]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/zebra_netns_notify.c
Merge pull request #5706 from mjstapp/fix_nh_debug_show
[mirror_frr.git] / zebra / zebra_netns_notify.c
index be36dc96bce285f7224d38b5afb8489925d0d492..d42cf3d60a22f3527aa3e11fe3334036af4d2961 100644 (file)
@@ -36,7 +36,7 @@
 #include "memory.h"
 #include "lib_errors.h"
 
-#include "zserv.h"
+#include "zebra_router.h"
 #include "zebra_memory.h"
 #endif /* defined(HAVE_NETLINK) */
 
@@ -77,7 +77,7 @@ static void zebra_ns_notify_create_context_from_entry_name(const char *name)
        if (netnspath == NULL)
                return;
 
-       frr_elevate_privs(&zserv_privs) {
+       frr_with_privs(&zserv_privs) {
                ns_id = zebra_ns_id_get(netnspath);
        }
        if (ns_id == NS_UNKNOWN)
@@ -92,17 +92,17 @@ static void zebra_ns_notify_create_context_from_entry_name(const char *name)
                return;
        }
        if (vrf_handler_create(NULL, name, &vrf) != CMD_SUCCESS) {
-               flog_warn(ZEBRA_ERR_NS_VRF_CREATION_FAILED,
+               flog_warn(EC_ZEBRA_NS_VRF_CREATION_FAILED,
                          "NS notify : failed to create VRF %s", name);
                ns_map_nsid_with_external(ns_id, false);
                return;
        }
-       frr_elevate_privs(&zserv_privs) {
+       frr_with_privs(&zserv_privs) {
                ret = vrf_netns_handler_create(NULL, vrf, netnspath,
                                               ns_id_external, ns_id);
        }
        if (ret != CMD_SUCCESS) {
-               flog_warn(ZEBRA_ERR_NS_VRF_CREATION_FAILED,
+               flog_warn(EC_ZEBRA_NS_VRF_CREATION_FAILED,
                          "NS notify : failed to create NS %s", netnspath);
                ns_map_nsid_with_external(ns_id, false);
                vrf_delete(vrf);
@@ -121,7 +121,7 @@ static int zebra_ns_continue_read(struct zebra_netns_info *zns_info,
                XFREE(MTYPE_NETNS_MISC, zns_info);
                return 0;
        }
-       thread_add_timer_msec(zebrad.master, zebra_ns_ready_read,
+       thread_add_timer_msec(zrouter.master, zebra_ns_ready_read,
                              (void *)zns_info, ZEBRA_NS_POLLING_INTERVAL_MSEC,
                              NULL);
        return 0;
@@ -133,7 +133,7 @@ static int zebra_ns_delete(char *name)
        struct ns *ns;
 
        if (!vrf) {
-               flog_warn(ZEBRA_ERR_NS_DELETION_FAILED_NO_VRF,
+               flog_warn(EC_ZEBRA_NS_DELETION_FAILED_NO_VRF,
                          "NS notify : no VRF found using NS %s", name);
                return 0;
        }
@@ -202,24 +202,30 @@ static int zebra_ns_ready_read(struct thread *t)
        netnspath = zns_info->netnspath;
        if (--zns_info->retries == 0)
                stop_retry = 1;
-       frr_elevate_privs(&zserv_privs) {
+       frr_with_privs(&zserv_privs) {
                err = ns_switch_to_netns(netnspath);
        }
        if (err < 0)
                return zebra_ns_continue_read(zns_info, stop_retry);
 
        /* go back to default ns */
-       frr_elevate_privs(&zserv_privs) {
+       frr_with_privs(&zserv_privs) {
                err = ns_switchback_to_initial();
        }
        if (err < 0)
                return zebra_ns_continue_read(zns_info, stop_retry);
 
+       /* check default name is not already set */
+       if (strmatch(VRF_DEFAULT_NAME, basename(netnspath))) {
+               zlog_warn("NS notify : NS %s is already default VRF."
+                         "Cancel VRF Creation", basename(netnspath));
+               return zebra_ns_continue_read(zns_info, 1);
+       }
        if (zebra_ns_notify_is_default_netns(basename(netnspath))) {
                zlog_warn(
                          "NS notify : NS %s is default VRF."
                          " Updating VRF Name", basename(netnspath));
-               vrf_set_default_name(basename(netnspath));
+               vrf_set_default_name(basename(netnspath), false);
                return zebra_ns_continue_read(zns_info, 1);
        }
 
@@ -236,10 +242,10 @@ static int zebra_ns_notify_read(struct thread *t)
        ssize_t len;
 
        zebra_netns_notify_current = thread_add_read(
-               zebrad.master, zebra_ns_notify_read, NULL, fd_monitor, NULL);
+               zrouter.master, zebra_ns_notify_read, NULL, fd_monitor, NULL);
        len = read(fd_monitor, buf, sizeof(buf));
        if (len < 0) {
-               flog_err_sys(ZEBRA_ERR_NS_NOTIFY_READ,
+               flog_err_sys(EC_ZEBRA_NS_NOTIFY_READ,
                             "NS notify read: failed to read (%s)",
                             safe_strerror(errno));
                return 0;
@@ -252,22 +258,24 @@ static int zebra_ns_notify_read(struct thread *t)
 
                if (!(event->mask & (IN_CREATE | IN_DELETE)))
                        continue;
-               if (event->mask & IN_DELETE)
-                       return zebra_ns_delete(event->name);
 
                if (offsetof(struct inotify_event, name) + event->len
                    >= sizeof(buf)) {
-                       flog_err(ZEBRA_ERR_NS_NOTIFY_READ,
+                       flog_err(EC_ZEBRA_NS_NOTIFY_READ,
                                 "NS notify read: buffer underflow");
                        break;
                }
 
                if (strnlen(event->name, event->len) == event->len) {
-                       flog_err(ZEBRA_ERR_NS_NOTIFY_READ,
+                       flog_err(EC_ZEBRA_NS_NOTIFY_READ,
                                 "NS notify error: bad event name");
                        break;
                }
 
+               if (event->mask & IN_DELETE) {
+                       zebra_ns_delete(event->name);
+                       continue;
+               }
                netnspath = ns_netns_pathname(NULL, event->name);
                if (!netnspath)
                        continue;
@@ -276,7 +284,7 @@ static int zebra_ns_notify_read(struct thread *t)
                                    sizeof(struct zebra_netns_info));
                netnsinfo->retries = ZEBRA_NS_POLLING_MAX_RETRIES;
                netnsinfo->netnspath = netnspath;
-               thread_add_timer_msec(zebrad.master, zebra_ns_ready_read,
+               thread_add_timer_msec(zrouter.master, zebra_ns_ready_read,
                                      (void *)netnsinfo, 0, NULL);
        }
        return 0;
@@ -288,7 +296,7 @@ void zebra_ns_notify_parse(void)
        DIR *srcdir = opendir(NS_RUN_DIR);
 
        if (srcdir == NULL) {
-               flog_err_sys(LIB_ERR_SYSTEM_CALL,
+               flog_err_sys(EC_LIB_SYSTEM_CALL,
                             "NS parsing init: failed to parse %s", NS_RUN_DIR);
                return;
        }
@@ -300,7 +308,7 @@ void zebra_ns_notify_parse(void)
                        continue;
                if (fstatat(dirfd(srcdir), dent->d_name, &st, 0) < 0) {
                        flog_err_sys(
-                               LIB_ERR_SYSTEM_CALL,
+                               EC_LIB_SYSTEM_CALL,
                                "NS parsing init: failed to parse entry %s",
                                dent->d_name);
                        continue;
@@ -310,11 +318,17 @@ void zebra_ns_notify_parse(void)
                                   dent->d_name);
                        continue;
                }
+               /* check default name is not already set */
+               if (strmatch(VRF_DEFAULT_NAME, basename(dent->d_name))) {
+                       zlog_warn("NS notify : NS %s is already default VRF."
+                                 "Cancel VRF Creation", dent->d_name);
+                       continue;
+               }
                if (zebra_ns_notify_is_default_netns(dent->d_name)) {
                        zlog_warn(
                                  "NS notify : NS %s is default VRF."
                                  " Updating VRF Name", dent->d_name);
-                       vrf_set_default_name(dent->d_name);
+                       vrf_set_default_name(dent->d_name, false);
                        continue;
                }
                zebra_ns_notify_create_context_from_entry_name(dent->d_name);
@@ -330,18 +344,18 @@ void zebra_ns_notify_init(void)
        fd_monitor = inotify_init();
        if (fd_monitor < 0) {
                flog_err_sys(
-                       LIB_ERR_SYSTEM_CALL,
+                       EC_LIB_SYSTEM_CALL,
                        "NS notify init: failed to initialize inotify (%s)",
                        safe_strerror(errno));
        }
        if (inotify_add_watch(fd_monitor, NS_RUN_DIR,
                              IN_CREATE | IN_DELETE) < 0) {
-               flog_err_sys(LIB_ERR_SYSTEM_CALL,
+               flog_err_sys(EC_LIB_SYSTEM_CALL,
                             "NS notify watch: failed to add watch (%s)",
                             safe_strerror(errno));
        }
        zebra_netns_notify_current = thread_add_read(
-               zebrad.master, zebra_ns_notify_read, NULL, fd_monitor, NULL);
+               zrouter.master, zebra_ns_notify_read, NULL, fd_monitor, NULL);
 }
 
 void zebra_ns_notify_close(void)
@@ -353,8 +367,11 @@ void zebra_ns_notify_close(void)
 
        if (zebra_netns_notify_current->u.fd > 0)
                fd = zebra_netns_notify_current->u.fd;
-       thread_cancel(zebra_netns_notify_current);
-       /* auto-removal of inotify items */
+
+       if (zebra_netns_notify_current->master != NULL)
+               thread_cancel(zebra_netns_notify_current);
+
+       /* auto-removal of notify items */
        if (fd > 0)
                close(fd);
 }