From: Donald Sharp Date: Thu, 11 May 2017 13:53:45 +0000 (-0400) Subject: pimg: Actually properly create the pim socket per vrf X-Git-Tag: frr-4.0-dev~468^2~138 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=f507c1966e5fc3a7f6bb3656204c9af31c652a58;p=mirror%2Ffrr.git pimg: Actually properly create the pim socket per vrf Create the actual pim socket per vrf. Signed-off-by: Donald Sharp --- diff --git a/pimd/pim_mroute.c b/pimd/pim_mroute.c index 2f6858ea83..fb216bcfb3 100644 --- a/pimd/pim_mroute.c +++ b/pimd/pim_mroute.c @@ -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); diff --git a/pimd/pimd.c b/pimd/pimd.c index 4c43d916bd..5b5ba068c5 100644 --- a/pimd/pimd.c +++ b/pimd/pimd.c @@ -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