Thanks Martin for adding the test case, and confirming the issue. Here is a
proposed change I made with diff below as well as attached --

Appreciate any comments/feedbacks...

diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 316fa5a..c424dd1 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -109,8 +109,12 @@ bgp_info_extra_free (struct bgp_info_extra **extra)

       (*extra)->damp_info = NULL;

+      if ((*extra)->attr)
+        bgp_attr_unintern(&((*extra)->attr));
+
+      (*extra)->attr = NULL;
+
       XFREE (MTYPE_BGP_ROUTE_EXTRA, *extra);
-
       *extra = NULL;
     }
 }
@@ -1602,7 +1606,8 @@ bgp_process_main (struct work_queue *wq, void *data)
   struct bgp_info *old_select;
   struct bgp_info_pair old_and_new;
   struct listnode *node, *nnode;
-  struct peer *peer;
+  struct peer *peer, *log_peer = NULL;
+  struct attr *attr;

   /* Best path selection. */
   bgp_best_selection (bgp, rn, &bgp->maxpaths[afi][safi], &old_and_new);
@@ -1638,6 +1643,8 @@ bgp_process_main (struct work_queue *wq, void *data)
   for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
       bgp_process_announce_selected (peer, new_select, rn, afi, safi);
+      if (log_peer == NULL)
+          log_peer = peer;
     }

   /* FIB update. */
@@ -1646,15 +1653,24 @@ bgp_process_main (struct work_queue *wq, void *data)
     {
       if (new_select
   && new_select->type == ZEBRA_ROUTE_BGP
-  && new_select->sub_type == BGP_ROUTE_NORMAL)
+  && new_select->sub_type == BGP_ROUTE_NORMAL) {
  bgp_zebra_announce (p, new_select, bgp, safi);
+      }
       else
  {
   /* Withdraw the route from the kernel. */
   if (old_select
       && old_select->type == ZEBRA_ROUTE_BGP
-      && old_select->sub_type == BGP_ROUTE_NORMAL)
-    bgp_zebra_withdraw (p, old_select, safi);
+      && old_select->sub_type == BGP_ROUTE_NORMAL) {
+            if (CHECK_FLAG (old_select->flags, BGP_INFO_NEW_NHOP_INVALID))
{
+              attr = old_select->attr;
+              old_select->attr = (bgp_info_extra_get(old_select))->attr;
+      bgp_zebra_withdraw (p, old_select, safi);
+              old_select->attr = attr;
+            } else {
+      bgp_zebra_withdraw (p, old_select, safi);
+            }
+          }
  }
     }

@@ -2105,7 +2121,7 @@ bgp_update_main (struct peer *peer, struct prefix *p,
struct attr *attr,
   struct bgp *bgp;
   struct attr new_attr;
   struct attr_extra new_extra;
-  struct attr *attr_new;
+  struct attr *attr_new, *saved_attr;
   struct bgp_info *ri;
   struct bgp_info *new;
   const char *reason;
@@ -2302,8 +2318,9 @@ bgp_update_main (struct peer *peer, struct prefix *p,
struct attr *attr,
     bgp_damp_withdraw (ri, rn, afi, safi, 1);
  }

-      /* Update to new attribute.  */
-      bgp_attr_unintern (&ri->attr);
+      /* Update to new attribute.  Save the old attr to be freed after we
decide
+         the new attribute has next hop that's reachable or not */
+      saved_attr = ri->attr;
       ri->attr = attr_new;

       /* Update MPLS tag.  */
@@ -2318,10 +2335,11 @@ bgp_update_main (struct peer *peer, struct prefix
*p, struct attr *attr,
   ret = bgp_damp_update (ri, rn, afi, safi);
   if (ret == BGP_DAMP_SUPPRESSED)
     {
-      bgp_unlock_node (rn);
-      return 0;
-    }
- }
+              bgp_attr_unintern (&saved_attr);
+              bgp_unlock_node (rn);
+              return 0;
+            }
+        }

       /* Nexthop reachability check. */
       if ((afi == AFI_IP || afi == AFI_IP6)
@@ -2331,13 +2349,26 @@ bgp_update_main (struct peer *peer, struct prefix
*p, struct attr *attr,
       || (peer->sort == BGP_PEER_EBGP && peer->ttl != 1)
       || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
  {
-  if (bgp_nexthop_lookup (afi, peer, ri, NULL, NULL))
-    bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
-  else
-    bgp_info_unset_flag (rn, ri, BGP_INFO_VALID);
- }
-      else
+          if (bgp_nexthop_lookup (afi, peer, ri, NULL, NULL)) {
+            bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
+            bgp_attr_unintern (&saved_attr);
+            bgp_info_unset_flag (rn, ri, BGP_INFO_NEW_NHOP_INVALID);
+          } else {
+            bgp_info_unset_flag (rn, ri, BGP_INFO_VALID);
+            bgp_info_set_flag (rn, ri, BGP_INFO_NEW_NHOP_INVALID);
+            if (!ri->extra)
+              ri->extra = bgp_info_extra_new();
+            else
+              if (ri->extra->attr)
+                bgp_attr_unintern(&(ri->extra->attr));
+            ri->extra->attr = saved_attr;
+          }
+        }
+      else {
         bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
+        bgp_attr_unintern (&saved_attr);
+        bgp_info_unset_flag (rn, ri, BGP_INFO_NEW_NHOP_INVALID);
+      }

       /* Process change. */
       bgp_aggregate_increment (bgp, p, ri, afi, safi);
diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h
index 3d2eea5..60c9b54 100644
--- a/bgpd/bgp_route.h
+++ b/bgpd/bgp_route.h
@@ -40,6 +40,9 @@ struct bgp_info_extra

   /* MPLS label.  */
   u_char tag[3];
+
+  /* Attribute structure. Only for invalid next hop update case  */
+  struct attr *attr;
 };

 struct bgp_info
@@ -82,6 +85,7 @@ struct bgp_info
 #define BGP_INFO_COUNTED (1 << 10)
 #define BGP_INFO_MULTIPATH      (1 << 11)
 #define BGP_INFO_MULTIPATH_CHG  (1 << 12)
+#define BGP_INFO_NEW_NHOP_INVALID (1 << 13)

   /* BGP route type.  This can be static, RIP, OSPF, BGP etc.  */
   u_char type;


On Sat, Oct 24, 2015 at 7:50 PM, Martin Winter <
[email protected]> wrote:

> 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
>>
>

Attachment: changes
Description: Binary data

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

Reply via email to