libmsc/ran_msg_iu.c: fix: properly handle SAPI IE of RANAP_DirectTransfer
The RANAP DirectTransfer message may contain an optional SAPI IE. Thanks to our TTCN-3 tests (and Wireshark!), it was discovered that this IE is ignored, so even if the MO SMS related messages arrive on SAPI 3 (as per GSM TS 04.11, section 2.3) OsmoMSC sends MT messages on SAPI 0. In ran_iu_decode_l3() we need to check if the SAPI IE is present, and tag the NAS PDU message buffer with a proper DLCI value. This change makes the failing SMS related test cases pass. Change-Id: I728b55b04e87fc23be6d4f8735e8cad82b6f640e
This commit is contained in:
parent
7659482318
commit
1c50044efb
|
@ -37,6 +37,7 @@
|
|||
#include <osmocom/msc/msc_common.h>
|
||||
#include <osmocom/msc/sccp_ran.h>
|
||||
#include <osmocom/msc/ran_msg_iu.h>
|
||||
#include <osmocom/msc/gsm_04_11.h>
|
||||
|
||||
/* Implement the extern talloc_asn1_ctx from libasn1c as talloc ctx for ASN.1 message composition */
|
||||
void *talloc_asn1_ctx = NULL;
|
||||
|
@ -92,8 +93,11 @@ static void ran_iu_decode_l3_initial(struct ran_dec *ran_iu_decode, const RANAP_
|
|||
msgb_free(ran);
|
||||
}
|
||||
|
||||
static void ran_iu_decode_l3(struct ran_dec *ran_iu_decode, const RANAP_NAS_PDU_t *nas_pdu, const char *msg_name)
|
||||
static void ran_iu_decode_l3(struct ran_dec *ran_iu_decode,
|
||||
const RANAP_DirectTransferIEs_t *ies,
|
||||
const char *msg_name)
|
||||
{
|
||||
const RANAP_NAS_PDU_t *nas_pdu = &ies->nas_pdu;
|
||||
struct msgb *ran = msgb_alloc(256, msg_name);
|
||||
struct ran_msg ran_dec_msg;
|
||||
|
||||
|
@ -101,6 +105,12 @@ static void ran_iu_decode_l3(struct ran_dec *ran_iu_decode, const RANAP_NAS_PDU_
|
|||
ran->l3h = msgb_put(ran, nas_pdu->size);
|
||||
memcpy(ran->l3h, nas_pdu->buf, nas_pdu->size);
|
||||
|
||||
/* Handle optional SAPI IE */
|
||||
if (ies->presenceMask & DIRECTTRANSFERIES_RANAP_SAPI_PRESENT) {
|
||||
if (ies->sapi == RANAP_SAPI_sapi_3)
|
||||
OMSC_LINKID_CB(ran) = UM_SAPI_SMS;
|
||||
}
|
||||
|
||||
ran_dec_msg = (struct ran_msg){
|
||||
.msg_type = RAN_MSG_DTAP,
|
||||
.msg_name = msg_name,
|
||||
|
@ -266,7 +276,7 @@ static void ran_iu_decode_ranap_msg(void *_ran_dec, ranap_message *message)
|
|||
return;
|
||||
|
||||
case RANAP_ProcedureCode_id_DirectTransfer:
|
||||
ran_iu_decode_l3(ran_iu_decode, &message->msg.directTransferIEs.nas_pdu, "RANAP DirectTransfer RAN PDU");
|
||||
ran_iu_decode_l3(ran_iu_decode, &message->msg.directTransferIEs, "RANAP DirectTransfer RAN PDU");
|
||||
return;
|
||||
|
||||
case RANAP_ProcedureCode_id_SecurityModeControl:
|
||||
|
|
Loading…
Reference in New Issue