summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_fsm.c8
-rw-r--r--bgpd/bgp_open.c2
-rw-r--r--bgpd/bgp_packet.c5
-rw-r--r--bgpd/bgp_route.c38
-rw-r--r--bgpd/bgpd.c2
-rw-r--r--lib/zebra.h5
6 files changed, 40 insertions, 20 deletions
diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c
index 60a6475330..a71364381e 100644
--- a/bgpd/bgp_fsm.c
+++ b/bgpd/bgp_fsm.c
@@ -509,7 +509,7 @@ bgp_graceful_restart_timer_expire (struct thread *thread)
/* NSF delete stale route */
for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
- for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++)
+ for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++)
if (peer->nsf[afi][safi])
bgp_clear_stale_route (peer, afi, safi);
@@ -542,7 +542,7 @@ bgp_graceful_stale_timer_expire (struct thread *thread)
/* NSF delete stale route */
for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
- for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++)
+ for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++)
if (peer->nsf[afi][safi])
bgp_clear_stale_route (peer, afi, safi);
@@ -1051,7 +1051,7 @@ bgp_stop (struct peer *peer)
UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_MODE);
for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
- for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++)
+ for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++)
peer->nsf[afi][safi] = 0;
}
@@ -1468,7 +1468,7 @@ bgp_establish (struct peer *peer)
/* graceful restart */
UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT);
for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
- for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++)
+ for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++)
{
if (peer->afc_nego[afi][safi]
&& CHECK_FLAG (peer->cap, PEER_CAP_RESTART_ADV)
diff --git a/bgpd/bgp_open.c b/bgpd/bgp_open.c
index 02026a004a..4c698562be 100644
--- a/bgpd/bgp_open.c
+++ b/bgpd/bgp_open.c
@@ -1536,7 +1536,7 @@ bgp_open_capability (struct stream *s, struct peer *peer)
if (peer->afc[afi][safi])
{
stream_putw (s, afi);
- stream_putc (s, safi);
+ stream_putc (s, (safi == SAFI_MPLS_VPN) ? SAFI_MPLS_LABELED_VPN : safi);
stream_putc (s, 0); //Forwarding is not retained as of now.
}
}
diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c
index 796a57f054..dffca37dd3 100644
--- a/bgpd/bgp_packet.c
+++ b/bgpd/bgp_packet.c
@@ -175,7 +175,7 @@ bgp_update_packet_eor (struct peer *peer, afi_t afi, safi_t safi)
stream_putc (s, BGP_ATTR_MP_UNREACH_NLRI);
stream_putc (s, 3);
stream_putw (s, afi);
- stream_putc (s, safi);
+ stream_putc (s, (safi == SAFI_MPLS_VPN) ? SAFI_MPLS_LABELED_VPN : safi);
}
bgp_packet_set_size (s);
@@ -240,8 +240,7 @@ bgp_write_packet (struct peer *peer)
if (!(PAF_SUBGRP(paf))->t_coalesce &&
peer->afc_nego[afi][safi] && peer->synctime
&& ! CHECK_FLAG (peer->af_sflags[afi][safi],
- PEER_STATUS_EOR_SEND)
- && safi != SAFI_MPLS_VPN)
+ PEER_STATUS_EOR_SEND))
{
SET_FLAG (peer->af_sflags[afi][safi],
PEER_STATUS_EOR_SEND);
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index cfc4ec3407..1e9aa4bb2a 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -3307,17 +3307,37 @@ bgp_clear_stale_route (struct peer *peer, afi_t afi, safi_t safi)
struct bgp_info *ri;
struct bgp_table *table;
- table = peer->bgp->rib[afi][safi];
+ if ( safi == SAFI_MPLS_VPN)
+ {
+ for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn; rn = bgp_route_next (rn))
+ {
+ struct bgp_node *rm;
+ struct bgp_info *ri;
- for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
+ /* look for neighbor in tables */
+ if ((table = rn->info) != NULL)
+ {
+ for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
+ for (ri = rm->info; ri; ri = ri->next)
+ if (ri->peer == peer)
+ {
+ if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
+ bgp_rib_remove (rm, ri, peer, afi, safi);
+ break;
+ }
+ }
+ }
+ }
+ else
{
- for (ri = rn->info; ri; ri = ri->next)
- if (ri->peer == peer)
- {
- if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
- bgp_rib_remove (rn, ri, peer, afi, safi);
- break;
- }
+ for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn; rn = bgp_route_next (rn))
+ for (ri = rn->info; ri; ri = ri->next)
+ if (ri->peer == peer)
+ {
+ if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
+ bgp_rib_remove (rn, ri, peer, afi, safi);
+ break;
+ }
}
}
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index 30f6e0d859..68ad6bbe11 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -1902,7 +1902,7 @@ peer_nsf_stop (struct peer *peer)
UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_MODE);
for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
- for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++)
+ for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++)
peer->nsf[afi][safi] = 0;
if (peer->t_gr_restart)
diff --git a/lib/zebra.h b/lib/zebra.h
index 5bb3590abd..fd1aa3cf7d 100644
--- a/lib/zebra.h
+++ b/lib/zebra.h
@@ -471,9 +471,10 @@ typedef enum {
/* Subsequent Address Family Identifier. */
#define SAFI_UNICAST 1
#define SAFI_MULTICAST 2
-#define SAFI_RESERVED_3 3
-#define SAFI_MPLS_VPN 4
+#define SAFI_MPLS_VPN 3
+#define SAFI_RESERVED_4 4
#define SAFI_ENCAP 7 /* per IANA */
+#define SAFI_RESERVED_5 5
#define SAFI_MAX 8
/* Default Administrative Distance of each protocol. */