pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-mgw/+/39223?usp=email )
Change subject: Rename and cleanup code allocating rtp/rtcp ports in trunk ......................................................................
Rename and cleanup code allocating rtp/rtcp ports in trunk
Clean up pointers passed. Rename function since it's clearly operating on trunk related fields through mutexes.
Change-Id: Ib894afcb61609c247883d5ccdd7b8fbf29b2cbf8 --- M include/osmocom/mgcp/mgcp_trunk.h M src/libosmo-mgcp/mgcp_protocol.c M src/libosmo-mgcp/mgcp_trunk.c 3 files changed, 45 insertions(+), 43 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-mgw refs/changes/23/39223/1
diff --git a/include/osmocom/mgcp/mgcp_trunk.h b/include/osmocom/mgcp/mgcp_trunk.h index 68d37dd..8d87954 100644 --- a/include/osmocom/mgcp/mgcp_trunk.h +++ b/include/osmocom/mgcp/mgcp_trunk.h @@ -2,9 +2,10 @@
#include <osmocom/gsm/i460_mux.h> #include <osmocom/abis/e1_input.h> +#include <osmocom/mgcp/mgcp_conn.h> +#include <osmocom/mgcp/mgcp_network.h> #include <osmocom/mgcp/mgcp_ratectr.h>
- #define LOGPTRUNK(trunk, cat, level, fmt, args...) \ LOGP(cat, level, "trunk:%u " fmt, \ trunk ? trunk->trunk_nr : 0, \ @@ -78,6 +79,7 @@ struct mgcp_trunk *mgcp_trunk_by_name(const struct mgcp_config *cfg, const char *epname); int e1_trunk_nr_from_epname(unsigned int *trunk_nr, const char *epname); struct mgcp_trunk *mgcp_trunk_by_line_num(const struct mgcp_config *cfg, unsigned int num); +int mgcp_trunk_allocate_conn_rtp_ports(struct mgcp_trunk *trunk, struct mgcp_conn_rtp *conn);
/* The virtual trunk is always created on trunk id 0 for historical reasons, * use this define constant as ID when allocating a virtual trunk. Other diff --git a/src/libosmo-mgcp/mgcp_protocol.c b/src/libosmo-mgcp/mgcp_protocol.c index 3efa0e0..32fbd43 100644 --- a/src/libosmo-mgcp/mgcp_protocol.c +++ b/src/libosmo-mgcp/mgcp_protocol.c @@ -489,46 +489,6 @@ return create_ok_response(rq->trunk, rq->endp, 200, "AUEP", rq->pdata->trans); }
-/* Try to find a free port by attempting to bind on it. Also handle the - * counter that points on the next free port. Since we have a pointer - * to the next free port, binding should in work on the first attempt in - * general. In case of failure the next port is tried until the whole port - * range is tried once. */ -static int allocate_port(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn) -{ - int i; - struct mgcp_port_range *range; - unsigned int tries; - - OSMO_ASSERT(conn); - - range = &endp->trunk->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) { - int rc; - - if (range->last_port >= range->range_end) - range->last_port = range->range_start; - - rc = mgcp_conn_rtp_bind_rtp_ports(conn, range->last_port); - - 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); - return -1; -} - /*! Helper function for check_local_cx_options() to get a pointer of the next * lco option identifier * \param[in] lco string @@ -1077,7 +1037,7 @@ rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_CRCX_FAIL_BIND_PORT)); goto error2; } - if (allocate_port(endp, conn_rtp) != 0) { + if (mgcp_trunk_allocate_conn_rtp_ports(trunk, conn_rtp) != 0) { rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_CRCX_FAIL_BIND_PORT)); goto error2; } @@ -1311,7 +1271,7 @@ if (strcmp(new_local_addr, conn_rtp->end.local_addr)) { osmo_strlcpy(conn_rtp->end.local_addr, new_local_addr, sizeof(conn_rtp->end.local_addr)); mgcp_rtp_end_free_port(&conn_rtp->end); - if (allocate_port(endp, conn_rtp) != 0) { + if (mgcp_trunk_allocate_conn_rtp_ports(trunk, conn_rtp) != 0) { rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_CRCX_FAIL_BIND_PORT)); goto error3; } diff --git a/src/libosmo-mgcp/mgcp_trunk.c b/src/libosmo-mgcp/mgcp_trunk.c index 69750f8..8d258e2 100644 --- a/src/libosmo-mgcp/mgcp_trunk.c +++ b/src/libosmo-mgcp/mgcp_trunk.c @@ -306,3 +306,43 @@
return NULL; } + +/* Try to find a free port by attempting to bind on it. Also handle the + * counter that points on the next free port. Since we have a pointer + * to the next free port, binding should in work on the first attempt in + * general. In case of failure the next port is tried until the whole port + * range is tried once. */ +int mgcp_trunk_allocate_conn_rtp_ports(struct mgcp_trunk *trunk, struct mgcp_conn_rtp *conn) +{ + int i; + struct mgcp_port_range *range; + unsigned int tries; + + OSMO_ASSERT(trunk); + OSMO_ASSERT(conn); + + range = &trunk->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) { + int rc; + + if (range->last_port >= range->range_end) + range->last_port = range->range_start; + + rc = mgcp_conn_rtp_bind_rtp_ports(conn, range->last_port); + + range->last_port += 2; + if (rc == 0) { + pthread_mutex_unlock(&range->lock); + return 0; + } + + } + pthread_mutex_unlock(&range->lock); + LOGPCONN(conn->conn, DLMGCP, LOGL_ERROR, + "Allocating a RTP/RTCP port failed %u times.\n", tries); + return -1; +}