ortp: disable SO_REUSEADDR + SO_REUSEPORT

ortp >= 0.24.0 doesn't differentiate between SO_REUSEADDR and
SO_REUSEPORT, and has both enabled by default.  The latter means that
we can end up with non-unique port bindings as we will not fail to
bind the same port twice.

This should have caused visible problems not only when operating multiple
osmo-bts on one machine (rare), but also with a single osmo-bts. Once the range
(default 16384-17407 ) wraps, there is a risk of new sockets (for new cals)
colliding with old ones. As two ports (RTP+RTCP) are used per call, this means
every 512 voice calls we expect the BTS to wrap. And from that point onwards
there's a risk of overlapping with previously allocated sockets.

Change-Id: I4fc9eee561c7958c70c63b4ffdc6cb700b795e28
Closes: OS#4444
This commit is contained in:
Harald Welte 2020-03-08 21:50:01 +01:00
parent 9104597d76
commit 54c919ec48
3 changed files with 8 additions and 2 deletions

View File

@ -378,6 +378,12 @@ struct osmo_rtp_socket *osmo_rtp_socket_create(void *talloc_ctx, unsigned int fl
rtp_session_set_profile(rs->sess, osmo_pt_profile);
rtp_session_set_jitter_compensation(rs->sess, 100);
/* ortp >= 0.24.0 doesn't differentiate between SO_REUSEADDR and
* SO_REUSEPORT, and has both enabled by default. The latter means that
* we can end up with non-unique port bindings as we will not fail to
* bind the same port twice */
rtp_session_set_reuseaddr(rs->sess, false);
rtp_session_signal_connect(rs->sess, "ssrc_changed",
(RtpCallback) ortp_sig_cb_ssrc,
RTP_SIGNAL_PTR_CAST(rs));

View File

@ -54,7 +54,7 @@ static void test_bind_fail(void)
else {
printf("FAILED - second bind to port %u worked\n", port[0]);
fflush(stdout);
//OSMO_ASSERT(0);
OSMO_ASSERT(0);
}
osmo_rtp_socket_free(rs[0]);

View File

@ -1,2 +1,2 @@
First bind to any random local port...
Now try to bind another socket to the same port: FAILED - second bind to port 16384 worked
Now try to bind another socket to the same port: OK (EADDRINUSE)