aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-07-13 16:33:16 +0200
committerHarald Welte <laforge@gnumonks.org>2017-07-13 16:54:23 +0200
commit37d204a120a49c83775f1b3a5deab1446398760d (patch)
tree87f48640487fa866f977452ae1f790195594664e
parentbc43a62f4128348b52af50ae75c84ba772c17e29 (diff)
socket: Add new OSMO_SOCK_F_NO_MCAST_ALL option
Using this option at socket creation, the caller can request disabling the IP_MULTICAST_ALL socket option. Change-Id: I5ab5de45c0b64ceb3636ea98245a23defa24ffd4
-rw-r--r--include/osmocom/core/socket.h2
-rw-r--r--src/socket.c10
2 files changed, 12 insertions, 0 deletions
diff --git a/include/osmocom/core/socket.h b/include/osmocom/core/socket.h
index 695e1d7e..ebfcab3a 100644
--- a/include/osmocom/core/socket.h
+++ b/include/osmocom/core/socket.h
@@ -22,6 +22,8 @@ struct osmo_fd;
#define OSMO_SOCK_F_NONBLOCK (1 << 2)
/*! disable multiast loop (IP_MULTICAST_LOOP) */
#define OSMO_SOCK_F_NO_MCAST_LOOP (1 << 3)
+/*! disable receiving all multiast even for non-subscribed groups */
+#define OSMO_SOCK_F_NO_MCAST_ALL (1 << 4)
int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto,
const char *host, uint16_t port, unsigned int flags);
diff --git a/src/socket.c b/src/socket.c
index c7d081c3..ca50b6f4 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -132,6 +132,16 @@ static int osmo_sock_init_tail(int fd, uint16_t type, unsigned int flags)
}
}
+ if (flags & OSMO_SOCK_F_NO_MCAST_ALL) {
+ rc = osmo_sock_mcast_all_set(fd, false);
+ if (rc < 0) {
+ LOGP(DLGLOBAL, LOGL_ERROR, "unable to disable receive of all multicast: %s\n",
+ strerror(errno));
+ /* do not abort here, as this is just an
+ * optional additional optimization that only
+ * exists on Linux only */
+ }
+ }
return 0;
}