diff options
-rw-r--r-- | bgpd/ChangeLog | 7 | ||||
-rw-r--r-- | bgpd/bgp_nexthop.c | 249 |
2 files changed, 82 insertions, 174 deletions
diff --git a/bgpd/ChangeLog b/bgpd/ChangeLog index 196fa033..0e767dec 100644 --- a/bgpd/ChangeLog +++ b/bgpd/ChangeLog @@ -1,3 +1,10 @@ +2004-11-09 Paul Jakma <paul@dishone.st> + + * bgp_nexthop.c: collapse bgp_connected_ipvX, bgp_nexthop_cache_ipvX + and cache{1,2}.. into arrays of tables and hence collapse + bgp_scan_ipv{4,6} into a single bgp_scan function. Tested, though + a long time ago (and this change was hand-merged). + 2004-11-04 Andrew J. Schorr <ajschorr@alumni.princeton.edu> * bgp_route.c: Remove all code related to VTY_CONTINUE; this feature diff --git a/bgpd/bgp_nexthop.c b/bgpd/bgp_nexthop.c index c50eeedd..cd899841 100644 --- a/bgpd/bgp_nexthop.c +++ b/bgpd/bgp_nexthop.c @@ -57,20 +57,12 @@ int bgp_scan_interval; int bgp_import_interval; /* Route table for next-hop lookup cache. */ -struct bgp_table *bgp_nexthop_cache_ipv4; -struct bgp_table *cache1; -struct bgp_table *cache2; - -/* Route table for next-hop lookup cache. */ -struct bgp_table *bgp_nexthop_cache_ipv6; -struct bgp_table *cache6_1; -struct bgp_table *cache6_2; - -/* Route table for connected route. */ -struct bgp_table *bgp_connected_ipv4; +struct bgp_table *bgp_nexthop_cache_table[AFI_MAX]; +struct bgp_table *cache1_table[AFI_MAX]; +struct bgp_table *cache2_table[AFI_MAX]; /* Route table for connected route. */ -struct bgp_table *bgp_connected_ipv6; +struct bgp_table *bgp_connected_table[AFI_MAX]; /* BGP nexthop lookup query client. */ static struct zclient *zlookup = NULL; @@ -197,7 +189,7 @@ bgp_nexthop_check_ebgp (afi_t afi, struct attr *attr) /* Lookup the address is onlink or not. */ if (afi == AFI_IP) { - rn = bgp_node_match_ipv4 (bgp_connected_ipv4, &attr->nexthop); + rn = bgp_node_match_ipv4 (bgp_connected_table[AFI_IP], &attr->nexthop); if (rn) { bgp_unlock_node (rn); @@ -214,7 +206,7 @@ bgp_nexthop_check_ebgp (afi_t afi, struct attr *attr) if (IN6_IS_ADDR_LINKLOCAL (&attr->mp_nexthop_global)) return 1; - rn = bgp_node_match_ipv6 (bgp_connected_ipv6, + rn = bgp_node_match_ipv6 (bgp_connected_table[AFI_IP6], &attr->mp_nexthop_global); if (rn) { @@ -258,7 +250,7 @@ bgp_nexthop_lookup_ipv6 (struct peer *peer, struct bgp_info *ri, int *changed, p.u.prefix6 = attr->mp_nexthop_global; /* IBGP or ebgp-multihop */ - rn = bgp_node_get (bgp_nexthop_cache_ipv6, &p); + rn = bgp_node_get (bgp_nexthop_cache_table[AFI_IP6], &p); if (rn->info) { @@ -276,10 +268,10 @@ bgp_nexthop_lookup_ipv6 (struct peer *peer, struct bgp_info *ri, int *changed, if (changed) { - if (bgp_nexthop_cache_ipv6 == cache6_1) - old = cache6_2; + if (bgp_nexthop_cache_table[AFI_IP6] == cache1_table[AFI_IP6]) + old = cache2_table[AFI_IP6]; else - old = cache6_1; + old = cache1_table[AFI_IP6]; oldrn = bgp_node_lookup (old, &p); if (oldrn) @@ -346,7 +338,7 @@ bgp_nexthop_lookup (afi_t afi, struct peer *peer, struct bgp_info *ri, p.u.prefix4 = addr; /* IBGP or ebgp-multihop */ - rn = bgp_node_get (bgp_nexthop_cache_ipv4, &p); + rn = bgp_node_get (bgp_nexthop_cache_table[AFI_IP], &p); if (rn->info) { @@ -364,10 +356,10 @@ bgp_nexthop_lookup (afi_t afi, struct peer *peer, struct bgp_info *ri, if (changed) { - if (bgp_nexthop_cache_ipv4 == cache1) - old = cache2; + if (bgp_nexthop_cache_table[AFI_IP] == cache1_table[AFI_IP]) + old = cache2_table[AFI_IP]; else - old = cache1; + old = cache1_table[AFI_IP]; oldrn = bgp_node_lookup (old, &p); if (oldrn) @@ -420,7 +412,7 @@ bgp_nexthop_cache_reset (struct bgp_table *table) } void -bgp_scan_ipv4 () +bgp_scan (afi_t afi, safi_t safi) { struct bgp_node *rn; struct bgp *bgp; @@ -434,10 +426,10 @@ bgp_scan_ipv4 () int metricchanged; /* Change cache. */ - if (bgp_nexthop_cache_ipv4 == cache1) - bgp_nexthop_cache_ipv4 = cache2; + if (bgp_nexthop_cache_table[afi] == cache1_table[afi]) + bgp_nexthop_cache_table[afi] = cache2_table[afi]; else - bgp_nexthop_cache_ipv4 = cache1; + bgp_nexthop_cache_table[afi] = cache1_table[afi]; /* Get default bgp. */ bgp = bgp_get_default (); @@ -450,15 +442,15 @@ bgp_scan_ipv4 () if (peer->status != Established) continue; - if (peer->afc[AFI_IP][SAFI_UNICAST]) - bgp_maximum_prefix_overflow (peer, AFI_IP, SAFI_UNICAST, 1); - if (peer->afc[AFI_IP][SAFI_MULTICAST]) - bgp_maximum_prefix_overflow (peer, AFI_IP, SAFI_MULTICAST, 1); - if (peer->afc[AFI_IP][SAFI_MPLS_VPN]) - bgp_maximum_prefix_overflow (peer, AFI_IP, SAFI_MPLS_VPN, 1); + if (peer->afc[afi][SAFI_UNICAST]) + bgp_maximum_prefix_overflow (peer, afi, SAFI_UNICAST, 1); + if (peer->afc[afi][SAFI_MULTICAST]) + bgp_maximum_prefix_overflow (peer, afi, SAFI_MULTICAST, 1); + if (peer->afc[afi][SAFI_MPLS_VPN]) + bgp_maximum_prefix_overflow (peer, afi, SAFI_MPLS_VPN, 1); } - for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_UNICAST]); rn; + for (rn = bgp_table_top (bgp->rib[afi][SAFI_UNICAST]); rn; rn = bgp_route_next (rn)) { for (bi = rn->info; bi; bi = next) @@ -471,9 +463,9 @@ bgp_scan_ipv4 () metricchanged = 0; if (peer_sort (bi->peer) == BGP_PEER_EBGP && bi->peer->ttl == 1) - valid = bgp_nexthop_check_ebgp (AFI_IP, bi->attr); + valid = bgp_nexthop_check_ebgp (afi, bi->attr); else - valid = bgp_nexthop_lookup (AFI_IP, bi->peer, bi, + valid = bgp_nexthop_lookup (afi, bi->peer, bi, &changed, &metricchanged); current = CHECK_FLAG (bi->flags, BGP_INFO_VALID) ? 1 : 0; @@ -488,153 +480,55 @@ bgp_scan_ipv4 () if (CHECK_FLAG (bi->flags, BGP_INFO_VALID)) { bgp_aggregate_decrement (bgp, &rn->p, bi, - AFI_IP, SAFI_UNICAST); - UNSET_FLAG (bi->flags, BGP_INFO_VALID); - } - else - { - SET_FLAG (bi->flags, BGP_INFO_VALID); - bgp_aggregate_increment (bgp, &rn->p, bi, - AFI_IP, SAFI_UNICAST); - } - } - - if (CHECK_FLAG (bgp->af_flags[AFI_IP][SAFI_UNICAST], - BGP_CONFIG_DAMPENING) - && bi->damp_info ) - if (bgp_damp_scan (bi, AFI_IP, SAFI_UNICAST)) - bgp_aggregate_increment (bgp, &rn->p, bi, - AFI_IP, SAFI_UNICAST); - } - } - bgp_process (bgp, rn, AFI_IP, SAFI_UNICAST); - } - - /* Flash old cache. */ - if (bgp_nexthop_cache_ipv4 == cache1) - bgp_nexthop_cache_reset (cache2); - else - bgp_nexthop_cache_reset (cache1); -} - -#ifdef HAVE_IPV6 -void -bgp_scan_ipv6 () -{ - struct bgp_node *rn; - struct bgp *bgp; - struct bgp_info *bi; - struct bgp_info *next; - struct peer *peer; - struct listnode *nn; - int valid; - int current; - int changed; - int metricchanged; - - /* Change cache. */ - if (bgp_nexthop_cache_ipv6 == cache6_1) - bgp_nexthop_cache_ipv6 = cache6_2; - else - bgp_nexthop_cache_ipv6 = cache6_1; - - /* Get default bgp. */ - bgp = bgp_get_default (); - if (bgp == NULL) - return; - - /* Maximum prefix check */ - LIST_LOOP (bgp->peer, peer, nn) - { - if (peer->status != Established) - continue; - - if (peer->afc[AFI_IP6][SAFI_UNICAST]) - bgp_maximum_prefix_overflow (peer, AFI_IP6, SAFI_UNICAST, 1); - if (peer->afc[AFI_IP6][SAFI_MULTICAST]) - bgp_maximum_prefix_overflow (peer, AFI_IP6, SAFI_MULTICAST, 1); - } - - for (rn = bgp_table_top (bgp->rib[AFI_IP6][SAFI_UNICAST]); rn; - rn = bgp_route_next (rn)) - { - for (bi = rn->info; bi; bi = next) - { - next = bi->next; - - if (bi->type == ZEBRA_ROUTE_BGP && bi->sub_type == BGP_ROUTE_NORMAL) - { - changed = 0; - metricchanged = 0; - - if (peer_sort (bi->peer) == BGP_PEER_EBGP && bi->peer->ttl == 1) - valid = 1; - else - valid = bgp_nexthop_lookup_ipv6 (bi->peer, bi, - &changed, &metricchanged); - - current = CHECK_FLAG (bi->flags, BGP_INFO_VALID) ? 1 : 0; - - if (changed) - SET_FLAG (bi->flags, BGP_INFO_IGP_CHANGED); - else - UNSET_FLAG (bi->flags, BGP_INFO_IGP_CHANGED); - - if (valid != current) - { - if (CHECK_FLAG (bi->flags, BGP_INFO_VALID)) - { - bgp_aggregate_decrement (bgp, &rn->p, bi, - AFI_IP6, SAFI_UNICAST); + afi, SAFI_UNICAST); UNSET_FLAG (bi->flags, BGP_INFO_VALID); } else { SET_FLAG (bi->flags, BGP_INFO_VALID); bgp_aggregate_increment (bgp, &rn->p, bi, - AFI_IP6, SAFI_UNICAST); + afi, SAFI_UNICAST); } } - if (CHECK_FLAG (bgp->af_flags[AFI_IP6][SAFI_UNICAST], + if (CHECK_FLAG (bgp->af_flags[afi][SAFI_UNICAST], BGP_CONFIG_DAMPENING) && bi->damp_info ) - if (bgp_damp_scan (bi, AFI_IP6, SAFI_UNICAST)) + if (bgp_damp_scan (bi, afi, SAFI_UNICAST)) bgp_aggregate_increment (bgp, &rn->p, bi, - AFI_IP6, SAFI_UNICAST); + afi, SAFI_UNICAST); } } - bgp_process (bgp, rn, AFI_IP6, SAFI_UNICAST); + bgp_process (bgp, rn, afi, SAFI_UNICAST); } /* Flash old cache. */ - if (bgp_nexthop_cache_ipv6 == cache6_1) - bgp_nexthop_cache_reset (cache6_2); + if (bgp_nexthop_cache_table[afi] == cache1_table[afi]) + bgp_nexthop_cache_reset (cache2_table[afi]); else - bgp_nexthop_cache_reset (cache6_1); + bgp_nexthop_cache_reset (cache1_table[afi]); } -#endif /* HAVE_IPV6 */ /* BGP scan thread. This thread check nexthop reachability. */ int -bgp_scan (struct thread *t) +bgp_scan_timer (struct thread *t) { bgp_scan_thread = - thread_add_timer (master, bgp_scan, NULL, bgp_scan_interval); + thread_add_timer (master, bgp_scan_timer, NULL, bgp_scan_interval); if (BGP_DEBUG (normal, NORMAL)) zlog_info ("Performing BGP general scanning"); - bgp_scan_ipv4 (); + bgp_scan (AFI_IP, SAFI_UNICAST); #ifdef HAVE_IPV6 - bgp_scan_ipv6 (); + bgp_scan (AFI_IP6, SAFI_UNICAST); #endif /* HAVE_IPV6 */ return 0; } -struct bgp_connected +struct bgp_connected_ref { unsigned int refcnt; }; @@ -647,7 +541,7 @@ bgp_connected_add (struct connected *ifc) struct prefix *dest; struct interface *ifp; struct bgp_node *rn; - struct bgp_connected *bc; + struct bgp_connected_ref *bc; ifp = ifc->ifp; @@ -676,7 +570,7 @@ bgp_connected_add (struct connected *ifc) if (prefix_ipv4_any ((struct prefix_ipv4 *) &p)) return; - rn = bgp_node_get (bgp_connected_ipv4, (struct prefix *) &p); + rn = bgp_node_get (bgp_connected_table[AFI_IP], (struct prefix *) &p); if (rn->info) { bc = rn->info; @@ -684,8 +578,8 @@ bgp_connected_add (struct connected *ifc) } else { - bc = XMALLOC (0, sizeof (struct bgp_connected)); - memset (bc, 0, sizeof (struct bgp_connected)); + bc = XMALLOC (0, sizeof (struct bgp_connected_ref)); + memset (bc, 0, sizeof (struct bgp_connected_ref)); bc->refcnt = 1; rn->info = bc; } @@ -710,7 +604,7 @@ bgp_connected_add (struct connected *ifc) if (IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6)) return; - rn = bgp_node_get (bgp_connected_ipv6, (struct prefix *) &p); + rn = bgp_node_get (bgp_connected_table[AFI_IP6], (struct prefix *) &p); if (rn->info) { bc = rn->info; @@ -718,8 +612,8 @@ bgp_connected_add (struct connected *ifc) } else { - bc = XMALLOC (0, sizeof (struct bgp_connected)); - memset (bc, 0, sizeof (struct bgp_connected)); + bc = XMALLOC (0, sizeof (struct bgp_connected_ref)); + memset (bc, 0, sizeof (struct bgp_connected_ref)); bc->refcnt = 1; rn->info = bc; } @@ -735,7 +629,7 @@ bgp_connected_delete (struct connected *ifc) struct prefix *dest; struct interface *ifp; struct bgp_node *rn; - struct bgp_connected *bc; + struct bgp_connected_ref *bc; ifp = ifc->ifp; @@ -761,7 +655,7 @@ bgp_connected_delete (struct connected *ifc) if (prefix_ipv4_any ((struct prefix_ipv4 *) &p)) return; - rn = bgp_node_lookup (bgp_connected_ipv4, &p); + rn = bgp_node_lookup (bgp_connected_table[AFI_IP], &p); if (! rn) return; @@ -795,7 +689,7 @@ bgp_connected_delete (struct connected *ifc) if (IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6)) return; - rn = bgp_node_lookup (bgp_connected_ipv6, (struct prefix *) &p); + rn = bgp_node_lookup (bgp_connected_table[AFI_IP6], (struct prefix *) &p); if (! rn) return; @@ -1242,11 +1136,11 @@ bgp_multiaccess_check_v4 (struct in_addr nexthop, char *peer) if (zlookup->sock < 0) return 0; - rn1 = bgp_node_match (bgp_connected_ipv4, &p1); + rn1 = bgp_node_match (bgp_connected_table[AFI_IP], &p1); if (! rn1) return 0; - rn2 = bgp_node_match (bgp_connected_ipv4, &p2); + rn2 = bgp_node_match (bgp_connected_table[AFI_IP], &p2); if (! rn2) return 0; @@ -1269,7 +1163,7 @@ DEFUN (bgp_scan_time, { thread_cancel (bgp_scan_thread); bgp_scan_thread = - thread_add_timer (master, bgp_scan, NULL, bgp_scan_interval); + thread_add_timer (master, bgp_scan_timer, NULL, bgp_scan_interval); } return CMD_SUCCESS; @@ -1288,7 +1182,7 @@ DEFUN (no_bgp_scan_time, { thread_cancel (bgp_scan_thread); bgp_scan_thread = - thread_add_timer (master, bgp_scan, NULL, bgp_scan_interval); + thread_add_timer (master, bgp_scan_timer, NULL, bgp_scan_interval); } return CMD_SUCCESS; @@ -1320,7 +1214,7 @@ DEFUN (show_ip_bgp_scan, vty_out (vty, "BGP scan interval is %d%s", bgp_scan_interval, VTY_NEWLINE); vty_out (vty, "Current BGP nexthop cache:%s", VTY_NEWLINE); - for (rn = bgp_table_top (bgp_nexthop_cache_ipv4); rn; rn = bgp_route_next (rn)) + for (rn = bgp_table_top (bgp_nexthop_cache_table[AFI_IP]); rn; rn = bgp_route_next (rn)) if ((bnc = rn->info) != NULL) { if (bnc->valid) @@ -1334,7 +1228,9 @@ DEFUN (show_ip_bgp_scan, #ifdef HAVE_IPV6 { char buf[BUFSIZ]; - for (rn = bgp_table_top (bgp_nexthop_cache_ipv6); rn; rn = bgp_route_next (rn)) + for (rn = bgp_table_top (bgp_nexthop_cache_table[AFI_IP6]); + rn; + rn = bgp_route_next (rn)) if ((bnc = rn->info) != NULL) { if (bnc->valid) @@ -1350,7 +1246,9 @@ DEFUN (show_ip_bgp_scan, #endif /* HAVE_IPV6 */ vty_out (vty, "BGP connected route:%s", VTY_NEWLINE); - for (rn = bgp_table_top (bgp_connected_ipv4); rn; rn = bgp_route_next (rn)) + for (rn = bgp_table_top (bgp_connected_table[AFI_IP]); + rn; + rn = bgp_route_next (rn)) if (rn->info != NULL) vty_out (vty, " %s/%d%s", inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen, VTY_NEWLINE); @@ -1359,7 +1257,9 @@ DEFUN (show_ip_bgp_scan, { char buf[BUFSIZ]; - for (rn = bgp_table_top (bgp_connected_ipv6); rn; rn = bgp_route_next (rn)) + for (rn = bgp_table_top (bgp_connected_table[AFI_IP6]); + rn; + rn = bgp_route_next (rn)) if (rn->info != NULL) vty_out (vty, " %s/%d%s", inet_ntop (AF_INET6, &rn->p.u.prefix6, buf, BUFSIZ), @@ -1391,21 +1291,22 @@ bgp_scan_init () bgp_scan_interval = BGP_SCAN_INTERVAL_DEFAULT; bgp_import_interval = BGP_IMPORT_INTERVAL_DEFAULT; - cache1 = bgp_table_init (); - cache2 = bgp_table_init (); - bgp_nexthop_cache_ipv4 = cache1; + cache1_table[AFI_IP] = bgp_table_init (); + cache2_table[AFI_IP] = bgp_table_init (); + bgp_nexthop_cache_table[AFI_IP] = cache1_table[AFI_IP]; - bgp_connected_ipv4 = bgp_table_init (); + bgp_connected_table[AFI_IP] = bgp_table_init (); #ifdef HAVE_IPV6 - cache6_1 = bgp_table_init (); - cache6_2 = bgp_table_init (); - bgp_nexthop_cache_ipv6 = cache6_1; - bgp_connected_ipv6 = bgp_table_init (); + cache1_table[AFI_IP6] = bgp_table_init (); + cache2_table[AFI_IP6] = bgp_table_init (); + bgp_nexthop_cache_table[AFI_IP6] = cache1_table[AFI_IP6]; + bgp_connected_table[AFI_IP6] = bgp_table_init (); #endif /* HAVE_IPV6 */ /* Make BGP scan thread. */ - bgp_scan_thread = thread_add_timer (master, bgp_scan, NULL, bgp_scan_interval); + bgp_scan_thread = thread_add_timer (master, bgp_scan_timer, + NULL, bgp_scan_interval); /* Make BGP import there. */ bgp_import_thread = thread_add_timer (master, bgp_import, NULL, 0); |