globally lock the portrange when trying to grab a port to prep for multithreading

Change-Id: I78ae737b829bb428372f34db7d5bc601b5088b78
This commit is contained in:
Eric Wild 2021-08-13 00:14:18 +02:00
parent 8f33303660
commit 55fdfc223e
3 changed files with 10 additions and 1 deletions

View File

@ -57,6 +57,9 @@ PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 1.1.0)
PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 1.1.0)
PKG_CHECK_MODULES(LIBOSMOTRAU, libosmotrau >= 1.1.0)
CFLAGS="$CFLAGS -pthread"
LDFLAGS="$LDFLAGS -pthread"
AC_ARG_ENABLE(sanitize,
[AS_HELP_STRING(
[--enable-sanitize],

View File

@ -34,6 +34,7 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include "mgcp_ratectr.h"
@ -92,6 +93,7 @@ typedef void (*mgcp_get_format)(struct mgcp_endpoint *endp,
* This holds information on how to allocate ports
*/
struct mgcp_port_range {
pthread_mutex_t lock;
/* addr or NULL to fall-back to default */
char *bind_addr_v4;
char *bind_addr_v6;

View File

@ -28,6 +28,7 @@
#include <limits.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <osmocom/core/msgb.h>
#include <osmocom/core/talloc.h>
@ -478,6 +479,7 @@ static int allocate_port(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn)
range = &endp->cfg->net_ports;
pthread_mutex_lock(&range->lock);
/* attempt to find a port */
tries = (range->range_end - range->range_start) / 2;
for (i = 0; i < tries; ++i) {
@ -490,11 +492,12 @@ static int allocate_port(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn)
range->last_port += 2;
if (rc == 0) {
pthread_mutex_unlock(&range->lock);
return 0;
}
}
pthread_mutex_unlock(&range->lock);
LOGPENDP(endp, DLMGCP, LOGL_ERROR,
"Allocating a RTP/RTCP port failed %u times.\n",
tries);
@ -1606,6 +1609,7 @@ struct mgcp_config *mgcp_config_alloc(void)
osmo_strlcpy(cfg->domain, "mgw", sizeof(cfg->domain));
cfg->net_ports.lock = (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER;
cfg->net_ports.range_start = RTP_PORT_DEFAULT_RANGE_START;
cfg->net_ports.range_end = RTP_PORT_DEFAULT_RANGE_END;
cfg->net_ports.last_port = cfg->net_ports.range_start;