To add to this issue:

I’ve hacked some test together for this and can confirm the problem.
It actually has nothing specifically to do with next-hop-self.

The problem is seen if a BGP update changes from a reachable next-hop
to an unreachable next-hop:

BGP updates the BGP table first, then sends the update to Zebra - but
sends the update (the withdraw in this case) with the NEW nexthop. Zebra
fails to find the specific route to withdraw and will then drop the withdraw.
The result is a stale (old) route in Zebra (Zebra RIB only - not BGP).

What makes it worse, is that even a close of the BGP session won’t fix
this. In my tests, only a restart of BGPd (or Zebra) fixes the problem.

To reproduce the issue, use my (ugly, but functional) BGPtool:
https://git-us.netdef.org/projects/NETDEF/repos/bgptool/
and checkout the branch “test/invalid-valid-invalid” (or commit a0af1816)
See doc at
https://git-us.netdef.org/projects/NETDEF/repos/bgptool/browse/README_valid-invalid.md?at=test/invalid-valid-invalid
on how to reproduce this.

I’ve reproduce this issue in the latest Quagga Master (commit ca8ec20
as of Sep 29, 2015)

Regards,
   Martin Winter
   [email protected]

PS: I did not spend the time looking into solution, just providing a way
to reproduce the issue (and confirming it)


On 1 Oct 2015, at 17:47, Jacqueline Yu wrote:

Here are the corresponding BGP log and Zebra log I have for this and I
observed similar failure on 0.99.24 as well as 0.99.22 --

BGP log --

2015/09/21 16:52:06 BGP: [AS4SEG] Parse aspath segment: got total byte
length 6

2015/09/21 16:52:06 BGP: [AS4SEG] Parse aspath segment: got type 2, length 2

2015/09/21 16:52:06 BGP: [AS4SEG] Parse aspath segment: Bytes now: 6

2015/09/21 16:52:06 BGP: 200.200.200.1 rcvd UPDATE w/ attr: nexthop
10.8.0.1, origin ?, localpref 100, path 200 50

2015/09/21 16:52:06 BGP: 200.200.200.1 rcvd 0.0.0.0/0

2015/09/21 16:52:06 BGP: 200.200.200.1 rcvd 10.150.0.0/16

2015/09/21 16:52:06 BGP: 200.200.200.1 rcvd 20.0.0.0/8

2015/09/21 16:52:06 BGP: 200.200.200.1 rcvd 60.0.0.0/8

2015/09/21 16:52:06 BGP: 200.200.200.1 rcvd 120.0.0.0/8

2015/09/21 16:52:06 BGP: 200.200.200.1 rcvd 120.1.1.0/24

2015/09/21 16:52:06 BGP: [AS4SEG] Parse aspath segment: got total byte
length 6

2015/09/21 16:52:06 BGP: [AS4SEG] Parse aspath segment: got type 2, length 2

2015/09/21 16:52:06 BGP: [AS4SEG] Parse aspath segment: Bytes now: 6

2015/09/21 16:52:06 BGP: 200.200.200.1 rcvd UPDATE w/ attr: nexthop
200.100.1.2, origin ?, localpref 100, path 200 50

2015/09/21 16:52:06 BGP: 200.200.200.1 rcvd 100.100.1.0/24

2015/09/21 16:52:06 BGP: 200.200.200.1 rcvd 100.100.2.0/24

2015/09/21 16:52:06 BGP: 200.200.200.1 rcvd 100.100.3.0/24

2015/09/21 16:52:06 BGP: 200.200.200.1 rcvd 100.100.4.0/24

2015/09/21 16:52:06 BGP: [AS4SEG] Parse aspath segment: got total byte
length 6

2015/09/21 16:52:06 BGP: [AS4SEG] Parse aspath segment: got type 2, length 2

2015/09/21 16:52:06 BGP: [AS4SEG] Parse aspath segment: Bytes now: 6

2015/09/21 16:52:06 BGP: 200.200.200.1 rcvd UPDATE w/ attr: nexthop
200.200.200.2, origin ?, localpref 100, path 200 50

2015/09/21 16:52:06 BGP: 200.200.200.1 rcvd 200.200.250.14/32

2015/09/21 16:52:06 BGP: 200.200.200.1 rcvd 200.200.250.15/32

2015/09/21 16:52:06 BGP: [AS4SEG] Parse aspath segment: got total byte
length 6

2015/09/21 16:52:06 BGP: [AS4SEG] Parse aspath segment: got type 2, length 2

2015/09/21 16:52:06 BGP: [AS4SEG] Parse aspath segment: Bytes now: 6

2015/09/21 16:52:06 BGP: 200.200.200.1 rcvd UPDATE w/ attr: nexthop
200.200.200.3, origin ?, localpref 100, path 200 50

2015/09/21 16:52:06 BGP: 200.200.200.1 rcvd 200.200.250.16/32

2015/09/21 16:52:06 BGP: Zebra send: IPv4 route delete 0.0.0.0/0 nexthop
10.8.0.1 metric 0

2015/09/21 16:52:06 BGP: Zebra send: IPv4 route delete 10.150.0.0/16
nexthop 10.8.0.1 metric 0

2015/09/21 16:52:06 BGP: Zebra send: IPv4 route delete 20.0.0.0/8 nexthop
10.8.0.1 metric 0

2015/09/21 16:52:06 BGP: Zebra send: IPv4 route delete 60.0.0.0/8 nexthop
10.8.0.1 metric 0

2015/09/21 16:52:06 BGP: Zebra send: IPv4 route delete 120.0.0.0/8 nexthop
10.8.0.1 metric 0

2015/09/21 16:52:06 BGP: Zebra send: IPv4 route delete 120.1.1.0/24 nexthop
10.8.0.1 metric 0

2015/09/21 16:52:06 BGP: Zebra send: IPv4 route delete 100.100.1.0/24
nexthop 200.100.1.2 metric 0

2015/09/21 16:52:06 BGP: Zebra send: IPv4 route delete 100.100.2.0/24
nexthop 200.100.1.2 metric 0

2015/09/21 16:52:06 BGP: Zebra send: IPv4 route delete 100.100.3.0/24
nexthop 200.100.1.2 metric 0

2015/09/21 16:52:06 BGP: Zebra send: IPv4 route delete 100.100.4.0/24
nexthop 200.100.1.2 metric 0

2015/09/21 16:52:06 BGP: Zebra send: IPv4 route delete 200.200.250.14/32
nexthop 200.200.200.2 metric 0

2015/09/21 16:52:06 BGP: Zebra send: IPv4 route delete 200.200.250.15/32
nexthop 200.200.200.2 metric 0

2015/09/21 16:52:06 BGP: Zebra send: IPv4 route delete 200.200.250.16/32
nexthop 200.200.200.3 metric 0


Zebra log --

2015/09/21 16:52:06 ZEBRA: zebra message comes from socket [13]

2015/09/21 16:52:06 ZEBRA: zebra message received
[ZEBRA_IPV4_NEXTHOP_LOOKUP] 4

2015/09/21 16:52:06 ZEBRA: zread_ipv4_nexthop_lookup: looking up 10.8.0.1

2015/09/21 16:52:06 ZEBRA: zsend_ipv4_nexthop_lookup: No matching rib entry
found.

2015/09/21 16:52:06 ZEBRA: zebra message comes from socket [13]

2015/09/21 16:52:06 ZEBRA: zebra message received
[ZEBRA_IPV4_NEXTHOP_LOOKUP] 4

2015/09/21 16:52:06 ZEBRA: zread_ipv4_nexthop_lookup: looking up 200.100.1.2

2015/09/21 16:52:06 ZEBRA: zsend_ipv4_nexthop_lookup: No matching rib entry
found.

2015/09/21 16:52:06 ZEBRA: zebra message comes from socket [13]

2015/09/21 16:52:06 ZEBRA: zebra message received
[ZEBRA_IPV4_NEXTHOP_LOOKUP] 4

2015/09/21 16:52:06 ZEBRA: zread_ipv4_nexthop_lookup: looking up
200.200.200.2

2015/09/21 16:52:06 ZEBRA: zsend_ipv4_nexthop_lookup: No matching rib entry
found.

2015/09/21 16:52:06 ZEBRA: zebra message comes from socket [13]

2015/09/21 16:52:06 ZEBRA: zebra message received
[ZEBRA_IPV4_NEXTHOP_LOOKUP] 4

2015/09/21 16:52:06 ZEBRA: zread_ipv4_nexthop_lookup: looking up
200.200.200.3

2015/09/21 16:52:06 ZEBRA: zsend_ipv4_nexthop_lookup: No matching rib entry
found.

2015/09/21 16:52:06 ZEBRA: zebra message comes from socket [12]

2015/09/21 16:52:06 ZEBRA: zebra message received [ZEBRA_IPV4_ROUTE_DELETE]
16

2015/09/21 16:52:06 ZEBRA: rib_delete_ipv4(): route delete 0.0.0.0/0 via
10.8.0.1 ifindex 0

2015/09/21 16:52:06 ZEBRA: route 0.0.0.0/0 via 10.8.0.1 ifindex 0 type 9
doesn't exist in rib

2015/09/21 16:52:06 ZEBRA: zebra message comes from socket [12]

2015/09/21 16:52:06 ZEBRA: zebra message received [ZEBRA_IPV4_ROUTE_DELETE]
18

2015/09/21 16:52:06 ZEBRA: rib_delete_ipv4(): route delete 10.150.0.0/16
via 10.8.0.1 ifindex 0

2015/09/21 16:52:06 ZEBRA: route 10.150.0.0/16 via 10.8.0.1 ifindex 0 type
9 doesn't exist in rib

2015/09/21 16:52:06 ZEBRA: zebra message comes from socket [12]

2015/09/21 16:52:06 ZEBRA: zebra message received [ZEBRA_IPV4_ROUTE_DELETE]
17

2015/09/21 16:52:06 ZEBRA: rib_delete_ipv4(): route delete 20.0.0.0/8 via
10.8.0.1 ifindex 0

2015/09/21 16:52:06 ZEBRA: route 20.0.0.0/8 via 10.8.0.1 ifindex 0 type 9
doesn't exist in rib

2015/09/21 16:52:06 ZEBRA: zebra message comes from socket [12]

2015/09/21 16:52:06 ZEBRA: zebra message received [ZEBRA_IPV4_ROUTE_DELETE]
17

2015/09/21 16:52:06 ZEBRA: rib_delete_ipv4(): route delete 60.0.0.0/8 via
10.8.0.1 ifindex 0

2015/09/21 16:52:06 ZEBRA: route 60.0.0.0/8 via 10.8.0.1 ifindex 0 type 9
doesn't exist in rib

2015/09/21 16:52:06 ZEBRA: zebra message comes from socket [12]

2015/09/21 16:52:06 ZEBRA: zebra message received [ZEBRA_IPV4_ROUTE_DELETE]
17

2015/09/21 16:52:06 ZEBRA: rib_delete_ipv4(): route delete 120.0.0.0/8 via
10.8.0.1 ifindex 0

2015/09/21 16:52:06 ZEBRA: route 120.0.0.0/8 via 10.8.0.1 ifindex 0 type 9
doesn't exist in rib

2015/09/21 16:52:06 ZEBRA: zebra message comes from socket [12]

2015/09/21 16:52:06 ZEBRA: zebra message received [ZEBRA_IPV4_ROUTE_DELETE]
19

2015/09/21 16:52:06 ZEBRA: rib_delete_ipv4(): route delete 120.1.1.0/24 via
10.8.0.1 ifindex 0

2015/09/21 16:52:06 ZEBRA: route 120.1.1.0/24 via 10.8.0.1 ifindex 0 type 9
doesn't exist in rib

2015/09/21 16:52:06 ZEBRA: zebra message comes from socket [12]

2015/09/21 16:52:06 ZEBRA: zebra message received [ZEBRA_IPV4_ROUTE_DELETE]
19

2015/09/21 16:52:06 ZEBRA: rib_delete_ipv4(): route delete 100.100.1.0/24
via 200.100.1.2 ifindex 0

2015/09/21 16:52:06 ZEBRA: route 100.100.1.0/24 via 200.100.1.2 ifindex 0
type 9 doesn't exist in rib

2015/09/21 16:52:06 ZEBRA: zebra message comes from socket [12]

2015/09/21 16:52:06 ZEBRA: zebra message received [ZEBRA_IPV4_ROUTE_DELETE]
19

2015/09/21 16:52:06 ZEBRA: rib_delete_ipv4(): route delete 100.100.2.0/24
via 200.100.1.2 ifindex 0

2015/09/21 16:52:06 ZEBRA: route 100.100.2.0/24 via 200.100.1.2 ifindex 0
type 9 doesn't exist in rib

2015/09/21 16:52:06 ZEBRA: zebra message comes from socket [12]

2015/09/21 16:52:06 ZEBRA: zebra message received [ZEBRA_IPV4_ROUTE_DELETE]
19

2015/09/21 16:52:06 ZEBRA: rib_delete_ipv4(): route delete 100.100.3.0/24
via 200.100.1.2 ifindex 0

2015/09/21 16:52:06 ZEBRA: route 100.100.3.0/24 via 200.100.1.2 ifindex 0
type 9 doesn't exist in rib

2015/09/21 16:52:06 ZEBRA: zebra message comes from socket [12]

2015/09/21 16:52:06 ZEBRA: zebra message received [ZEBRA_IPV4_ROUTE_DELETE]
19

2015/09/21 16:52:06 ZEBRA: rib_delete_ipv4(): route delete 100.100.4.0/24
via 200.100.1.2 ifindex 0

2015/09/21 16:52:06 ZEBRA: route 100.100.4.0/24 via 200.100.1.2 ifindex 0
type 9 doesn't exist in rib

2015/09/21 16:52:06 ZEBRA: zebra message comes from socket [12]

2015/09/21 16:52:06 ZEBRA: zebra message received [ZEBRA_IPV4_ROUTE_DELETE]
20

2015/09/21 16:52:06 ZEBRA: rib_delete_ipv4(): route delete 200.200.250.14/32
via 200.200.200.2 ifindex 0

2015/09/21 16:52:06 ZEBRA: route 200.200.250.14/32 via 200.200.200.2
ifindex 0 type 9 doesn't exist in rib

2015/09/21 16:52:06 ZEBRA: zebra message comes from socket [12]

2015/09/21 16:52:06 ZEBRA: zebra message received [ZEBRA_IPV4_ROUTE_DELETE]
20

2015/09/21 16:52:06 ZEBRA: rib_delete_ipv4(): route delete 200.200.250.15/32
via 200.200.200.2 ifindex 0

2015/09/21 16:52:06 ZEBRA: route 200.200.250.15/32 via 200.200.200.2
ifindex 0 type 9 doesn't exist in rib

2015/09/21 16:52:06 ZEBRA: zebra message comes from socket [12]

2015/09/21 16:52:06 ZEBRA: zebra message received [ZEBRA_IPV4_ROUTE_DELETE]
20

2015/09/21 16:52:06 ZEBRA: rib_delete_ipv4(): route delete 200.200.250.16/32
via 200.200.200.3 ifindex 0

2015/09/21 16:52:06 ZEBRA: route 200.200.250.16/32 via 200.200.200.3
ifindex 0 type 9 doesn't exist in rib

On Tue, Sep 22, 2015 at 11:52 AM, J Yu <[email protected]> wrote:

Hi all,

I am seeing issue where kernel routes are not deleted even though the some of the routes have updated nexthop that's not reachable. I do see delete going into Zebra where it has the new nexthop while Zebra still had the routes pointed to the old nexthop. My code base is 0.99.24 with some minor
modifications...Anyone had seen similar issue?

Example from below -- This router is C14 and neighbor IP is 200.200.200.1
and the route tables looks fine on C14.
C14# show ip bgp
BGP table version is 0, local router ID is 200.200.250.14
Status codes: s suppressed, d damped, h history, * valid, > best, =
multipath,
           i internal, r RIB-failure, S Stale, R Removed
Origin codes: i - IGP, e - EGP, ? - incomplete

Network          Next Hop            Metric LocPrf Weight Path
*>i0.0.0.0          200.200.200.1                 100      0 200 50 ?
*>i10.150.0.0/16    200.200.200.1                 100      0 200 50 ?

C14# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
    O - OSPF, I - IS-IS, B - BGP, P - PIM, A - Babel,
    > - selected route, * - FIB route

B>  0.0.0.0/0 [200/0] via 200.200.200.1 (recursive), 00:00:32
*                     via 200.200.200.1, eth3.21 onlink, 00:00:32
B>  10.150.0.0/16 [200/0] via 200.200.200.1 (recursive), 00:00:32
*                         via 200.200.200.1, eth3.21 onlink, 00:00:32
------------
Now, changing neighbor to no longer do next-hop-self, hence the next hop will point to the new nexthop of 10.8.0.1 and I see the following outputs--
------------
C14# show ip bgp
BGP table version is 0, local router ID is 200.200.250.14
Status codes: s suppressed, d damped, h history, * valid, > best, =
multipath,
           i internal, r RIB-failure, S Stale, R Removed
Origin codes: i - IGP, e - EGP, ? - incomplete

Network          Next Hop            Metric LocPrf Weight Path
* i0.0.0.0          10.8.0.1                      100      0 200 50 ?
* i10.150.0.0/16    10.8.0.1                      100      0 200 50 ?


C14# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
    O - OSPF, I - IS-IS, B - BGP, P - PIM, A - Babel,
    > - selected route, * - FIB route

B>  0.0.0.0/0 [200/0] via 200.200.200.1 (recursive), 00:07:09
*                     via 200.200.200.1, eth3.21 onlink, 00:07:09
B>  10.150.0.0/16 [200/0] via 200.200.200.1 (recursive), 00:07:09
*                         via 200.200.200.1, eth3.21 onlink, 00:07:09

Appreciate any pointers!

Jacqueline

_______________________________________________
Quagga-dev mailing list
[email protected]
https://lists.quagga.net/mailman/listinfo/quagga-dev

_______________________________________________
Quagga-dev mailing list
[email protected]
https://lists.quagga.net/mailman/listinfo/quagga-dev

_______________________________________________
Quagga-dev mailing list
[email protected]
https://lists.quagga.net/mailman/listinfo/quagga-dev

Reply via email to