116 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| function pub_add_communities(int ASN; int PeerType) {
 | |
|     # DIRECT PEER
 | |
|     if (PeerType=0) then {
 | |
|         if bgp_large_community !~ [(LOCAL_ASN, 110, *)] 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 {
 | |
|         if bgp_large_community !~ [(LOCAL_ASN, 110, *)] then {
 | |
|             bgp_large_community.add((LOCAL_ASN, 110, 0));
 | |
|             bgp_large_community.add((LOCAL_ASN, 110, 1));
 | |
|         }
 | |
|         
 | |
| 
 | |
|     # UPSTREAM
 | |
|     }else if (PeerType=10) then {
 | |
|         if bgp_large_community !~ [(LOCAL_ASN, 110, *)] then bgp_large_community.add((LOCAL_ASN, 110, 10));
 | |
| 
 | |
|     # DOWNSTREAM
 | |
|     } else if (PeerType=20) then {
 | |
|         if bgp_large_community !~ [(LOCAL_ASN, 110, *)] then bgp_large_community.add((LOCAL_ASN, 110, 20));
 | |
|     # Self Route
 | |
|     } else if (PeerType=30) then {
 | |
|         if bgp_large_community !~ [(LOCAL_ASN, 110, *)] then bgp_large_community.add((LOCAL_ASN, 110, 30));
 | |
|     }
 | |
| 
 | |
|     # Finished (LOCAL_ASN, 110, *);
 | |
| 
 | |
|     if bgp_large_community !~ [(LOCAL_ASN, 120, *)] then bgp_large_community.add((LOCAL_ASN, 120, POP));
 | |
|     if bgp_large_community !~ [(LOCAL_ASN, 121, *)] 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(LOCAL_ASN);
 | |
|     if (LOCAL_ASN, 115, 3) ~ bgp_large_community then {
 | |
|         bgp_path.prepend(LOCAL_ASN);
 | |
|         bgp_path.prepend(LOCAL_ASN);
 | |
|         bgp_path.prepend(LOCAL_ASN);
 | |
|     }
 | |
|     if (LOCAL_ASN, 115, 5) ~ bgp_large_community then {
 | |
|         bgp_path.prepend(LOCAL_ASN);
 | |
|         bgp_path.prepend(LOCAL_ASN);
 | |
|         bgp_path.prepend(LOCAL_ASN);
 | |
|         bgp_path.prepend(LOCAL_ASN);
 | |
|         bgp_path.prepend(LOCAL_ASN);
 | |
|     }
 | |
|     # 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 pub_process_path() {
 | |
|     # Delete Self eBGP Confed Path.
 | |
|     bgp_path.delete([4200000000..4225479999]);
 | |
|     # Route is via or locate Europe & Africa & Middle East
 | |
|     if bgp_large_community ~ [(LOCAL_ASN, 122, 100), (LOCAL_ASN, 122, 300..310), (LOCAL_ASN, 122, 600), (LOCAL_ASN, 121, 100), (LOCAL_ASN, 121, 300..310), (LOCAL_ASN, 121, 600)] then bgp_path.prepend(LOCAL_ASN);
 | |
|     # Route is via or locate America
 | |
|     if bgp_large_community ~ [(LOCAL_ASN, 122, 200..299), (LOCAL_ASN, 121, 200..299)] then bgp_path.prepend(LOCAL_ASN);
 | |
|     # Route is via or locate East Asia & Oceania
 | |
|     if bgp_large_community ~ [(LOCAL_ASN, 122, 400..500), (LOCAL_ASN, 121, 200..299)] then bgp_path.prepend(LOCAL_ASN);
 | |
|     # Self PoP
 | |
|     if (LOCAL_ASN, 120, POP) ~ bgp_large_community then {
 | |
|         bgp_path.delete(LOCAL_ASN);
 | |
|         bgp_path.prepend(LOCAL_ASN);
 | |
|     }
 | |
|     pub_preprocess_communities();
 | |
| }
 | |
| 
 | |
| function transit_import_filter(int ASN) {
 | |
|     if !is_valid() then return false;
 | |
|     pub_add_communities(ASN, 10);
 | |
|     pub_preprocess_communities();
 | |
|     bgp_local_pref = 400 - bgp_path.len * 10;
 | |
|     if LOCAL_ASN ~ bgp_path then bgp_local_pref = 1;
 | |
|     pub_route_controller_specific();
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| function transit_export_filter(int ASN) {
 | |
|     pub_process_path();
 | |
|     if !is_valid() then return false;
 | |
|     if bgp_large_community ~ [(LOCAL_ASN, 110, 0), (LOCAL_ASN, 110, 10)] then return false;
 | |
|     if !pub_is_downstream_route() && source = RTS_BGP then {
 | |
|         print "transit exporter: for ", net, " ASN ", bgp_path.last;
 | |
|         return false;
 | |
|     }
 | |
|     pub_add_communities(ASN, 30);
 | |
|     if pub_process_communities(ASN, 10) then return true;
 | |
|     else return false;
 | |
| } |