pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-sgsn/+/40987?usp=email )
Change subject: iu_rnc: Introduce helper API iu_rnc_discard_all_ue_ctx()
......................................................................
iu_rnc: Introduce helper API iu_rnc_discard_all_ue_ctx()
This is a preparation commit to introduce iu_rnc_fsm in follow-up patch.
The helper API will be used whenever the entire RNC is considered reset.
* Code inside handle_notice_ind() is moved to its own function
iu_rnc_discard_all_ue_ctx().
* Dependent helper ue_ctx_link_invalidated_free() API is properly
prefixed/renamed to ue_conn_ctx_link_invalidated_free(), where methods
for ue_conn_ctx object are placed.
* ue_conn_ctx_find() is properly prefixed/renamed to
sgsn_scu_iups_ue_conn_ctx_find() and made available to functions in
other files.
Change-Id: Ie3a4732a85a69d115dd5756bfa64b296e9e5edd2
---
M include/osmocom/sgsn/iu_client.h
M include/osmocom/sgsn/iu_rnc.h
M include/osmocom/sgsn/sccp.h
M src/sgsn/iu_client.c
M src/sgsn/iu_rnc.c
M src/sgsn/sccp.c
6 files changed, 39 insertions(+), 26 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-sgsn refs/changes/87/40987/1
diff --git a/include/osmocom/sgsn/iu_client.h b/include/osmocom/sgsn/iu_client.h
index e32084b..a684dda 100644
--- a/include/osmocom/sgsn/iu_client.h
+++ b/include/osmocom/sgsn/iu_client.h
@@ -88,6 +88,8 @@
struct ranap_ue_conn_ctx *ue_conn_ctx_alloc(struct ranap_iu_rnc *rnc, uint32_t conn_id);
+void ue_conn_ctx_link_invalidated_free(struct ranap_ue_conn_ctx *ue);
+
/* freeing the UE will release all resources
* This will close the SCCP connection connected to the UE */
void sgsn_ranap_iu_free_ue(struct ranap_ue_conn_ctx *ue_ctx);
diff --git a/include/osmocom/sgsn/iu_rnc.h b/include/osmocom/sgsn/iu_rnc.h
index 55f716b..9bdb559 100644
--- a/include/osmocom/sgsn/iu_rnc.h
+++ b/include/osmocom/sgsn/iu_rnc.h
@@ -35,3 +35,5 @@
struct sgsn_sccp_user_iups *scu_iups,
const struct osmo_sccp_addr *addr);
void iu_rnc_update_rai_seen(struct ranap_iu_rnc *rnc, const struct osmo_routing_area_id
*rai);
+
+void iu_rnc_discard_all_ue_ctx(struct ranap_iu_rnc *rnc);
diff --git a/include/osmocom/sgsn/sccp.h b/include/osmocom/sgsn/sccp.h
index 53c7a89..67388a4 100644
--- a/include/osmocom/sgsn/sccp.h
+++ b/include/osmocom/sgsn/sccp.h
@@ -38,6 +38,8 @@
int sgsn_scu_iups_tx_data_req(struct sgsn_sccp_user_iups *scu_iups, uint32_t conn_id,
struct msgb *ranap_msg);
+struct ranap_ue_conn_ctx *sgsn_scu_iups_ue_conn_ctx_find(struct sgsn_sccp_user_iups
*scu_iups, uint32_t conn_id);
+
int sgsn_sccp_init(struct sgsn_instance *sgsn);
void sgsn_sccp_release(struct sgsn_instance *sgsn);
diff --git a/src/sgsn/iu_client.c b/src/sgsn/iu_client.c
index 21c0470..c093963 100644
--- a/src/sgsn/iu_client.c
+++ b/src/sgsn/iu_client.c
@@ -105,6 +105,21 @@
talloc_free(ue_ctx);
}
+void ue_conn_ctx_link_invalidated_free(struct ranap_ue_conn_ctx *ue)
+{
+ uint32_t conn_id = ue->conn_id;
+
+ global_iu_event(ue, RANAP_IU_EVENT_LINK_INVALIDATED, NULL);
+
+ /* A RANAP_IU_EVENT_LINK_INVALIDATED, can lead to a free */
+ ue = sgsn_scu_iups_ue_conn_ctx_find(ue->rnc->scu_iups, conn_id);
+ if (!ue)
+ return;
+ if (ue->free_on_release)
+ sgsn_ranap_iu_free_ue(ue);
+}
+
+
/***********************************************************************
* Paging
***********************************************************************/
diff --git a/src/sgsn/iu_rnc.c b/src/sgsn/iu_rnc.c
index 36350ff..158381c 100644
--- a/src/sgsn/iu_rnc.c
+++ b/src/sgsn/iu_rnc.c
@@ -170,3 +170,14 @@
}
/* else, LAC,RAC already recorded with the current RNC. */
}
+
+void iu_rnc_discard_all_ue_ctx(struct ranap_iu_rnc *rnc)
+{
+ struct ranap_ue_conn_ctx *ue_ctx, *ue_ctx_tmp;
+
+ llist_for_each_entry_safe(ue_ctx, ue_ctx_tmp,
&sgsn->sccp.scu_iups->ue_conn_ctx_list, list) {
+ if (ue_ctx->rnc != rnc)
+ continue;
+ ue_conn_ctx_link_invalidated_free(ue_ctx);
+ }
+}
diff --git a/src/sgsn/sccp.c b/src/sgsn/sccp.c
index 1eed08a..8b57dd4 100644
--- a/src/sgsn/sccp.c
+++ b/src/sgsn/sccp.c
@@ -100,7 +100,7 @@
return rc;
}
-static struct ranap_ue_conn_ctx *ue_conn_ctx_find(struct sgsn_sccp_user_iups *scu_iups,
uint32_t conn_id)
+struct ranap_ue_conn_ctx *sgsn_scu_iups_ue_conn_ctx_find(struct sgsn_sccp_user_iups
*scu_iups, uint32_t conn_id)
{
struct ranap_ue_conn_ctx *ctx;
@@ -143,20 +143,6 @@
}
}
-static void ue_ctx_link_invalidated_free(struct ranap_ue_conn_ctx *ue)
-{
- uint32_t conn_id = ue->conn_id;
-
- global_iu_event(ue, RANAP_IU_EVENT_LINK_INVALIDATED, NULL);
-
- /* A RANAP_IU_EVENT_LINK_INVALIDATED, can lead to a free */
- ue = ue_conn_ctx_find(ue->rnc->scu_iups, conn_id);
- if (!ue)
- return;
- if (ue->free_on_release)
- sgsn_ranap_iu_free_ue(ue);
-}
-
static void handle_notice_ind(struct sgsn_sccp_user_iups *scu_iups, const struct
osmo_scu_notice_param *ni)
{
struct ranap_iu_rnc *rnc;
@@ -177,7 +163,6 @@
/* Messages are not arriving to RNC. Signal to user that all related ue_ctx are invalid.
*/
llist_for_each_entry(rnc, &sgsn->rnc_list, entry) {
- struct ranap_ue_conn_ctx *ue_ctx, *ue_ctx_tmp;
if (osmo_sccp_addr_ri_cmp(&rnc->sccp_addr, &ni->calling_addr))
continue;
LOGP(DSUA, LOGL_NOTICE,
@@ -185,11 +170,7 @@
osmo_rnc_id_name(&rnc->rnc_id),
ni->cause, osmo_sccp_return_cause_name(ni->cause),
ni->importance);
- llist_for_each_entry_safe(ue_ctx, ue_ctx_tmp, &scu_iups->ue_conn_ctx_list, list)
{
- if (ue_ctx->rnc != rnc)
- continue;
- ue_ctx_link_invalidated_free(ue_ctx);
- }
+ iu_rnc_discard_all_ue_ctx(rnc);
/* TODO: ideally we'd have some event to submit to upper
* layer to inform about peer availability change... */
}
@@ -278,7 +259,7 @@
llist_for_each_entry_safe(ue_ctx, ue_ctx_tmp, &scu_iups->ue_conn_ctx_list,
list) {
if (ue_ctx->rnc != rnc)
continue;
- ue_ctx_link_invalidated_free(ue_ctx);
+ ue_conn_ctx_link_invalidated_free(ue_ctx);
}
/* TODO: ideally we'd have some event to submit to upper
* layer to inform about peer availability change... */
@@ -354,7 +335,7 @@
LOGP(DSUA, LOGL_DEBUG, "N-DISCONNECT.ind(%u)\n", conn_id);
ue_conn_sccp_addr_del(scu_iups, conn_id);
- ue = ue_conn_ctx_find(scu_iups, conn_id);
+ ue = sgsn_scu_iups_ue_conn_ctx_find(scu_iups, conn_id);
if (!ue)
break;
@@ -363,10 +344,10 @@
rc = sgsn_ranap_iu_rx_co_msg(ue, msgb_l2(oph->msg), msgb_l2len(oph->msg));
/* A Iu Release event might be used to free the UE in cn_ranap_handle_co(). */
- ue = ue_conn_ctx_find(scu_iups, conn_id);
+ ue = sgsn_scu_iups_ue_conn_ctx_find(scu_iups, conn_id);
if (!ue)
break;
- ue_ctx_link_invalidated_free(ue);
+ ue_conn_ctx_link_invalidated_free(ue);
break;
case OSMO_PRIM(OSMO_SCU_PRIM_N_DATA, PRIM_OP_INDICATION):
/* connection-oriented data received */
@@ -375,7 +356,7 @@
osmo_hexdump(msgb_l2(oph->msg), msgb_l2len(oph->msg)));
/* resolve UE context */
- ue = ue_conn_ctx_find(scu_iups, conn_id);
+ ue = sgsn_scu_iups_ue_conn_ctx_find(scu_iups, conn_id);
if (!ue) {
/* Could be an InitialUE-Message after an empty CR, recreate new_ctx */
const struct osmo_sccp_addr *sccp_addr = ue_conn_sccp_addr_find(scu_iups, conn_id);
--
To view, visit
https://gerrit.osmocom.org/c/osmo-sgsn/+/40987?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: osmo-sgsn
Gerrit-Branch: master
Gerrit-Change-Id: Ie3a4732a85a69d115dd5756bfa64b296e9e5edd2
Gerrit-Change-Number: 40987
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>