Greetings, I noticed during setting up a peering that the MED is not actually send to my peer, although bird shows it in the export. We confirmed this via tcpdump on both ends.
After debugging a bit, I noticed that this only affects “learned” routes but routes from the static protocol worked just fine. After disabling the “export table” feature, the MED was send out just fine. Is this behaviour expected? This behaviour is reproducible in BIRD 2.0.7 and 2.0.10 with the following scenario (Configs to test are attached): R0 is connected to R1 and R2 R0, R1 and R2 send each one route R0 sets the MED to 300 R1 sets the MED to 100 R2 sets the MED to 200 Setting “export table on;” yields the following results: # Bird shows the MED in the export R0 $ ./birdc s r all export R1 BIRD 2.0.10 ready. Table master4: 198.18.0.0/24 unicast [static1 02:05:56.604] * (200) Type: static univ BGP.med: 300 198.18.2.0/24 unicast [R2 02:11:51.132 from 198.19.0.2] * (100) [AS4242420002i] Type: BGP univ BGP.origin: IGP BGP.as_path: 4242420002 BGP.next_hop: 198.19.0.2 BGP.med: 300 BGP.local_pref: 100 R0 $ ./birdc s r all export R2 BIRD 2.0.10 ready. Table master4: 198.18.0.0/24 unicast [static1 02:05:56.604] * (200) Type: static univ BGP.med: 300 198.18.1.0/24 unicast [R1 02:11:51.133 from 198.19.0.1] * (100) [AS4242420001i] Type: BGP univ BGP.origin: IGP BGP.as_path: 4242420001 BGP.next_hop: 198.19.0.1 BGP.med: 300 BGP.local_pref: 100 R0 # But on R1, R2 it does not appear for learned routes: R1 $ ./birdc s r all protocol R0 BIRD 2.0.10 ready. Table master4: 198.18.0.0/24 unicast [R0 02:11:51.133 from 198.19.0.0] * (100) [AS4242420000i] Type: BGP univ BGP.origin: IGP BGP.as_path: 4242420000 BGP.next_hop: 198.19.0.0 BGP.med: 300 BGP.local_pref: 100 198.18.2.0/24 unicast [R0 02:11:51.133 from 198.19.0.0] * (100) [AS4242420002i] Type: BGP univ BGP.origin: IGP BGP.as_path: 4242420000 4242420002 BGP.next_hop: 198.19.0.0 BGP.local_pref: 100 R1 $ R2 $ ./birdc s r all protocol R0 BIRD 2.0.10 ready. Table master4: 198.18.0.0/24 unicast [R0 02:11:51.132 from 198.19.0.0] * (100) [AS4242420000i] Type: BGP univ BGP.origin: IGP BGP.as_path: 4242420000 BGP.next_hop: 198.19.0.0 BGP.med: 300 BGP.local_pref: 100 198.18.1.0/24 unicast [R0 02:11:51.133 from 198.19.0.0] * (100) [AS4242420001i] Type: BGP univ BGP.origin: IGP BGP.as_path: 4242420000 4242420001 BGP.next_hop: 198.19.0.0 BGP.local_pref: 100 R2 $ Setting “export table off;” yield the expected result: R1 $ ./birdc s r all protocol R0 BIRD 2.0.10 ready. Table master4: 198.18.0.0/24 unicast [R0 03:15:47.147 from 198.19.0.0] * (100) [AS4242420000i] Type: BGP univ BGP.origin: IGP BGP.as_path: 4242420000 BGP.next_hop: 198.19.0.0 BGP.med: 300 BGP.local_pref: 100 198.18.2.0/24 unicast [R0 03:15:50.635 from 198.19.0.0] * (100) [AS4242420002i] Type: BGP univ BGP.origin: IGP BGP.as_path: 4242420000 4242420002 BGP.next_hop: 198.19.0.0 BGP.med: 300 BGP.local_pref: 100 R1 $ R2 $ ./birdc s r all protocol R0 BIRD 2.0.10 ready. Table master4: 198.18.0.0/24 unicast [R0 03:15:50.635 from 198.19.0.0] * (100) [AS4242420000i] Type: BGP univ BGP.origin: IGP BGP.as_path: 4242420000 BGP.next_hop: 198.19.0.0 BGP.med: 300 BGP.local_pref: 100 198.18.1.0/24 unicast [R0 03:15:50.635 from 198.19.0.0] * (100) [AS4242420001i] Type: BGP univ BGP.origin: IGP BGP.as_path: 4242420000 4242420001 BGP.next_hop: 198.19.0.0 BGP.med: 300 BGP.local_pref: 100 R2 $
protocol static { route 198.18.0.0/24 reject; ipv4 {}; } template bgp rs_peers { local 198.19.0.0 port 1179 as 4242420000; ipv4 { import table off; export table on; import all; export filter { if source ~ [RTS_STATIC, RTS_BGP] then { bgp_med = 300; accept; } reject; }; }; }; protocol bgp R1 from rs_peers { neighbor 198.19.0.1 port 1179 as 4242420001; }; protocol bgp R2 from rs_peers { neighbor 198.19.0.2 port 1179 as 4242420002; };
protocol static { route 198.18.1.0/24 reject; ipv4 { }; } protocol bgp R0 { ipv4 { import all; export filter { if source ~ [RTS_STATIC, RTS_BGP] then { bgp_med = 100; accept; } reject; }; }; local 198.19.0.1 port 1179 as 4242420001; neighbor 198.19.0.0 port 1179 as 4242420000; };
protocol static { route 198.18.2.0/24 reject; ipv4 { }; } protocol bgp R0 { ipv4 { import all; export filter { # here we export the whole net if source ~ [RTS_STATIC, RTS_BGP] then { bgp_med = 200; accept; } reject; }; }; local 198.19.0.2 port 1179 as 4242420002; neighbor 198.19.0.0 port 1179 as 4242420000; };