Compare commits

...

1 Commits

Author SHA1 Message Date
Guido Casati
24812b3499 Fix AMF Set ID type mismatch for 10-bit field support
- Fix AMF Set ID handling to support full 3GPP 10-bit range (0-1023) instead of limited 8-bit range (0-255)
- Change ngap_gNB_nnsf_select_amf_by_amf_setid parameter type from uint8_t to uint16_t
- Update printf format specifiers
- Improve code readability wherever possibile

This fixes the issue where AMF Set IDs > 255 caused 'No matching AMF found' warnings during UE RRC Reestablishment, as the type mismatch prevented correct AMF matching.

See 9.3.3.12 3GPP TS 38.413 - 10-bit AMF Set ID field.

Closes #1012
2025-10-27 12:36:36 +01:00
5 changed files with 26 additions and 20 deletions

View File

@@ -279,7 +279,7 @@ void rrc_gNB_send_NGAP_NAS_FIRST_REQ(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, NR_RRC
uint32_t amf_Id = BIT_STRING_to_uint32(&r_amf->amf_Identifier);
UE->ue_guami = req->ue_identity.guami = get_guami(amf_Id, req->plmn);
LOG_I(NGAP,
"GUAMI in NGAP_NAS_FIRST_REQ (UE %04x): AMF Set ID %u, Region ID %u, Pointer %u\n",
"GUAMI in NGAP_NAS_FIRST_REQ (UE %04x): AMF Set ID %hu, Region ID %u, Pointer %u\n",
UE->rnti,
req->ue_identity.guami.amf_set_id,
req->ue_identity.guami.amf_region_id,

View File

@@ -160,7 +160,7 @@ static void ngap_dump_served_guami(const ngap_gNB_amf_data_t *amf_desc_p)
NGAP_DEBUG(" AMF Region ID: %d\n", region_p->amf_region_id);
}
STAILQ_FOREACH(set_id_p, &guami_p->amf_set_ids, next) {
NGAP_DEBUG(" AMF Set ID: %d\n", set_id_p->amf_set_id);
NGAP_DEBUG(" AMF Set ID: %hu\n", set_id_p->amf_set_id);
}
STAILQ_FOREACH(pointer_p, &guami_p->amf_pointers, next) {
NGAP_DEBUG(" AMF Pointer: %d\n", pointer_p->amf_pointer);
@@ -1132,15 +1132,17 @@ static int ngap_gNB_handle_paging(sctp_assoc_t assoc_id, uint32_t stream, NGAP_N
NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PagingIEs_t, ie, container, NGAP_ProtocolIE_ID_id_UEPagingIdentity, true);
struct NGAP_FiveG_S_TMSI *fiveG_S_TMSI = ie->value.choice.UEPagingIdentity.choice.fiveG_S_TMSI;
OCTET_STRING_TO_INT16(&fiveG_S_TMSI->aMFSetID, msg->ue_paging_identity.s_tmsi.amf_set_id);
OCTET_STRING_TO_INT8(&fiveG_S_TMSI->aMFPointer, msg->ue_paging_identity.s_tmsi.amf_pointer);
OCTET_STRING_TO_INT32(&fiveG_S_TMSI->fiveG_TMSI, msg->ue_paging_identity.s_tmsi.m_tmsi);
fiveg_s_tmsi_t *s_tmsi = &msg->ue_paging_identity.s_tmsi;
NGAP_DEBUG("[SCTP %u] Received Paging Identity amf_set_id %d, amf_pointer %d, m_tmsi %d\n",
OCTET_STRING_TO_INT16(&fiveG_S_TMSI->aMFSetID, s_tmsi->amf_set_id);
OCTET_STRING_TO_INT8(&fiveG_S_TMSI->aMFPointer, s_tmsi->amf_pointer);
OCTET_STRING_TO_INT32(&fiveG_S_TMSI->fiveG_TMSI, s_tmsi->m_tmsi);
NGAP_DEBUG("[SCTP %u] Received Paging Identity amf_set_id %hu, amf_pointer %d, m_tmsi %d\n",
assoc_id,
msg->ue_paging_identity.s_tmsi.amf_set_id,
msg->ue_paging_identity.s_tmsi.amf_pointer,
msg->ue_paging_identity.s_tmsi.m_tmsi);
s_tmsi->amf_set_id,
s_tmsi->amf_pointer,
s_tmsi->m_tmsi);
msg->paging_drx = NGAP_PAGING_DRX_256;
/* id-pagingDRX */
@@ -1176,11 +1178,15 @@ static int ngap_gNB_handle_paging(sctp_assoc_t assoc_id, uint32_t stream, NGAP_N
}
//paging parameter values
NGAP_DEBUG("[SCTP %u] Received Paging parameters: Paging Identity amf_set_id %d amf_pointer %d m_tmsi %d paging_drx %d paging_priority %d\n",assoc_id,
msg->ue_paging_identity.s_tmsi.amf_set_id,
msg->ue_paging_identity.s_tmsi.amf_pointer,
msg->ue_paging_identity.s_tmsi.m_tmsi,
msg->paging_drx, msg->paging_priority);
NGAP_DEBUG(
"[SCTP %u] Received Paging parameters: Paging Identity amf_set_id %hu amf_pointer %d m_tmsi %d paging_drx %d paging_priority "
"%d\n",
assoc_id,
s_tmsi->amf_set_id,
s_tmsi->amf_pointer,
s_tmsi->m_tmsi,
msg->paging_drx,
msg->paging_priority);
/* send message to RRC */
itti_send_msg_to_task(TASK_RRC_GNB, ngap_gNB_instance->instance, message_p);

View File

@@ -75,7 +75,7 @@ static ngap_gNB_amf_data_t *select_amf(ngap_gNB_instance_t *instance_p, const ng
if (msg->ue_identity.presenceMask & NGAP_UE_IDENTITIES_guami) {
const nr_guami_t *guami = &msg->ue_identity.guami;
LOG_D(NGAP,
"GUAMI is present: MCC=%03d MNC=%0*d RegionID=%d SetID=%d Pointer=%d\n",
"GUAMI is present: MCC=%03d MNC=%0*d RegionID=%d SetID=%hu Pointer=%d\n",
guami->plmn.mcc,
guami->plmn.mnc_digit_length,
guami->plmn.mnc,
@@ -85,7 +85,7 @@ static ngap_gNB_amf_data_t *select_amf(ngap_gNB_instance_t *instance_p, const ng
amf = ngap_gNB_nnsf_select_amf_by_guami(instance_p, msg->establishment_cause, *guami);
if (amf) {
LOG_I(NGAP,
"UE %d: Selected AMF '%s' (assoc_id %d) through GUAMI MCC=%03d MNC=%0*d AMFRI %d AMFSI %d AMFPT %d\n",
"UE %d: Selected AMF '%s' (assoc_id %d) through GUAMI MCC=%03d MNC=%0*d AMFRI %d AMFSI %hu AMFPT %d\n",
msg->gNB_ue_ngap_id,
amf->amf_name,
amf->assoc_id,
@@ -106,7 +106,7 @@ static ngap_gNB_amf_data_t *select_amf(ngap_gNB_instance_t *instance_p, const ng
amf = ngap_gNB_nnsf_select_amf_by_amf_setid(instance_p, msg->establishment_cause, msg->plmn, fgs_tmsi->amf_set_id);
if (amf) {
LOG_I(NGAP,
"UE %d: Selected AMF '%s' (assoc_id %d) through S-TMSI AMFSI %d and selected PLMN MCC=%03d MNC=%0*d\n",
"UE %d: Selected AMF '%s' (assoc_id %d) through S-TMSI AMFSI %hu and selected PLMN MCC=%03d MNC=%0*d\n",
msg->gNB_ue_ngap_id,
amf->amf_name,
amf->assoc_id,

View File

@@ -156,7 +156,7 @@ ngap_gNB_amf_data_t *ngap_gNB_nnsf_select_amf_by_plmn_id(ngap_gNB_instance_t *in
ngap_gNB_amf_data_t *ngap_gNB_nnsf_select_amf_by_amf_setid(ngap_gNB_instance_t *instance_p,
const ngap_rrc_establishment_cause_t cause,
const plmn_id_t selected_plmn_identity,
uint8_t amf_setid)
uint16_t amf_setid)
{
struct ngap_gNB_amf_data_s *amf_data_p = NULL;
@@ -223,7 +223,7 @@ ngap_gNB_amf_data_t *ngap_gNB_nnsf_select_amf_by_amf_setid(ngap_gNB_instance_t *
}
}
NGAP_WARN("No matching AMF found for PLMN (MCC=%03d MNC=%0*d) and AMF SetID=%u\n",
NGAP_WARN("No matching AMF found for PLMN (MCC=%03d MNC=%0*d) and AMF SetID=%hu\n",
selected_plmn_identity.mcc,
selected_plmn_identity.mnc_digit_length,
selected_plmn_identity.mnc,

View File

@@ -43,7 +43,7 @@ ngap_gNB_amf_data_t *ngap_gNB_nnsf_select_amf_by_plmn_id(ngap_gNB_instance_t *in
ngap_gNB_amf_data_t *ngap_gNB_nnsf_select_amf_by_amf_setid(ngap_gNB_instance_t *instance_p,
const ngap_rrc_establishment_cause_t cause,
const plmn_id_t selected_plmn_identity,
uint8_t amf_setid);
uint16_t amf_setid);
ngap_gNB_amf_data_t *ngap_gNB_nnsf_select_amf_by_guami(ngap_gNB_instance_t *instance_p,
const ngap_rrc_establishment_cause_t cause,