<div dir="ltr"><div dir="ltr"><div dir="ltr">Hello!<div><br></div><div>I'm creating a BGP lab for my students and found interesting and unexpected behavior.</div><div><br></div><div>I'm getting reject message when receiving route:</div><div>2023-12-10 15:10:53.724 <TRACE> isp1.ipv4 > added [best] <a href="http://10.200.0.0/16">10.200.0.0/16</a> 0L 4G unicast</div>2023-12-10 15:10:53.724 <TRACE> isp1.ipv4 < rejected by protocol <a href="http://10.200.0.0/16">10.200.0.0/16</a> 0L 4G unicast<br><div><br></div><div>But then the route appears in ip route:</div><div><a href="http://10.200.0.0/16">10.200.0.0/16</a> dev 201 proto bird scope link metric 32<br><br>I've dug into the source code and found that the reject is happening here:<br>proto/bgp/attrs.c:1641 if (src == p) return -1 into bgp_preexport function.<br><br>The question is: what is happening and does it look valid/expected?<br><br>Wireguard configuration is the same on all peers:<br><br>[Interface]<br>Address=<a href="http://10.10.10.201/32">10.10.10.201/32</a><br>PrivateKey=******<br>Table=off<br><br>[Peer]<br>Endpoint=*******<br>PublicKey=*****<br>PersistentKeepalive=25<br>AllowedIPs=<a href="http://0.0.0.0/0">0.0.0.0/0</a><br><br>My configuration for BIRD peers:<br>==== local bird.conf ====</div><div>log stderr all;<br>router id 10.10.10.201;<br><br>protocol device {<br> scan time 10;<br>}<br><br>protocol kernel {<br> ipv4 {<br>              import all;<br>        export all;<br>  };<br>    learn;<br>}<br><br>protocol static {<br>        ipv4;<br> route <a href="http://10.201.0.0/16">10.201.0.0/16</a> via "wlp41s0"; # wifi device<br>   route <a href="http://10.10.10.0/24">10.10.10.0/24</a> via "201"; # wireguard device<br>}<br><br>protocol bgp isp1 {<br>        router id 10.10.10.201;<br>       local 10.10.10.201 as 65201;<br>  neighbor 10.10.10.200 as 65200;<br>       source address 10.10.10.201;<br>  multihop;<br>     ipv4 {<br>                import filter {<br>                       if net ~ <a href="http://10.0.0.0/8">10.0.0.0/8</a> then accept;<br>                        else reject;<br>          };<br>            export filter {<br>                       if net ~ <a href="http://10.201.0.0/16">10.201.0.0/16</a> then accept;<br>                  else reject;<br>          };<br><br>  };<br>    debug all;<br>}<br>==== /client bird.conf ====<br><br>==== remote bird.conf ====<br>log stderr all;<br><br>protocol kernel {<br>        learn;                  # Learn all alien routes from the kernel<br>      persist;                # Don't remove routes on bird shutdown<br>    scan time 20;           # Scan kernel routing table every 20 seconds<br>  import all;             # Default is import all<br>       export all;             # Default is export none<br>#     kernel table 5;         # Kernel table to synchronize with (default: main)<br>}<br><br>protocol device {<br>    scan time 10;<br>}<br><br>protocol static {<br> export all;</div><div>route <a href="http://10.10.10.0/24">10.10.10.0/24</a> via "200"; # wireguard device<br>        route <a href="http://10.200.0.0/16">10.200.0.0/16</a> via 10.200.200.200; # virtual network<br>}<br><br>template bgp cpr_ne {<br>        local as 65200;<br>       router id 10.10.10.200;<br>       multihop;<br>     source address 10.10.10.200;<br>  import filter {<br>               if net ~ <a href="http://10.201.0.0/16">10.201.0.0/16</a> then accept;<br>          else if net ~ <a href="http://10.202.0.0/16">10.202.0.0/16</a> then accept;<br>             else if net ~ <a href="http://10.203.0.0/16">10.203.0.0/16</a> then accept;<br>             else if net ~ <a href="http://10.204.0.0/16">10.204.0.0/16</a> then accept;<br>             else if net ~ <a href="http://10.205.0.0/16">10.205.0.0/16</a> then accept;<br>             else if net ~ <a href="http://10.206.0.0/16">10.206.0.0/16</a> then accept;<br>             else if net ~ <a href="http://10.207.0.0/16">10.207.0.0/16</a> then accept;<br>             else if net ~ <a href="http://10.208.0.0/16">10.208.0.0/16</a> then accept;<br>             else reject;<br>  };<br>    export filter {<br>               if net ~ <a href="http://10.200.0.0/16">10.200.0.0/16</a> then accept;<br>          else reject;<br>  };<br>}<br><br>protocol bgp cpr201 from cpr_ne {<br>    neighbor 10.10.10.201 as 65201;<br>}<br>protocol bgp cpr202 from cpr_ne {<br> neighbor 10.10.10.202 as 65202;<br>}<br>protocol bgp cpr203 from cpr_ne {<br> neighbor 10.10.10.203 as 65203;<br>}<br>protocol bgp cpr204 from cpr_ne {<br> neighbor 10.10.10.204 as 65204;<br>}<br>protocol bgp cpr205 from cpr_ne {<br> neighbor 10.10.10.205 as 65205;<br>}<br>protocol bgp cpr206 from cpr_ne {<br> neighbor 10.10.10.206 as 65206;<br>}<br>protocol bgp cpr207 from cpr_ne {<br> neighbor 10.10.10.207 as 65207;<br>}<br>protocol bgp cpr208 from cpr_ne {<br> neighbor 10.10.10.208 as 65208;<br>}<br>==== remote bird.conf ====<br></div></div></div></div>