pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-sgsn/+/40958?usp=email )
Change subject: sccp: Introduce helper func sgsn_sccp_user_iups_tx_data_req()
......................................................................
sccp: Introduce helper func sgsn_sccp_user_iups_tx_data_req()
This avoid code deduplication plus moving SCCP SAP logic into sccp.c.
Change-Id: Id34f86b4f5e40ddceac4066ec18ebc60529cafab
---
M include/osmocom/sgsn/gprs_ranap.h
M include/osmocom/sgsn/sccp.h
M src/sgsn/gprs_ranap.c
M src/sgsn/sccp.c
4 files changed, 34 insertions(+), 52 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-sgsn refs/changes/58/40958/1
diff --git a/include/osmocom/sgsn/gprs_ranap.h b/include/osmocom/sgsn/gprs_ranap.h
index 52a70b2..8a6c189 100644
--- a/include/osmocom/sgsn/gprs_ranap.h
+++ b/include/osmocom/sgsn/gprs_ranap.h
@@ -16,7 +16,6 @@
int iu_rab_act_ps(uint8_t rab_id, struct sgsn_pdp_ctx *pdp);
int ranap_iu_tx(struct msgb *msg, uint8_t sapi);
-int ranap_iu_rab_act(struct ranap_ue_conn_ctx *ue_ctx, struct msgb *msg);
int ranap_iu_rab_deact(struct ranap_ue_conn_ctx *ue_ctx, uint8_t rab_id);
int ranap_iu_tx_sec_mode_cmd(struct ranap_ue_conn_ctx *uectx, struct osmo_auth_vector
*vec,
int send_ck, int new_key);
diff --git a/include/osmocom/sgsn/sccp.h b/include/osmocom/sgsn/sccp.h
index a75c6aa..3dcb4f8 100644
--- a/include/osmocom/sgsn/sccp.h
+++ b/include/osmocom/sgsn/sccp.h
@@ -18,6 +18,8 @@
*/
#pragma once
+#include <stdint.h>
+
#include <osmocom/sigtran/sccp_sap.h>
struct sgsn_instance;
@@ -34,6 +36,8 @@
struct sgsn_sccp_user_iups *sgsn_scu_iups_inst_alloc(struct sgsn_instance *sgsn, struct
osmo_sccp_instance *sccp);
void sgsn_scu_iups_free(struct sgsn_sccp_user_iups *scu_iups);
+int sgsn_sccp_user_iups_tx_data_req(struct sgsn_sccp_user_iups *scu_iups, uint32_t
conn_id, struct msgb *ranap_msg);
+
int sgsn_sccp_init(struct sgsn_instance *sgsn);
void sgsn_sccp_release(struct sgsn_instance *sgsn);
diff --git a/src/sgsn/gprs_ranap.c b/src/sgsn/gprs_ranap.c
index 8433765..008063b 100644
--- a/src/sgsn/gprs_ranap.c
+++ b/src/sgsn/gprs_ranap.c
@@ -331,23 +331,7 @@
msg = ranap_new_msg_rab_assign_data(rab_id, ggsn_ip,
pdp->lib->teid_gn, use_x213_nsap);
- msg->l2h = msg->data;
- return ranap_iu_rab_act(uectx, msg);
-}
-
-int ranap_iu_rab_act(struct ranap_ue_conn_ctx *ue_ctx, struct msgb *msg)
-{
- struct osmo_scu_prim *prim;
-
- /* wrap RANAP message in SCCP N-DATA.req */
- prim = (struct osmo_scu_prim *) msgb_push(msg, sizeof(*prim));
- prim->u.data.conn_id = ue_ctx->conn_id;
- osmo_prim_init(&prim->oph,
- SCCP_SAP_USER,
- OSMO_SCU_PRIM_N_DATA,
- PRIM_OP_REQUEST,
- msg);
- return osmo_sccp_user_sap_down(ue_ctx->scu_iups->scu, &prim->oph);
+ return sgsn_sccp_user_iups_tx_data_req(uectx->scu_iups, uectx->conn_id, msg);
}
int ranap_iu_rab_deact(struct ranap_ue_conn_ctx *ue_ctx, uint8_t rab_id)
@@ -359,38 +343,23 @@
int ranap_iu_tx_sec_mode_cmd(struct ranap_ue_conn_ctx *uectx, struct osmo_auth_vector
*vec,
int send_ck, int new_key)
{
- struct osmo_scu_prim *prim;
struct msgb *msg;
/* create RANAP message */
msg = ranap_new_msg_sec_mod_cmd(vec->ik, send_ck ? vec->ck : NULL,
new_key ? RANAP_KeyStatus_new : RANAP_KeyStatus_old);
- msg->l2h = msg->data;
- /* wrap RANAP message in SCCP N-DATA.req */
- prim = (struct osmo_scu_prim *) msgb_push(msg, sizeof(*prim));
- prim->u.data.conn_id = uectx->conn_id;
- osmo_prim_init(&prim->oph, SCCP_SAP_USER,
- OSMO_SCU_PRIM_N_DATA,
- PRIM_OP_REQUEST, msg);
- return osmo_sccp_user_sap_down(uectx->scu_iups->scu, &prim->oph);
+ return sgsn_sccp_user_iups_tx_data_req(uectx->scu_iups, uectx->conn_id, msg);
}
int ranap_iu_tx_common_id(struct ranap_ue_conn_ctx *uectx, const char *imsi)
{
struct msgb *msg;
- struct osmo_scu_prim *prim;
LOGP(DRANAP, LOGL_INFO, "Transmitting RANAP CommonID (SCCP conn_id %u)\n",
uectx->conn_id);
msg = ranap_new_msg_common_id(imsi);
- msg->l2h = msg->data;
- prim = (struct osmo_scu_prim *) msgb_push(msg, sizeof(*prim));
- prim->u.data.conn_id = uectx->conn_id;
- osmo_prim_init(&prim->oph, SCCP_SAP_USER,
- OSMO_SCU_PRIM_N_DATA,
- PRIM_OP_REQUEST, msg);
- return osmo_sccp_user_sap_down(uectx->scu_iups->scu, &prim->oph);
+ return sgsn_sccp_user_iups_tx_data_req(uectx->scu_iups, uectx->conn_id, msg);
}
/* Send a paging command down a given SCCP User. tmsi and paging_cause are
@@ -413,7 +382,6 @@
{
struct ranap_ue_conn_ctx *uectx = msg_nas->dst;
struct msgb *msg;
- struct osmo_scu_prim *prim;
if (!uectx) {
LOGP(DRANAP, LOGL_ERROR,
@@ -426,22 +394,16 @@
msg = ranap_new_msg_dt(sapi, msg_nas->data, msgb_length(msg_nas));
msgb_free(msg_nas);
- msg->l2h = msg->data;
- prim = (struct osmo_scu_prim *) msgb_push(msg, sizeof(*prim));
- prim->u.data.conn_id = uectx->conn_id;
- osmo_prim_init(&prim->oph, SCCP_SAP_USER,
- OSMO_SCU_PRIM_N_DATA,
- PRIM_OP_REQUEST, msg);
- return osmo_sccp_user_sap_down(uectx->scu_iups->scu, &prim->oph);
+
+ return sgsn_sccp_user_iups_tx_data_req(uectx->scu_iups, uectx->conn_id, msg);
}
/* Send Iu Release for the given UE connection.
* If cause is NULL, Normal Release cause is sent, otherwise
* the provided cause. */
-int ranap_iu_tx_release(struct ranap_ue_conn_ctx *ctx, const struct RANAP_Cause *cause)
+int ranap_iu_tx_release(struct ranap_ue_conn_ctx *uectx, const struct RANAP_Cause
*cause)
{
struct msgb *msg;
- struct osmo_scu_prim *prim;
static const struct RANAP_Cause default_cause = {
.present = RANAP_Cause_PR_nAS,
.choice.radioNetwork = RANAP_CauseNAS_normal_release,
@@ -451,13 +413,7 @@
cause = &default_cause;
msg = ranap_new_msg_iu_rel_cmd(cause);
- msg->l2h = msg->data;
- prim = (struct osmo_scu_prim *) msgb_push(msg, sizeof(*prim));
- prim->u.data.conn_id = ctx->conn_id;
- osmo_prim_init(&prim->oph, SCCP_SAP_USER,
- OSMO_SCU_PRIM_N_DATA,
- PRIM_OP_REQUEST, msg);
- return osmo_sccp_user_sap_down(ctx->scu_iups->scu, &prim->oph);
+ return sgsn_sccp_user_iups_tx_data_req(uectx->scu_iups, uectx->conn_id, msg);
}
void ranap_iu_tx_release_free(struct ranap_ue_conn_ctx *ctx,
diff --git a/src/sgsn/sccp.c b/src/sgsn/sccp.c
index 2f99f6b..4a4d6a1 100644
--- a/src/sgsn/sccp.c
+++ b/src/sgsn/sccp.c
@@ -77,6 +77,29 @@
talloc_free(scu_iups);
}
+/* wrap RANAP message in SCCP N-DATA.req
+ * ranap_msg becomes owned by the callee. */
+int sgsn_sccp_user_iups_tx_data_req(struct sgsn_sccp_user_iups *scu_iups, uint32_t
conn_id, struct msgb *ranap_msg)
+{
+ struct osmo_scu_prim *prim;
+ int rc;
+
+ if (!scu_iups) {
+ LOGP(DSUA, LOGL_ERROR, "Failed to send SCCP N-DATA.req(%u): no SCCP User\n",
conn_id);
+ return -1;
+ }
+
+ ranap_msg->l2h = ranap_msg->data;
+ prim = (struct osmo_scu_prim *)msgb_push(ranap_msg, sizeof(*prim));
+ osmo_prim_init(&prim->oph, SCCP_SAP_USER, OSMO_SCU_PRIM_N_DATA, PRIM_OP_REQUEST,
ranap_msg);
+ prim->u.data.conn_id = conn_id;
+
+ rc = osmo_sccp_user_sap_down(scu_iups->scu, &prim->oph);
+ if (rc)
+ LOGP(DSUA, LOGL_ERROR, "Failed to send SCCP N-DATA.req(%u)\n", conn_id);
+ 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 *ctx;
--
To view, visit
https://gerrit.osmocom.org/c/osmo-sgsn/+/40958?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: Id34f86b4f5e40ddceac4066ec18ebc60529cafab
Gerrit-Change-Number: 40958
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>