bgpd: use correct bgp tables for rpki revalidation

Signed-off-by: Marcel Röthke <marcel.roethke@haw-hamburg.de>
This commit is contained in:
Marcel Röthke 2018-07-19 17:58:05 +02:00
parent 0b2c4b3560
commit 31a2af325e

View File

@ -372,28 +372,38 @@ static int bgpd_sync_callback(struct thread *thread)
afi_t afi = (rec.prefix.ver == LRTR_IPV4) ? AFI_IP : AFI_IP6; afi_t afi = (rec.prefix.ver == LRTR_IPV4) ? AFI_IP : AFI_IP6;
for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, bgp)) { for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, bgp)) {
struct peer *peer;
struct listnode *peer_listnode;
for (ALL_LIST_ELEMENTS_RO(bgp->peer, peer_listnode, peer)) {
safi_t safi; safi_t safi;
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
if (!bgp->rib[afi][safi]) if (!peer->bgp->rib[afi][safi])
continue; continue;
struct list *matches = list_new(); struct list *matches = list_new();
matches->del = (void (*)(void *))bgp_unlock_node; matches->del =
(void (*)(void *))bgp_unlock_node;
bgp_table_range_lookup(bgp->rib[afi][safi], prefix, bgp_table_range_lookup(
peer->bgp->rib[afi][safi], prefix,
rec.max_len, matches); rec.max_len, matches);
struct bgp_node *bgp_node; struct bgp_node *bgp_node;
struct listnode *bgp_listnode;
for (ALL_LIST_ELEMENTS_RO(matches, node, bgp_node)) for (ALL_LIST_ELEMENTS_RO(matches, bgp_listnode,
revalidate_bgp_node(bgp_node, afi, safi); bgp_node))
revalidate_bgp_node(bgp_node, afi,
safi);
list_delete_and_null(&matches); list_delete_and_null(&matches);
} }
} }
}
prefix_free(prefix); prefix_free(prefix);
return 0; return 0;
@ -414,40 +424,37 @@ static void revalidate_bgp_node(struct bgp_node *bgp_node, afi_t afi,
label = bgp_info->extra->label; label = bgp_info->extra->label;
num_labels = bgp_info->extra->num_labels; num_labels = bgp_info->extra->num_labels;
} }
ret = bgp_update(ain->peer, &bgp_node->p, 0, ain->attr, afi, ret = bgp_update(ain->peer, &bgp_node->p, ain->addpath_rx_id,
safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, ain->attr, afi, safi, ZEBRA_ROUTE_BGP,
label, num_labels, 1, NULL); BGP_ROUTE_NORMAL, NULL, label, num_labels, 1,
NULL);
if (ret < 0) { if (ret < 0)
bgp_unlock_node(bgp_node);
return; return;
} }
}
} }
static void revalidate_all_routes(void) static void revalidate_all_routes(void)
{ {
struct bgp *bgp; struct bgp *bgp;
struct listnode *node; struct listnode *node;
struct bgp_node *bgp_node;
for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, bgp)) { for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, bgp)) {
struct peer *peer;
struct listnode *peer_listnode;
for (ALL_LIST_ELEMENTS_RO(bgp->peer, peer_listnode, peer)) {
for (size_t i = 0; i < 2; i++) { for (size_t i = 0; i < 2; i++) {
safi_t safi; safi_t safi;
afi_t afi = (i == 0) ? AFI_IP : AFI_IP6; afi_t afi = (i == 0) ? AFI_IP : AFI_IP6;
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { for (safi = SAFI_UNICAST; safi < SAFI_MAX;
if (!bgp->rib[afi][safi]) safi++) {
if (!peer->bgp->rib[afi][safi])
continue; continue;
for (bgp_node = bgp_soft_reconfig_in(peer, afi, safi);
bgp_table_top(bgp->rib[afi][safi]);
bgp_node;
bgp_node = bgp_route_next(bgp_node)) {
if (bgp_node->info != NULL) {
revalidate_bgp_node(bgp_node,
afi, safi);
}
} }
} }
} }