aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-07-13 16:20:21 +0200
committerHarald Welte <laforge@gnumonks.org>2017-07-13 16:53:41 +0200
commitbc43a62f4128348b52af50ae75c84ba772c17e29 (patch)
treeecd59db08d6a3d70d3417dc51290a5ccfececf1b
parentc47bbda78ce62d3390343b39d3bdfd0d6c9609df (diff)
socket: Allow disabling multicast loop on socket creation
This introduces a new flag OSMO_SOCK_F_NO_MCAST_LOOP, which can be used to disable the looping back of multicast packets transmitted throug this socket to other local sockets on the machine. As this looping-back is active by default, a single option to deviate from the default is deemed sufficient. Change-Id: I24a5b1ebc3f84d2d5d4734e54df50efaea26490b
-rw-r--r--include/osmocom/core/socket.h2
-rw-r--r--src/socket.c20
2 files changed, 18 insertions, 4 deletions
diff --git a/include/osmocom/core/socket.h b/include/osmocom/core/socket.h
index 6db436ae..695e1d7e 100644
--- a/include/osmocom/core/socket.h
+++ b/include/osmocom/core/socket.h
@@ -20,6 +20,8 @@ struct osmo_fd;
#define OSMO_SOCK_F_BIND (1 << 1)
/*! switch socket to non-blocking mode */
#define OSMO_SOCK_F_NONBLOCK (1 << 2)
+/*! disable multiast loop (IP_MULTICAST_LOOP) */
+#define OSMO_SOCK_F_NO_MCAST_LOOP (1 << 3)
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 d0e4c243..c7d081c3 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -106,7 +106,7 @@ static int socket_helper(const struct addrinfo *rp, unsigned int flags)
static int osmo_sock_init_tail(int fd, uint16_t type, unsigned int flags)
{
- int rc = 0;
+ int rc;
/* Make sure to call 'listen' on a bound, connection-oriented sock */
if ((flags & (OSMO_SOCK_F_BIND|OSMO_SOCK_F_CONNECT)) == OSMO_SOCK_F_BIND) {
@@ -114,13 +114,25 @@ static int osmo_sock_init_tail(int fd, uint16_t type, unsigned int flags)
case SOCK_STREAM:
case SOCK_SEQPACKET:
rc = listen(fd, 10);
+ if (rc < 0) {
+ LOGP(DLGLOBAL, LOGL_ERROR, "unable to listen on socket: %s\n",
+ strerror(errno));
+ return rc;
+ }
+ break;
}
}
- if (rc < 0)
- LOGP(DLGLOBAL, LOGL_ERROR, "unable to listen on socket: %s\n", strerror(errno));
+ if (flags & OSMO_SOCK_F_NO_MCAST_LOOP) {
+ rc = osmo_sock_mcast_loop_set(fd, false);
+ if (rc < 0) {
+ LOGP(DLGLOBAL, LOGL_ERROR, "unable to disable multicast loop: %s\n",
+ strerror(errno));
+ return rc;
+ }
+ }
- return rc;
+ return 0;
}
/*! Initialize a socket (including bind and/or connect)