<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-abis/+/17432">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Add rtp_test to show the double-bind bug of OS#4444<br><br>Change-Id: I6742e5504cfb827031031e4d8d49a616ab203a94<br>---<br>M tests/Makefile.am<br>A tests/rtp_test/rtp_test.c<br>A tests/rtp_test/rtp_test.ok<br>M tests/testsuite.at<br>4 files changed, 109 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>index 8ee91bb..bd95cf5 100644</span><br><span>--- a/tests/Makefile.am</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -6,7 +6,8 @@</span><br><span>                 e1inp_ipa_bts_test    \</span><br><span>              ipa_proxy_test        \</span><br><span>              subchan_demux/subchan_demux_test \</span><br><span style="color: hsl(0, 100%, 40%);">-              ipa_recv/ipa_recv_test</span><br><span style="color: hsl(120, 100%, 40%);">+                ipa_recv/ipa_recv_test \</span><br><span style="color: hsl(120, 100%, 40%);">+              rtp_test/rtp_test</span><br><span> </span><br><span> e1inp_ipa_bsc_test_SOURCES = e1inp_ipa_bsc_test.c</span><br><span> e1inp_ipa_bsc_test_LDADD = $(top_builddir)/src/libosmoabis.la \</span><br><span>@@ -31,6 +32,11 @@</span><br><span>                         $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) \</span><br><span>                     $(LIBOSMOVTY_LIBS)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+rtp_test_rtp_test_SOURCES = rtp_test/rtp_test.c</span><br><span style="color: hsl(120, 100%, 40%);">+rtp_test_rtp_test_LDADD = $(top_builddir)/src/libosmotrau.la \</span><br><span style="color: hsl(120, 100%, 40%);">+                       $(LIBOSMOCORE_LIBS)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # boilerplate for the tests</span><br><span> # The `:;' works around a Bash 3.2 bug when the output is not writeable.</span><br><span> $(srcdir)/package.m4: $(top_srcdir)/configure.ac</span><br><span>@@ -52,7 +58,8 @@</span><br><span> </span><br><span> EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) \</span><br><span>  subchan_demux/subchan_demux_test.ok \</span><br><span style="color: hsl(0, 100%, 40%);">-   ipa_recv/ipa_recv_test.ok</span><br><span style="color: hsl(120, 100%, 40%);">+     ipa_recv/ipa_recv_test.ok \</span><br><span style="color: hsl(120, 100%, 40%);">+   rtp_test/rtp_test.ok</span><br><span> </span><br><span> TESTSUITE = $(srcdir)/testsuite</span><br><span> </span><br><span>diff --git a/tests/rtp_test/rtp_test.c b/tests/rtp_test/rtp_test.c</span><br><span>new file mode 100644</span><br><span>index 0000000..d696033</span><br><span>--- /dev/null</span><br><span>+++ b/tests/rtp_test/rtp_test.c</span><br><span>@@ -0,0 +1,92 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <unistd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/socket.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <netinet/in.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <arpa/inet.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/talloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/application.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/trau/osmo_ortp.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void *tall_test;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct osmo_rtp_socket *create_bind_any(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_rtp_socket *rs;</span><br><span style="color: hsl(120, 100%, 40%);">+   int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      rs = osmo_rtp_socket_create(tall_test, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 16384; i < 65535; i+=2) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (osmo_rtp_socket_bind(rs, "0.0.0.0", i) == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                    return rs;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_rtp_socket_free(rs);</span><br><span style="color: hsl(120, 100%, 40%);">+     return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* test if binding two sockets to the same local port fails (See OS#4444) */</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_bind_fail(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_rtp_socket *rs[2];</span><br><span style="color: hsl(120, 100%, 40%);">+        uint32_t ip;</span><br><span style="color: hsl(120, 100%, 40%);">+  int rc, port[2];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    printf("First bind to any random local port...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ rs[0] = create_bind_any();</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(rs[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* then obtain the local port */</span><br><span style="color: hsl(120, 100%, 40%);">+      rc = osmo_rtp_get_bound_ip_port(rs[0], &ip, &port[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(rc == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("Now try to bind another socket to the same port: ");</span><br><span style="color: hsl(120, 100%, 40%);">+        rs[1] = osmo_rtp_socket_create(tall_test, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(rs[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = osmo_rtp_socket_bind(rs[1], "0.0.0.0", port[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rc == -1 && errno == EADDRINUSE)</span><br><span style="color: hsl(120, 100%, 40%);">+          printf("OK (EADDRINUSE)\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        else {</span><br><span style="color: hsl(120, 100%, 40%);">+                printf("FAILED - second bind to port %u worked\n", port[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+                fflush(stdout);</span><br><span style="color: hsl(120, 100%, 40%);">+               //OSMO_ASSERT(0);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_rtp_socket_free(rs[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_rtp_socket_free(rs[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define DTEST 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct log_info_cat bts_test_cat[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+     [DTEST] = {</span><br><span style="color: hsl(120, 100%, 40%);">+           .name = "DTEST",</span><br><span style="color: hsl(120, 100%, 40%);">+            .description = "test",</span><br><span style="color: hsl(120, 100%, 40%);">+              .color = "\033[1;35m",</span><br><span style="color: hsl(120, 100%, 40%);">+              .enabled = 1, .loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+        },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct log_info bts_test_log_info = {</span><br><span style="color: hsl(120, 100%, 40%);">+  .filter_fn = NULL,</span><br><span style="color: hsl(120, 100%, 40%);">+    .cat = bts_test_cat,</span><br><span style="color: hsl(120, 100%, 40%);">+  .num_cat = ARRAY_SIZE(bts_test_cat),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int main(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      tall_test = talloc_named_const(NULL, 1, "rtp_test");</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_init_logging2(tall_test, &bts_test_log_info);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_rtp_init(tall_test);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   test_bind_fail();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/rtp_test/rtp_test.ok b/tests/rtp_test/rtp_test.ok</span><br><span>new file mode 100644</span><br><span>index 0000000..ded2792</span><br><span>--- /dev/null</span><br><span>+++ b/tests/rtp_test/rtp_test.ok</span><br><span>@@ -0,0 +1,2 @@</span><br><span style="color: hsl(120, 100%, 40%);">+First bind to any random local port...</span><br><span style="color: hsl(120, 100%, 40%);">+Now try to bind another socket to the same port: FAILED - second bind to port 16384 worked</span><br><span>diff --git a/tests/testsuite.at b/tests/testsuite.at</span><br><span>index ff550b0..5e87248 100644</span><br><span>--- a/tests/testsuite.at</span><br><span>+++ b/tests/testsuite.at</span><br><span>@@ -23,3 +23,9 @@</span><br><span> AT_CHECK([$abs_top_builddir/tests/subchan_demux/subchan_demux_test], [], [expout])</span><br><span> AT_CLEANUP</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+AT_SETUP([rtp_test])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_KEYWORDS([rtp_test])</span><br><span style="color: hsl(120, 100%, 40%);">+cat $abs_srcdir/rtp_test/rtp_test.ok > expout</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CHECK([$abs_top_builddir/tests/rtp_test/rtp_test], [ignore], [expout])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CLEANUP</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-abis/+/17432">change 17432</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/c/libosmo-abis/+/17432"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-abis </div>
<div style="display:none"> Gerrit-Branch: pespin/0.8.0 </div>
<div style="display:none"> Gerrit-Change-Id: I6742e5504cfb827031031e4d8d49a616ab203a94 </div>
<div style="display:none"> Gerrit-Change-Number: 17432 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>