---
 bgpd/bgp_fsm.c |  3 +++
 bgpd/bgp_nht.c | 39 +++++++++++++++++++++++++++++++++++++++
 bgpd/bgp_nht.h |  8 ++++++++
 3 files changed, 50 insertions(+)

diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c
index d84a865..8001e3b 100644
--- a/bgpd/bgp_fsm.c
+++ b/bgpd/bgp_fsm.c
@@ -457,6 +457,8 @@ bgp_stop (struct peer *peer)
       BGP_EVENT_FLUSH (peer);
     }
 
+  bgp_drop_peer_nexthop(family2afi(peer->su.sa.sa_family), peer);
+
   /* Increment Dropped count. */
   if (peer->status == Established)
     {
@@ -721,6 +723,7 @@ bgp_start (struct peer *peer)
 
   bgp_find_or_add_nexthop(family2afi(peer->su.sa.sa_family), NULL, peer,
                          connected);
+
   status = bgp_connect (peer);
 
   switch (status)
diff --git a/bgpd/bgp_nht.c b/bgpd/bgp_nht.c
index 34b5fd1..2549e9e 100644
--- a/bgpd/bgp_nht.c
+++ b/bgpd/bgp_nht.c
@@ -90,6 +90,45 @@ bgp_unlink_nexthop (struct bgp_info *path)
     }
 }
 
+void
+bgp_drop_peer_nexthop (afi_t afi, struct peer *peer)
+{
+  struct bgp_node *rn;
+  struct prefix p;
+
+  if (peer == NULL)
+    return;
+
+  if (afi == AFI_IP)
+    {
+      p.family = AF_INET;
+      p.prefixlen = IPV4_MAX_BITLEN;
+      p.u.prefix4 = peer->su.sin.sin_addr;
+    }
+  else if (afi == AFI_IP6)
+    {
+      p.family = AF_INET6;
+      p.prefixlen = IPV6_MAX_BITLEN;
+      p.u.prefix6 = peer->su.sin6.sin6_addr;
+    } 
+  else
+    return;                     /* unknown AFI */
+
+  rn = bgp_node_get (bgp_nexthop_cache_table[afi], &p);
+
+  if (rn->info)
+    {  
+      struct bgp_nexthop_cache *bnc;
+      bnc = rn->info;
+      unregister_nexthop(bnc);
+      bnc->node->info = NULL;
+      bgp_unlock_node(bnc->node);
+      bnc_free(bnc);
+    }
+
+  bgp_unlock_node (rn);
+}
+
 int
 bgp_find_or_add_nexthop (afi_t afi, struct bgp_info *ri, struct peer *peer,
                         int connected)
diff --git a/bgpd/bgp_nht.h b/bgpd/bgp_nht.h
index 2bced7f..08e7019 100644
--- a/bgpd/bgp_nht.h
+++ b/bgpd/bgp_nht.h
@@ -55,4 +55,12 @@ extern int bgp_find_or_add_nexthop(afi_t a, struct bgp_info 
*p,
  */
 extern void bgp_unlink_nexthop(struct bgp_info *p);
 
+/**
+ * bgp_unlink_nexthop() - Drop the nexthop object based on a peer.
+ * ARGUMENTS:
+ *   a - afi: AFI_IP or AF_IP6
+ *   peer - The BGP peer associated with this NHT
+ */
+extern void bgp_drop_peer_nexthop(afi_t afi, struct peer *peer);
+
 #endif /* _BGP_NHT_H */
-- 
2.1.3


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

Reply via email to