This commit appends or withdraw entries in ADJ-RIB-IN entries of VRF RIB tables.
Signed-off-by: Philippe Guibert <philippe.guib...@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