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);
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);
{
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__,
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;
}
}
qpim_static_route_list->del = (void (*)(void *))pim_static_route_free;
- pim_mroute_socket_enable(pimg);
-
-
/*
RFC 4601: 4.6.3. Assert Metrics