Introduce support for libosmo-mgcp-client MGW pooling
Large RAN installations may benefit from distributing the RTP voice
stream load over multiple media gateways.
libosmo-mgcp-client supports MGW pooling since version 1.8.0 (more than
one year ago). OsmoBSC has already been making use of it since then (see
osmo-bsc.git 8d22e6870637ed6d392a8a77aeaebc51b23a8a50); lets use this
feature in osmo-msc too.
This commit is also part of a series of patches cleaning up
libosmo-mgcp-client and slowly getting rid of the old non-mgw-pooled VTY
configuration, in order to keep only 1 way to configure
libosmo-mgcp-client through VTY.
Related: SYS#5091
Related: SYS#5987
Change-Id: I7670ba56fe989706579224a364595fdd4b4708ff
diff --git a/src/libmsc/call_leg.c b/src/libmsc/call_leg.c
index e890f75..f8a75c4 100644
--- a/src/libmsc/call_leg.c
+++ b/src/libmsc/call_leg.c
@@ -122,7 +122,13 @@
static void call_leg_mgw_endpoint_gone(struct call_leg *cl)
{
+ struct mgcp_client *mgcp_client;
int i;
+
+ /* Put MGCP client back into MGW pool */
+ mgcp_client = osmo_mgcpc_ep_client(cl->mgw_endpoint);
+ mgcp_client_pool_put(mgcp_client);
+
cl->mgw_endpoint = NULL;
for (i = 0; i < ARRAY_SIZE(cl->rtp); i++) {
if (!cl->rtp[i])
@@ -275,10 +281,17 @@
if (cl->rtp[dir])
return 0;
- if (!cl->mgw_endpoint)
+ if (!cl->mgw_endpoint) {
+ struct mgcp_client *mgcp_client = mgcp_client_pool_get(gsmnet->mgw.mgw_pool);
+ if (!mgcp_client) {
+ LOG_CALL_LEG(cl, LOGL_ERROR,
+ "cannot ensure MGW endpoint -- no MGW configured, check configuration!\n");
+ return -ENODEV;
+ }
cl->mgw_endpoint = osmo_mgcpc_ep_alloc(cl->fi, CALL_LEG_EV_MGW_ENDPOINT_GONE,
- gsmnet->mgw.client, gsmnet->mgw.tdefs, cl->fi->id,
- "%s", mgcp_client_rtpbridge_wildcard(gsmnet->mgw.client));
+ mgcp_client, gsmnet->mgw.tdefs, cl->fi->id,
+ "%s", mgcp_client_rtpbridge_wildcard(mgcp_client));
+ }
if (!cl->mgw_endpoint) {
LOG_CALL_LEG(cl, LOGL_ERROR, "failed to setup MGW endpoint\n");
return -EIO;
diff --git a/src/libmsc/msc_vty.c b/src/libmsc/msc_vty.c
index be05a95..357b975 100644
--- a/src/libmsc/msc_vty.c
+++ b/src/libmsc/msc_vty.c
@@ -2033,6 +2033,8 @@
install_element(GSMNET_NODE, &cfg_net_no_per_loc_upd_cmd);
install_element(GSMNET_NODE, &cfg_net_call_wait_cmd);
install_element(GSMNET_NODE, &cfg_net_no_call_wait_cmd);
+ mgcp_client_pool_vty_init(GSMNET_NODE, MGW_NODE, " ", msc_network->mgw.mgw_pool);
+
install_element(CONFIG_NODE, &cfg_msc_cmd);
install_node(&msc_node, config_write_msc);
@@ -2066,7 +2068,9 @@
/* Timer configuration commands (generic osmo_tdef API) */
osmo_tdef_vty_groups_init(MSC_NODE, msc_tdef_group);
+ /* Deprecated: Old MGCP config without pooling support in MSC node: */
mgcp_client_vty_init(msc_network, MSC_NODE, &msc_network->mgw.conf);
+
#ifdef BUILD_IU
ranap_iu_vty_init(MSC_NODE, (enum ranap_nsap_addr_enc*)&msc_network->iu.rab_assign_addr_enc);
#endif