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, *); return true; } 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, *); return true; } function pub_process_communities(int ASN; int PeerType) { 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; } return true; } 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) { # Delete Self eBGP Confed Path. bgp_path.delete([4200000000..4225479999]); if !is_valid() then return false; if bgp_path.last !~ DOWNSTREAM_ASN && source = RTS_BGP then return false; if pub_process_communities(ASN, 10) then return true; else return false; }