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)
{
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);

View 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