#/etc/bird/community_filters.conf function update_latency(int link_latency) { bgp_community.add((64511, link_latency)); if (64511, 9) ~ bgp_community then { bgp_community.delete([(64511, 1..8)]); return 9; } else if (64511, 8) ~ bgp_community then { bgp_community.delete([(64511, 1..7)]); return 8; } else if (64511, 7) ~ bgp_community then { bgp_community.delete([(64511, 1..6)]); return 7; } else if (64511, 6) ~ bgp_community then { bgp_community.delete([(64511, 1..5)]); return 6; } else if (64511, 5) ~ bgp_community then { bgp_community.delete([(64511, 1..4)]); return 5; } else if (64511, 4) ~ bgp_community then { bgp_community.delete([(64511, 1..3)]); return 4; } else if (64511, 3) ~ bgp_community then { bgp_community.delete([(64511, 1..2)]); return 3; } else if (64511, 2) ~ bgp_community then { bgp_community.delete([(64511, 1..1)]); return 2; } else return 1; } function update_bandwidth(int link_bandwidth) { bgp_community.add((64511, link_bandwidth)); if (64511, 21) ~ bgp_community then { bgp_community.delete([(64511, 22..29)]); return 21; } else if (64511, 22) ~ bgp_community then { bgp_community.delete([(64511, 23..29)]); return 22; } else if (64511, 23) ~ bgp_community then { bgp_community.delete([(64511, 24..29)]); return 23; } else if (64511, 24) ~ bgp_community then { bgp_community.delete([(64511, 25..29)]); return 24; } else if (64511, 25) ~ bgp_community then { bgp_community.delete([(64511, 26..29)]); return 25; } else if (64511, 26) ~ bgp_community then { bgp_community.delete([(64511, 27..29)]); return 26; } else if (64511, 27) ~ bgp_community then { bgp_community.delete([(64511, 28..29)]); return 27; } else if (64511, 28) ~ bgp_community then { bgp_community.delete([(64511, 29..29)]); return 28; } else return 29; } function update_crypto(int link_crypto) { bgp_community.add((64511, link_crypto)); if (64511, 31) ~ bgp_community then { bgp_community.delete([(64511, 32..34)]); return 31; } else if (64511, 32) ~ bgp_community then { bgp_community.delete([(64511, 33..34)]); return 32; } else if (64511, 33) ~ bgp_community then { bgp_community.delete([(64511, 34..34)]); return 33; } else return 34; } function update_flags(int link_latency; int link_bandwidth; int link_crypto) int dn42_latency; int dn42_bandwidth; int dn42_crypto; { dn42_latency = update_latency(link_latency); dn42_bandwidth = update_bandwidth(link_bandwidth) - 20; dn42_crypto = update_crypto(link_crypto) - 30; # replace 4 with your calculated bandwidth value if dn42_bandwidth > 4 then dn42_bandwidth = 4; # bgp_local_pref = 10000+100*dn42_bandwidth + 50*(10-dn42_latency)-200*bgp_path.len+100*dn42_crypto; #(as suggested by tombii) # bgp_local_pref = 1000*dn42_bandwidth - 10*dn42_latency; if dn42_crypto < 2 then bgp_local_pref = 0; #(as suggested by Jplitza) # bgp_local_pref = 10000+100*dn42_bandwidth + 50*(10-dn42_latency)-400*(bgp_path.len-1)+100*dn42_crypto; #(as suggested by Mic92 - prefer direct tunnel) return true; } # Combines filter from local4.conf/local6.conf and filter4.conf/filter6.conf, # which means, these must included before this file function dn42_import_filter(int link_latency; int link_bandwidth; int link_crypto) { if (roa_check(dn42_roa, net, bgp_path.last) = ROA_INVALID) then { print "[dn42] ROA check failed for ", net, " ASN ", bgp_path.last; reject; } if is_valid_network() && !is_self_net() then { update_flags(link_latency, link_bandwidth, link_crypto); accept; } reject; } function dn42_export_filter(int link_latency; int link_bandwith; int link_crypto) { if is_valid_network() then { if source = RTS_STATIC then bgp_community.add((64511, DN42_REGION)); update_flags(link_latency, link_bandwith, link_crypto); accept; } reject; } # iBGP Peer Policies function iBGP_import_peer_policy() { if bgp_path.len > 64 then return false; # Reject too long BGP Paths if is_self_net() then return false; # Reject local used networks (IXP, Peerings) from iBGP Peers if ( bgp_local_pref > 1000 ) then { # Reset local pref on iBGP Links, to do AS Path Metric only bgp_local_pref = 100; } return true; # Allow all on iBGP Links };