From 28070ee3c43a868644ec7ff91b9fc3b064f9502c Mon Sep 17 00:00:00 2001 From: "G. Paul Ziemba" Date: Mon, 16 Jan 2017 11:09:12 -0800 Subject: [PATCH] bgpd rfapi: Shift rfapi receive hooks for vpn and encap safis into bgp_update/bgp_withdraw (Issue #91) Signed-off-by: G. Paul Ziemba --- bgpd/bgp_encap.c | 8 -------- bgpd/bgp_mplsvpn.c | 30 +++++++----------------------- bgpd/bgp_route.c | 37 +++++++++++++++++++++++++++++++++++++ bgpd/rfapi/rfapi.c | 5 +++-- bgpd/rfapi/rfapi_import.c | 6 ++++++ 5 files changed, 53 insertions(+), 33 deletions(-) diff --git a/bgpd/bgp_encap.c b/bgpd/bgp_encap.c index 75a348e3fe..3fe8988b9c 100644 --- a/bgpd/bgp_encap.c +++ b/bgpd/bgp_encap.c @@ -188,15 +188,7 @@ bgp_nlri_parse_encap( if (attr) { bgp_update (peer, &p, 0, attr, afi, SAFI_ENCAP, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, NULL, 0); -#if ENABLE_BGP_VNC - rfapiProcessUpdate(peer, NULL, &p, &prd, attr, afi, SAFI_ENCAP, - ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL); -#endif } else { -#if ENABLE_BGP_VNC - rfapiProcessWithdraw(peer, NULL, &p, &prd, attr, afi, SAFI_ENCAP, - ZEBRA_ROUTE_BGP, 0); -#endif bgp_withdraw (peer, &p, 0, attr, afi, SAFI_ENCAP, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, NULL); } diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c index bfbddb6c30..a789c6f192 100644 --- a/bgpd/bgp_mplsvpn.c +++ b/bgpd/bgp_mplsvpn.c @@ -173,9 +173,6 @@ bgp_nlri_parse_vpn (struct peer *peer, struct attr *attr, safi_t safi; int addpath_encoded; u_int32_t addpath_id; -#if ENABLE_BGP_VNC - u_int32_t label = 0; -#endif /* Check peer status. */ if (peer->status != Established) @@ -251,10 +248,6 @@ bgp_nlri_parse_vpn (struct peer *peer, struct attr *attr, return -1; } -#if ENABLE_BGP_VNC - label = decode_label (pnt); -#endif - /* Copyr label to prefix. */ tagpnt = pnt; @@ -294,23 +287,14 @@ bgp_nlri_parse_vpn (struct peer *peer, struct attr *attr, if (attr) { - bgp_update (peer, &p, addpath_id, attr, packet->afi, SAFI_MPLS_VPN, - ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, tagpnt, 0); -#if ENABLE_BGP_VNC - rfapiProcessUpdate(peer, NULL, &p, &prd, attr, packet->afi, - SAFI_MPLS_VPN, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, - &label); -#endif + bgp_update (peer, &p, addpath_id, attr, packet->afi, SAFI_MPLS_VPN, + ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, tagpnt, 0); } else { -#if ENABLE_BGP_VNC - rfapiProcessWithdraw(peer, NULL, &p, &prd, attr, packet->afi, - SAFI_MPLS_VPN, ZEBRA_ROUTE_BGP, 0); -#endif - bgp_withdraw (peer, &p, addpath_id, attr, packet->afi, SAFI_MPLS_VPN, - ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, tagpnt); - } + bgp_withdraw (peer, &p, addpath_id, attr, packet->afi, SAFI_MPLS_VPN, + ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, tagpnt); + } } /* Packet length consistency check. */ if (pnt != lim) @@ -657,7 +641,7 @@ show_adj_route_vpn (struct vty *vty, struct peer *peer, struct prefix_rd *prd, u struct rd_as rd_as; struct rd_ip rd_ip = {0}; #if ENABLE_BGP_VNC - struct rd_vnc_eth rd_vnc_eth; + struct rd_vnc_eth rd_vnc_eth = {0}; #endif u_char *pnt; @@ -867,7 +851,7 @@ bgp_show_mpls_vpn (struct vty *vty, afi_t afi, struct prefix_rd *prd, struct rd_as rd_as; struct rd_ip rd_ip = {0}; #if ENABLE_BGP_VNC - struct rd_vnc_eth rd_vnc_eth; + struct rd_vnc_eth rd_vnc_eth = {0}; #endif u_char *pnt; diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 5fdda66258..0e9c71c1ee 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -2680,6 +2680,21 @@ bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id, bgp_process (bgp, rn, afi, safi); bgp_unlock_node (rn); +#if ENABLE_BGP_VNC + if (SAFI_MPLS_VPN == safi) + { + uint32_t label = decode_label(tag); + + rfapiProcessUpdate(peer, NULL, p, prd, attr, afi, safi, type, sub_type, + &label); + } + if (SAFI_ENCAP == safi) + { + rfapiProcessUpdate(peer, NULL, p, prd, attr, afi, safi, type, sub_type, + NULL); + } +#endif + return 0; } // End of implicit withdraw @@ -2774,6 +2789,21 @@ bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id, /* Process change. */ bgp_process (bgp, rn, afi, safi); +#if ENABLE_BGP_VNC + if (SAFI_MPLS_VPN == safi) + { + uint32_t label = decode_label(tag); + + rfapiProcessUpdate(peer, NULL, p, prd, attr, afi, safi, type, sub_type, + &label); + } + if (SAFI_ENCAP == safi) + { + rfapiProcessUpdate(peer, NULL, p, prd, attr, afi, safi, type, sub_type, + NULL); + } +#endif + return 0; /* This BGP update is filtered. Log the reason then update BGP @@ -2813,6 +2843,13 @@ bgp_withdraw (struct peer *peer, struct prefix *p, u_int32_t addpath_id, struct bgp_node *rn; struct bgp_info *ri; +#if ENABLE_BGP_VNC + if ((SAFI_MPLS_VPN == safi) || (SAFI_ENCAP == safi)) + { + rfapiProcessWithdraw(peer, NULL, p, prd, NULL, afi, safi, type, 0); + } +#endif + bgp = peer->bgp; /* Lookup node. */ diff --git a/bgpd/rfapi/rfapi.c b/bgpd/rfapi/rfapi.c index 6353f7dacf..25fb7aaf65 100644 --- a/bgpd/rfapi/rfapi.c +++ b/bgpd/rfapi/rfapi.c @@ -417,9 +417,10 @@ del_vnc_route ( { vnc_zlog_debug_verbose - ("%s: trying bi=%p, bi->peer=%p, bi->type=%d, bi->sub_type=%d, bi->extra->vnc.export.rfapi_handle=%p", + ("%s: trying bi=%p, bi->peer=%p, bi->type=%d, bi->sub_type=%d, bi->extra->vnc.export.rfapi_handle=%p, local_pref=%u", __func__, bi, bi->peer, bi->type, bi->sub_type, - (bi->extra ? bi->extra->vnc.export.rfapi_handle : NULL)); + (bi->extra ? bi->extra->vnc.export.rfapi_handle : NULL), + ((bi->attr && CHECK_FLAG(bi->attr->flag, ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF)))? bi->attr->local_pref: 0)); if (bi->peer == peer && bi->type == type && diff --git a/bgpd/rfapi/rfapi_import.c b/bgpd/rfapi/rfapi_import.c index e6fdb7180e..590691a6b7 100644 --- a/bgpd/rfapi/rfapi_import.c +++ b/bgpd/rfapi/rfapi_import.c @@ -3724,6 +3724,12 @@ rfapiBgpInfoFilteredImportVPN ( if (rn->info) original_had_routes = 1; + if (VNC_DEBUG(VERBOSE)) + { + vnc_zlog_debug_verbose ("%s: showing IT node on entry", __func__); + rfapiShowItNode (NULL, rn); /* debug */ + } + /* * Look for same route (will have same RD and peer) */ -- 2.39.5