mirror of https://gerrit.osmocom.org/libosmocore
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
This commit is contained in:
parent
c47bbda78c
commit
bc43a62f41
|
@ -20,6 +20,8 @@ struct osmo_fd;
|
||||||
#define OSMO_SOCK_F_BIND (1 << 1)
|
#define OSMO_SOCK_F_BIND (1 << 1)
|
||||||
/*! switch socket to non-blocking mode */
|
/*! switch socket to non-blocking mode */
|
||||||
#define OSMO_SOCK_F_NONBLOCK (1 << 2)
|
#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,
|
int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto,
|
||||||
const char *host, uint16_t port, unsigned int flags);
|
const char *host, uint16_t port, unsigned int flags);
|
||||||
|
|
20
src/socket.c
20
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)
|
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 */
|
/* 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) {
|
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_STREAM:
|
||||||
case SOCK_SEQPACKET:
|
case SOCK_SEQPACKET:
|
||||||
rc = listen(fd, 10);
|
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)
|
if (flags & OSMO_SOCK_F_NO_MCAST_LOOP) {
|
||||||
LOGP(DLGLOBAL, LOGL_ERROR, "unable to listen on socket: %s\n", strerror(errno));
|
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)
|
/*! Initialize a socket (including bind and/or connect)
|
||||||
|
|
Loading…
Reference in New Issue