pespin has uploaded this change for review.

View Change

Move DL CO RANAP processing to its proper layer file

Change-Id: Ifcb8a23becb57ccad6c9aa4769b6f27d31a71c96
---
M include/osmocom/hnbgw/hnbgw_ranap.h
M src/osmo-hnbgw/context_map_sccp.c
M src/osmo-hnbgw/hnbgw_ranap.c
3 files changed, 100 insertions(+), 87 deletions(-)

git pull ssh://gerrit.osmocom.org:29418/osmo-hnbgw refs/changes/88/39988/1
diff --git a/include/osmocom/hnbgw/hnbgw_ranap.h b/include/osmocom/hnbgw/hnbgw_ranap.h
index 4317ece..2e77246 100644
--- a/include/osmocom/hnbgw/hnbgw_ranap.h
+++ b/include/osmocom/hnbgw/hnbgw_ranap.h
@@ -8,5 +8,6 @@
int hnbgw_ranap_rx_udt_ul(struct msgb *msg, uint8_t *data, size_t len);
int hnbgw_ranap_rx_udt_dl(struct hnbgw_cnlink *cnlink, const struct osmo_scu_unitdata_param *unitdata,
const uint8_t *data, unsigned int len);
+int hnbgw_ranap_rx_data_dl(struct hnbgw_context_map *map, struct msgb *ranap_msg);
int hnbgw_ranap_init(void);

diff --git a/src/osmo-hnbgw/context_map_sccp.c b/src/osmo-hnbgw/context_map_sccp.c
index fc82426..42a0e49 100644
--- a/src/osmo-hnbgw/context_map_sccp.c
+++ b/src/osmo-hnbgw/context_map_sccp.c
@@ -27,18 +27,10 @@

#include <osmocom/sigtran/sccp_helpers.h>

-#include <osmocom/ranap/ranap_common_ran.h>
-
-#if ENABLE_PFCP
-#include <osmocom/pfcp/pfcp_cp_peer.h>
-#endif
-
#include <osmocom/hnbgw/hnbgw_cn.h>
#include <osmocom/hnbgw/context_map.h>
+#include <osmocom/hnbgw/hnbgw_ranap.h>
#include <osmocom/hnbgw/tdefs.h>
-#include <osmocom/hnbgw/mgw_fsm.h>
-#include <osmocom/hnbgw/ps_rab_ass_fsm.h>
-#include <osmocom/hnbgw/kpi.h>

enum map_sccp_fsm_state {
MAP_SCCP_ST_INIT,
@@ -187,32 +179,6 @@
return osmo_sccp_tx_disconn(map->cnlink->hnbgw_sccp_user->sccp_user, map->scu_conn_id, NULL, 0);
}

-static int destruct_ranap_ran_rx_co_ies(ranap_message *ranap_message_p)
-{
- ranap_ran_rx_co_free(ranap_message_p);
- return 0;
-}
-
-/* Decode DL RANAP message with convenient memory freeing: just talloc_free() the returned pointer..
- * Allocate a ranap_message from OTC_SELECT, decode RANAP msgb into it, attach a talloc destructor that calls
- * ranap_cn_rx_co_free() upon talloc_free(), and return the decoded ranap_message. */
-static ranap_message *hnbgw_decode_ranap_ran_co(struct msgb *ranap_msg)
-{
- int rc;
- ranap_message *message;
-
- if (!msg_has_l2_data(ranap_msg))
- return NULL;
- message = talloc_zero(OTC_SELECT, ranap_message);
- rc = ranap_ran_rx_co_decode(NULL, message, msgb_l2(ranap_msg), msgb_l2len(ranap_msg));
- if (rc != 0) {
- talloc_free(message);
- return NULL;
- }
- talloc_set_destructor(message, destruct_ranap_ran_rx_co_ies);
- return message;
-}
-
static int handle_rx_sccp(struct osmo_fsm_inst *fi, struct msgb *ranap_msg)
{
struct hnbgw_context_map *map = fi->priv;
@@ -225,58 +191,7 @@
if (!msg_has_l2_data(ranap_msg))
return 0;

- /* See if it is a RAB Assignment Request message from SCCP to RUA, where we need to change the user plane
- * information, for RTP mapping via MGW, or GTP mapping via UPF. */
- ranap_message *message = hnbgw_decode_ranap_ran_co(ranap_msg);
- if (message) {
- talloc_set_destructor(message, destruct_ranap_ran_rx_co_ies);
-
- LOGPFSML(fi, LOGL_DEBUG, "rx from SCCP: RANAP %s\n",
- get_value_string(ranap_procedure_code_vals, message->procedureCode));
-
- kpi_ranap_process_dl(map, message);
-
- if (!map->is_ps) {
- /* Circuit-Switched. Set up mapping of RTP ports via MGW */
-
- switch (message->procedureCode) {
- case RANAP_ProcedureCode_id_RAB_Assignment:
- /* mgw_fsm_alloc_and_handle_rab_ass_req() takes ownership of (ranap) message */
- return handle_cs_rab_ass_req(map, ranap_msg, message);
- case RANAP_ProcedureCode_id_Iu_Release:
- /* Any IU Release will terminate the MGW FSM, the message itsself is not passed to the
- * FSM code. It is just forwarded normally by map_rua_tx_dt() below. */
- mgw_fsm_release(map);
- break;
- }
-#if ENABLE_PFCP
- } else {
- switch (message->procedureCode) {
- case RANAP_ProcedureCode_id_RAB_Assignment:
- /* If a UPF is configured, handle the RAB Assignment via ps_rab_ass_fsm, and replace the
- * GTP F-TEIDs in the RAB Assignment message before passing it on to RUA. */
- if (hnb_gw_is_gtp_mapping_enabled()) {
- LOGP(DMAIN, LOGL_DEBUG,
- "RAB Assignment: setting up GTP tunnel mapping via UPF %s\n",
- osmo_sockaddr_to_str_c(OTC_SELECT, osmo_pfcp_cp_peer_get_remote_addr(g_hnbgw->pfcp.cp_peer)));
- return hnbgw_gtpmap_rx_rab_ass_req(map, ranap_msg, message);
- }
- /* If no UPF is configured, directly forward the message as-is (no GTP mapping). */
- LOGP(DMAIN, LOGL_DEBUG, "RAB Assignment: no UPF configured, forwarding as-is\n");
- break;
-
- case RANAP_ProcedureCode_id_Iu_Release:
- /* Any IU Release will terminate the MGW FSM, the message itsself is not passed to the
- * FSM code. It is just forwarded normally by map_rua_tx_dt() below. */
- hnbgw_gtpmap_release(map);
- break;
- }
-#endif
- }
- }
-
- /* It was not a RAB Assignment Request that needed to be intercepted. Forward as-is to RUA. */
- return map_rua_dispatch(map, MAP_RUA_EV_TX_DIRECT_TRANSFER, ranap_msg);
+ return hnbgw_ranap_rx_data_dl(map, ranap_msg);
}

static void map_sccp_init_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)
diff --git a/src/osmo-hnbgw/hnbgw_ranap.c b/src/osmo-hnbgw/hnbgw_ranap.c
index d795264..666560c 100644
--- a/src/osmo-hnbgw/hnbgw_ranap.c
+++ b/src/osmo-hnbgw/hnbgw_ranap.c
@@ -18,6 +18,8 @@
*
*/

+#include "config.h"
+
#include <unistd.h>
#include <errno.h>
#include <string.h>
@@ -28,12 +30,21 @@
#include <osmocom/core/utils.h>

#include <osmocom/ranap/ranap_common.h>
+#include <osmocom/ranap/ranap_common_ran.h>
#include <osmocom/ranap/ranap_ies_defs.h>
#include <osmocom/ranap/ranap_msg_factory.h>

+#if ENABLE_PFCP
+#include <osmocom/pfcp/pfcp_cp_peer.h>
+#endif
+
#include <osmocom/hnbgw/hnbgw.h>
#include <osmocom/hnbgw/hnbgw_rua.h>
#include <osmocom/hnbgw/hnbgw_cn.h>
+#include <osmocom/hnbgw/context_map.h>
+#include <osmocom/hnbgw/mgw_fsm.h>
+#include <osmocom/hnbgw/ps_rab_ass_fsm.h>
+#include <osmocom/hnbgw/kpi.h>

/*****************************************************************************
* Processing of RANAP from the endpoint towards RAN (hNodeB), acting as CN
@@ -410,6 +421,92 @@
return rc;
}

+static int destruct_ranap_ran_rx_co_ies(ranap_message *ranap_message_p)
+{
+ ranap_ran_rx_co_free(ranap_message_p);
+ return 0;
+}
+
+/* Decode DL RANAP message with convenient memory freeing: just talloc_free() the returned pointer..
+ * Allocate a ranap_message from OTC_SELECT, decode RANAP msgb into it, attach a talloc destructor that calls
+ * ranap_cn_rx_co_free() upon talloc_free(), and return the decoded ranap_message. */
+static ranap_message *hnbgw_decode_ranap_ran_co(struct msgb *ranap_msg)
+{
+ int rc;
+ ranap_message *message;
+
+ if (!msg_has_l2_data(ranap_msg))
+ return NULL;
+ message = talloc_zero(OTC_SELECT, ranap_message);
+ rc = ranap_ran_rx_co_decode(NULL, message, msgb_l2(ranap_msg), msgb_l2len(ranap_msg));
+ if (rc != 0) {
+ talloc_free(message);
+ return NULL;
+ }
+ talloc_set_destructor(message, destruct_ranap_ran_rx_co_ies);
+ return message;
+}
+
+/* Process a received RANAP PDU through SCCP DATA.ind coming from CN (MSC/SGSN)
+ * Takes ownership of ranap_msg? */
+int hnbgw_ranap_rx_data_dl(struct hnbgw_context_map *map, struct msgb *ranap_msg)
+{
+ OSMO_ASSERT(map);
+ OSMO_ASSERT(msg_has_l2_data(ranap_msg));
+
+ /* See if it is a RAB Assignment Request message from SCCP to RUA, where we need to change the user plane
+ * information, for RTP mapping via MGW, or GTP mapping via UPF. */
+ ranap_message *message = hnbgw_decode_ranap_ran_co(ranap_msg);
+ if (message) {
+ talloc_set_destructor(message, destruct_ranap_ran_rx_co_ies);
+
+ LOG_MAP(map, DCN, LOGL_DEBUG, "rx from SCCP: RANAP %s\n",
+ get_value_string(ranap_procedure_code_vals, message->procedureCode));
+
+ kpi_ranap_process_dl(map, message);
+
+ if (!map->is_ps) {
+ /* Circuit-Switched. Set up mapping of RTP ports via MGW */
+ switch (message->procedureCode) {
+ case RANAP_ProcedureCode_id_RAB_Assignment:
+ /* mgw_fsm_alloc_and_handle_rab_ass_req() takes ownership of (ranap) message */
+ return handle_cs_rab_ass_req(map, ranap_msg, message);
+ case RANAP_ProcedureCode_id_Iu_Release:
+ /* Any IU Release will terminate the MGW FSM, the message itsself is not passed to the
+ * FSM code. It is just forwarded normally by map_rua_tx_dt() below. */
+ mgw_fsm_release(map);
+ break;
+ }
+#if ENABLE_PFCP
+ } else {
+ switch (message->procedureCode) {
+ case RANAP_ProcedureCode_id_RAB_Assignment:
+ /* If a UPF is configured, handle the RAB Assignment via ps_rab_ass_fsm, and replace the
+ * GTP F-TEIDs in the RAB Assignment message before passing it on to RUA. */
+ if (hnb_gw_is_gtp_mapping_enabled()) {
+ LOG_MAP(map, DCN, LOGL_DEBUG,
+ "RAB Assignment: setting up GTP tunnel mapping via UPF %s\n",
+ osmo_sockaddr_to_str_c(OTC_SELECT, osmo_pfcp_cp_peer_get_remote_addr(g_hnbgw->pfcp.cp_peer)));
+ return hnbgw_gtpmap_rx_rab_ass_req(map, ranap_msg, message);
+ }
+ /* If no UPF is configured, directly forward the message as-is (no GTP mapping). */
+ LOG_MAP(map, DCN, LOGL_DEBUG, "RAB Assignment: no UPF configured, forwarding as-is\n");
+ break;
+
+ case RANAP_ProcedureCode_id_Iu_Release:
+ /* Any IU Release will terminate the MGW FSM, the message itsself is not passed to the
+ * FSM code. It is just forwarded normally by map_rua_tx_dt() below. */
+ hnbgw_gtpmap_release(map);
+ break;
+ }
+#endif
+ }
+ }
+
+ /* It was not a RAB Assignment Request that needed to be intercepted. Forward as-is to RUA. */
+ return map_rua_dispatch(map, MAP_RUA_EV_TX_DIRECT_TRANSFER, ranap_msg);
+}
+
int hnbgw_ranap_init(void)
{
return 0;

To view, visit change 39988. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: newchange
Gerrit-Project: osmo-hnbgw
Gerrit-Branch: master
Gerrit-Change-Id: Ifcb8a23becb57ccad6c9aa4769b6f27d31a71c96
Gerrit-Change-Number: 39988
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin@sysmocom.de>