aboutsummaryrefslogtreecommitdiffstats
path: root/src/hnbgw_ranap.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/hnbgw_ranap.c')
-rw-r--r--src/hnbgw_ranap.c102
1 files changed, 60 insertions, 42 deletions
diff --git a/src/hnbgw_ranap.c b/src/hnbgw_ranap.c
index c0b968f..1e38cf0 100644
--- a/src/hnbgw_ranap.c
+++ b/src/hnbgw_ranap.c
@@ -38,31 +38,16 @@
static int ranap_tx_reset_ack(struct hnb_context *hnb,
RANAP_CN_DomainIndicator_t domain)
{
- RANAP_ResetAcknowledge_t out;
- RANAP_ResetAcknowledgeIEs_t ies;
struct msgb *msg;
int rc;
- memset(&ies, 0, sizeof(ies));
- ies.cN_DomainIndicator = domain;
-
- memset(&out, 0, sizeof(out));
- rc = ranap_encode_resetacknowledgeies(&out, &ies);
- if (rc < 0) {
- LOGP(DRANAP, LOGL_ERROR, "error encoding reset ack IEs: %d\n", rc);
- return rc;
- }
-
- msg = ranap_generate_successful_outcome(RANAP_ProcedureCode_id_Reset,
- RANAP_Criticality_reject,
- &asn_DEF_RANAP_ResetAcknowledge,
- &out);
+ msg = ranap_new_msg_reset_ack(domain, NULL);
if (!msg)
return -1;
- msg->dst = hnb;
+ rc = rua_tx_udt(hnb, msg->data, msgb_length(msg));
- rc = rua_tx_udt(msg);
+ msgb_free(msg);
return rc;
}
@@ -110,26 +95,6 @@ int ranap_parse_lai(struct gprs_ra_id *ra_id, const RANAP_LAI_t *lai)
return 0;
}
-static int ranap_rx_init_ue_msg(struct hnb_context *hnb, ANY_t *in)
-{
- RANAP_InitialUE_MessageIEs_t ies;
- struct gprs_ra_id ra_id;
- int rc;
-
- rc = ranap_decode_initialue_messageies(&ies, in);
- if (rc < 0)
- return rc;
-
- /* location area ID of the serving cell */
- ranap_parse_lai(&ra_id, &ies.lai);
-
- DEBUGP(DMAIN, "%u-%u-%u: InitialUE: %s\n", ra_id.mcc, ra_id.mnc,
- ra_id.lac, osmo_hexdump(ies.nas_pdu.buf, ies.nas_pdu.size));
- /* FIXME: hand NAS PDU into MSC */
-
- return 0;
-}
-
static int ranap_rx_dt(struct hnb_context *hnb, ANY_t *in)
{
RANAP_DirectTransferIEs_t ies;
@@ -160,19 +125,66 @@ static int ranap_rx_initiating_msg(struct hnb_context *hnb, RANAP_InitiatingMess
{
int rc;
+ /* according tot the spec, we can primarily receive Overload,
+ * Reset, Reset ACK, Error Indication, reset Resource, Reset
+ * Resurce Acknowledge as connecitonless RANAP. There are some
+ * more messages regarding Information Transfer, Direct
+ * Information Transfer and Uplink Information Trnansfer that we
+ * can ignore. In either case, it is RANAP that we need to
+ * decode... */
switch (imsg->procedureCode) {
case RANAP_ProcedureCode_id_Reset:
+ /* Reset request */
rc = ranap_rx_init_reset(hnb, &imsg->value);
break;
- case RANAP_ProcedureCode_id_InitialUE_Message:
- rc = ranap_rx_init_ue_msg(hnb, &imsg->value);
+ case RANAP_ProcedureCode_id_OverloadControl: /* Overload ind */
break;
- case RANAP_ProcedureCode_id_DirectTransfer:
- rc = ranap_rx_dt(hnb, &imsg->value);
+ case RANAP_ProcedureCode_id_ErrorIndication: /* Error ind */
+ break;
+ case RANAP_ProcedureCode_id_ResetResource: /* request */
+ case RANAP_ProcedureCode_id_InformationTransfer:
+ case RANAP_ProcedureCode_id_DirectInformationTransfer:
+ case RANAP_ProcedureCode_id_UplinkInformationExchange:
+ LOGP(DRANAP, LOGL_NOTICE, "Received unsupported RANAP "
+ "Procedure %u from HNB, ignoring\n", imsg->procedureCode);
+ break;
+ default:
+ LOGP(DRANAP, LOGL_NOTICE, "Received suspicious RANAP "
+ "Procedure %u from HNB, ignoring\n", imsg->procedureCode);
+ break;
+ }
+}
+
+static int ranap_rx_successful_msg(struct hnb_context *hnb, RANAP_SuccessfulOutcome_t *imsg)
+{
+ int rc;
+
+ /* according tot the spec, we can primarily receive Overload,
+ * Reset, Reset ACK, Error Indication, reset Resource, Reset
+ * Resurce Acknowledge as connecitonless RANAP. There are some
+ * more messages regarding Information Transfer, Direct
+ * Information Transfer and Uplink Information Trnansfer that we
+ * can ignore. In either case, it is RANAP that we need to
+ * decode... */
+ switch (imsg->procedureCode) {
+ case RANAP_ProcedureCode_id_Reset: /* Reset acknowledge */
+ break;
+ case RANAP_ProcedureCode_id_ResetResource: /* response */
+ case RANAP_ProcedureCode_id_InformationTransfer:
+ case RANAP_ProcedureCode_id_DirectInformationTransfer:
+ case RANAP_ProcedureCode_id_UplinkInformationExchange:
+ LOGP(DRANAP, LOGL_NOTICE, "Received unsupported RANAP "
+ "Procedure %u from HNB, ignoring\n", imsg->procedureCode);
+ break;
+ default:
+ LOGP(DRANAP, LOGL_NOTICE, "Received suspicious RANAP "
+ "Procedure %u from HNB, ignoring\n", imsg->procedureCode);
break;
}
}
+
+
static int _hnbgw_ranap_rx(struct hnb_context *hnb, RANAP_RANAP_PDU_t *pdu)
{
int rc;
@@ -182,10 +194,16 @@ static int _hnbgw_ranap_rx(struct hnb_context *hnb, RANAP_RANAP_PDU_t *pdu)
rc = ranap_rx_initiating_msg(hnb, &pdu->choice.initiatingMessage);
break;
case RANAP_RANAP_PDU_PR_successfulOutcome:
+ rc = ranap_rx_successful_msg(hnb, &pdu->choice.successfulOutcome);
break;
case RANAP_RANAP_PDU_PR_unsuccessfulOutcome:
+ LOGP(DRANAP, LOGL_NOTICE, "Received unsupported RANAP "
+ "unsuccessful outcome procedure %u from HNB, ignoring\n",
+ pdu->choice.unsuccessfulOutcome.procedureCode);
break;
default:
+ LOGP(DRANAP, LOGL_NOTICE, "Received suspicious RANAP "
+ "presence %u from HNB, ignoring\n", pdu->present);
break;
}
}