]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_rpki.c
*: remove the configuration lock from all daemons
[mirror_frr.git] / bgpd / bgp_rpki.c
index 1371ce80262bfaa4ee82d7f2ae983449719c34c8..c5d38f30093e51de41a8e4ae16db7c890f2a28c5 100644 (file)
@@ -49,6 +49,7 @@
 #include "bgpd/bgp_route.h"
 #include "lib/network.h"
 #include "lib/thread.h"
+#ifndef VTYSH_EXTRACT_PL
 #include "rtrlib/rtrlib.h"
 #include "rtrlib/rtr_mgr.h"
 #include "rtrlib/lib/ip.h"
@@ -56,6 +57,7 @@
 #if defined(FOUND_SSH)
 #include "rtrlib/transport/ssh/ssh_transport.h"
 #endif
+#endif
 #include "hook.h"
 #include "libfrr.h"
 #include "version.h"
@@ -215,12 +217,12 @@ static route_map_result_t route_match(void *rule, const struct prefix *prefix,
                                      route_map_object_t type, void *object)
 {
        int *rpki_status = rule;
-       struct bgp_info *bgp_info;
+       struct bgp_path_info *path;
 
        if (type == RMAP_BGP) {
-               bgp_info = object;
+               path = object;
 
-               if (rpki_validate_prefix(bgp_info->peer, bgp_info->attr, prefix)
+               if (rpki_validate_prefix(path->peer, path->attr, prefix)
                    == *rpki_status) {
                        return RMAP_MATCH;
                }
@@ -372,26 +374,36 @@ static int bgpd_sync_callback(struct thread *thread)
        afi_t afi = (rec.prefix.ver == LRTR_IPV4) ? AFI_IP : AFI_IP6;
 
        for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, bgp)) {
-               safi_t safi;
+               struct peer *peer;
+               struct listnode *peer_listnode;
+
+               for (ALL_LIST_ELEMENTS_RO(bgp->peer, peer_listnode, peer)) {
+                       safi_t safi;
 
-               for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
-                       if (!bgp->rib[afi][safi])
-                               continue;
+                       for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
+                               if (!peer->bgp->rib[afi][safi])
+                                       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,
-                                              rec.max_len, matches);
+                               bgp_table_range_lookup(
+                                       peer->bgp->rib[afi][safi], prefix,
+                                       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))
-                               revalidate_bgp_node(bgp_node, afi, safi);
+                               for (ALL_LIST_ELEMENTS_RO(matches, bgp_listnode,
+                                                         bgp_node))
+                                       revalidate_bgp_node(bgp_node, afi,
+                                                           safi);
 
-                       list_delete_and_null(&matches);
+                               list_delete(&matches);
+                       }
                }
        }
 
@@ -406,22 +418,21 @@ static void revalidate_bgp_node(struct bgp_node *bgp_node, afi_t afi,
 
        for (ain = bgp_node->adj_in; ain; ain = ain->next) {
                int ret;
-               struct bgp_info *bgp_info = bgp_node->info;
+               struct bgp_path_info *path = bgp_node->info;
                mpls_label_t *label = NULL;
                uint32_t num_labels = 0;
 
-               if (bgp_info && bgp_info->extra) {
-                       label = bgp_info->extra->label;
-                       num_labels = bgp_info->extra->num_labels;
+               if (path && path->extra) {
+                       label = path->extra->label;
+                       num_labels = path->extra->num_labels;
                }
-               ret = bgp_update(ain->peer, &bgp_node->p, 0, ain->attr, afi,
-                                safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL,
-                                label, num_labels, 1, NULL);
+               ret = bgp_update(ain->peer, &bgp_node->p, ain->addpath_rx_id,
+                                ain->attr, afi, safi, ZEBRA_ROUTE_BGP,
+                                BGP_ROUTE_NORMAL, NULL, label, num_labels, 1,
+                                NULL);
 
-               if (ret < 0) {
-                       bgp_unlock_node(bgp_node);
+               if (ret < 0)
                        return;
-               }
        }
 }
 
@@ -429,25 +440,23 @@ static void revalidate_all_routes(void)
 {
        struct bgp *bgp;
        struct listnode *node;
-       struct bgp_node *bgp_node;
 
        for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, bgp)) {
-               for (size_t i = 0; i < 2; i++) {
-                       safi_t safi;
-                       afi_t afi = (i == 0) ? AFI_IP : AFI_IP6;
+               struct peer *peer;
+               struct listnode *peer_listnode;
 
-                       for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
-                               if (!bgp->rib[afi][safi])
-                                       continue;
+               for (ALL_LIST_ELEMENTS_RO(bgp->peer, peer_listnode, peer)) {
+
+                       for (size_t i = 0; i < 2; i++) {
+                               safi_t safi;
+                               afi_t afi = (i == 0) ? AFI_IP : AFI_IP6;
 
-                               for (bgp_node =
-                                            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);
-                                       }
+                               for (safi = SAFI_UNICAST; safi < SAFI_MAX;
+                                    safi++) {
+                                       if (!peer->bgp->rib[afi][safi])
+                                               continue;
+
+                                       bgp_soft_reconfig_in(peer, afi, safi);
                                }
                        }
                }
@@ -530,7 +539,7 @@ static int bgp_rpki_init(struct thread_master *master)
 static int bgp_rpki_fini(void)
 {
        stop();
-       list_delete_and_null(&cache_list);
+       list_delete(&cache_list);
 
        close(rpki_sync_socket_rtr);
        close(rpki_sync_socket_bgpd);
@@ -1252,10 +1261,10 @@ DEFUN_NOSH (rpki_exit,
            "exit",
            "Exit rpki configuration and restart rpki session\n")
 {
-       int ret = reset(false);
+       reset(false);
 
        vty->node = CONFIG_NODE;
-       return ret == SUCCESS ? CMD_SUCCESS : CMD_WARNING;
+       return CMD_SUCCESS;
 }
 
 DEFUN_NOSH (rpki_quit,
@@ -1273,7 +1282,7 @@ DEFUN_NOSH (rpki_end,
 {
        int ret = reset(false);
 
-       vty_config_unlock(vty);
+       vty_config_exit(vty);
        vty->node = ENABLE_NODE;
        return ret == SUCCESS ? CMD_SUCCESS : CMD_WARNING;
 }