Mailing List Archive

[PATCH 57/57] bgpd: VRF adj rib in update
This commit appends or withdraw entries in ADJ-RIB-IN entries of VRF
RIB tables.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
---
bgpd/bgp_route.c | 45 +++++++++++++++++++++++++++++++++------------
1 file changed, 33 insertions(+), 12 deletions(-)

diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 789e219a1178..674dbced9a6c 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -1800,10 +1800,13 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, safi_t safi, struct bgp_nod
struct bgp_node *vrf_rn;
struct bgp_info *iter = NULL;
struct prefix_rd *prd;
- char pfx_str[INET6_BUFSIZ];
+ char pfx_str[PREFIX_STRLEN];
+ afi_t afi_int;

if(afi == AFI_INTERNAL_L2VPN)
- afi = AFI_IP; /* XXX should be set to appropriate AFI : AF_INET or AF_INET6 */
+ afi_int = AFI_IP; /* XXX should be set to appropriate AFI : AF_INET or AF_INET6 */
+ else
+ afi_int = afi;
prd = &bgp_node_table (rn)->prd;
if (BGP_DEBUG (events, EVENTS))
{
@@ -1815,9 +1818,9 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, safi_t safi, struct bgp_nod
prefix2str(&rn->p, pfx_str, sizeof(pfx_str));
if(select && select->attr && select->attr->extra)
{
- if (afi == AFI_IP)
+ if (afi_int == AFI_IP)
strcpy (nh_str, inet_ntoa (select->attr->extra->mp_nexthop_global_in));
- else if (afi == AFI_IP6)
+ else if (afi_int == AFI_IP6)
inet_ntop (AF_INET6, &select->attr->extra->mp_nexthop_global, nh_str, BUFSIZ);
}
else if(select)
@@ -1835,11 +1838,11 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, safi_t safi, struct bgp_nod
/* check if global RIB plans for destroying initial entry
* if yes, then suppress it
*/
- if(!vrf || !vrf->rib[afi] || !select)
+ if(!vrf || !vrf->rib[afi_int] || !select)
{
return;
}
- vrf_rn = bgp_node_get (vrf->rib[afi], &rn->p);
+ vrf_rn = bgp_node_get (vrf->rib[afi_int], &rn->p);
if(!vrf_rn)
{
return;
@@ -1852,6 +1855,15 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, safi_t safi, struct bgp_nod
{
if(iter->peer->remote_id.s_addr == select->peer->remote_id.s_addr)
{
+ if (CHECK_FLAG (iter->peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
+ && iter->peer != iter->peer->bgp->peer_self)
+ if (!bgp_adj_in_unset (vrf_rn, iter->peer))
+ {
+ prefix2str(&vrf_rn->p, pfx_str, sizeof(pfx_str));
+ if (BGP_DEBUG (update, UPDATE_IN))
+ zlog (iter->peer->log, LOG_DEBUG, "%s withdrawing route %s "
+ "not in adj-in", iter->peer->host, pfx_str);
+ }
bgp_info_delete(vrf_rn, iter);
prefix2str(&vrf_rn->p, pfx_str, sizeof(pfx_str));
if (BGP_DEBUG (events, EVENTS))
@@ -1859,9 +1871,9 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, safi_t safi, struct bgp_nod
char nh_str[BUFSIZ] = "<?>";
if(iter->attr && iter->attr->extra)
{
- if (afi == AFI_IP)
+ if (afi_int == AFI_IP)
strcpy (nh_str, inet_ntoa (iter->attr->extra->mp_nexthop_global_in));
- else if (afi == AFI_IP6)
+ else if (afi_int == AFI_IP6)
inet_ntop (AF_INET6, &iter->attr->extra->mp_nexthop_global, nh_str, BUFSIZ);
}
else
@@ -1872,7 +1884,7 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, safi_t safi, struct bgp_nod
zlog_debug ("%s: processing entry (for removal) from %s [ nh %s]",
pfx_str, iter->peer->host, nh_str);
}
- bgp_process (iter->peer->bgp, vrf_rn, afi, SAFI_UNICAST);
+ bgp_process (iter->peer->bgp, vrf_rn, afi_int, SAFI_UNICAST);
break;
}
}
@@ -1927,9 +1939,9 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, safi_t safi, struct bgp_nod
prefix2str(&rn->p, pfx_str, sizeof(pfx_str));
if(iter->attr && iter->attr->extra)
{
- if (afi == AFI_IP)
+ if (afi_int == AFI_IP)
strcpy (nh_str, inet_ntoa (iter->attr->extra->mp_nexthop_global_in));
- else if (afi == AFI_IP6)
+ else if (afi_int == AFI_IP6)
inet_ntop (AF_INET6, &iter->attr->extra->mp_nexthop_global, nh_str, BUFSIZ);
}
else
@@ -1942,7 +1954,16 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, safi_t safi, struct bgp_nod
iter->peer->host, nh_str);

}
- bgp_process (iter->peer->bgp, vrf_rn, afi, SAFI_UNICAST);
+ /* When peer's soft reconfiguration enabled. Record input packet in
+ Adj-RIBs-In. */
+ if( ( action == ROUTE_INFO_TO_UPDATE) || (action == ROUTE_INFO_TO_ADD ))
+ {
+ /* soft_reconfig is set to 0 so, it should work XXX */
+ if ( CHECK_FLAG (iter->peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
+ && iter->peer != iter->peer->bgp->peer_self)
+ bgp_adj_in_set (vrf_rn, iter->peer, iter->attr);
+ }
+ bgp_process (iter->peer->bgp, vrf_rn, afi_int, SAFI_UNICAST);
}
}

--
2.1.4


_______________________________________________
Quagga-dev mailing list
Quagga-dev@lists.quagga.net
https://lists.quagga.net/mailman/listinfo/quagga-dev