aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/msc/ran_msg.h1
-rw-r--r--src/libmsc/msc_a.c12
-rw-r--r--src/libmsc/ran_msg_a.c14
3 files changed, 16 insertions, 11 deletions
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;
}