diff options
Diffstat (limited to 'bgpd/rfapi/rfapi_monitor.c')
-rw-r--r-- | bgpd/rfapi/rfapi_monitor.c | 2677 |
1 files changed, 1282 insertions, 1395 deletions
diff --git a/bgpd/rfapi/rfapi_monitor.c b/bgpd/rfapi/rfapi_monitor.c index 275e44896..9c0d9da6f 100644 --- a/bgpd/rfapi/rfapi_monitor.c +++ b/bgpd/rfapi/rfapi_monitor.c @@ -1,4 +1,4 @@ -/* +/* * * Copyright 2009-2016, LabN Consulting, L.L.C. * @@ -54,49 +54,44 @@ #define DEBUG_DUP_CHECK 0 #define DEBUG_ETH_SL 0 -static void -rfapiMonitorTimerRestart (struct rfapi_monitor_vpn *m); +static void rfapiMonitorTimerRestart(struct rfapi_monitor_vpn *m); -static void -rfapiMonitorEthTimerRestart (struct rfapi_monitor_eth *m); +static void rfapiMonitorEthTimerRestart(struct rfapi_monitor_eth *m); /* * Forward declarations */ -static void -rfapiMonitorEthDetachImport (struct bgp *bgp, struct rfapi_monitor_eth *mon); +static void rfapiMonitorEthDetachImport(struct bgp *bgp, + struct rfapi_monitor_eth *mon); #if DEBUG_ETH_SL /* * Debug function, special case */ -void -rfapiMonitorEthSlCheck( - struct route_node *rn, - const char *tag1, - const char *tag2) +void rfapiMonitorEthSlCheck(struct route_node *rn, const char *tag1, + const char *tag2) { - struct route_node *rn_saved = NULL; - static struct skiplist *sl_saved = NULL; - struct skiplist *sl; - - if (!rn) - return; - - if (rn_saved && (rn != rn_saved)) - return; - - if (!rn_saved) - rn_saved = rn; - - sl = RFAPI_MONITOR_ETH(rn); - if (sl || sl_saved) - { - vnc_zlog_debug_verbose("%s[%s%s]: rn=%p, rn->lock=%d, old sl=%p, new sl=%p", - __func__, (tag1? tag1: ""), (tag2? tag2: ""), rn, rn->lock, - sl_saved, sl); - sl_saved = sl; - } + struct route_node *rn_saved = NULL; + static struct skiplist *sl_saved = NULL; + struct skiplist *sl; + + if (!rn) + return; + + if (rn_saved && (rn != rn_saved)) + return; + + if (!rn_saved) + rn_saved = rn; + + sl = RFAPI_MONITOR_ETH(rn); + if (sl || sl_saved) { + vnc_zlog_debug_verbose( + "%s[%s%s]: rn=%p, rn->lock=%d, old sl=%p, new sl=%p", + __func__, (tag1 ? tag1 : ""), (tag2 ? tag2 : ""), rn, + rn->lock, sl_saved, sl); + sl_saved = sl; + } } #endif @@ -104,13 +99,12 @@ rfapiMonitorEthSlCheck( * Debugging function that aborts when it finds monitors whose * "next" pointer * references themselves */ -void -rfapiMonitorLoopCheck (struct rfapi_monitor_vpn *mchain) +void rfapiMonitorLoopCheck(struct rfapi_monitor_vpn *mchain) { - struct rfapi_monitor_vpn *m; + struct rfapi_monitor_vpn *m; - for (m = mchain; m; m = m->next) - assert (m != m->next); + for (m = mchain; m; m = m->next) + assert(m != m->next); } #if DEBUG_DUP_CHECK @@ -118,381 +112,349 @@ rfapiMonitorLoopCheck (struct rfapi_monitor_vpn *mchain) * Debugging code: see if a monitor is mentioned more than once * in a HD's monitor list */ -void -rfapiMonitorDupCheck (struct bgp *bgp) +void rfapiMonitorDupCheck(struct bgp *bgp) { - struct listnode *hnode; - struct rfapi_descriptor *rfd; - - for (ALL_LIST_ELEMENTS_RO (&bgp->rfapi->descriptors, hnode, rfd)) - { - struct route_node *mrn; - - if (!rfd->mon) - continue; - - for (mrn = route_top (rfd->mon); mrn; mrn = route_next (mrn)) - { - struct rfapi_monitor_vpn *m; - for (m = (struct rfapi_monitor_vpn *) (mrn->info); m; m = m->next) - m->dcount = 0; - } - } - - for (ALL_LIST_ELEMENTS_RO (&bgp->rfapi->descriptors, hnode, rfd)) - { - struct route_node *mrn; - - if (!rfd->mon) - continue; - - for (mrn = route_top (rfd->mon); mrn; mrn = route_next (mrn)) - { - struct rfapi_monitor_vpn *m; - - for (m = (struct rfapi_monitor_vpn *) (mrn->info); m; m = m->next) - assert (++m->dcount == 1); - } - } + struct listnode *hnode; + struct rfapi_descriptor *rfd; + + for (ALL_LIST_ELEMENTS_RO(&bgp->rfapi->descriptors, hnode, rfd)) { + struct route_node *mrn; + + if (!rfd->mon) + continue; + + for (mrn = route_top(rfd->mon); mrn; mrn = route_next(mrn)) { + struct rfapi_monitor_vpn *m; + for (m = (struct rfapi_monitor_vpn *)(mrn->info); m; + m = m->next) + m->dcount = 0; + } + } + + for (ALL_LIST_ELEMENTS_RO(&bgp->rfapi->descriptors, hnode, rfd)) { + struct route_node *mrn; + + if (!rfd->mon) + continue; + + for (mrn = route_top(rfd->mon); mrn; mrn = route_next(mrn)) { + struct rfapi_monitor_vpn *m; + + for (m = (struct rfapi_monitor_vpn *)(mrn->info); m; + m = m->next) + assert(++m->dcount == 1); + } + } } #endif /* debug */ -void -rfapiMonitorCleanCheck (struct bgp *bgp) +void rfapiMonitorCleanCheck(struct bgp *bgp) { - struct listnode *hnode; - struct rfapi_descriptor *rfd; + struct listnode *hnode; + struct rfapi_descriptor *rfd; - for (ALL_LIST_ELEMENTS_RO (&bgp->rfapi->descriptors, hnode, rfd)) - { - assert (!rfd->import_table->vpn0_queries[AFI_IP]); - assert (!rfd->import_table->vpn0_queries[AFI_IP6]); + for (ALL_LIST_ELEMENTS_RO(&bgp->rfapi->descriptors, hnode, rfd)) { + assert(!rfd->import_table->vpn0_queries[AFI_IP]); + assert(!rfd->import_table->vpn0_queries[AFI_IP6]); - struct route_node *rn; + struct route_node *rn; - for (rn = route_top (rfd->import_table->imported_vpn[AFI_IP]); rn; - rn = route_next (rn)) - { + for (rn = route_top(rfd->import_table->imported_vpn[AFI_IP]); + rn; rn = route_next(rn)) { - assert (!RFAPI_MONITOR_VPN (rn)); - } - for (rn = route_top (rfd->import_table->imported_vpn[AFI_IP6]); rn; - rn = route_next (rn)) - { + assert(!RFAPI_MONITOR_VPN(rn)); + } + for (rn = route_top(rfd->import_table->imported_vpn[AFI_IP6]); + rn; rn = route_next(rn)) { - assert (!RFAPI_MONITOR_VPN (rn)); - } - } + assert(!RFAPI_MONITOR_VPN(rn)); + } + } } /* debug */ -void -rfapiMonitorCheckAttachAllowed (void) +void rfapiMonitorCheckAttachAllowed(void) { - struct bgp *bgp = bgp_get_default (); - assert (!(bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE)); + struct bgp *bgp = bgp_get_default(); + assert(!(bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE)); } -void -rfapiMonitorExtraFlush (safi_t safi, struct route_node *rn) +void rfapiMonitorExtraFlush(safi_t safi, struct route_node *rn) { - struct rfapi_it_extra *hie; - struct rfapi_monitor_vpn *v; - struct rfapi_monitor_vpn *v_next; - struct rfapi_monitor_encap *e = NULL; - struct rfapi_monitor_encap *e_next = NULL; - - if (!rn) - return; - - if (!rn->aggregate) - return; - - hie = (struct rfapi_it_extra *) (rn->aggregate); - - switch (safi) - { - case SAFI_ENCAP: - for (e = hie->u.encap.e; e; e = e_next) - { - e_next = e->next; - e->next = NULL; - XFREE (MTYPE_RFAPI_MONITOR_ENCAP, e); - route_unlock_node (rn); - } - hie->u.encap.e = NULL; - break; - - case SAFI_MPLS_VPN: - for (v = hie->u.vpn.v; v; v = v_next) - { - v_next = v->next; - v->next = NULL; - XFREE (MTYPE_RFAPI_MONITOR, e); - route_unlock_node (rn); - } - hie->u.vpn.v = NULL; - if (hie->u.vpn.e.source) - { - while (!skiplist_delete_first (hie->u.vpn.e.source)) - { - route_unlock_node (rn); - } - skiplist_free (hie->u.vpn.e.source); - hie->u.vpn.e.source = NULL; - route_unlock_node (rn); - } - if (hie->u.vpn.idx_rd) - { - /* looping through bi->extra->vnc.import.rd is tbd */ - while (!skiplist_delete_first (hie->u.vpn.idx_rd)) - { - route_unlock_node (rn); - } - skiplist_free (hie->u.vpn.idx_rd); - hie->u.vpn.idx_rd = NULL; - route_unlock_node (rn); - } - if (hie->u.vpn.mon_eth) - { - while (!skiplist_delete_first (hie->u.vpn.mon_eth)) - { - route_unlock_node (rn); - } - skiplist_free (hie->u.vpn.mon_eth); - hie->u.vpn.mon_eth = NULL; - route_unlock_node (rn); - } - break; - - default: - assert (0); - } - XFREE (MTYPE_RFAPI_IT_EXTRA, hie); - rn->aggregate = NULL; - route_unlock_node (rn); + struct rfapi_it_extra *hie; + struct rfapi_monitor_vpn *v; + struct rfapi_monitor_vpn *v_next; + struct rfapi_monitor_encap *e = NULL; + struct rfapi_monitor_encap *e_next = NULL; + + if (!rn) + return; + + if (!rn->aggregate) + return; + + hie = (struct rfapi_it_extra *)(rn->aggregate); + + switch (safi) { + case SAFI_ENCAP: + for (e = hie->u.encap.e; e; e = e_next) { + e_next = e->next; + e->next = NULL; + XFREE(MTYPE_RFAPI_MONITOR_ENCAP, e); + route_unlock_node(rn); + } + hie->u.encap.e = NULL; + break; + + case SAFI_MPLS_VPN: + for (v = hie->u.vpn.v; v; v = v_next) { + v_next = v->next; + v->next = NULL; + XFREE(MTYPE_RFAPI_MONITOR, e); + route_unlock_node(rn); + } + hie->u.vpn.v = NULL; + if (hie->u.vpn.e.source) { + while (!skiplist_delete_first(hie->u.vpn.e.source)) { + route_unlock_node(rn); + } + skiplist_free(hie->u.vpn.e.source); + hie->u.vpn.e.source = NULL; + route_unlock_node(rn); + } + if (hie->u.vpn.idx_rd) { + /* looping through bi->extra->vnc.import.rd is tbd */ + while (!skiplist_delete_first(hie->u.vpn.idx_rd)) { + route_unlock_node(rn); + } + skiplist_free(hie->u.vpn.idx_rd); + hie->u.vpn.idx_rd = NULL; + route_unlock_node(rn); + } + if (hie->u.vpn.mon_eth) { + while (!skiplist_delete_first(hie->u.vpn.mon_eth)) { + route_unlock_node(rn); + } + skiplist_free(hie->u.vpn.mon_eth); + hie->u.vpn.mon_eth = NULL; + route_unlock_node(rn); + } + break; + + default: + assert(0); + } + XFREE(MTYPE_RFAPI_IT_EXTRA, hie); + rn->aggregate = NULL; + route_unlock_node(rn); } /* * If the child lists are empty, release the rfapi_it_extra struct */ -void -rfapiMonitorExtraPrune (safi_t safi, struct route_node *rn) +void rfapiMonitorExtraPrune(safi_t safi, struct route_node *rn) { - struct rfapi_it_extra *hie; - - if (!rn) - return; - - if (!rn->aggregate) - return; - - hie = (struct rfapi_it_extra *) (rn->aggregate); - - switch (safi) - { - case SAFI_ENCAP: - if (hie->u.encap.e) - return; - break; - - case SAFI_MPLS_VPN: - if (hie->u.vpn.v) - return; - if (hie->u.vpn.mon_eth) - { - if (skiplist_count (hie->u.vpn.mon_eth)) - return; - skiplist_free (hie->u.vpn.mon_eth); - hie->u.vpn.mon_eth = NULL; - route_unlock_node (rn); /* uncount skiplist */ - } - if (hie->u.vpn.e.source) - { - if (skiplist_count (hie->u.vpn.e.source)) - return; - skiplist_free (hie->u.vpn.e.source); - hie->u.vpn.e.source = NULL; - route_unlock_node (rn); - } - if (hie->u.vpn.idx_rd) - { - if (skiplist_count (hie->u.vpn.idx_rd)) - return; - skiplist_free (hie->u.vpn.idx_rd); - hie->u.vpn.idx_rd = NULL; - route_unlock_node (rn); - } - if (hie->u.vpn.mon_eth) - { - if (skiplist_count (hie->u.vpn.mon_eth)) - return; - skiplist_free (hie->u.vpn.mon_eth); - hie->u.vpn.mon_eth = NULL; - route_unlock_node (rn); - } - break; - - default: - assert (0); - } - XFREE (MTYPE_RFAPI_IT_EXTRA, hie); - rn->aggregate = NULL; - route_unlock_node (rn); + struct rfapi_it_extra *hie; + + if (!rn) + return; + + if (!rn->aggregate) + return; + + hie = (struct rfapi_it_extra *)(rn->aggregate); + + switch (safi) { + case SAFI_ENCAP: + if (hie->u.encap.e) + return; + break; + + case SAFI_MPLS_VPN: + if (hie->u.vpn.v) + return; + if (hie->u.vpn.mon_eth) { + if (skiplist_count(hie->u.vpn.mon_eth)) + return; + skiplist_free(hie->u.vpn.mon_eth); + hie->u.vpn.mon_eth = NULL; + route_unlock_node(rn); /* uncount skiplist */ + } + if (hie->u.vpn.e.source) { + if (skiplist_count(hie->u.vpn.e.source)) + return; + skiplist_free(hie->u.vpn.e.source); + hie->u.vpn.e.source = NULL; + route_unlock_node(rn); + } + if (hie->u.vpn.idx_rd) { + if (skiplist_count(hie->u.vpn.idx_rd)) + return; + skiplist_free(hie->u.vpn.idx_rd); + hie->u.vpn.idx_rd = NULL; + route_unlock_node(rn); + } + if (hie->u.vpn.mon_eth) { + if (skiplist_count(hie->u.vpn.mon_eth)) + return; + skiplist_free(hie->u.vpn.mon_eth); + hie->u.vpn.mon_eth = NULL; + route_unlock_node(rn); + } + break; + + default: + assert(0); + } + XFREE(MTYPE_RFAPI_IT_EXTRA, hie); + rn->aggregate = NULL; + route_unlock_node(rn); } /* * returns locked node */ -struct route_node * -rfapiMonitorGetAttachNode (struct rfapi_descriptor *rfd, struct prefix *p) +struct route_node *rfapiMonitorGetAttachNode(struct rfapi_descriptor *rfd, + struct prefix *p) { - afi_t afi; - struct route_node *rn; - - if (RFAPI_0_PREFIX (p)) - { - assert (1); - } - - afi = family2afi (p->family); - assert (afi); - - /* - * It's possible that even though there is a route at this node, - * there are no routes with valid UN addresses (i.e,. with no - * valid tunnel routes). Check for that and walk back up the - * tree if necessary. - * - * When the outer loop completes, the matched node, if any, is - * locked (i.e., its reference count has been incremented) to - * account for the VPN monitor we are about to attach. - * - * if a monitor is moved to another node, there must be - * corresponding unlock/locks - */ - for (rn = route_node_match (rfd->import_table->imported_vpn[afi], p); rn;) - { - - struct bgp_info *bi; - struct prefix pfx_dummy; - - /* TBD update this code to use new valid_interior_count */ - for (bi = rn->info; bi; bi = bi->next) - { - /* - * If there is a cached ENCAP UN address, it's a usable - * VPN route - */ - if (bi->extra && bi->extra->vnc.import.un_family) - { - break; - } - - /* - * Or if there is a valid Encap Attribute tunnel subtlv address, - * it's a usable VPN route. - */ - if (!rfapiGetVncTunnelUnAddr (bi->attr, &pfx_dummy)) - { - break; - } - } - if (bi) - break; - - route_unlock_node (rn); - if ((rn = rn->parent)) - { - route_lock_node (rn); - } - } - - if (!rn) - { - struct prefix pfx_default; - - memset (&pfx_default, 0, sizeof (pfx_default)); - pfx_default.family = p->family; - - /* creates default node if none exists, and increments ref count */ - rn = - route_node_get (rfd->import_table->imported_vpn[afi], &pfx_default); - } - - return rn; + afi_t afi; + struct route_node *rn; + + if (RFAPI_0_PREFIX(p)) { + assert(1); + } + + afi = family2afi(p->family); + assert(afi); + + /* + * It's possible that even though there is a route at this node, + * there are no routes with valid UN addresses (i.e,. with no + * valid tunnel routes). Check for that and walk back up the + * tree if necessary. + * + * When the outer loop completes, the matched node, if any, is + * locked (i.e., its reference count has been incremented) to + * account for the VPN monitor we are about to attach. + * + * if a monitor is moved to another node, there must be + * corresponding unlock/locks + */ + for (rn = route_node_match(rfd->import_table->imported_vpn[afi], p); + rn;) { + + struct bgp_info *bi; + struct prefix pfx_dummy; + + /* TBD update this code to use new valid_interior_count */ + for (bi = rn->info; bi; bi = bi->next) { + /* + * If there is a cached ENCAP UN address, it's a usable + * VPN route + */ + if (bi->extra && bi->extra->vnc.import.un_family) { + break; + } + + /* + * Or if there is a valid Encap Attribute tunnel subtlv + * address, + * it's a usable VPN route. + */ + if (!rfapiGetVncTunnelUnAddr(bi->attr, &pfx_dummy)) { + break; + } + } + if (bi) + break; + + route_unlock_node(rn); + if ((rn = rn->parent)) { + route_lock_node(rn); + } + } + + if (!rn) { + struct prefix pfx_default; + + memset(&pfx_default, 0, sizeof(pfx_default)); + pfx_default.family = p->family; + + /* creates default node if none exists, and increments ref count + */ + rn = route_node_get(rfd->import_table->imported_vpn[afi], + &pfx_default); + } + + return rn; } -/* +/* * If this function happens to attach the monitor to a radix tree * node (as opposed to the 0-prefix list), the node pointer is * returned (for the benefit of caller which might like to use it * to generate an immediate query response). */ -static struct route_node * -rfapiMonitorAttachImport (struct rfapi_descriptor *rfd, - struct rfapi_monitor_vpn *m) +static struct route_node *rfapiMonitorAttachImport(struct rfapi_descriptor *rfd, + struct rfapi_monitor_vpn *m) { - struct route_node *rn; - - rfapiMonitorCheckAttachAllowed (); - - if (RFAPI_0_PREFIX (&m->p)) - { - /* - * Add new monitor entry to vpn0 list - */ - afi_t afi; - - afi = family2afi (m->p.family); - assert (afi); - - m->next = rfd->import_table->vpn0_queries[afi]; - rfd->import_table->vpn0_queries[afi] = m; - vnc_zlog_debug_verbose ("%s: attached monitor %p to vpn0 list", __func__, m); - return NULL; - } - - /* - * Attach new monitor entry to import table node - */ - rn = rfapiMonitorGetAttachNode (rfd, &m->p); /* returns locked rn */ - m->node = rn; - m->next = RFAPI_MONITOR_VPN (rn); - RFAPI_MONITOR_VPN_W_ALLOC (rn) = m; - RFAPI_CHECK_REFCOUNT (rn, SAFI_MPLS_VPN, 0); - vnc_zlog_debug_verbose ("%s: attached monitor %p to rn %p", __func__, m, rn); - return rn; + struct route_node *rn; + + rfapiMonitorCheckAttachAllowed(); + + if (RFAPI_0_PREFIX(&m->p)) { + /* + * Add new monitor entry to vpn0 list + */ + afi_t afi; + + afi = family2afi(m->p.family); + assert(afi); + + m->next = rfd->import_table->vpn0_queries[afi]; + rfd->import_table->vpn0_queries[afi] = m; + vnc_zlog_debug_verbose("%s: attached monitor %p to vpn0 list", + __func__, m); + return NULL; + } + + /* + * Attach new monitor entry to import table node + */ + rn = rfapiMonitorGetAttachNode(rfd, &m->p); /* returns locked rn */ + m->node = rn; + m->next = RFAPI_MONITOR_VPN(rn); + RFAPI_MONITOR_VPN_W_ALLOC(rn) = m; + RFAPI_CHECK_REFCOUNT(rn, SAFI_MPLS_VPN, 0); + vnc_zlog_debug_verbose("%s: attached monitor %p to rn %p", __func__, m, + rn); + return rn; } /* * reattach monitors for this HD to import table */ -void -rfapiMonitorAttachImportHd (struct rfapi_descriptor *rfd) +void rfapiMonitorAttachImportHd(struct rfapi_descriptor *rfd) { - struct route_node *mrn; - - if (!rfd->mon) - { - /* - * No monitors for this HD - */ - return; - } - - for (mrn = route_top (rfd->mon); mrn; mrn = route_next (mrn)) - { - - if (!mrn->info) - continue; - - (void) rfapiMonitorAttachImport (rfd, - (struct rfapi_monitor_vpn - *) (mrn->info)); - } + struct route_node *mrn; + + if (!rfd->mon) { + /* + * No monitors for this HD + */ + return; + } + + for (mrn = route_top(rfd->mon); mrn; mrn = route_next(mrn)) { + + if (!mrn->info) + continue; + + (void)rfapiMonitorAttachImport( + rfd, (struct rfapi_monitor_vpn *)(mrn->info)); + } } /* @@ -506,1198 +468,1123 @@ rfapiMonitorAttachImportHd (struct rfapi_descriptor *rfd) * caller will have to do its own lookup. */ struct route_node * -rfapiMonitorAdd ( - struct bgp *bgp, - struct rfapi_descriptor *rfd, - struct prefix *p) +rfapiMonitorAdd(struct bgp *bgp, struct rfapi_descriptor *rfd, struct prefix *p) { - struct rfapi_monitor_vpn *m; - struct route_node *rn; - - /* - * Initialize nve's monitor list if needed - * NB use the same radix tree for IPv4 and IPv6 targets. - * The prefix will always have full-length mask (/32, /128) - * or be 0/0 so they won't get mixed up. - */ - if (!rfd->mon) - { - rfd->mon = route_table_init (); - } - rn = route_node_get (rfd->mon, p); - if (rn->info) - { - /* - * received this query before, no further action needed - */ - rfapiMonitorTimerRestart ((struct rfapi_monitor_vpn *) rn->info); - route_unlock_node (rn); - return NULL; - } - - /* - * New query for this nve, record it in the HD - */ - rn->info = XCALLOC (MTYPE_RFAPI_MONITOR, sizeof (struct rfapi_monitor_vpn)); - m = (struct rfapi_monitor_vpn *) (rn->info); - m->rfd = rfd; - prefix_copy (&m->p, p); - - ++rfd->monitor_count; - ++bgp->rfapi->monitor_count; - - rfapiMonitorTimerRestart (m); - - if (bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE) - { - /* - * callbacks turned off, so don't attach monitor to import table - */ - return NULL; - } - - - /* - * attach to import table - */ - return rfapiMonitorAttachImport (rfd, m); + struct rfapi_monitor_vpn *m; + struct route_node *rn; + + /* + * Initialize nve's monitor list if needed + * NB use the same radix tree for IPv4 and IPv6 targets. + * The prefix will always have full-length mask (/32, /128) + * or be 0/0 so they won't get mixed up. + */ + if (!rfd->mon) { + rfd->mon = route_table_init(); + } + rn = route_node_get(rfd->mon, p); + if (rn->info) { + /* + * received this query before, no further action needed + */ + rfapiMonitorTimerRestart((struct rfapi_monitor_vpn *)rn->info); + route_unlock_node(rn); + return NULL; + } + + /* + * New query for this nve, record it in the HD + */ + rn->info = + XCALLOC(MTYPE_RFAPI_MONITOR, sizeof(struct rfapi_monitor_vpn)); + m = (struct rfapi_monitor_vpn *)(rn->info); + m->rfd = rfd; + prefix_copy(&m->p, p); + + ++rfd->monitor_count; + ++bgp->rfapi->monitor_count; + + rfapiMonitorTimerRestart(m); + + if (bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE) { + /* + * callbacks turned off, so don't attach monitor to import table + */ + return NULL; + } + + + /* + * attach to import table + */ + return rfapiMonitorAttachImport(rfd, m); } /* * returns monitor pointer if found, NULL if not */ static struct rfapi_monitor_vpn * -rfapiMonitorDetachImport (struct rfapi_monitor_vpn *m) +rfapiMonitorDetachImport(struct rfapi_monitor_vpn *m) { - struct rfapi_monitor_vpn *prev; - struct rfapi_monitor_vpn *this = NULL; - - if (RFAPI_0_PREFIX (&m->p)) - { - afi_t afi; - - /* - * 0-prefix monitors are stored in a special list and not - * in the import VPN tree - */ - - afi = family2afi (m->p.family); - assert (afi); - - if (m->rfd->import_table) - { - for (prev = NULL, this = m->rfd->import_table->vpn0_queries[afi]; - this; prev = this, this = this->next) - { - - if (this == m) - break; - } - if (this) - { - if (!prev) - { - m->rfd->import_table->vpn0_queries[afi] = this->next; - } - else - { - prev->next = this->next; - } - } - } - } - else - { - - if (m->node) - { - for (prev = NULL, - this = RFAPI_MONITOR_VPN (m->node); - this; prev = this, this = this->next) - { - - if (this == m) - break; - } - if (this) - { - if (prev) - { - prev->next = this->next; - } - else - { - RFAPI_MONITOR_VPN_W_ALLOC (m->node) = this->next; - } - RFAPI_CHECK_REFCOUNT (m->node, SAFI_MPLS_VPN, 1); - route_unlock_node (m->node); - } - m->node = NULL; - } - } - return this; + struct rfapi_monitor_vpn *prev; + struct rfapi_monitor_vpn *this = NULL; + + if (RFAPI_0_PREFIX(&m->p)) { + afi_t afi; + + /* + * 0-prefix monitors are stored in a special list and not + * in the import VPN tree + */ + + afi = family2afi(m->p.family); + assert(afi); + + if (m->rfd->import_table) { + for (prev = NULL, + this = m->rfd->import_table->vpn0_queries[afi]; + this; prev = this, this = this->next) { + + if (this == m) + break; + } + if (this) { + if (!prev) { + m->rfd->import_table + ->vpn0_queries[afi] = + this->next; + } else { + prev->next = this->next; + } + } + } + } else { + + if (m->node) { + for (prev = NULL, this = RFAPI_MONITOR_VPN(m->node); + this; prev = this, this = this->next) { + + if (this == m) + break; + } + if (this) { + if (prev) { + prev->next = this->next; + } else { + RFAPI_MONITOR_VPN_W_ALLOC(m->node) = + this->next; + } + RFAPI_CHECK_REFCOUNT(m->node, SAFI_MPLS_VPN, 1); + route_unlock_node(m->node); + } + m->node = NULL; + } + } + return this; } -void -rfapiMonitorDetachImportHd (struct rfapi_descriptor *rfd) +void rfapiMonitorDetachImportHd(struct rfapi_descriptor *rfd) { - struct route_node *rn; - - if (!rfd->mon) - return; - - for (rn = route_top (rfd->mon); rn; rn = route_next (rn)) - { - if (rn->info) - { - rfapiMonitorDetachImport ((struct rfapi_monitor_vpn *) (rn->info)); - } - } + struct route_node *rn; + + if (!rfd->mon) + return; + + for (rn = route_top(rfd->mon); rn; rn = route_next(rn)) { + if (rn->info) { + rfapiMonitorDetachImport( + (struct rfapi_monitor_vpn *)(rn->info)); + } + } } -void -rfapiMonitorDel ( - struct bgp *bgp, - struct rfapi_descriptor *rfd, - struct prefix *p) +void rfapiMonitorDel(struct bgp *bgp, struct rfapi_descriptor *rfd, + struct prefix *p) { - struct route_node *rn; - struct rfapi_monitor_vpn *m; - - assert (rfd->mon); - rn = route_node_get (rfd->mon, p); /* locks node */ - m = rn->info; - - assert (m); - - /* - * remove from import table - */ - if (!(bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE)) - { - rfapiMonitorDetachImport (m); - } - - if (m->timer) - { - thread_cancel (m->timer); - m->timer = NULL; - } - - /* - * remove from rfd list - */ - XFREE (MTYPE_RFAPI_MONITOR, m); - rn->info = NULL; - route_unlock_node (rn); /* undo original lock when created */ - route_unlock_node (rn); /* undo lock in route_node_get */ - - --rfd->monitor_count; - --bgp->rfapi->monitor_count; + struct route_node *rn; + struct rfapi_monitor_vpn *m; + + assert(rfd->mon); + rn = route_node_get(rfd->mon, p); /* locks node */ + m = rn->info; + + assert(m); + + /* + * remove from import table + */ + if (!(bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE)) { + rfapiMonitorDetachImport(m); + } + + if (m->timer) { + thread_cancel(m->timer); + m->timer = NULL; + } + + /* + * remove from rfd list + */ + XFREE(MTYPE_RFAPI_MONITOR, m); + rn->info = NULL; + route_unlock_node(rn); /* undo original lock when created */ + route_unlock_node(rn); /* undo lock in route_node_get */ + + --rfd->monitor_count; + --bgp->rfapi->monitor_count; } /* * returns count of monitors deleted */ -int -rfapiMonitorDelHd (struct rfapi_descriptor *rfd) +int rfapiMonitorDelHd(struct rfapi_descriptor *rfd) { - struct route_node *rn; - struct bgp *bgp; - int count = 0; - - vnc_zlog_debug_verbose ("%s: entry rfd=%p", __func__, rfd); - - bgp = bgp_get_default (); - - if (rfd->mon) - { - for (rn = route_top (rfd->mon); rn; rn = route_next (rn)) - { - struct rfapi_monitor_vpn *m; - if ((m = rn->info)) - { - if (!(bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE)) - { - rfapiMonitorDetachImport (m); - } - - if (m->timer) - { - thread_cancel (m->timer); - m->timer = NULL; - } - - XFREE (MTYPE_RFAPI_MONITOR, m); - rn->info = NULL; - route_unlock_node (rn); /* undo original lock when created */ - ++count; - --rfd->monitor_count; - --bgp->rfapi->monitor_count; - } - } - route_table_finish (rfd->mon); - rfd->mon = NULL; - } - - if (rfd->mon_eth) - { - - struct rfapi_monitor_eth *mon_eth; - - while (!skiplist_first (rfd->mon_eth, NULL, (void **) &mon_eth)) - { - - int rc; - - if (!(bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE)) - { - rfapiMonitorEthDetachImport (bgp, mon_eth); - } - else - { + struct route_node *rn; + struct bgp *bgp; + int count = 0; + + vnc_zlog_debug_verbose("%s: entry rfd=%p", __func__, rfd); + + bgp = bgp_get_default(); + + if (rfd->mon) { + for (rn = route_top(rfd->mon); rn; rn = route_next(rn)) { + struct rfapi_monitor_vpn *m; + if ((m = rn->info)) { + if (!(bgp->rfapi_cfg->flags + & BGP_VNC_CONFIG_CALLBACK_DISABLE)) { + rfapiMonitorDetachImport(m); + } + + if (m->timer) { + thread_cancel(m->timer); + m->timer = NULL; + } + + XFREE(MTYPE_RFAPI_MONITOR, m); + rn->info = NULL; + route_unlock_node(rn); /* undo original lock + when created */ + ++count; + --rfd->monitor_count; + --bgp->rfapi->monitor_count; + } + } + route_table_finish(rfd->mon); + rfd->mon = NULL; + } + + if (rfd->mon_eth) { + + struct rfapi_monitor_eth *mon_eth; + + while (!skiplist_first(rfd->mon_eth, NULL, (void **)&mon_eth)) { + + int rc; + + if (!(bgp->rfapi_cfg->flags + & BGP_VNC_CONFIG_CALLBACK_DISABLE)) { + rfapiMonitorEthDetachImport(bgp, mon_eth); + } else { #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose - ("%s: callbacks disabled, not attempting to detach mon_eth %p", - __func__, mon_eth); + vnc_zlog_debug_verbose( + "%s: callbacks disabled, not attempting to detach mon_eth %p", + __func__, mon_eth); #endif - } - - if (mon_eth->timer) - { - thread_cancel (mon_eth->timer); - mon_eth->timer = NULL; - } - - /* - * remove from rfd list - */ - rc = skiplist_delete (rfd->mon_eth, mon_eth, mon_eth); - assert (!rc); - - vnc_zlog_debug_verbose ("%s: freeing mon_eth %p", __func__, mon_eth); - XFREE (MTYPE_RFAPI_MONITOR_ETH, mon_eth); - - ++count; - --rfd->monitor_count; - --bgp->rfapi->monitor_count; - } - skiplist_free (rfd->mon_eth); - rfd->mon_eth = NULL; - - } - - return count; + } + + if (mon_eth->timer) { + thread_cancel(mon_eth->timer); + mon_eth->timer = NULL; + } + + /* + * remove from rfd list + */ + rc = skiplist_delete(rfd->mon_eth, mon_eth, mon_eth); + assert(!rc); + + vnc_zlog_debug_verbose("%s: freeing mon_eth %p", + __func__, mon_eth); + XFREE(MTYPE_RFAPI_MONITOR_ETH, mon_eth); + + ++count; + --rfd->monitor_count; + --bgp->rfapi->monitor_count; + } + skiplist_free(rfd->mon_eth); + rfd->mon_eth = NULL; + } + + return count; } -void -rfapiMonitorResponseRemovalOff (struct bgp *bgp) +void rfapiMonitorResponseRemovalOff(struct bgp *bgp) { - if (bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_RESPONSE_REMOVAL_DISABLE) - { - return; - } - bgp->rfapi_cfg->flags |= BGP_VNC_CONFIG_RESPONSE_REMOVAL_DISABLE; + if (bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_RESPONSE_REMOVAL_DISABLE) { + return; + } + bgp->rfapi_cfg->flags |= BGP_VNC_CONFIG_RESPONSE_REMOVAL_DISABLE; } -void -rfapiMonitorResponseRemovalOn (struct bgp *bgp) +void rfapiMonitorResponseRemovalOn(struct bgp *bgp) { - if (!(bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_RESPONSE_REMOVAL_DISABLE)) - { - return; - } - bgp->rfapi_cfg->flags &= ~BGP_VNC_CONFIG_RESPONSE_REMOVAL_DISABLE; + if (!(bgp->rfapi_cfg->flags + & BGP_VNC_CONFIG_RESPONSE_REMOVAL_DISABLE)) { + return; + } + bgp->rfapi_cfg->flags &= ~BGP_VNC_CONFIG_RESPONSE_REMOVAL_DISABLE; } -static int -rfapiMonitorTimerExpire (struct thread *t) +static int rfapiMonitorTimerExpire(struct thread *t) { - struct rfapi_monitor_vpn *m = t->arg; + struct rfapi_monitor_vpn *m = t->arg; - /* forget reference to thread, it's gone */ - m->timer = NULL; + /* forget reference to thread, it's gone */ + m->timer = NULL; - /* delete the monitor */ - rfapiMonitorDel (bgp_get_default (), m->rfd, &m->p); + /* delete the monitor */ + rfapiMonitorDel(bgp_get_default(), m->rfd, &m->p); - return 0; + return 0; } -static void -rfapiMonitorTimerRestart (struct rfapi_monitor_vpn *m) +static void rfapiMonitorTimerRestart(struct rfapi_monitor_vpn *m) { - if (m->timer) - { - unsigned long remain = thread_timer_remain_second (m->timer); - - /* unexpected case, but avoid wraparound problems below */ - if (remain > m->rfd->response_lifetime) - return; - - /* don't restart if we just restarted recently */ - if (m->rfd->response_lifetime - remain < 2) - return; - - thread_cancel (m->timer); - m->timer = NULL; - } - - { - char buf[BUFSIZ]; - - vnc_zlog_debug_verbose ("%s: target %s life %u", __func__, - rfapi_ntop (m->p.family, m->p.u.val, buf, BUFSIZ), - m->rfd->response_lifetime); - } - m->timer = NULL; - thread_add_timer(bm->master, rfapiMonitorTimerExpire, m, m->rfd->response_lifetime, - &m->timer); + if (m->timer) { + unsigned long remain = thread_timer_remain_second(m->timer); + + /* unexpected case, but avoid wraparound problems below */ + if (remain > m->rfd->response_lifetime) + return; + + /* don't restart if we just restarted recently */ + if (m->rfd->response_lifetime - remain < 2) + return; + + thread_cancel(m->timer); + m->timer = NULL; + } + + { + char buf[BUFSIZ]; + + vnc_zlog_debug_verbose( + "%s: target %s life %u", __func__, + rfapi_ntop(m->p.family, m->p.u.val, buf, BUFSIZ), + m->rfd->response_lifetime); + } + m->timer = NULL; + thread_add_timer(bm->master, rfapiMonitorTimerExpire, m, + m->rfd->response_lifetime, &m->timer); } -/* +/* * called when an updated response is sent to the NVE. Per * ticket 255, restart timers for any monitors that could have * been responsible for the response, i.e., any monitors for * the exact prefix or a parent of it. */ -void -rfapiMonitorTimersRestart (struct rfapi_descriptor *rfd, struct prefix *p) +void rfapiMonitorTimersRestart(struct rfapi_descriptor *rfd, struct prefix *p) { - struct route_node *rn; - - if (AF_ETHERNET == p->family) - { - struct rfapi_monitor_eth *mon_eth; - int rc; - void *cursor; - - /* - * XXX match any LNI - */ - for (cursor = NULL, - rc = - skiplist_next (rfd->mon_eth, NULL, (void **) &mon_eth, &cursor); - rc == 0; - rc = - skiplist_next (rfd->mon_eth, NULL, (void **) &mon_eth, &cursor)) - { - - if (!memcmp (mon_eth->macaddr.octet, p->u.prefix_eth.octet, - ETHER_ADDR_LEN)) - { - - rfapiMonitorEthTimerRestart (mon_eth); - - } - } - - } - else - { - for (rn = route_top (rfd->mon); rn; rn = route_next (rn)) - { - struct rfapi_monitor_vpn *m; - - if (!((m = rn->info))) - continue; - - /* NB order of test is significant ! */ - if (!m->node || prefix_match (&m->node->p, p)) - { - rfapiMonitorTimerRestart (m); - } - } - } + struct route_node *rn; + + if (AF_ETHERNET == p->family) { + struct rfapi_monitor_eth *mon_eth; + int rc; + void *cursor; + + /* + * XXX match any LNI + */ + for (cursor = NULL, + rc = skiplist_next(rfd->mon_eth, NULL, (void **)&mon_eth, + &cursor); + rc == 0; rc = skiplist_next(rfd->mon_eth, NULL, + (void **)&mon_eth, &cursor)) { + + if (!memcmp(mon_eth->macaddr.octet, + p->u.prefix_eth.octet, ETHER_ADDR_LEN)) { + + rfapiMonitorEthTimerRestart(mon_eth); + } + } + + } else { + for (rn = route_top(rfd->mon); rn; rn = route_next(rn)) { + struct rfapi_monitor_vpn *m; + + if (!((m = rn->info))) + continue; + + /* NB order of test is significant ! */ + if (!m->node || prefix_match(&m->node->p, p)) { + rfapiMonitorTimerRestart(m); + } + } + } } /* * Find monitors at this node and all its parents. Call * rfapiRibUpdatePendingNode with this node and all corresponding NVEs. */ -void -rfapiMonitorItNodeChanged ( - struct rfapi_import_table *import_table, - struct route_node *it_node, - struct rfapi_monitor_vpn *monitor_list) /* for base it node, NULL=all */ +void rfapiMonitorItNodeChanged( + struct rfapi_import_table *import_table, struct route_node *it_node, + struct rfapi_monitor_vpn *monitor_list) /* for base it node, NULL=all */ { - struct skiplist *nves_seen; - struct route_node *rn = it_node; - struct bgp *bgp = bgp_get_default (); - afi_t afi = family2afi (rn->p.family); + struct skiplist *nves_seen; + struct route_node *rn = it_node; + struct bgp *bgp = bgp_get_default(); + afi_t afi = family2afi(rn->p.family); #if DEBUG_L2_EXTRA - char buf_prefix[BUFSIZ]; + char buf_prefix[BUFSIZ]; #endif - assert (bgp); - assert (import_table); + assert(bgp); + assert(import_table); - nves_seen = skiplist_new (0, NULL, NULL); + nves_seen = skiplist_new(0, NULL, NULL); #if DEBUG_L2_EXTRA - prefix2str (&it_node->p, buf_prefix, BUFSIZ); - vnc_zlog_debug_verbose ("%s: it=%p, it_node=%p, it_node->prefix=%s", - __func__, import_table, it_node, buf_prefix); + prefix2str(&it_node->p, buf_prefix, BUFSIZ); + vnc_zlog_debug_verbose("%s: it=%p, it_node=%p, it_node->prefix=%s", + __func__, import_table, it_node, buf_prefix); #endif - if (AFI_L2VPN == afi) - { - struct rfapi_monitor_eth *m; - struct skiplist *sl; - void *cursor; - int rc; - - if ((sl = RFAPI_MONITOR_ETH (rn))) - { - - for (cursor = NULL, - rc = skiplist_next (sl, NULL, (void **) &m, (void **) &cursor); - !rc; - rc = skiplist_next (sl, NULL, (void **) &m, (void **) &cursor)) - { - - if (skiplist_search (nves_seen, m->rfd, NULL)) - { - /* - * Haven't done this NVE yet. Add to "seen" list. - */ - assert (!skiplist_insert (nves_seen, m->rfd, NULL)); - - /* - * update its RIB - */ - rfapiRibUpdatePendingNode(bgp, m->rfd, import_table, - it_node, m->rfd->response_lifetime); - } - } - } - - } - else - { - - struct rfapi_monitor_vpn *m; - - if (monitor_list) - { - m = monitor_list; - } - else - { - m = RFAPI_MONITOR_VPN (rn); - } - - do - { - /* - * If we have reached the root node (parent==NULL) and there - * are no routes here (info==NULL), and the IT node that - * changed was not the root node (it_node->parent != NULL), - * then any monitors at this node are here because they had - * no match at all. Therefore, do not send route updates to them - * because we haven't sent them an initial route. - */ - if (!rn->parent && !rn->info && it_node->parent) - break; - - for (; m; m = m->next) - { - - if (RFAPI_0_PREFIX (&m->p)) - { - /* shouldn't happen, but be safe */ - continue; - } - if (skiplist_search (nves_seen, m->rfd, NULL)) - { - /* - * Haven't done this NVE yet. Add to "seen" list. - */ - assert (!skiplist_insert (nves_seen, m->rfd, NULL)); - - { - char buf_attach_pfx[BUFSIZ]; - char buf_target_pfx[BUFSIZ]; - - prefix2str (&m->node->p, buf_attach_pfx, BUFSIZ); - prefix2str (&m->p, buf_target_pfx, BUFSIZ); - vnc_zlog_debug_verbose - ("%s: update rfd %p attached to pfx %s (targ=%s)", - __func__, m->rfd, buf_attach_pfx, buf_target_pfx); - } - - /* - * update its RIB - */ - rfapiRibUpdatePendingNode(bgp, m->rfd, import_table, - it_node, m->rfd->response_lifetime); - } - } - rn = rn->parent; - if (rn) - m = RFAPI_MONITOR_VPN (rn); - } - while (rn); - } - - /* - * All-routes L2 monitors - */ - if (AFI_L2VPN == afi) - { - struct rfapi_monitor_eth *e; + if (AFI_L2VPN == afi) { + struct rfapi_monitor_eth *m; + struct skiplist *sl; + void *cursor; + int rc; + + if ((sl = RFAPI_MONITOR_ETH(rn))) { + + for (cursor = NULL, + rc = skiplist_next(sl, NULL, (void **)&m, + (void **)&cursor); + !rc; rc = skiplist_next(sl, NULL, (void **)&m, + (void **)&cursor)) { + + if (skiplist_search(nves_seen, m->rfd, NULL)) { + /* + * Haven't done this NVE yet. Add to + * "seen" list. + */ + assert(!skiplist_insert(nves_seen, + m->rfd, NULL)); + + /* + * update its RIB + */ + rfapiRibUpdatePendingNode( + bgp, m->rfd, import_table, + it_node, + m->rfd->response_lifetime); + } + } + } + + } else { + + struct rfapi_monitor_vpn *m; + + if (monitor_list) { + m = monitor_list; + } else { + m = RFAPI_MONITOR_VPN(rn); + } + + do { + /* + * If we have reached the root node (parent==NULL) and + * there + * are no routes here (info==NULL), and the IT node that + * changed was not the root node (it_node->parent != + * NULL), + * then any monitors at this node are here because they + * had + * no match at all. Therefore, do not send route updates + * to them + * because we haven't sent them an initial route. + */ + if (!rn->parent && !rn->info && it_node->parent) + break; + + for (; m; m = m->next) { + + if (RFAPI_0_PREFIX(&m->p)) { + /* shouldn't happen, but be safe */ + continue; + } + if (skiplist_search(nves_seen, m->rfd, NULL)) { + /* + * Haven't done this NVE yet. Add to + * "seen" list. + */ + assert(!skiplist_insert(nves_seen, + m->rfd, NULL)); + + { + char buf_attach_pfx[BUFSIZ]; + char buf_target_pfx[BUFSIZ]; + + prefix2str(&m->node->p, + buf_attach_pfx, + BUFSIZ); + prefix2str(&m->p, + buf_target_pfx, + BUFSIZ); + vnc_zlog_debug_verbose( + "%s: update rfd %p attached to pfx %s (targ=%s)", + __func__, m->rfd, + buf_attach_pfx, + buf_target_pfx); + } + + /* + * update its RIB + */ + rfapiRibUpdatePendingNode( + bgp, m->rfd, import_table, + it_node, + m->rfd->response_lifetime); + } + } + rn = rn->parent; + if (rn) + m = RFAPI_MONITOR_VPN(rn); + } while (rn); + } + + /* + * All-routes L2 monitors + */ + if (AFI_L2VPN == afi) { + struct rfapi_monitor_eth *e; #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: checking L2 all-routes monitors", __func__); + vnc_zlog_debug_verbose("%s: checking L2 all-routes monitors", + __func__); #endif - for (e = import_table->eth0_queries; e; e = e->next) - { + for (e = import_table->eth0_queries; e; e = e->next) { #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: checking eth0 mon=%p", __func__, e); + vnc_zlog_debug_verbose("%s: checking eth0 mon=%p", + __func__, e); #endif - if (skiplist_search (nves_seen, e->rfd, NULL)) - { - /* - * Haven't done this NVE yet. Add to "seen" list. - */ - assert (!skiplist_insert (nves_seen, e->rfd, NULL)); - - /* - * update its RIB - */ + if (skiplist_search(nves_seen, e->rfd, NULL)) { + /* + * Haven't done this NVE yet. Add to "seen" + * list. + */ + assert(!skiplist_insert(nves_seen, e->rfd, + NULL)); + +/* + * update its RIB + */ #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: found L2 all-routes monitor %p", __func__, e); + vnc_zlog_debug_verbose( + "%s: found L2 all-routes monitor %p", + __func__, e); #endif - rfapiRibUpdatePendingNode (bgp, e->rfd, import_table, it_node, - e->rfd->response_lifetime); - } - } - } - else - { - struct rfapi_monitor_vpn *m; - - /* - * All-routes IPv4. IPv6 monitors - */ - for (m = import_table->vpn0_queries[afi]; m; m = m->next) - { - if (skiplist_search (nves_seen, m->rfd, NULL)) - { - /* - * Haven't done this NVE yet. Add to "seen" list. - */ - assert (!skiplist_insert (nves_seen, m->rfd, NULL)); - - /* - * update its RIB - */ - rfapiRibUpdatePendingNode (bgp, m->rfd, import_table, it_node, - m->rfd->response_lifetime); - } - } - } - - skiplist_free (nves_seen); + rfapiRibUpdatePendingNode( + bgp, e->rfd, import_table, it_node, + e->rfd->response_lifetime); + } + } + } else { + struct rfapi_monitor_vpn *m; + + /* + * All-routes IPv4. IPv6 monitors + */ + for (m = import_table->vpn0_queries[afi]; m; m = m->next) { + if (skiplist_search(nves_seen, m->rfd, NULL)) { + /* + * Haven't done this NVE yet. Add to "seen" + * list. + */ + assert(!skiplist_insert(nves_seen, m->rfd, + NULL)); + + /* + * update its RIB + */ + rfapiRibUpdatePendingNode( + bgp, m->rfd, import_table, it_node, + m->rfd->response_lifetime); + } + } + } + + skiplist_free(nves_seen); } /* * For the listed monitors, update new node and its subtree, but * omit old node and its subtree */ -void -rfapiMonitorMovedUp ( - struct rfapi_import_table *import_table, - struct route_node *old_node, - struct route_node *new_node, - struct rfapi_monitor_vpn *monitor_list) +void rfapiMonitorMovedUp(struct rfapi_import_table *import_table, + struct route_node *old_node, + struct route_node *new_node, + struct rfapi_monitor_vpn *monitor_list) { - struct bgp *bgp = bgp_get_default (); - struct rfapi_monitor_vpn *m; - - assert (new_node); - assert (old_node); - assert (new_node != old_node); - - /* - * If new node is 0/0 and there is no route there, don't - * generate an update because it will not contain any - * routes including the target. - */ - if (!new_node->parent && !new_node->info) - { - vnc_zlog_debug_verbose ("%s: new monitor at 0/0 and no routes, no updates", - __func__); - return; - } - - for (m = monitor_list; m; m = m->next) - { - rfapiRibUpdatePendingNode (bgp, m->rfd, import_table, new_node, - m->rfd->response_lifetime); - rfapiRibUpdatePendingNodeSubtree (bgp, m->rfd, import_table, new_node, - old_node, m->rfd->response_lifetime); - } + struct bgp *bgp = bgp_get_default(); + struct rfapi_monitor_vpn *m; + + assert(new_node); + assert(old_node); + assert(new_node != old_node); + + /* + * If new node is 0/0 and there is no route there, don't + * generate an update because it will not contain any + * routes including the target. + */ + if (!new_node->parent && !new_node->info) { + vnc_zlog_debug_verbose( + "%s: new monitor at 0/0 and no routes, no updates", + __func__); + return; + } + + for (m = monitor_list; m; m = m->next) { + rfapiRibUpdatePendingNode(bgp, m->rfd, import_table, new_node, + m->rfd->response_lifetime); + rfapiRibUpdatePendingNodeSubtree(bgp, m->rfd, import_table, + new_node, old_node, + m->rfd->response_lifetime); + } } -static int -rfapiMonitorEthTimerExpire (struct thread *t) +static int rfapiMonitorEthTimerExpire(struct thread *t) { - struct rfapi_monitor_eth *m = t->arg; + struct rfapi_monitor_eth *m = t->arg; - /* forget reference to thread, it's gone */ - m->timer = NULL; + /* forget reference to thread, it's gone */ + m->timer = NULL; - /* delete the monitor */ - rfapiMonitorEthDel (bgp_get_default (), m->rfd, &m->macaddr, - m->logical_net_id); + /* delete the monitor */ + rfapiMonitorEthDel(bgp_get_default(), m->rfd, &m->macaddr, + m->logical_net_id); - return 0; + return 0; } -static void -rfapiMonitorEthTimerRestart (struct rfapi_monitor_eth *m) +static void rfapiMonitorEthTimerRestart(struct rfapi_monitor_eth *m) { - if (m->timer) - { - unsigned long remain = thread_timer_remain_second (m->timer); - - /* unexpected case, but avoid wraparound problems below */ - if (remain > m->rfd->response_lifetime) - return; - - /* don't restart if we just restarted recently */ - if (m->rfd->response_lifetime - remain < 2) - return; - - thread_cancel (m->timer); - m->timer = NULL; - } - - { - char buf[BUFSIZ]; - - vnc_zlog_debug_verbose ("%s: target %s life %u", __func__, - rfapiEthAddr2Str (&m->macaddr, buf, BUFSIZ), - m->rfd->response_lifetime); - } - m->timer = NULL; - thread_add_timer(bm->master, rfapiMonitorEthTimerExpire, m, m->rfd->response_lifetime, - &m->timer); + if (m->timer) { + unsigned long remain = thread_timer_remain_second(m->timer); + + /* unexpected case, but avoid wraparound problems below */ + if (remain > m->rfd->response_lifetime) + return; + + /* don't restart if we just restarted recently */ + if (m->rfd->response_lifetime - remain < 2) + return; + + thread_cancel(m->timer); + m->timer = NULL; + } + + { + char buf[BUFSIZ]; + + vnc_zlog_debug_verbose( + "%s: target %s life %u", __func__, + rfapiEthAddr2Str(&m->macaddr, buf, BUFSIZ), + m->rfd->response_lifetime); + } + m->timer = NULL; + thread_add_timer(bm->master, rfapiMonitorEthTimerExpire, m, + m->rfd->response_lifetime, &m->timer); } -static int -mon_eth_cmp (void *a, void *b) +static int mon_eth_cmp(void *a, void *b) { - struct rfapi_monitor_eth *m1; - struct rfapi_monitor_eth *m2; - - int i; - - m1 = (struct rfapi_monitor_eth *) a; - m2 = (struct rfapi_monitor_eth *) b; - - /* - * compare ethernet addresses - */ - for (i = 0; i < ETHER_ADDR_LEN; ++i) - { - if (m1->macaddr.octet[i] != m2->macaddr.octet[i]) - return (m1->macaddr.octet[i] - m2->macaddr.octet[i]); - } - - /* - * compare LNIs - */ - return (m1->logical_net_id - m2->logical_net_id); + struct rfapi_monitor_eth *m1; + struct rfapi_monitor_eth *m2; + + int i; + + m1 = (struct rfapi_monitor_eth *)a; + m2 = (struct rfapi_monitor_eth *)b; + + /* + * compare ethernet addresses + */ + for (i = 0; i < ETHER_ADDR_LEN; ++i) { + if (m1->macaddr.octet[i] != m2->macaddr.octet[i]) + return (m1->macaddr.octet[i] - m2->macaddr.octet[i]); + } + + /* + * compare LNIs + */ + return (m1->logical_net_id - m2->logical_net_id); } -static void -rfapiMonitorEthAttachImport ( - struct rfapi_import_table *it, - struct route_node *rn, /* it node attach point if non-0 */ - struct rfapi_monitor_eth *mon) /* monitor struct to attach */ +static void rfapiMonitorEthAttachImport( + struct rfapi_import_table *it, + struct route_node *rn, /* it node attach point if non-0 */ + struct rfapi_monitor_eth *mon) /* monitor struct to attach */ { - struct skiplist *sl; - int rc; + struct skiplist *sl; + int rc; - vnc_zlog_debug_verbose ("%s: it=%p", __func__, it); + vnc_zlog_debug_verbose("%s: it=%p", __func__, it); - rfapiMonitorCheckAttachAllowed (); + rfapiMonitorCheckAttachAllowed(); - if (RFAPI_0_ETHERADDR (&mon->macaddr)) - { - /* - * These go on a different list - */ - mon->next = it->eth0_queries; - it->eth0_queries = mon; + if (RFAPI_0_ETHERADDR(&mon->macaddr)) { + /* + * These go on a different list + */ + mon->next = it->eth0_queries; + it->eth0_queries = mon; #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: attached monitor %p to eth0 list", __func__, mon); + vnc_zlog_debug_verbose("%s: attached monitor %p to eth0 list", + __func__, mon); #endif - return; - } + return; + } - if (rn == NULL) - { + if (rn == NULL) { #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: rn is null!", __func__); + vnc_zlog_debug_verbose("%s: rn is null!", __func__); #endif - return; - } - - /* - * Get sl to attach to - */ - sl = RFAPI_MONITOR_ETH_W_ALLOC (rn); - if (!sl) - { - sl = RFAPI_MONITOR_ETH_W_ALLOC (rn) = skiplist_new (0, NULL, NULL); - route_lock_node(rn); /* count skiplist mon_eth */ - } + return; + } + + /* + * Get sl to attach to + */ + sl = RFAPI_MONITOR_ETH_W_ALLOC(rn); + if (!sl) { + sl = RFAPI_MONITOR_ETH_W_ALLOC(rn) = + skiplist_new(0, NULL, NULL); + route_lock_node(rn); /* count skiplist mon_eth */ + } #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: rn=%p, rn->lock=%d, sl=%p, attaching eth mon %p", - __func__, rn, rn->lock, sl, mon); + vnc_zlog_debug_verbose( + "%s: rn=%p, rn->lock=%d, sl=%p, attaching eth mon %p", __func__, + rn, rn->lock, sl, mon); #endif - rc = skiplist_insert (sl, (void *) mon, (void *) mon); - assert (!rc); + rc = skiplist_insert(sl, (void *)mon, (void *)mon); + assert(!rc); - /* count eth monitor */ - route_lock_node(rn); + /* count eth monitor */ + route_lock_node(rn); } /* * reattach monitors for this HD to import table */ -static void -rfapiMonitorEthAttachImportHd (struct bgp *bgp, struct rfapi_descriptor *rfd) +static void rfapiMonitorEthAttachImportHd(struct bgp *bgp, + struct rfapi_descriptor *rfd) { - void *cursor; - struct rfapi_monitor_eth *mon; - int rc; - - if (!rfd->mon_eth) - { - /* - * No monitors for this HD - */ - return; - } - - for (cursor = NULL, - rc = skiplist_next (rfd->mon_eth, NULL, (void **) &mon, &cursor); - rc == 0; - rc = skiplist_next (rfd->mon_eth, NULL, (void **) &mon, &cursor)) - { - - struct rfapi_import_table *it; - struct prefix pfx_mac_buf; - struct route_node *rn; - - it = rfapiMacImportTableGet (bgp, mon->logical_net_id); - assert (it); - - memset ((void *) &pfx_mac_buf, 0, sizeof (struct prefix)); - pfx_mac_buf.family = AF_ETHERNET; - pfx_mac_buf.prefixlen = 48; - pfx_mac_buf.u.prefix_eth = mon->macaddr; - - rn = route_node_get (it->imported_vpn[AFI_L2VPN], &pfx_mac_buf); - assert (rn); - - (void) rfapiMonitorEthAttachImport (it, rn, mon); - } + void *cursor; + struct rfapi_monitor_eth *mon; + int rc; + + if (!rfd->mon_eth) { + /* + * No monitors for this HD + */ + return; + } + + for (cursor = NULL, + rc = skiplist_next(rfd->mon_eth, NULL, (void **)&mon, &cursor); + rc == 0; + rc = skiplist_next(rfd->mon_eth, NULL, (void **)&mon, &cursor)) { + + struct rfapi_import_table *it; + struct prefix pfx_mac_buf; + struct route_node *rn; + + it = rfapiMacImportTableGet(bgp, mon->logical_net_id); + assert(it); + + memset((void *)&pfx_mac_buf, 0, sizeof(struct prefix)); + pfx_mac_buf.family = AF_ETHERNET; + pfx_mac_buf.prefixlen = 48; + pfx_mac_buf.u.prefix_eth = mon->macaddr; + + rn = route_node_get(it->imported_vpn[AFI_L2VPN], &pfx_mac_buf); + assert(rn); + + (void)rfapiMonitorEthAttachImport(it, rn, mon); + } } -static void -rfapiMonitorEthDetachImport ( - struct bgp *bgp, - struct rfapi_monitor_eth *mon) /* monitor struct to detach */ +static void rfapiMonitorEthDetachImport( + struct bgp *bgp, + struct rfapi_monitor_eth *mon) /* monitor struct to detach */ { - struct rfapi_import_table *it; - struct prefix pfx_mac_buf; - struct skiplist *sl; - struct route_node *rn; - int rc; - - it = rfapiMacImportTableGet (bgp, mon->logical_net_id); - assert (it); - - if (RFAPI_0_ETHERADDR (&mon->macaddr)) - { - struct rfapi_monitor_eth *prev; - struct rfapi_monitor_eth *this = NULL; - - for (prev = NULL, - this = it->eth0_queries; this; prev = this, this = this->next) - { - - if (this == mon) - break; - } - if (this) - { - if (!prev) - { - it->eth0_queries = this->next; - } - else - { - prev->next = this->next; - } - } + struct rfapi_import_table *it; + struct prefix pfx_mac_buf; + struct skiplist *sl; + struct route_node *rn; + int rc; + + it = rfapiMacImportTableGet(bgp, mon->logical_net_id); + assert(it); + + if (RFAPI_0_ETHERADDR(&mon->macaddr)) { + struct rfapi_monitor_eth *prev; + struct rfapi_monitor_eth *this = NULL; + + for (prev = NULL, this = it->eth0_queries; this; + prev = this, this = this->next) { + + if (this == mon) + break; + } + if (this) { + if (!prev) { + it->eth0_queries = this->next; + } else { + prev->next = this->next; + } + } #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: it=%p, LNI=%d, detached eth0 mon %p", - __func__, it, mon->logical_net_id, mon); + vnc_zlog_debug_verbose( + "%s: it=%p, LNI=%d, detached eth0 mon %p", __func__, it, + mon->logical_net_id, mon); #endif - return; - } + return; + } - memset ((void *) &pfx_mac_buf, 0, sizeof (struct prefix)); - pfx_mac_buf.family = AF_ETHERNET; - pfx_mac_buf.prefixlen = 48; - pfx_mac_buf.u.prefix_eth = mon->macaddr; + memset((void *)&pfx_mac_buf, 0, sizeof(struct prefix)); + pfx_mac_buf.family = AF_ETHERNET; + pfx_mac_buf.prefixlen = 48; + pfx_mac_buf.u.prefix_eth = mon->macaddr; - rn = route_node_get (it->imported_vpn[AFI_L2VPN], &pfx_mac_buf); - assert (rn); + rn = route_node_get(it->imported_vpn[AFI_L2VPN], &pfx_mac_buf); + assert(rn); #if DEBUG_L2_EXTRA - char buf_prefix[BUFSIZ]; - prefix2str (&rn->p, buf_prefix, BUFSIZ); + char buf_prefix[BUFSIZ]; + prefix2str(&rn->p, buf_prefix, BUFSIZ); #endif - /* - * Get sl to detach from - */ - sl = RFAPI_MONITOR_ETH (rn); + /* + * Get sl to detach from + */ + sl = RFAPI_MONITOR_ETH(rn); #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: it=%p, rn=%p, rn->lock=%d, sl=%p, pfx=%s, LNI=%d, detaching eth mon %p", - __func__, it, rn, rn->lock, sl, buf_prefix, mon->logical_net_id, mon); + vnc_zlog_debug_verbose( + "%s: it=%p, rn=%p, rn->lock=%d, sl=%p, pfx=%s, LNI=%d, detaching eth mon %p", + __func__, it, rn, rn->lock, sl, buf_prefix, mon->logical_net_id, + mon); #endif - assert (sl); + assert(sl); - rc = skiplist_delete (sl, (void *) mon, (void *) mon); - assert (!rc); + rc = skiplist_delete(sl, (void *)mon, (void *)mon); + assert(!rc); - /* uncount eth monitor */ - route_unlock_node(rn); + /* uncount eth monitor */ + route_unlock_node(rn); } -struct route_node * -rfapiMonitorEthAdd ( - struct bgp *bgp, - struct rfapi_descriptor *rfd, - struct ethaddr *macaddr, - uint32_t logical_net_id) +struct route_node *rfapiMonitorEthAdd(struct bgp *bgp, + struct rfapi_descriptor *rfd, + struct ethaddr *macaddr, + uint32_t logical_net_id) { - int rc; - struct rfapi_monitor_eth mon_buf; - struct rfapi_monitor_eth *val; - struct rfapi_import_table *it; - struct route_node *rn = NULL; - struct prefix pfx_mac_buf; - - if (!rfd->mon_eth) - { - rfd->mon_eth = skiplist_new (0, mon_eth_cmp, NULL); - } - - it = rfapiMacImportTableGet (bgp, logical_net_id); - assert (it); - - /* - * Get route node in import table. Here is where we attach the - * monitor. - * - * Look it up now because we return it to caller regardless of - * whether we create a new monitor or not. - */ - memset ((void *) &pfx_mac_buf, 0, sizeof (struct prefix)); - pfx_mac_buf.family = AF_ETHERNET; - pfx_mac_buf.prefixlen = 48; - pfx_mac_buf.u.prefix_eth = *macaddr; - - if (!RFAPI_0_ETHERADDR (macaddr)) - { - rn = route_node_get (it->imported_vpn[AFI_L2VPN], &pfx_mac_buf); - assert (rn); - } - - memset ((void *) &mon_buf, 0, sizeof (mon_buf)); - mon_buf.rfd = rfd; - mon_buf.macaddr = *macaddr; - mon_buf.logical_net_id = logical_net_id; - - { - char buf[BUFSIZ]; - - vnc_zlog_debug_verbose ("%s: LNI=%d: rfd=%p, pfx=%s", - __func__, logical_net_id, rfd, - rfapi_ntop (pfx_mac_buf.family, pfx_mac_buf.u.val, buf, - BUFSIZ)); - } - - - /* - * look up query - */ - rc = skiplist_search (rfd->mon_eth, (void *) &mon_buf, (void **) &val); - if (!rc) - { - /* - * Found monitor - we have seen this query before - * restart timer - */ - vnc_zlog_debug_verbose ("%s: already present in rfd->mon_eth, not adding", - __func__); - rfapiMonitorEthTimerRestart (val); - return rn; - } - - /* - * New query - */ - val = XCALLOC (MTYPE_RFAPI_MONITOR_ETH, sizeof (struct rfapi_monitor_eth)); - assert (val); - *val = mon_buf; - - ++rfd->monitor_count; - ++bgp->rfapi->monitor_count; - - rc = skiplist_insert (rfd->mon_eth, val, val); + int rc; + struct rfapi_monitor_eth mon_buf; + struct rfapi_monitor_eth *val; + struct rfapi_import_table *it; + struct route_node *rn = NULL; + struct prefix pfx_mac_buf; + + if (!rfd->mon_eth) { + rfd->mon_eth = skiplist_new(0, mon_eth_cmp, NULL); + } + + it = rfapiMacImportTableGet(bgp, logical_net_id); + assert(it); + + /* + * Get route node in import table. Here is where we attach the + * monitor. + * + * Look it up now because we return it to caller regardless of + * whether we create a new monitor or not. + */ + memset((void *)&pfx_mac_buf, 0, sizeof(struct prefix)); + pfx_mac_buf.family = AF_ETHERNET; + pfx_mac_buf.prefixlen = 48; + pfx_mac_buf.u.prefix_eth = *macaddr; + + if (!RFAPI_0_ETHERADDR(macaddr)) { + rn = route_node_get(it->imported_vpn[AFI_L2VPN], &pfx_mac_buf); + assert(rn); + } + + memset((void *)&mon_buf, 0, sizeof(mon_buf)); + mon_buf.rfd = rfd; + mon_buf.macaddr = *macaddr; + mon_buf.logical_net_id = logical_net_id; + + { + char buf[BUFSIZ]; + + vnc_zlog_debug_verbose( + "%s: LNI=%d: rfd=%p, pfx=%s", __func__, logical_net_id, + rfd, rfapi_ntop(pfx_mac_buf.family, pfx_mac_buf.u.val, + buf, BUFSIZ)); + } + + + /* + * look up query + */ + rc = skiplist_search(rfd->mon_eth, (void *)&mon_buf, (void **)&val); + if (!rc) { + /* + * Found monitor - we have seen this query before + * restart timer + */ + vnc_zlog_debug_verbose( + "%s: already present in rfd->mon_eth, not adding", + __func__); + rfapiMonitorEthTimerRestart(val); + return rn; + } + + /* + * New query + */ + val = XCALLOC(MTYPE_RFAPI_MONITOR_ETH, + sizeof(struct rfapi_monitor_eth)); + assert(val); + *val = mon_buf; + + ++rfd->monitor_count; + ++bgp->rfapi->monitor_count; + + rc = skiplist_insert(rfd->mon_eth, val, val); #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: inserted rfd=%p mon_eth=%p, rc=%d", __func__, rfd, val, - rc); + vnc_zlog_debug_verbose("%s: inserted rfd=%p mon_eth=%p, rc=%d", + __func__, rfd, val, rc); #endif - /* - * start timer - */ - rfapiMonitorEthTimerRestart (val); + /* + * start timer + */ + rfapiMonitorEthTimerRestart(val); - if (bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE) - { - /* - * callbacks turned off, so don't attach monitor to import table - */ + if (bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE) { +/* + * callbacks turned off, so don't attach monitor to import table + */ #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose - ("%s: callbacks turned off, not attaching mon_eth %p to import table", - __func__, val); + vnc_zlog_debug_verbose( + "%s: callbacks turned off, not attaching mon_eth %p to import table", + __func__, val); #endif - return rn; - } + return rn; + } - /* - * attach to import table - */ - rfapiMonitorEthAttachImport (it, rn, val); + /* + * attach to import table + */ + rfapiMonitorEthAttachImport(it, rn, val); - return rn; + return rn; } -void -rfapiMonitorEthDel ( - struct bgp *bgp, - struct rfapi_descriptor *rfd, - struct ethaddr *macaddr, - uint32_t logical_net_id) +void rfapiMonitorEthDel(struct bgp *bgp, struct rfapi_descriptor *rfd, + struct ethaddr *macaddr, uint32_t logical_net_id) { - struct rfapi_monitor_eth *val; - struct rfapi_monitor_eth mon_buf; - int rc; + struct rfapi_monitor_eth *val; + struct rfapi_monitor_eth mon_buf; + int rc; - vnc_zlog_debug_verbose ("%s: entry rfd=%p", __func__, rfd); + vnc_zlog_debug_verbose("%s: entry rfd=%p", __func__, rfd); - assert (rfd->mon_eth); + assert(rfd->mon_eth); - memset ((void *) &mon_buf, 0, sizeof (mon_buf)); - mon_buf.macaddr = *macaddr; - mon_buf.logical_net_id = logical_net_id; + memset((void *)&mon_buf, 0, sizeof(mon_buf)); + mon_buf.macaddr = *macaddr; + mon_buf.logical_net_id = logical_net_id; - rc = skiplist_search (rfd->mon_eth, (void *) &mon_buf, (void **) &val); - assert (!rc); + rc = skiplist_search(rfd->mon_eth, (void *)&mon_buf, (void **)&val); + assert(!rc); - /* - * remove from import table - */ - if (!(bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE)) - { - rfapiMonitorEthDetachImport (bgp, val); - } + /* + * remove from import table + */ + if (!(bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE)) { + rfapiMonitorEthDetachImport(bgp, val); + } - if (val->timer) - { - thread_cancel (val->timer); - val->timer = NULL; - } + if (val->timer) { + thread_cancel(val->timer); + val->timer = NULL; + } - /* - * remove from rfd list - */ - rc = skiplist_delete (rfd->mon_eth, val, val); - assert (!rc); + /* + * remove from rfd list + */ + rc = skiplist_delete(rfd->mon_eth, val, val); + assert(!rc); #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: freeing mon_eth %p", __func__, val); + vnc_zlog_debug_verbose("%s: freeing mon_eth %p", __func__, val); #endif - XFREE (MTYPE_RFAPI_MONITOR_ETH, val); + XFREE(MTYPE_RFAPI_MONITOR_ETH, val); - --rfd->monitor_count; - --bgp->rfapi->monitor_count; + --rfd->monitor_count; + --bgp->rfapi->monitor_count; } -void -rfapiMonitorCallbacksOff (struct bgp *bgp) +void rfapiMonitorCallbacksOff(struct bgp *bgp) { - struct rfapi_import_table *it; - afi_t afi; - struct route_table *rt; - struct route_node *rn; - void *cursor; - int rc; - struct rfapi *h = bgp->rfapi; - - if (bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE) - { - /* - * Already off. - */ - return; - } - bgp->rfapi_cfg->flags |= BGP_VNC_CONFIG_CALLBACK_DISABLE; + struct rfapi_import_table *it; + afi_t afi; + struct route_table *rt; + struct route_node *rn; + void *cursor; + int rc; + struct rfapi *h = bgp->rfapi; + + if (bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE) { + /* + * Already off. + */ + return; + } + bgp->rfapi_cfg->flags |= BGP_VNC_CONFIG_CALLBACK_DISABLE; #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: turned off callbacks", __func__); + vnc_zlog_debug_verbose("%s: turned off callbacks", __func__); #endif - if (h == NULL) - return; - /* - * detach monitors from import VPN tables. The monitors - * will still be linked in per-nve monitor lists. - */ - for (it = h->imports; it; it = it->next) - { - for (afi = AFI_IP; afi < AFI_MAX; ++afi) - { - - struct rfapi_monitor_vpn *m; - struct rfapi_monitor_vpn *next; - - rt = it->imported_vpn[afi]; - - for (rn = route_top (rt); rn; rn = route_next (rn)) - { - m = RFAPI_MONITOR_VPN (rn); - if (RFAPI_MONITOR_VPN (rn)) - RFAPI_MONITOR_VPN_W_ALLOC (rn) = NULL; - for (; m; m = next) - { - next = m->next; - m->next = NULL; /* gratuitous safeness */ - m->node = NULL; - route_unlock_node (rn); /* uncount */ - } - } - - for (m = it->vpn0_queries[afi]; m; m = next) - { - next = m->next; - m->next = NULL; /* gratuitous safeness */ - m->node = NULL; - } - it->vpn0_queries[afi] = NULL; /* detach first monitor */ - } - } - - /* - * detach monitors from import Eth tables. The monitors - * will still be linked in per-nve monitor lists. - */ - - /* - * Loop over ethernet import tables - */ - for (cursor = NULL, - rc = skiplist_next (h->import_mac, NULL, (void **) &it, &cursor); - !rc; rc = skiplist_next (h->import_mac, NULL, (void **) &it, &cursor)) - { - struct rfapi_monitor_eth *e; - struct rfapi_monitor_eth *enext; - - /* - * The actual route table - */ - rt = it->imported_vpn[AFI_L2VPN]; - - /* - * Find non-0 monitors (i.e., actual addresses, not FTD monitors) - */ - for (rn = route_top (rt); rn; rn = route_next (rn)) - { - struct skiplist *sl; - - sl = RFAPI_MONITOR_ETH (rn); - while (!skiplist_delete_first(sl)) - { - route_unlock_node (rn); /* uncount monitor */ - } - } - - /* - * Find 0-monitors (FTD queries) - */ - for (e = it->eth0_queries; e; e = enext) - { + if (h == NULL) + return; + /* + * detach monitors from import VPN tables. The monitors + * will still be linked in per-nve monitor lists. + */ + for (it = h->imports; it; it = it->next) { + for (afi = AFI_IP; afi < AFI_MAX; ++afi) { + + struct rfapi_monitor_vpn *m; + struct rfapi_monitor_vpn *next; + + rt = it->imported_vpn[afi]; + + for (rn = route_top(rt); rn; rn = route_next(rn)) { + m = RFAPI_MONITOR_VPN(rn); + if (RFAPI_MONITOR_VPN(rn)) + RFAPI_MONITOR_VPN_W_ALLOC(rn) = NULL; + for (; m; m = next) { + next = m->next; + m->next = + NULL; /* gratuitous safeness */ + m->node = NULL; + route_unlock_node(rn); /* uncount */ + } + } + + for (m = it->vpn0_queries[afi]; m; m = next) { + next = m->next; + m->next = NULL; /* gratuitous safeness */ + m->node = NULL; + } + it->vpn0_queries[afi] = NULL; /* detach first monitor */ + } + } + + /* + * detach monitors from import Eth tables. The monitors + * will still be linked in per-nve monitor lists. + */ + + /* + * Loop over ethernet import tables + */ + for (cursor = NULL, + rc = skiplist_next(h->import_mac, NULL, (void **)&it, &cursor); + !rc; + rc = skiplist_next(h->import_mac, NULL, (void **)&it, &cursor)) { + struct rfapi_monitor_eth *e; + struct rfapi_monitor_eth *enext; + + /* + * The actual route table + */ + rt = it->imported_vpn[AFI_L2VPN]; + + /* + * Find non-0 monitors (i.e., actual addresses, not FTD + * monitors) + */ + for (rn = route_top(rt); rn; rn = route_next(rn)) { + struct skiplist *sl; + + sl = RFAPI_MONITOR_ETH(rn); + while (!skiplist_delete_first(sl)) { + route_unlock_node(rn); /* uncount monitor */ + } + } + + /* + * Find 0-monitors (FTD queries) + */ + for (e = it->eth0_queries; e; e = enext) { #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: detaching eth0 mon %p", __func__, e); + vnc_zlog_debug_verbose("%s: detaching eth0 mon %p", + __func__, e); #endif - enext = e->next; - e->next = NULL; /* gratuitous safeness */ - } - it->eth0_queries = NULL; /* detach first monitor */ - } + enext = e->next; + e->next = NULL; /* gratuitous safeness */ + } + it->eth0_queries = NULL; /* detach first monitor */ + } } -void -rfapiMonitorCallbacksOn (struct bgp *bgp) +void rfapiMonitorCallbacksOn(struct bgp *bgp) { - struct listnode *hnode; - struct rfapi_descriptor *rfd; - - if (!(bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE)) - { - /* - * Already on. It's important that we don't try to reattach - * monitors that are already attached because, in the interest - * of performance, there is no checking at the lower level - * whether a monitor is already attached. It leads to - * corrupted chains (e.g., looped pointers) - */ - return; - } - bgp->rfapi_cfg->flags &= ~BGP_VNC_CONFIG_CALLBACK_DISABLE; + struct listnode *hnode; + struct rfapi_descriptor *rfd; + + if (!(bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE)) { + /* + * Already on. It's important that we don't try to reattach + * monitors that are already attached because, in the interest + * of performance, there is no checking at the lower level + * whether a monitor is already attached. It leads to + * corrupted chains (e.g., looped pointers) + */ + return; + } + bgp->rfapi_cfg->flags &= ~BGP_VNC_CONFIG_CALLBACK_DISABLE; #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: turned on callbacks", __func__); + vnc_zlog_debug_verbose("%s: turned on callbacks", __func__); #endif - if (bgp->rfapi == NULL) - return; - - /* - * reattach monitors - */ - for (ALL_LIST_ELEMENTS_RO (&bgp->rfapi->descriptors, hnode, rfd)) - { - - rfapiMonitorAttachImportHd (rfd); - rfapiMonitorEthAttachImportHd (bgp, rfd); - } + if (bgp->rfapi == NULL) + return; + + /* + * reattach monitors + */ + for (ALL_LIST_ELEMENTS_RO(&bgp->rfapi->descriptors, hnode, rfd)) { + + rfapiMonitorAttachImportHd(rfd); + rfapiMonitorEthAttachImportHd(bgp, rfd); + } } |