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
This commit is contained in:
parent
7558c20973
commit
f48cd95bbc
|
@ -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);
|
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);
|
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);
|
const char *mgcp_client_pool_member_name(const struct mgcp_client_pool_member *pool_member);
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <asm-generic/errno.h>
|
||||||
#include <osmocom/mgcp_client/mgcp_client.h>
|
#include <osmocom/mgcp_client/mgcp_client.h>
|
||||||
#include <osmocom/mgcp_client/mgcp_client_internal.h>
|
#include <osmocom/mgcp_client/mgcp_client_internal.h>
|
||||||
#include <osmocom/mgcp_client/mgcp_client_pool_internal.h>
|
#include <osmocom/mgcp_client/mgcp_client_pool_internal.h>
|
||||||
|
@ -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) {
|
llist_for_each_entry(pool_member, &pool->member_list, list) {
|
||||||
|
|
||||||
/* Initialize client */
|
/* Initialize client */
|
||||||
pool_member->client = mgcp_client_init(pool_member, &pool_member->conf);
|
if (mgcp_client_pool_member_reinit_client(pool_member, pool) == 0)
|
||||||
if (!pool_member->client) {
|
pool_members_initialized++;
|
||||||
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++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 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);
|
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. */
|
/* 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)
|
const char *mgcp_client_pool_member_name(const struct mgcp_client_pool_member *pool_member)
|
||||||
{
|
{
|
||||||
|
|
|
@ -401,32 +401,10 @@ DEFUN_ATTR(mgw_reconnect, mgw_reconnect_cmd,
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get rid of a possibly existing old MGCP client instance first */
|
if (mgcp_client_pool_member_reinit_client(pool_member, global_mgcp_client_pool) < 0) {
|
||||||
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)) {
|
|
||||||
LOGP(DLMGCP, LOGL_ERROR, "(manual) MGW %s connect failed at (%s:%u)\n",
|
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,
|
mgcp_client_pool_member_name(pool_member), pool_member->conf.remote_addr,
|
||||||
pool_member->conf.remote_port);
|
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",
|
vty_out(vty, "%% MGCP client (MGW %s) initalization failed ('%s')%s",
|
||||||
mgcp_client_pool_member_name(pool_member), argv[0], VTY_NEWLINE);
|
mgcp_client_pool_member_name(pool_member), argv[0], VTY_NEWLINE);
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
|
|
Loading…
Reference in New Issue