diff --git a/include/osmocom/mgcp_client/mgcp_client_pool_internal.h b/include/osmocom/mgcp_client/mgcp_client_pool_internal.h index 582090c3d..d9beb6f59 100644 --- a/include/osmocom/mgcp_client/mgcp_client_pool_internal.h +++ b/include/osmocom/mgcp_client/mgcp_client_pool_internal.h @@ -47,4 +47,5 @@ struct mgcp_client_pool_member *mgcp_client_pool_find_member_by_nr(struct mgcp_c struct mgcp_client_pool_member *mgcp_client_pool_member_alloc(struct mgcp_client_pool *pool, unsigned int nr); void mgcp_client_pool_member_free(struct mgcp_client_pool_member *pool_member); +int mgcp_client_pool_member_reinit_client(struct mgcp_client_pool_member *pool_member, struct mgcp_client_pool *pool); const char *mgcp_client_pool_member_name(const struct mgcp_client_pool_member *pool_member); diff --git a/src/libosmo-mgcp-client/mgcp_client_pool.c b/src/libosmo-mgcp-client/mgcp_client_pool.c index 5b921f10c..00c086804 100644 --- a/src/libosmo-mgcp-client/mgcp_client_pool.c +++ b/src/libosmo-mgcp-client/mgcp_client_pool.c @@ -18,6 +18,7 @@ * */ +#include #include #include #include @@ -54,26 +55,8 @@ unsigned int mgcp_client_pool_connect(struct mgcp_client_pool *pool) llist_for_each_entry(pool_member, &pool->member_list, list) { /* Initialize client */ - pool_member->client = mgcp_client_init(pool_member, &pool_member->conf); - if (!pool_member->client) { - LOGPPMGW(pool_member, LOGL_ERROR, "MGCP client initialization failed\n"); - continue; - } - - /* Set backpointer so that we can detect later that this MGCP client is managed - * by this pool. */ - pool_member->client->pool = pool; - - /* Connect client */ - if (mgcp_client_connect2(pool_member->client, 0)) { - LOGPPMGW(pool_member, LOGL_ERROR, "MGCP client connect failed at (%s:%u)\n", - pool_member->conf.remote_addr, pool_member->conf.remote_port); - talloc_free(pool_member->client); - pool_member->client = NULL; - continue; - } - - pool_members_initialized++; + if (mgcp_client_pool_member_reinit_client(pool_member, pool) == 0) + pool_members_initialized++; } return pool_members_initialized; @@ -238,6 +221,38 @@ void mgcp_client_pool_member_free(struct mgcp_client_pool_member *pool_member) talloc_free(pool_member); } +/*! Recreate and reconnect the MGCP client associated to the pool descriptor. + * \param[in] pool_member MGCP client pool descriptor. + */ +int mgcp_client_pool_member_reinit_client(struct mgcp_client_pool_member *pool_member, struct mgcp_client_pool *pool) +{ + /* Get rid of a possibly existing old MGCP client instance first */ + if (pool_member->client) { + mgcp_client_disconnect(pool_member->client); + talloc_free(pool_member->client); + } + + /* Initialize client */ + pool_member->client = mgcp_client_init(pool_member, &pool_member->conf); + if (!pool_member->client) { + LOGPPMGW(pool_member, LOGL_ERROR, "MGCP client initialization failed\n"); + return -EINVAL; + } + + /* Set backpointer so that we can detect later that this MGCP client is managed by this pool. */ + pool_member->client->pool = pool; + + /* Connect client */ + if (mgcp_client_connect2(pool_member->client, 0)) { + LOGPPMGW(pool_member, LOGL_ERROR, "MGCP client connect failed at (%s:%u)\n", + pool_member->conf.remote_addr, pool_member->conf.remote_port); + talloc_free(pool_member->client); + pool_member->client = NULL; + return -ECONNABORTED; + } + return 0; +} + /* Get a human readable name for a given pool member. */ const char *mgcp_client_pool_member_name(const struct mgcp_client_pool_member *pool_member) { diff --git a/src/libosmo-mgcp-client/mgcp_client_vty.c b/src/libosmo-mgcp-client/mgcp_client_vty.c index 505f3ab99..81f8f3e6e 100644 --- a/src/libosmo-mgcp-client/mgcp_client_vty.c +++ b/src/libosmo-mgcp-client/mgcp_client_vty.c @@ -401,32 +401,10 @@ DEFUN_ATTR(mgw_reconnect, mgw_reconnect_cmd, return CMD_WARNING; } - /* Get rid of a possibly existing old MGCP client instance first */ - if (pool_member->client) { - mgcp_client_disconnect(pool_member->client); - talloc_free(pool_member->client); - } - - /* Create a new MGCP client instance with the current config */ - pool_member->client = mgcp_client_init(pool_member, &pool_member->conf); - if (!pool_member->client) { - LOGP(DLMGCP, LOGL_ERROR, "(manual) MGW %s initalization failed\n", - mgcp_client_pool_member_name(pool_member)); - vty_out(vty, "%% MGCP client (MGW %s) initalization failed ('%s')%s", - mgcp_client_pool_member_name(pool_member), argv[0], VTY_NEWLINE); - return CMD_WARNING; - } - - /* Set backpointer so that we can detect later that this MGCP client is managed by this pool. */ - pool_member->client->pool = global_mgcp_client_pool; - - /* Connect client */ - if (mgcp_client_connect(pool_member->client)) { + if (mgcp_client_pool_member_reinit_client(pool_member, global_mgcp_client_pool) < 0) { LOGP(DLMGCP, LOGL_ERROR, "(manual) MGW %s connect failed at (%s:%u)\n", mgcp_client_pool_member_name(pool_member), pool_member->conf.remote_addr, pool_member->conf.remote_port); - talloc_free(pool_member->client); - pool_member->client = NULL; vty_out(vty, "%% MGCP client (MGW %s) initalization failed ('%s')%s", mgcp_client_pool_member_name(pool_member), argv[0], VTY_NEWLINE); return CMD_WARNING;