summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pimd/pim_mroute.c43
1 files changed, 26 insertions, 17 deletions
diff --git a/pimd/pim_mroute.c b/pimd/pim_mroute.c
index 436e0508f3..dc4c4402a1 100644
--- a/pimd/pim_mroute.c
+++ b/pimd/pim_mroute.c
@@ -48,8 +48,8 @@ static void mroute_read_on(struct pim_instance *pim);
static int pim_mroute_set(struct pim_instance *pim, int enable)
{
int err;
- int opt;
- socklen_t opt_len = sizeof(opt);
+ int opt, data;
+ socklen_t data_len = sizeof(data);
long flags;
/*
@@ -58,15 +58,15 @@ static int pim_mroute_set(struct pim_instance *pim, int enable)
if (pim->vrf_id != VRF_DEFAULT) {
frr_elevate_privs(&pimd_privs) {
- opt = pim->vrf->data.l.table_id;
+ data = pim->vrf->data.l.table_id;
err = setsockopt(pim->mroute_socket, IPPROTO_IP,
MRT_TABLE,
- &opt, opt_len);
+ &data, data_len);
if (err) {
zlog_warn(
"%s %s: failure: setsockopt(fd=%d,IPPROTO_IP, MRT_TABLE=%d): errno=%d: %s",
__FILE__, __PRETTY_FUNCTION__,
- pim->mroute_socket, opt, errno,
+ pim->mroute_socket, data, errno,
safe_strerror(errno));
return -1;
}
@@ -74,23 +74,32 @@ static int pim_mroute_set(struct pim_instance *pim, int enable)
}
}
- 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;
+ frr_elevate_privs(&pimd_privs) {
+ opt = enable ? MRT_INIT : MRT_DONE;
+ /*
+ * *BSD *cares* about what value we pass down
+ * here
+ */
+ data = 1;
+ err = setsockopt(pim->mroute_socket, IPPROTO_IP,
+ opt, &data, data_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", data, errno,
+ safe_strerror(errno));
+ return -1;
+ }
}
#if defined(HAVE_IP_PKTINFO)
if (enable) {
/* Linux and Solaris IP_PKTINFO */
- opt = 1;
- if (setsockopt(pim->mroute_socket, IPPROTO_IP, IP_PKTINFO, &opt,
- sizeof(opt))) {
+ data = 1;
+ if (setsockopt(pim->mroute_socket, IPPROTO_IP, IP_PKTINFO,
+ &data, data_len)) {
zlog_warn(
"Could not set IP_PKTINFO on socket fd=%d: errno=%d: %s",
pim->mroute_socket, errno,