aboutsummaryrefslogtreecommitdiffstats
path: root/src/socket.c
diff options
context:
space:
mode:
authorPhilipp Maier <pmaier@sysmocom.de>2018-08-23 20:11:50 +0200
committerPhilipp Maier <pmaier@sysmocom.de>2018-08-23 20:17:45 +0200
commit73196e77fb28d71f5ab536d4e6265cfcbb169b3d (patch)
tree4cb2766d256be7a869aa8300203a2c05574d949f /src/socket.c
parent8a757d20f714909264eb76d400de529cb75b9fe0 (diff)
socket: add flag to enforce SO_REUSEADDR on UDP sockets
When IPPROTO_UDP is used then SO_REUSEADDR omitted since UDP is connection less we do not have to wait until lingering connections time out. There were also negative effects such as that two applicatications could use the same UDP port, normally one of the two applications would get an error, but with SO_REUSEADDR this is supressed. However, there are applications (UDP MULTICAST) where two applications must be able to use the same port. In the osmocom project those are osmo-bts-virtual, virtphy and gsmtap in general. Lets introduce a flag that the API user can supply in order to have SO_REUSEADDR applied. - Add new flag OSMO_SOCK_F_UDP_REUSEADDR Change-Id: I94aaf6d5224ab23bde5ea5c4a83569b6145ab32b Related: OS#3497
Diffstat (limited to 'src/socket.c')
-rw-r--r--src/socket.c6
1 files changed, 3 insertions, 3 deletions
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,