mgcp-client: Rearrange internal backpointers

Let's properly store backpointers so that it is easy to access all
relation chain (pool<->pool_member<->mgcp_client).

Related: SYS#5987
Change-Id: I5ec2465075da2e3c8eabca9df60681620a7db499
diff --git a/include/osmocom/mgcp_client/mgcp_client_internal.h b/include/osmocom/mgcp_client/mgcp_client_internal.h
index 73e3de2..2eb9b4c 100644
--- a/include/osmocom/mgcp_client/mgcp_client_internal.h
+++ b/include/osmocom/mgcp_client/mgcp_client_internal.h
@@ -16,7 +16,7 @@
 	mgcp_trans_id_t next_trans_id;
 	struct llist_head responses_pending;
 	struct llist_head inuse_endpoints;
-	struct mgcp_client_pool *pool;
+	struct mgcp_client_pool_member *pool_member;
 };
 
 struct mgcp_inuse_endpoint {
diff --git a/include/osmocom/mgcp_client/mgcp_client_pool_internal.h b/include/osmocom/mgcp_client/mgcp_client_pool_internal.h
index 91e5a45..d71deaf 100644
--- a/include/osmocom/mgcp_client/mgcp_client_pool_internal.h
+++ b/include/osmocom/mgcp_client/mgcp_client_pool_internal.h
@@ -26,6 +26,9 @@
 	/* Entry in llist mgcp_client_pool->pool. */
 	struct llist_head list;
 
+	/* The pool managing this object: */
+	struct mgcp_client_pool *pool;
+
 	/* Reference number assinged by VTY. This number is used to manage the pool from the VTY and to identify it in
 	 * the log. */
 	unsigned int nr;
@@ -48,5 +51,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);
+int mgcp_client_pool_member_reinit_client(struct mgcp_client_pool_member *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_pool.c b/src/libosmo-mgcp-client/mgcp_client_pool.c
index 00c0868..bee3555 100644
--- a/src/libosmo-mgcp-client/mgcp_client_pool.c
+++ b/src/libosmo-mgcp-client/mgcp_client_pool.c
@@ -55,7 +55,7 @@
 	llist_for_each_entry(pool_member, &pool->member_list, list) {
 
 		/* Initialize client */
-		if (mgcp_client_pool_member_reinit_client(pool_member, pool) == 0)
+		if (mgcp_client_pool_member_reinit_client(pool_member) == 0)
 			pool_members_initialized++;
 	}
 
@@ -165,25 +165,19 @@
 void mgcp_client_pool_put(struct mgcp_client *mgcp_client)
 {
 	struct mgcp_client_pool_member *pool_member;
-	struct mgcp_client_pool *pool;
 
 	if (!mgcp_client)
 		return;
 
-	if (mgcp_client->pool)
-		pool = mgcp_client->pool;
-	else
+	if (!mgcp_client->pool_member)
 		return;
+	pool_member = mgcp_client->pool_member;
 
-	llist_for_each_entry(pool_member, &pool->member_list, list) {
-		if (pool_member->client == mgcp_client) {
-			if (pool_member->refcount == 0) {
-				LOGPPMGW(pool_member, LOGL_ERROR, "MGW pool member has invalid refcount\n");
-				return;
-			}
-			pool_member->refcount--;
-		}
+	if (pool_member->refcount == 0) {
+		LOGPPMGW(pool_member, LOGL_ERROR, "MGW pool member has invalid refcount\n");
+		return;
 	}
+	pool_member->refcount--;
 }
 
 /***************************
@@ -201,6 +195,7 @@
 	pool_member = talloc_zero(pool, struct mgcp_client_pool_member);
 	OSMO_ASSERT(pool_member);
 	mgcp_client_conf_init(&pool_member->conf);
+	pool_member->pool = pool;
 	pool_member->nr = nr;
 	llist_add_tail(&pool_member->list, &pool->member_list);
 	return pool_member;
@@ -224,7 +219,7 @@
 /*! 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)
+int mgcp_client_pool_member_reinit_client(struct mgcp_client_pool_member *pool_member)
 {
 	/* Get rid of a possibly existing old MGCP client instance first */
 	if (pool_member->client) {
@@ -240,7 +235,7 @@
 	}
 
 	/* Set backpointer so that we can detect later that this MGCP client is managed by this pool. */
-	pool_member->client->pool = pool;
+	pool_member->client->pool_member = pool_member;
 
 	/* Connect client */
 	if (mgcp_client_connect2(pool_member->client, 0)) {
diff --git a/src/libosmo-mgcp-client/mgcp_client_vty.c b/src/libosmo-mgcp-client/mgcp_client_vty.c
index 81f8f3e..a823b0c 100644
--- a/src/libosmo-mgcp-client/mgcp_client_vty.c
+++ b/src/libosmo-mgcp-client/mgcp_client_vty.c
@@ -401,7 +401,7 @@
 		return CMD_WARNING;
 	}
 
-	if (mgcp_client_pool_member_reinit_client(pool_member, global_mgcp_client_pool) < 0) {
+	if (mgcp_client_pool_member_reinit_client(pool_member) < 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);