Store 5G-S-TMSI from UE if received
This commit implements retrieval of 5G-S-TMSI from Parts 1&2, or the entire 5G-S-TMSI, depending on what the UE sends. Further, if it has been retrieved, print a log of all constituent parts of it. The UE-specific variable ng_5G_S_TMSI_Part2 is not needed, as we compute the full 5G-S-TMSI as soon as we have Part2 (and 1). The correct forwarding to the core is implemented in the following commit.
This commit is contained in:
@@ -277,7 +277,6 @@ typedef struct gNB_RRC_UE_s {
|
|||||||
/* Information from UE RRC Setup Request */
|
/* Information from UE RRC Setup Request */
|
||||||
NR_UE_S_TMSI Initialue_identity_5g_s_TMSI;
|
NR_UE_S_TMSI Initialue_identity_5g_s_TMSI;
|
||||||
uint64_t ng_5G_S_TMSI_Part1;
|
uint64_t ng_5G_S_TMSI_Part1;
|
||||||
uint16_t ng_5G_S_TMSI_Part2;
|
|
||||||
NR_EstablishmentCause_t establishment_cause;
|
NR_EstablishmentCause_t establishment_cause;
|
||||||
|
|
||||||
uint32_t rrc_ue_id;
|
uint32_t rrc_ue_id;
|
||||||
|
|||||||
+46
-50
@@ -1213,27 +1213,13 @@ static void rrc_handle_RRCSetupRequest(gNB_RRC_INST *rrc, sctp_assoc_t assoc_id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint64_t s_tmsi_part1 = BIT_STRING_to_uint64(&rrcSetupRequest->ue_Identity.choice.ng_5G_S_TMSI_Part1);
|
uint64_t s_tmsi_part1 = BIT_STRING_to_uint64(&rrcSetupRequest->ue_Identity.choice.ng_5G_S_TMSI_Part1);
|
||||||
|
LOG_I(NR_RRC, "Received UE 5G-S-TMSI-Part1 %ld\n", s_tmsi_part1);
|
||||||
|
|
||||||
// memcpy(((uint8_t *) & random_value) + 3,
|
ue_context_p = rrc_gNB_create_ue_context(assoc_id, msg->crnti, rrc, s_tmsi_part1, msg->gNB_DU_ue_id);
|
||||||
// rrcSetupRequest->ue_Identity.choice.ng_5G_S_TMSI_Part1.buf,
|
AssertFatal(ue_context_p != NULL, "out of memory\n");
|
||||||
// rrcSetupRequest->ue_Identity.choice.ng_5G_S_TMSI_Part1.size);
|
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||||
|
UE->Initialue_identity_5g_s_TMSI.presence = true;
|
||||||
if ((ue_context_p = rrc_gNB_ue_context_5g_s_tmsi_exist(rrc, s_tmsi_part1))) {
|
UE->ng_5G_S_TMSI_Part1 = s_tmsi_part1;
|
||||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
|
||||||
LOG_I(NR_RRC, " 5G-S-TMSI-Part1 exists, old rnti %04x => %04x\n", UE->rnti, msg->crnti);
|
|
||||||
AssertFatal(false, "not implemented\n");
|
|
||||||
|
|
||||||
/* replace rnti in the context */
|
|
||||||
UE->rnti = msg->crnti;
|
|
||||||
} else {
|
|
||||||
LOG_I(NR_RRC, "UE %04x 5G-S-TMSI-Part1 doesn't exist, setting ng_5G_S_TMSI_Part1 => %ld\n", msg->crnti, s_tmsi_part1);
|
|
||||||
|
|
||||||
ue_context_p = rrc_gNB_create_ue_context(assoc_id, msg->crnti, rrc, s_tmsi_part1, msg->gNB_DU_ue_id);
|
|
||||||
AssertFatal(ue_context_p != NULL, "out of memory\n");
|
|
||||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
|
||||||
UE->Initialue_identity_5g_s_TMSI.presence = true;
|
|
||||||
UE->ng_5G_S_TMSI_Part1 = s_tmsi_part1;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
uint64_t random_value = 0;
|
uint64_t random_value = 0;
|
||||||
memcpy(((uint8_t *)&random_value) + 3,
|
memcpy(((uint8_t *)&random_value) + 3,
|
||||||
@@ -1509,42 +1495,52 @@ static int handle_rrcSetupComplete(const protocol_ctxt_t *const ctxt_pP,
|
|||||||
NR_RRCSetupComplete_IEs_t *setup_complete_ies = setup_complete->criticalExtensions.choice.rrcSetupComplete;
|
NR_RRCSetupComplete_IEs_t *setup_complete_ies = setup_complete->criticalExtensions.choice.rrcSetupComplete;
|
||||||
|
|
||||||
if (setup_complete_ies->ng_5G_S_TMSI_Value != NULL) {
|
if (setup_complete_ies->ng_5G_S_TMSI_Value != NULL) {
|
||||||
|
uint64_t fiveg_s_TMSI = 0;
|
||||||
if (setup_complete_ies->ng_5G_S_TMSI_Value->present == NR_RRCSetupComplete_IEs__ng_5G_S_TMSI_Value_PR_ng_5G_S_TMSI_Part2) {
|
if (setup_complete_ies->ng_5G_S_TMSI_Value->present == NR_RRCSetupComplete_IEs__ng_5G_S_TMSI_Value_PR_ng_5G_S_TMSI_Part2) {
|
||||||
if (setup_complete_ies->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI_Part2.size != 2) {
|
const BIT_STRING_t *part2 = &setup_complete_ies->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI_Part2;
|
||||||
LOG_E(NR_RRC,
|
if (part2->size != 2) {
|
||||||
"wrong ng_5G_S_TMSI_Part2 size, expected 2, provided %lu",
|
LOG_E(NR_RRC, "wrong ng_5G_S_TMSI_Part2 size, expected 2, provided %lu", part2->size);
|
||||||
(long unsigned int)
|
|
||||||
setup_complete->criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI_Part2.size);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UE->ng_5G_S_TMSI_Part1 != 0) {
|
|
||||||
UE->ng_5G_S_TMSI_Part2 = BIT_STRING_to_uint16(&setup_complete_ies->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI_Part2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO */
|
|
||||||
} else if (setup_complete_ies->ng_5G_S_TMSI_Value->present == NR_RRCSetupComplete_IEs__ng_5G_S_TMSI_Value_PR_ng_5G_S_TMSI) {
|
|
||||||
if (setup_complete_ies->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI.size != 6) {
|
|
||||||
LOG_E(NR_RRC,
|
|
||||||
"wrong ng_5G_S_TMSI size, expected 6, provided %lu",
|
|
||||||
(long unsigned int)setup_complete_ies->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI.size);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t fiveg_s_TMSI = BIT_STRING_to_uint64(&setup_complete_ies->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI);
|
|
||||||
LOG_I(NR_RRC,
|
|
||||||
"Received rrcSetupComplete, 5g_s_TMSI: 0x%lX, amf_set_id: 0x%lX(%ld), amf_pointer: 0x%lX(%ld), 5g TMSI: 0x%X \n",
|
|
||||||
fiveg_s_TMSI,
|
|
||||||
fiveg_s_TMSI >> 38,
|
|
||||||
fiveg_s_TMSI >> 38,
|
|
||||||
(fiveg_s_TMSI >> 32) & 0x3F,
|
|
||||||
(fiveg_s_TMSI >> 32) & 0x3F,
|
|
||||||
(uint32_t)fiveg_s_TMSI);
|
|
||||||
if (UE->Initialue_identity_5g_s_TMSI.presence) {
|
if (UE->Initialue_identity_5g_s_TMSI.presence) {
|
||||||
UE->Initialue_identity_5g_s_TMSI.amf_set_id = fiveg_s_TMSI >> 38;
|
uint16_t stmsi_part2 = BIT_STRING_to_uint16(part2);
|
||||||
UE->Initialue_identity_5g_s_TMSI.amf_pointer = (fiveg_s_TMSI >> 32) & 0x3F;
|
LOG_I(RRC, "s_tmsi part2 %d (%02x %02x)\n", stmsi_part2, part2->buf[0], part2->buf[1]);
|
||||||
UE->Initialue_identity_5g_s_TMSI.fiveg_tmsi = (uint32_t)fiveg_s_TMSI;
|
// Part2 is leftmost 9, Part1 is rightmost 39 bits of 5G-S-TMSI
|
||||||
|
fiveg_s_TMSI = ((uint64_t) stmsi_part2) << 39 | UE->ng_5G_S_TMSI_Part1;
|
||||||
|
} else {
|
||||||
|
LOG_W(RRC, "UE %d received 5G-S-TMSI-Part2, but no 5G-S-TMSI-Part1 present, won't send 5G-S-TMSI to core\n", UE->rrc_ue_id);
|
||||||
|
UE->Initialue_identity_5g_s_TMSI.presence = false;
|
||||||
}
|
}
|
||||||
|
} else if (setup_complete_ies->ng_5G_S_TMSI_Value->present == NR_RRCSetupComplete_IEs__ng_5G_S_TMSI_Value_PR_ng_5G_S_TMSI) {
|
||||||
|
const NR_NG_5G_S_TMSI_t *bs_stmsi = &setup_complete_ies->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI;
|
||||||
|
if (bs_stmsi->size != 6) {
|
||||||
|
LOG_E(NR_RRC, "wrong ng_5G_S_TMSI size, expected 6, provided %lu", bs_stmsi->size);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fiveg_s_TMSI = BIT_STRING_to_uint64(bs_stmsi);
|
||||||
|
UE->Initialue_identity_5g_s_TMSI.presence = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UE->Initialue_identity_5g_s_TMSI.presence) {
|
||||||
|
uint16_t amf_set_id = fiveg_s_TMSI >> 38;
|
||||||
|
uint8_t amf_pointer = (fiveg_s_TMSI >> 32) & 0x3F;
|
||||||
|
uint32_t fiveg_tmsi = (uint32_t) fiveg_s_TMSI;
|
||||||
|
LOG_I(NR_RRC,
|
||||||
|
"5g_s_TMSI: 0x%lX, amf_set_id: 0x%X (%d), amf_pointer: 0x%X (%d), 5g TMSI: 0x%X \n",
|
||||||
|
fiveg_s_TMSI,
|
||||||
|
amf_set_id,
|
||||||
|
amf_set_id,
|
||||||
|
amf_pointer,
|
||||||
|
amf_pointer,
|
||||||
|
fiveg_tmsi);
|
||||||
|
UE->Initialue_identity_5g_s_TMSI.amf_set_id = amf_set_id;
|
||||||
|
UE->Initialue_identity_5g_s_TMSI.amf_pointer = amf_pointer;
|
||||||
|
UE->Initialue_identity_5g_s_TMSI.fiveg_tmsi = fiveg_tmsi;
|
||||||
|
|
||||||
|
// update random identity with 5G-S-TMSI, which only contained Part1 of it
|
||||||
|
UE->random_ue_identity = fiveg_s_TMSI;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user