function pub_add_communities(int ASN; int PeerType) { # DIRECT PEER if (PeerType=0) then { bgp_large_community.add((LOCAL_ASN, 110, 0)); bgp_large_community.add((LOCAL_ASN, 110, 2)); # PEER via IX } else if (PeerType=1) then { bgp_large_community.add((LOCAL_ASN, 110, 0)); bgp_large_community.add((LOCAL_ASN, 110, 1)); # UPSTREAM }else if (PeerType=10) then { bgp_large_community.add((LOCAL_ASN, 110, 10)); # DOWNSTREAM } else if (PeerType=20) then { bgp_large_community.add((LOCAL_ASN, 110, 20)); } # Finished (LOCAL_ASN, 110, *); if (LOCAL_ASN, 120, POP) ~ bgp_large_community then bgp_large_community.add((LOCAL_ASN, 120, POP)); if (LOCAL_ASN, 121, REGION) ~ bgp_large_community then bgp_large_community.add((LOCAL_ASN, 121, REGION)); # Finished (LOCAL_ASN, 120~130, *); } function pub_preprocess_communities() { if (LOCAL_ASN, 115, 1) ~ bgp_large_community then bgp_path.prepend(bgp_path.last); if (LOCAL_ASN, 115, 3) ~ bgp_large_community then { bgp_path.prepend(bgp_path.last); bgp_path.prepend(bgp_path.last); bgp_path.prepend(bgp_path.last); } if (LOCAL_ASN, 115, 5) ~ bgp_large_community then { bgp_path.prepend(bgp_path.last); bgp_path.prepend(bgp_path.last); bgp_path.prepend(bgp_path.last); bgp_path.prepend(bgp_path.last); bgp_path.prepend(bgp_path.last); } # Finished (LOCAL_ASN, 115, *); } function pub_process_communities(int ASN; int PeerType) { if (LOCAL_ASN, 125, POP) ~ bgp_large_community then { bgp_community.add((65535, 65282)); } if (LOCAL_ASN, 126, REGION) ~ bgp_large_community then { bgp_community.add((65535, 65283)); } if (65535, 65281) ~ bgp_community then return false; if (65535, 65282) ~ bgp_community then return false; if (65535, 65283) ~ bgp_community then return false; if (LOCAL_ASN, 2, ASN) ~ bgp_large_community then return false; # PEER if (PeerType<10) then { if (LOCAL_ASN, 1, 1) ~ bgp_large_community then return false; # UPSTREAM } else if (PeerType=10) then { if (LOCAL_ASN, 1, 0) ~ bgp_large_community then return false; # DOWNSTREAM } else if (PeerType=20) then { if (LOCAL_ASN, 1, 2) ~ bgp_large_community then return false; } } function transit_import_filter(int ASN) { if !is_valid() then return false; pub_add_communities(ASN, 10); pub_preprocess_communities(); return true; } function transit_export_filter(int ASN) { if !is_valid() then return false; # Delete Self eBGP Confed Path. bgp_path.delete([4200000000..4225479999]); pub_process_communities(ASN, 10); if bgp_path.last !~ DOWNSTREAM_ASN then return false; return true; }