diff options
author | Harald Welte <laforge@gnumonks.org> | 2017-07-13 16:20:21 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2017-07-13 16:53:41 +0200 |
commit | bc43a62f4128348b52af50ae75c84ba772c17e29 (patch) | |
tree | ecd59db08d6a3d70d3417dc51290a5ccfececf1b /src | |
parent | c47bbda78ce62d3390343b39d3bdfd0d6c9609df (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
Diffstat (limited to 'src')
-rw-r--r-- | src/socket.c | 20 |
1 files changed, 16 insertions, 4 deletions
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) |