<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/10587">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">socket: add flag to enforce SO_REUSEADDR on UDP sockets<br><br>When IPPROTO_UDP is used then SO_REUSEADDR omitted since UDP is<br>connection less we do not have to wait until lingering connections time<br>out. There were also negative effects such as that two applicatications<br>could use the same UDP port, normally one of the two applications would<br>get an error, but with SO_REUSEADDR this is supressed. However, there<br>are applications (UDP MULTICAST) where two applications must be able to<br>use the same port. In the osmocom project those are osmo-bts-virtual,<br>virtphy and gsmtap in general.<br><br>Lets introduce a flag that the API user can supply in order to have<br>SO_REUSEADDR applied.<br><br>- Add new flag OSMO_SOCK_F_UDP_REUSEADDR<br><br>Change-Id: I94aaf6d5224ab23bde5ea5c4a83569b6145ab32b<br>Related: OS#3497<br>---<br>M include/osmocom/core/socket.h<br>M src/socket.c<br>2 files changed, 5 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/core/socket.h b/include/osmocom/core/socket.h</span><br><span>index 20515b9..f23a243 100644</span><br><span>--- a/include/osmocom/core/socket.h</span><br><span>+++ b/include/osmocom/core/socket.h</span><br><span>@@ -24,6 +24,8 @@</span><br><span> #define OSMO_SOCK_F_NO_MCAST_LOOP (1 << 3)</span><br><span> /*! disable receiving all multiast even for non-subscribed groups */</span><br><span> #define OSMO_SOCK_F_NO_MCAST_ALL  (1 << 4)</span><br><span style="color: hsl(120, 100%, 40%);">+/*! use SO_REUSEADDR on UDP ports (required for multicast) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define OSMO_SOCK_F_UDP_REUSEADDR (1 << 5)</span><br><span> </span><br><span> int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto,</span><br><span>                const char *host, uint16_t port, unsigned int flags);</span><br><span>diff --git a/src/socket.c b/src/socket.c</span><br><span>index 210dbf9..7e7f6d9 100644</span><br><span>--- a/src/socket.c</span><br><span>+++ b/src/socket.c</span><br><span>@@ -209,7 +209,7 @@</span><br><span>                  if (sfd < 0)</span><br><span>                              continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   if (proto != IPPROTO_UDP) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (proto != IPPROTO_UDP || flags & OSMO_SOCK_F_UDP_REUSEADDR) {</span><br><span>                                 rc = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR,</span><br><span>                                               &on, sizeof(on));</span><br><span>                                if (rc < 0) {</span><br><span>@@ -349,7 +349,7 @@</span><br><span>                               continue;</span><br><span>                    }</span><br><span>            } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (proto != IPPROTO_UDP) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (proto != IPPROTO_UDP || flags & OSMO_SOCK_F_UDP_REUSEADDR) {</span><br><span>                                 rc = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR,</span><br><span>                                               &on, sizeof(on));</span><br><span>                                if (rc < 0) {</span><br><span>@@ -379,7 +379,7 @@</span><br><span>               return -ENODEV;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (proto != IPPROTO_UDP) {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (proto != IPPROTO_UDP || flags & OSMO_SOCK_F_UDP_REUSEADDR) {</span><br><span>                 rc = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));</span><br><span>                 if (rc < 0) {</span><br><span>                     LOGP(DLGLOBAL, LOGL_ERROR,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10587">change 10587</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/10587"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I94aaf6d5224ab23bde5ea5c4a83569b6145ab32b </div>
<div style="display:none"> Gerrit-Change-Number: 10587 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>