mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-24 19:37:51 +00:00
Revert "bgpd: combine import_check_table and nexthop_check_table"
This commit is contained in:
parent
5752340415
commit
c2cedabed1
@ -58,8 +58,7 @@ void bnc_nexthop_free(struct bgp_nexthop_cache *bnc)
|
|||||||
|
|
||||||
struct bgp_nexthop_cache *bnc_new(struct bgp_nexthop_cache_head *tree,
|
struct bgp_nexthop_cache *bnc_new(struct bgp_nexthop_cache_head *tree,
|
||||||
struct prefix *prefix, uint32_t srte_color,
|
struct prefix *prefix, uint32_t srte_color,
|
||||||
ifindex_t ifindex, bool import_check_table,
|
ifindex_t ifindex)
|
||||||
bool nexthop_check_table)
|
|
||||||
{
|
{
|
||||||
struct bgp_nexthop_cache *bnc;
|
struct bgp_nexthop_cache *bnc;
|
||||||
|
|
||||||
@ -69,9 +68,6 @@ struct bgp_nexthop_cache *bnc_new(struct bgp_nexthop_cache_head *tree,
|
|||||||
bnc->ifindex_ipv6_ll = ifindex;
|
bnc->ifindex_ipv6_ll = ifindex;
|
||||||
bnc->srte_color = srte_color;
|
bnc->srte_color = srte_color;
|
||||||
bnc->tree = tree;
|
bnc->tree = tree;
|
||||||
bnc->import_check_table = import_check_table;
|
|
||||||
bnc->nexthop_check_table = nexthop_check_table;
|
|
||||||
|
|
||||||
LIST_INIT(&(bnc->paths));
|
LIST_INIT(&(bnc->paths));
|
||||||
bgp_nexthop_cache_add(tree, bnc);
|
bgp_nexthop_cache_add(tree, bnc);
|
||||||
|
|
||||||
@ -972,7 +968,7 @@ static void bgp_show_nexthops_detail(struct vty *vty, struct bgp *bgp,
|
|||||||
|
|
||||||
static void bgp_show_nexthop(struct vty *vty, struct bgp *bgp,
|
static void bgp_show_nexthop(struct vty *vty, struct bgp *bgp,
|
||||||
struct bgp_nexthop_cache *bnc, bool specific,
|
struct bgp_nexthop_cache *bnc, bool specific,
|
||||||
bool import_check_table, json_object *json)
|
json_object *json)
|
||||||
{
|
{
|
||||||
char buf[PREFIX2STR_BUFFER];
|
char buf[PREFIX2STR_BUFFER];
|
||||||
time_t tbuf;
|
time_t tbuf;
|
||||||
@ -981,12 +977,6 @@ static void bgp_show_nexthop(struct vty *vty, struct bgp *bgp,
|
|||||||
json_object *json_last_update = NULL;
|
json_object *json_last_update = NULL;
|
||||||
json_object *json_nexthop = NULL;
|
json_object *json_nexthop = NULL;
|
||||||
|
|
||||||
if (bnc->import_check_table && !import_check_table)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (bnc->nexthop_check_table && import_check_table)
|
|
||||||
return;
|
|
||||||
|
|
||||||
peer = (struct peer *)bnc->nht_info;
|
peer = (struct peer *)bnc->nht_info;
|
||||||
|
|
||||||
if (json)
|
if (json)
|
||||||
@ -1113,14 +1103,16 @@ static void bgp_show_nexthops(struct vty *vty, struct bgp *bgp,
|
|||||||
else
|
else
|
||||||
vty_out(vty, "Current BGP nexthop cache:\n");
|
vty_out(vty, "Current BGP nexthop cache:\n");
|
||||||
}
|
}
|
||||||
|
if (import_table)
|
||||||
|
tree = &bgp->import_check_table;
|
||||||
|
else
|
||||||
|
tree = &bgp->nexthop_cache_table;
|
||||||
|
|
||||||
tree = &bgp->nexthop_cache_table;
|
|
||||||
if (afi == AFI_IP || afi == AFI_IP6) {
|
if (afi == AFI_IP || afi == AFI_IP6) {
|
||||||
if (json)
|
if (json)
|
||||||
json_afi = json_object_new_object();
|
json_afi = json_object_new_object();
|
||||||
frr_each (bgp_nexthop_cache, &(*tree)[afi], bnc) {
|
frr_each (bgp_nexthop_cache, &(*tree)[afi], bnc) {
|
||||||
bgp_show_nexthop(vty, bgp, bnc, detail, import_table,
|
bgp_show_nexthop(vty, bgp, bnc, detail, json_afi);
|
||||||
json_afi);
|
|
||||||
found = true;
|
found = true;
|
||||||
}
|
}
|
||||||
if (found && json)
|
if (found && json)
|
||||||
@ -1134,8 +1126,7 @@ static void bgp_show_nexthops(struct vty *vty, struct bgp *bgp,
|
|||||||
if (json && (afi == AFI_IP || afi == AFI_IP6))
|
if (json && (afi == AFI_IP || afi == AFI_IP6))
|
||||||
json_afi = json_object_new_object();
|
json_afi = json_object_new_object();
|
||||||
frr_each (bgp_nexthop_cache, &(*tree)[afi], bnc)
|
frr_each (bgp_nexthop_cache, &(*tree)[afi], bnc)
|
||||||
bgp_show_nexthop(vty, bgp, bnc, detail, import_table,
|
bgp_show_nexthop(vty, bgp, bnc, detail, json_afi);
|
||||||
json_afi);
|
|
||||||
if (json && (afi == AFI_IP || afi == AFI_IP6))
|
if (json && (afi == AFI_IP || afi == AFI_IP6))
|
||||||
json_object_object_add(
|
json_object_object_add(
|
||||||
json, (afi == AFI_IP) ? "ipv4" : "ipv6",
|
json, (afi == AFI_IP) ? "ipv4" : "ipv6",
|
||||||
@ -1171,15 +1162,15 @@ static int show_ip_bgp_nexthop_table(struct vty *vty, const char *name,
|
|||||||
vty_out(vty, "nexthop address is malformed\n");
|
vty_out(vty, "nexthop address is malformed\n");
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
}
|
}
|
||||||
tree = &bgp->nexthop_cache_table;
|
tree = import_table ? &bgp->import_check_table
|
||||||
|
: &bgp->nexthop_cache_table;
|
||||||
if (json)
|
if (json)
|
||||||
json_afi = json_object_new_object();
|
json_afi = json_object_new_object();
|
||||||
frr_each (bgp_nexthop_cache, &(*tree)[family2afi(nhop.family)],
|
frr_each (bgp_nexthop_cache, &(*tree)[family2afi(nhop.family)],
|
||||||
bnc) {
|
bnc) {
|
||||||
if (prefix_cmp(&bnc->prefix, &nhop))
|
if (prefix_cmp(&bnc->prefix, &nhop))
|
||||||
continue;
|
continue;
|
||||||
bgp_show_nexthop(vty, bgp, bnc, true, import_table,
|
bgp_show_nexthop(vty, bgp, bnc, true, json_afi);
|
||||||
json_afi);
|
|
||||||
found = true;
|
found = true;
|
||||||
}
|
}
|
||||||
if (json)
|
if (json)
|
||||||
@ -1322,6 +1313,7 @@ void bgp_scan_init(struct bgp *bgp)
|
|||||||
|
|
||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
|
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
|
||||||
bgp_nexthop_cache_init(&bgp->nexthop_cache_table[afi]);
|
bgp_nexthop_cache_init(&bgp->nexthop_cache_table[afi]);
|
||||||
|
bgp_nexthop_cache_init(&bgp->import_check_table[afi]);
|
||||||
bgp->connected_table[afi] = bgp_table_init(bgp, afi,
|
bgp->connected_table[afi] = bgp_table_init(bgp, afi,
|
||||||
SAFI_UNICAST);
|
SAFI_UNICAST);
|
||||||
}
|
}
|
||||||
@ -1341,6 +1333,7 @@ void bgp_scan_finish(struct bgp *bgp)
|
|||||||
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
|
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
|
||||||
/* Only the current one needs to be reset. */
|
/* Only the current one needs to be reset. */
|
||||||
bgp_nexthop_cache_reset(&bgp->nexthop_cache_table[afi]);
|
bgp_nexthop_cache_reset(&bgp->nexthop_cache_table[afi]);
|
||||||
|
bgp_nexthop_cache_reset(&bgp->import_check_table[afi]);
|
||||||
|
|
||||||
bgp->connected_table[afi]->route_table->cleanup =
|
bgp->connected_table[afi]->route_table->cleanup =
|
||||||
bgp_connected_cleanup;
|
bgp_connected_cleanup;
|
||||||
|
@ -91,9 +91,6 @@ struct bgp_nexthop_cache {
|
|||||||
* nexthop.
|
* nexthop.
|
||||||
*/
|
*/
|
||||||
bool is_evpn_gwip_nexthop;
|
bool is_evpn_gwip_nexthop;
|
||||||
|
|
||||||
bool import_check_table;
|
|
||||||
bool nexthop_check_table;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int bgp_nexthop_cache_compare(const struct bgp_nexthop_cache *a,
|
extern int bgp_nexthop_cache_compare(const struct bgp_nexthop_cache *a,
|
||||||
@ -135,9 +132,8 @@ extern bool bgp_nexthop_self(struct bgp *bgp, afi_t afi, uint8_t type,
|
|||||||
struct bgp_dest *dest);
|
struct bgp_dest *dest);
|
||||||
extern struct bgp_nexthop_cache *bnc_new(struct bgp_nexthop_cache_head *tree,
|
extern struct bgp_nexthop_cache *bnc_new(struct bgp_nexthop_cache_head *tree,
|
||||||
struct prefix *prefix,
|
struct prefix *prefix,
|
||||||
uint32_t srte_color, ifindex_t ifindex,
|
uint32_t srte_color,
|
||||||
bool import_check_table,
|
ifindex_t ifindex);
|
||||||
bool nexthop_check_table);
|
|
||||||
extern bool bnc_existing_for_prefix(struct bgp_nexthop_cache *bnc);
|
extern bool bnc_existing_for_prefix(struct bgp_nexthop_cache *bnc);
|
||||||
extern void bnc_free(struct bgp_nexthop_cache *bnc);
|
extern void bnc_free(struct bgp_nexthop_cache *bnc);
|
||||||
extern struct bgp_nexthop_cache *bnc_find(struct bgp_nexthop_cache_head *tree,
|
extern struct bgp_nexthop_cache *bnc_find(struct bgp_nexthop_cache_head *tree,
|
||||||
|
@ -378,12 +378,14 @@ int bgp_find_or_add_nexthop(struct bgp *bgp_route, struct bgp *bgp_nexthop,
|
|||||||
} else
|
} else
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
tree = &bgp_nexthop->nexthop_cache_table[afi];
|
if (is_bgp_static_route)
|
||||||
|
tree = &bgp_nexthop->import_check_table[afi];
|
||||||
|
else
|
||||||
|
tree = &bgp_nexthop->nexthop_cache_table[afi];
|
||||||
|
|
||||||
bnc = bnc_find(tree, &p, srte_color, ifindex);
|
bnc = bnc_find(tree, &p, srte_color, ifindex);
|
||||||
if (!bnc) {
|
if (!bnc) {
|
||||||
bnc = bnc_new(tree, &p, srte_color, ifindex,
|
bnc = bnc_new(tree, &p, srte_color, ifindex);
|
||||||
is_bgp_static_route, !is_bgp_static_route);
|
|
||||||
bnc->bgp = bgp_nexthop;
|
bnc->bgp = bgp_nexthop;
|
||||||
if (BGP_DEBUG(nht, NHT))
|
if (BGP_DEBUG(nht, NHT))
|
||||||
zlog_debug("Allocated bnc %pFX(%d)(%u)(%s) peer %p",
|
zlog_debug("Allocated bnc %pFX(%d)(%u)(%s) peer %p",
|
||||||
@ -391,11 +393,6 @@ int bgp_find_or_add_nexthop(struct bgp *bgp_route, struct bgp *bgp_nexthop,
|
|||||||
bnc->srte_color, bnc->bgp->name_pretty,
|
bnc->srte_color, bnc->bgp->name_pretty,
|
||||||
peer);
|
peer);
|
||||||
} else {
|
} else {
|
||||||
if (is_bgp_static_route)
|
|
||||||
bnc->import_check_table = true;
|
|
||||||
else
|
|
||||||
bnc->nexthop_check_table = true;
|
|
||||||
|
|
||||||
if (BGP_DEBUG(nht, NHT))
|
if (BGP_DEBUG(nht, NHT))
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"Found existing bnc %pFX(%d)(%s) flags 0x%x ifindex %d #paths %d peer %p",
|
"Found existing bnc %pFX(%d)(%s) flags 0x%x ifindex %d #paths %d peer %p",
|
||||||
@ -822,8 +819,12 @@ static void bgp_nht_ifp_handle(struct interface *ifp, bool up)
|
|||||||
|
|
||||||
bgp_nht_ifp_table_handle(bgp, &bgp->nexthop_cache_table[AFI_IP], ifp,
|
bgp_nht_ifp_table_handle(bgp, &bgp->nexthop_cache_table[AFI_IP], ifp,
|
||||||
up);
|
up);
|
||||||
|
bgp_nht_ifp_table_handle(bgp, &bgp->import_check_table[AFI_IP], ifp,
|
||||||
|
up);
|
||||||
bgp_nht_ifp_table_handle(bgp, &bgp->nexthop_cache_table[AFI_IP6], ifp,
|
bgp_nht_ifp_table_handle(bgp, &bgp->nexthop_cache_table[AFI_IP6], ifp,
|
||||||
up);
|
up);
|
||||||
|
bgp_nht_ifp_table_handle(bgp, &bgp->import_check_table[AFI_IP6], ifp,
|
||||||
|
up);
|
||||||
}
|
}
|
||||||
|
|
||||||
void bgp_nht_ifp_up(struct interface *ifp)
|
void bgp_nht_ifp_up(struct interface *ifp)
|
||||||
@ -899,7 +900,7 @@ void bgp_nht_interface_events(struct peer *peer)
|
|||||||
void bgp_parse_nexthop_update(int command, vrf_id_t vrf_id)
|
void bgp_parse_nexthop_update(int command, vrf_id_t vrf_id)
|
||||||
{
|
{
|
||||||
struct bgp_nexthop_cache_head *tree = NULL;
|
struct bgp_nexthop_cache_head *tree = NULL;
|
||||||
struct bgp_nexthop_cache *bnc_nhc;
|
struct bgp_nexthop_cache *bnc_nhc, *bnc_import;
|
||||||
struct bgp *bgp;
|
struct bgp *bgp;
|
||||||
struct prefix match;
|
struct prefix match;
|
||||||
struct zapi_route nhr;
|
struct zapi_route nhr;
|
||||||
@ -929,12 +930,19 @@ void bgp_parse_nexthop_update(int command, vrf_id_t vrf_id)
|
|||||||
zlog_debug(
|
zlog_debug(
|
||||||
"parse nexthop update %pFX(%u)(%s): bnc info not found for nexthop cache",
|
"parse nexthop update %pFX(%u)(%s): bnc info not found for nexthop cache",
|
||||||
&nhr.prefix, nhr.srte_color, bgp->name_pretty);
|
&nhr.prefix, nhr.srte_color, bgp->name_pretty);
|
||||||
} else {
|
} else
|
||||||
if (bnc_nhc->nexthop_check_table)
|
bgp_process_nexthop_update(bnc_nhc, &nhr, false);
|
||||||
bgp_process_nexthop_update(bnc_nhc, &nhr, false);
|
|
||||||
if (bnc_nhc->import_check_table)
|
tree = &bgp->import_check_table[afi];
|
||||||
bgp_process_nexthop_update(bnc_nhc, &nhr, true);
|
|
||||||
}
|
bnc_import = bnc_find(tree, &match, nhr.srte_color, 0);
|
||||||
|
if (!bnc_import) {
|
||||||
|
if (BGP_DEBUG(nht, NHT))
|
||||||
|
zlog_debug(
|
||||||
|
"parse nexthop update %pFX(%u)(%s): bnc info not found for import check",
|
||||||
|
&nhr.prefix, nhr.srte_color, bgp->name_pretty);
|
||||||
|
} else
|
||||||
|
bgp_process_nexthop_update(bnc_import, &nhr, true);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* HACK: if any BGP route is dependant on an SR-policy that doesn't
|
* HACK: if any BGP route is dependant on an SR-policy that doesn't
|
||||||
|
@ -559,6 +559,9 @@ struct bgp {
|
|||||||
/* Tree for next-hop lookup cache. */
|
/* Tree for next-hop lookup cache. */
|
||||||
struct bgp_nexthop_cache_head nexthop_cache_table[AFI_MAX];
|
struct bgp_nexthop_cache_head nexthop_cache_table[AFI_MAX];
|
||||||
|
|
||||||
|
/* Tree for import-check */
|
||||||
|
struct bgp_nexthop_cache_head import_check_table[AFI_MAX];
|
||||||
|
|
||||||
struct bgp_table *connected_table[AFI_MAX];
|
struct bgp_table *connected_table[AFI_MAX];
|
||||||
|
|
||||||
struct hash *address_hash;
|
struct hash *address_hash;
|
||||||
|
Loading…
Reference in New Issue
Block a user