]> git.proxmox.com Git - mirror_frr.git/commitdiff
pimg: Actually properly create the pim socket per vrf
authorDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 11 May 2017 13:53:45 +0000 (09:53 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 24 Jul 2017 17:51:34 +0000 (13:51 -0400)
Create the actual pim socket per vrf.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
pimd/pim_mroute.c
pimd/pimd.c

index 2f6858ea831350a90892b8f79b6e7b5581f852c8..fb216bcfb323ece276fd9ca5abc6f78bd779ae42 100644 (file)
@@ -46,24 +46,19 @@ static void mroute_read_on(struct pim_instance *pim);
 static int pim_mroute_set(struct pim_instance *pim, int enable)
 {
        int err;
-       int opt = enable ? MRT_INIT : MRT_DONE;
+       int opt;
        socklen_t opt_len = sizeof(opt);
        long flags;
 
-       err = setsockopt(pim->mroute_socket, IPPROTO_IP, opt, &opt, opt_len);
-       if (err) {
-               zlog_warn(
-                       "%s %s: failure: setsockopt(fd=%d,IPPROTO_IP,%s=%d): errno=%d: %s",
-                       __FILE__, __PRETTY_FUNCTION__, pim->mroute_socket,
-                       enable ? "MRT_INIT" : "MRT_DONE", opt, errno,
-                       safe_strerror(errno));
-               return -1;
-       }
-
        /*
         * We need to create the VRF table for the pim mroute_socket
         */
        if (pim->vrf_id != VRF_DEFAULT) {
+               if (pimd_privs.change(ZPRIVS_RAISE))
+                       zlog_err(
+                               "pim_mroute_socket_enable: could not raise privs, %s",
+                               safe_strerror(errno));
+
                opt = pim->vrf_id;
                err = setsockopt(pim->mroute_socket, IPPROTO_IP, MRT_TABLE,
                                 &opt, opt_len);
@@ -75,6 +70,22 @@ static int pim_mroute_set(struct pim_instance *pim, int enable)
                                safe_strerror(errno));
                        return -1;
                }
+
+               if (pimd_privs.change(ZPRIVS_LOWER))
+                       zlog_err(
+                               "pim_mroute_socket_enable: could not lower privs, %s",
+                               safe_strerror(errno));
+       }
+
+       opt = enable ? MRT_INIT : MRT_DONE;
+       err = setsockopt(pim->mroute_socket, IPPROTO_IP, opt, &opt, opt_len);
+       if (err) {
+               zlog_warn(
+                       "%s %s: failure: setsockopt(fd=%d,IPPROTO_IP,%s=%d): errno=%d: %s",
+                       __FILE__, __PRETTY_FUNCTION__, pim->mroute_socket,
+                       enable ? "MRT_INIT" : "MRT_DONE", opt, errno,
+                       safe_strerror(errno));
+               return -1;
        }
 
        setsockopt_so_recvbuf(pim->mroute_socket, 1024 * 1024 * 8);
index 4c43d916bdd0c8db0046625399bdb83718e832ab..5b5ba068c5699660b7c7d3ba25fb810f6d605ec8 100644 (file)
@@ -95,6 +95,7 @@ static int pim_vrf_enable(struct vrf *vrf)
 {
        struct pim_instance *pim;
 
+       zlog_debug("%s: for %s", __PRETTY_FUNCTION__, vrf->name);
        pim = pim_instance_init(vrf);
        if (pim == NULL) {
                zlog_err("%s %s: pim class init failure ", __FILE__,
@@ -233,9 +234,13 @@ static struct pim_instance *pim_instance_init(struct vrf *vrf)
                return NULL;
        }
 
-       pim->mroute_socket = -1;
        pim->send_v6_secondary = 1;
 
+       if (vrf->vrf_id == VRF_DEFAULT)
+               pimg = pim;
+
+       pim_mroute_socket_enable(pim);
+
        return pim;
 }
 
@@ -266,9 +271,6 @@ void pim_init()
        }
        qpim_static_route_list->del = (void (*)(void *))pim_static_route_free;
 
-       pim_mroute_socket_enable(pimg);
-
-
        /*
          RFC 4601: 4.6.3.  Assert Metrics