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