diff options
-rw-r--r-- | include/osmocom/core/socket.h | 2 | ||||
-rw-r--r-- | src/socket.c | 6 |
2 files changed, 5 insertions, 3 deletions
diff --git a/include/osmocom/core/socket.h b/include/osmocom/core/socket.h index 20515b99..f23a2436 100644 --- a/include/osmocom/core/socket.h +++ b/include/osmocom/core/socket.h @@ -24,6 +24,8 @@ struct osmo_fd; #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) +/*! use SO_REUSEADDR on UDP ports (required for multicast) */ +#define OSMO_SOCK_F_UDP_REUSEADDR (1 << 5) 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 210dbf96..7e7f6d96 100644 --- a/src/socket.c +++ b/src/socket.c @@ -209,7 +209,7 @@ int osmo_sock_init2(uint16_t family, uint16_t type, uint8_t proto, if (sfd < 0) continue; - if (proto != IPPROTO_UDP) { + if (proto != IPPROTO_UDP || flags & OSMO_SOCK_F_UDP_REUSEADDR) { rc = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); if (rc < 0) { @@ -349,7 +349,7 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, continue; } } else { - if (proto != IPPROTO_UDP) { + if (proto != IPPROTO_UDP || flags & OSMO_SOCK_F_UDP_REUSEADDR) { rc = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); if (rc < 0) { @@ -379,7 +379,7 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, return -ENODEV; } - if (proto != IPPROTO_UDP) { + if (proto != IPPROTO_UDP || flags & OSMO_SOCK_F_UDP_REUSEADDR) { rc = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); if (rc < 0) { LOGP(DLGLOBAL, LOGL_ERROR, |