mgcp-client: Refactor reinit of mgcp clients
The second parameter of mgcp_client_pool_member_reinit_client() will be
removed in a follow-up patch after further refactoring.
Related: SYS#5987
Change-Id: I0ab59278629c0e7e7c62a68b54b4235df58a5d77
diff --git a/include/osmocom/mgcp_client/mgcp_client_pool_internal.h b/include/osmocom/mgcp_client/mgcp_client_pool_internal.h
index 582090c..d9beb6f 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_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 5b921f1..00c0868 100644
--- a/src/libosmo-mgcp-client/mgcp_client_pool.c
+++ b/src/libosmo-mgcp-client/mgcp_client_pool.c
@@ -18,6 +18,7 @@
*
*/
+#include <asm-generic/errno.h>
#include <osmocom/mgcp_client/mgcp_client.h>
#include <osmocom/mgcp_client/mgcp_client_internal.h>
#include <osmocom/mgcp_client/mgcp_client_pool_internal.h>
@@ -54,26 +55,8 @@
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 @@
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 505f3ab..81f8f3e 100644
--- a/src/libosmo-mgcp-client/mgcp_client_vty.c
+++ b/src/libosmo-mgcp-client/mgcp_client_vty.c
@@ -401,32 +401,10 @@
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;