BGP quagga not deleting old routes

bgpquagga

I've got quagga running on Slackware 14.2, kernel 4.4.7, (quagga-1.0.20160315 build from sources). Quagga fails to update route when path dissappears.

For example, that route is wrong and it was previously created by quagga:

94.246.185.0/24 via 94.246.185.42 dev eth3.2224  proto zebra  metric 20

As I understand, quagga has information about correct path, but ignores it because there's already route in kernel table…

bgp# show ip bgp 94.74.72.0/24
BGP routing table entry for 94.74.72.0/24
Paths: (2 available, best #2, table Default-IP-Routing-Table)
  Not advertised to any peer
  12741 1299 7713 45470 45470 50935
    213.17.213.97 from 213.17.213.97 (83.238.252.171)
      Origin IGP, localpref 100, valid, external
      Community: 1299:37000 12741:21000 12741:21041
      Last update: Tue Aug 30 11:28:22 2016

  9002 7713 45470 45470 50935
    87.245.245.89 from 87.245.245.89 (87.245.225.167)
      Origin IGP, localpref 100, valid, external, best
      Community: 9002:9002 9002:64789
      Last update: Tue Aug 30 11:27:55 201

bgp# show ip route 94.74.72.0/24
Routing entry for 94.74.72.0/24
  Known via "bgp", distance 20, metric 0, vrf 0
  Last update 01:22:43 ago
    87.245.245.89, via eth3.585

Routing entry for 94.74.72.0/24
  Known via "kernel", distance 0, metric 0, vrf 0, best, fib
  * 94.246.185.42, via eth3.2224

Is this may be a bug in quagga or error in my configuration?

Best Answer

I am having the same issue using Quagga (version 1.2.2). I had the --retain flag on the daemon, removed it from my start up script and restarted quagga, but it didn't fix the issue. Only manually deleting the route from the kernel fixed the routing loop.

bgprouter# sh ip route 125.209.208.1
Routing entry for 125.209.208.0/22
  Known via "bgp", distance 20, metric 0, tag 0, vrf 0
  Last update 00:02:06 ago
  >  206.197.187.12, via ix0

Routing entry for 125.209.208.0/22
  Known via "kernel", distance 0, metric 0, tag 0, vrf 0, best, fib
  >* 111.111.111.145, via ix2

In the shell (freeBSD), I delete the kernel route:

# route del -net 125.209.208.0/22

And then the router is repopulated from zebra with the proper router:

# route get 125.209.208.0
   route to: 125.209.208.0
destination: 125.209.208.0
       mask: 255.255.252.0
    gateway: as6939.sfmix.org
        fib: 0
  interface: ix0
      flags: <UP,GATEWAY,DONE,PROTO1>
 recvpipe  sendpipe  ssthresh  rtt,msec    mtu        weight    expire
       0         0         0         0      1500         1         0