pimg: Actually properly create the pim socket per vrf

Create the actual pim socket per vrf.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2017-05-11 09:53:45 -04:00
parent 1145d0256e
commit f507c1966e
2 changed files with 28 additions and 15 deletions

View 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) static int pim_mroute_set(struct pim_instance *pim, int enable)
{ {
int err; int err;
int opt = enable ? MRT_INIT : MRT_DONE; int opt;
socklen_t opt_len = sizeof(opt); socklen_t opt_len = sizeof(opt);
long flags; 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 * We need to create the VRF table for the pim mroute_socket
*/ */
if (pim->vrf_id != VRF_DEFAULT) { 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; opt = pim->vrf_id;
err = setsockopt(pim->mroute_socket, IPPROTO_IP, MRT_TABLE, err = setsockopt(pim->mroute_socket, IPPROTO_IP, MRT_TABLE,
&opt, opt_len); &opt, opt_len);
@ -75,6 +70,22 @@ static int pim_mroute_set(struct pim_instance *pim, int enable)
safe_strerror(errno)); safe_strerror(errno));
return -1; 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); setsockopt_so_recvbuf(pim->mroute_socket, 1024 * 1024 * 8);

View File

@ -95,6 +95,7 @@ static int pim_vrf_enable(struct vrf *vrf)
{ {
struct pim_instance *pim; struct pim_instance *pim;
zlog_debug("%s: for %s", __PRETTY_FUNCTION__, vrf->name);
pim = pim_instance_init(vrf); pim = pim_instance_init(vrf);
if (pim == NULL) { if (pim == NULL) {
zlog_err("%s %s: pim class init failure ", __FILE__, 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; return NULL;
} }
pim->mroute_socket = -1;
pim->send_v6_secondary = 1; pim->send_v6_secondary = 1;
if (vrf->vrf_id == VRF_DEFAULT)
pimg = pim;
pim_mroute_socket_enable(pim);
return pim; return pim;
} }
@ -266,9 +271,6 @@ void pim_init()
} }
qpim_static_route_list->del = (void (*)(void *))pim_static_route_free; qpim_static_route_list->del = (void (*)(void *))pim_static_route_free;
pim_mroute_socket_enable(pimg);
/* /*
RFC 4601: 4.6.3. Assert Metrics RFC 4601: 4.6.3. Assert Metrics