diff options
author | Alexander Couzens <lynxis@fe80.eu> | 2019-09-10 17:46:54 +0200 |
---|---|---|
committer | Alexander Couzens <lynxis@fe80.eu> | 2019-09-15 20:42:30 +0200 |
commit | ff79699b48c45ecf0fa6e2a9c014bd6ece886f0f (patch) | |
tree | a1df369d62ee3a4c19eb968610244d292b9db9ca /src | |
parent | 8e2a0ee8e275686d3cc11ee00dbffa64380953c5 (diff) |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/iu_client.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/iu_client.c b/src/iu_client.c index 38c8a1d..e4eb83e 100644 --- a/src/iu_client.c +++ b/src/iu_client.c @@ -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"); |