iu_client: introduce ranap_iu_tx_release_free()

ranap_iu_tx_release_free is a fire and forget function to release
gracefully if possible. It first sends a Iu Release Command. After
a certain timeout the connection will be released.

Change-Id: I349e2c61ba0131e233b7ab927dfced0bd461dd8f
This commit is contained in:
Alexander Couzens 2019-09-10 17:46:54 +02:00
parent 8e2a0ee8e2
commit ff79699b48
3 changed files with 28 additions and 0 deletions

View File

@ -8,3 +8,4 @@
# If any interfaces have been removed or changed since the last public release: c:r:0.
#library what description / commit summary line
libranap iu_client.h struct ranap_ue_conn_ctx: add field notification
libranap iu_client.h struct ranap_ue_conn_ctx: add field release_timeout

View File

@ -31,6 +31,8 @@ struct ranap_ue_conn_ctx {
struct gprs_ra_id ra_id;
enum ranap_nsap_addr_enc rab_assign_addr_enc;
bool notification; /* send notification to the upstream user */
/* Will be set when the Iu Release Command has been sent */
struct osmo_timer_list release_timeout;
};
enum ranap_iu_event_type {
@ -71,6 +73,13 @@ int ranap_iu_tx_sec_mode_cmd(struct ranap_ue_conn_ctx *uectx, struct osmo_auth_v
int ranap_iu_tx_common_id(struct ranap_ue_conn_ctx *ue_ctx, const char *imsi);
int ranap_iu_tx_release(struct ranap_ue_conn_ctx *ctx, const struct RANAP_Cause *cause);
/* transmit a Iu Release Command and free the ctx afterwards.
* If a Release Complete is not received within timeout s,
* release the SCCP connection. */
void ranap_iu_tx_release_free(struct ranap_ue_conn_ctx *ctx,
const struct RANAP_Cause *cause,
int timeout);
/* freeing the UE will release all resources
* This will close the SCCP connection connected to the UE */
void ranap_iu_free_ue(struct ranap_ue_conn_ctx *ue_ctx);

View File

@ -129,6 +129,9 @@ static struct ranap_ue_conn_ctx *ue_conn_ctx_alloc(struct ranap_iu_rnc *rnc, uin
ctx->rnc = rnc;
ctx->conn_id = conn_id;
ctx->notification = true;
osmo_timer_setup(&ctx->release_timeout,
(void *)(void *) ranap_iu_free_ue,
ctx);
llist_add(&ctx->list, &ue_conn_ctx_list);
return ctx;
@ -150,6 +153,7 @@ void ranap_iu_free_ue(struct ranap_ue_conn_ctx *ue_ctx)
if (!ue_ctx)
return;
osmo_timer_del(&ue_ctx->release_timeout);
osmo_sccp_tx_disconn(g_scu, ue_ctx->conn_id, NULL, 0);
llist_del(&ue_ctx->list);
talloc_free(ue_ctx);
@ -491,6 +495,20 @@ int ranap_iu_tx_release(struct ranap_ue_conn_ctx *ctx, const struct RANAP_Cause
return osmo_sccp_user_sap_down(g_scu, &prim->oph);
}
void ranap_iu_tx_release_free(struct ranap_ue_conn_ctx *ctx,
const struct RANAP_Cause *cause,
int timeout)
{
ctx->notification = false;
int ret = ranap_iu_tx_release(ctx, cause);
if (ret) {
ranap_iu_free_ue(ctx);
return;
}
osmo_timer_schedule(&ctx->release_timeout, timeout, 0);
}
static int ranap_handle_co_iu_rel_req(struct ranap_ue_conn_ctx *ctx, RANAP_Iu_ReleaseRequestIEs_t *ies)
{
LOGPIU(LOGL_INFO, "Received Iu Release Request, Sending Release Command\n");