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;