summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/ChangeLog7
-rw-r--r--bgpd/bgp_nexthop.c249
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);