diff --git a/TODO-RELEASE b/TODO-RELEASE index c480ba008..5fe3d5365 100644 --- a/TODO-RELEASE +++ b/TODO-RELEASE @@ -25,4 +25,5 @@ # #library what description / commit summary line libosmo-netif >1.2.0 OSMUX_DEFAULT_PORT, osmux_xfrm_output_*, osmux_xfrm_input_* -libosmocore >1.7.0 osmo_sockaddr_is_any() \ No newline at end of file +libosmocore >1.7.0 osmo_sockaddr_is_any() +libmgcp-client NEW APIs mgcp_client_pool_member_...() \ No newline at end of file diff --git a/include/osmocom/mgcp_client/mgcp_client_pool.h b/include/osmocom/mgcp_client/mgcp_client_pool.h index d0a6ff430..949e87028 100644 --- a/include/osmocom/mgcp_client/mgcp_client_pool.h +++ b/include/osmocom/mgcp_client/mgcp_client_pool.h @@ -2,10 +2,17 @@ struct mgcp_client; struct mgcp_client_pool; +struct mgcp_client_pool_member; struct mgcp_client_pool *mgcp_client_pool_alloc(void *talloc_ctx); + void mgcp_client_pool_vty_init(int parent_node, int mgw_node, const char *indent, struct mgcp_client_pool *pool); unsigned int mgcp_client_pool_connect(struct mgcp_client_pool *pool); void mgcp_client_pool_register_single(struct mgcp_client_pool *pool, struct mgcp_client *mgcp_client); + struct mgcp_client *mgcp_client_pool_get(struct mgcp_client_pool *pool); void mgcp_client_pool_put(struct mgcp_client *mgcp_client); + +struct mgcp_client_pool_member *mgcp_client_pool_find_member_by_nr(struct mgcp_client_pool *pool, unsigned int nr); +struct mgcp_client *mgcp_client_pool_member_get(struct mgcp_client_pool_member *pool_member); +bool mgcp_client_pool_member_is_blocked(const struct mgcp_client_pool_member *pool_member); diff --git a/include/osmocom/mgcp_client/mgcp_client_pool_internal.h b/include/osmocom/mgcp_client/mgcp_client_pool_internal.h index d71deaf19..999c3efac 100644 --- a/include/osmocom/mgcp_client/mgcp_client_pool_internal.h +++ b/include/osmocom/mgcp_client/mgcp_client_pool_internal.h @@ -18,9 +18,6 @@ struct mgcp_client_pool { struct cmd_node *vty_node; }; -struct mgcp_client_pool_member *mgcp_client_pool_find_member_by_nr(struct mgcp_client_pool *pool, unsigned int nr); - - /* Struct to handle a member of a pool of MGWs. */ struct mgcp_client_pool_member { /* Entry in llist mgcp_client_pool->pool. */ diff --git a/src/libosmo-mgcp-client/mgcp_client_pool.c b/src/libosmo-mgcp-client/mgcp_client_pool.c index bee3555ba..caec5353f 100644 --- a/src/libosmo-mgcp-client/mgcp_client_pool.c +++ b/src/libosmo-mgcp-client/mgcp_client_pool.c @@ -148,12 +148,10 @@ struct mgcp_client *mgcp_client_pool_get(struct mgcp_client_pool *pool) /* Pick a suitable pool member */ pool_member = mgcp_client_pool_pick(pool); - if (pool_member) { - pool_member->refcount++; - return pool_member->client; - } + if (!pool_member) + return NULL; - return NULL; + return mgcp_client_pool_member_get(pool_member); } /*! put an MGCP client back into the pool (decrement reference counter). @@ -273,3 +271,22 @@ const char *mgcp_client_pool_member_name(const struct mgcp_client_pool_member *p return name; } + +/*! Get the MGCP client associated with the pool reference from the pool (increment reference counter). + * \param[in] pool_member MGCP client pool descriptor. + * \returns MGCP client descriptor, NULL if no member was not ready. + */ +struct mgcp_client *mgcp_client_pool_member_get(struct mgcp_client_pool_member *pool_member) +{ + pool_member->refcount++; + return pool_member->client; +} + +/*! Get whether the MGCP client associated with the pool reference is blocked by policy. + * \param[in] pool_member MGCP client pool descriptor. + * \returns true if blocked, false otherwise + */ +bool mgcp_client_pool_member_is_blocked(const struct mgcp_client_pool_member *pool_member) +{ + return pool_member->blocked; +} diff --git a/src/libosmo-mgcp-client/mgcp_client_vty.c b/src/libosmo-mgcp-client/mgcp_client_vty.c index a823b0c82..da017f691 100644 --- a/src/libosmo-mgcp-client/mgcp_client_vty.c +++ b/src/libosmo-mgcp-client/mgcp_client_vty.c @@ -32,6 +32,7 @@ #include #include #include +#include #define MGW_STR MGCP_CLIENT_MGW_STR