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(LIBOSMOABIS, libosmoabis >= 1.1.0)
PKG_CHECK_MODULES(LIBOSMOTRAU, libosmotrau >= 1.1.0) PKG_CHECK_MODULES(LIBOSMOTRAU, libosmotrau >= 1.1.0)
CFLAGS="$CFLAGS -pthread"
LDFLAGS="$LDFLAGS -pthread"
AC_ARG_ENABLE(sanitize, AC_ARG_ENABLE(sanitize,
[AS_HELP_STRING( [AS_HELP_STRING(
[--enable-sanitize], [--enable-sanitize],

View File

@ -34,6 +34,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <pthread.h>
#include "mgcp_ratectr.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 * This holds information on how to allocate ports
*/ */
struct mgcp_port_range { struct mgcp_port_range {
pthread_mutex_t lock;
/* addr or NULL to fall-back to default */ /* addr or NULL to fall-back to default */
char *bind_addr_v4; char *bind_addr_v4;
char *bind_addr_v6; char *bind_addr_v6;

View File

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