diff options
Diffstat (limited to 'bgpd/bgp_table.c')
| -rw-r--r-- | bgpd/bgp_table.c | 46 |
1 files changed, 31 insertions, 15 deletions
diff --git a/bgpd/bgp_table.c b/bgpd/bgp_table.c index 04181d38be..dcf9852a67 100644 --- a/bgpd/bgp_table.c +++ b/bgpd/bgp_table.c @@ -168,13 +168,22 @@ static struct bgp_node * bgp_route_next_until_maxlen(struct bgp_node *node, const struct bgp_node *limit, const uint8_t maxlen) { - if (node->l_left && node->p.prefixlen < maxlen - && node->l_left->p.prefixlen <= maxlen) { - return bgp_node_from_rnode(node->l_left); + const struct prefix *p = bgp_node_get_prefix(node); + + if (node->l_left) { + const struct prefix *left_p = + bgp_node_get_prefix(bgp_node_from_rnode(node->l_left)); + + if (p->prefixlen < maxlen && left_p->prefixlen <= maxlen) + return bgp_node_from_rnode(node->l_left); } - if (node->l_right && node->p.prefixlen < maxlen - && node->l_right->p.prefixlen <= maxlen) { - return bgp_node_from_rnode(node->l_right); + + if (node->l_right) { + const struct prefix *right_p = + bgp_node_get_prefix(bgp_node_from_rnode(node->l_right)); + + if (p->prefixlen < maxlen && right_p->prefixlen <= maxlen) + return bgp_node_from_rnode(node->l_right); } while (node->parent && node != limit) { @@ -187,7 +196,8 @@ bgp_route_next_until_maxlen(struct bgp_node *node, const struct bgp_node *limit, return NULL; } -void bgp_table_range_lookup(const struct bgp_table *table, struct prefix *p, +void bgp_table_range_lookup(const struct bgp_table *table, + const struct prefix *p, uint8_t maxlen, struct list *matches) { struct bgp_node *node = bgp_node_from_rnode(table->route_table->top); @@ -196,24 +206,29 @@ void bgp_table_range_lookup(const struct bgp_table *table, struct prefix *p, if (node == NULL) return; - while (node && - node->p.prefixlen <= p->prefixlen && prefix_match(&node->p, p)) { + const struct prefix *node_p = bgp_node_get_prefix(node); + + while (node && node_p->prefixlen <= p->prefixlen + && prefix_match(node_p, p)) { if (bgp_node_has_bgp_path_info_data(node) - && node->p.prefixlen == p->prefixlen) { + && node_p->prefixlen == p->prefixlen) { matched = node; break; } node = bgp_node_from_rnode(node->link[prefix_bit( - &p->u.prefix, node->p.prefixlen)]); + &p->u.prefix, node_p->prefixlen)]); + node_p = bgp_node_get_prefix(node); } if (!node) return; - if (matched == NULL && node->p.prefixlen <= maxlen - && prefix_match(p, &node->p) && node->parent == NULL) + node_p = bgp_node_get_prefix(node); + if (matched == NULL && node_p->prefixlen <= maxlen + && prefix_match(p, node_p) && node->parent == NULL) matched = node; - else if ((matched == NULL && node->p.prefixlen > maxlen) || !node->parent) + else if ((matched == NULL && node_p->prefixlen > maxlen) + || !node->parent) return; else if (matched == NULL && node->parent) matched = node = bgp_node_from_rnode(node->parent); @@ -227,7 +242,8 @@ void bgp_table_range_lookup(const struct bgp_table *table, struct prefix *p, } while ((node = bgp_route_next_until_maxlen(node, matched, maxlen))) { - if (prefix_match(p, &node->p)) { + node_p = bgp_node_get_prefix(node); + if (prefix_match(p, node_p)) { if (bgp_node_has_bgp_path_info_data(node)) { bgp_lock_node(node); listnode_add(matches, node); |
