diff --git a/include/osmocom/msc/ran_msg.h b/include/osmocom/msc/ran_msg.h index af0822b70..081c7ad4d 100644 --- a/include/osmocom/msc/ran_msg.h +++ b/include/osmocom/msc/ran_msg.h @@ -210,6 +210,7 @@ struct ran_msg { * alg_id == 0 means no such IE was present. */ uint8_t alg_id; const char *imeisv; + const struct tlv_p_entry *l3_msg; } cipher_mode_complete; struct { enum gsm0808_cause bssap_cause; diff --git a/src/libmsc/msc_a.c b/src/libmsc/msc_a.c index b41457458..344b442cb 100644 --- a/src/libmsc/msc_a.c +++ b/src/libmsc/msc_a.c @@ -1407,6 +1407,18 @@ int msc_a_ran_dec_from_msc_i(struct msc_a *msc_a, struct msc_a_ran_dec_data *d) }; vlr_subscr_rx_ciph_res(vsub, VLR_CIPH_COMPL); rc = 0; + + /* Evaluate enclosed L3 message, typically Identity Response (IMEISV) */ + if (msg->cipher_mode_complete.l3_msg) { + unsigned char *data = (unsigned char*)(msg->cipher_mode_complete.l3_msg->val); + uint16_t len = msg->cipher_mode_complete.l3_msg->len; + struct msgb *dtap = msgb_alloc(len, "DTAP from Cipher Mode Complete"); + unsigned char *pos = msgb_put(dtap, len); + memcpy(pos, data, len); + dtap->l3h = pos; + rc = msc_a_up_l3(msc_a, dtap); + msgb_free(dtap); + } break; case RAN_MSG_CIPHER_MODE_REJECT: diff --git a/src/libmsc/ran_msg_a.c b/src/libmsc/ran_msg_a.c index 43e27f6ca..7672d863d 100644 --- a/src/libmsc/ran_msg_a.c +++ b/src/libmsc/ran_msg_a.c @@ -194,18 +194,10 @@ static int ran_a_decode_cipher_mode_complete(struct ran_dec *ran_dec, struct msg ran_dec_msg.cipher_mode_complete.alg_id = ie_chosen_encr_alg->val[0]; } - rc = ran_decoded(ran_dec, &ran_dec_msg); + if (ie_l3_msg) + ran_dec_msg.cipher_mode_complete.l3_msg = ie_l3_msg; - if (ie_l3_msg) { - msg->l3h = (uint8_t*)ie_l3_msg->val; - msgb_l3trim(msg, ie_l3_msg->len); - ran_dec_msg = (struct ran_msg){ - .msg_type = RAN_MSG_DTAP, - .msg_name = "BSSMAP Ciphering Mode Complete (L3 Message Contents)", - .dtap = msg, - }; - ran_decoded(ran_dec, &ran_dec_msg); - } + rc = ran_decoded(ran_dec, &ran_dec_msg); return rc; }