From 4ad2a78706f42c64a7536da560ca665a258a240e Mon Sep 17 00:00:00 2001 From: Guido Casati Date: Mon, 12 May 2025 15:57:16 +0200 Subject: [PATCH] Fix GUAMI decoding in NG Setup Response handler GUAMI fields (Set ID, Pointer and Region ID) were decoded as Octet String, however they are encoded as BIT STRING. Therefore, the GUAMI value was wrongly decoded. In the AMF logs the AMF IDs are 1,1,1, however in gNB logs we had 1,64,4 Quick local test confirmed that: ---- TESTING AMF IDs = 1 ---- Region ID (OCTET STRING): 1 Region ID (BIT STRING): 1 Set ID (OCTET STRING): 64 Set ID (BIT STRING): 1 Pointer (OCTET STRING): 4 Pointer (BIT STRING): 1 The difference arises because: - OCTET STRING treats the buffer as raw bytes, with all bits used. - BIT STRING includes a `bits_unused` field, which tells how many padding bits are present in the least significant end. This is especially important in 3GPP ASN.1 definitions like AMF Set ID (10 bits), AMF Region ID (8 bits), AMF Pointer (6 bits), where the full byte(s) may contain unused bits that must be masked out. --- openair3/NGAP/ngap_gNB_handlers.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/openair3/NGAP/ngap_gNB_handlers.c b/openair3/NGAP/ngap_gNB_handlers.c index 1ef49f66c0..ad8efce5a3 100644 --- a/openair3/NGAP/ngap_gNB_handlers.c +++ b/openair3/NGAP/ngap_gNB_handlers.c @@ -217,27 +217,21 @@ static int ngap_gNB_handle_ng_setup_response(sctp_assoc_t assoc_id, uint32_t str STAILQ_INSERT_TAIL(&new_guami_p->served_plmns, new_plmn_identity_p, next); new_guami_p->nb_served_plmns++; - NGAP_AMFRegionID_t *amf_region_id_p; struct served_region_id_s *new_region_id_p; - amf_region_id_p = &guami_item_p->gUAMI.aMFRegionID; new_region_id_p = calloc(1, sizeof(struct served_region_id_s)); - OCTET_STRING_TO_INT8(amf_region_id_p, new_region_id_p->amf_region_id); + new_region_id_p->amf_region_id = BIT_STRING_to_uint8(&guami_item_p->gUAMI.aMFRegionID); STAILQ_INSERT_TAIL(&new_guami_p->served_region_ids, new_region_id_p, next); new_guami_p->nb_region_id++; - NGAP_AMFSetID_t *amf_set_id_p; struct amf_set_id_s *new_amf_set_id_p; - amf_set_id_p = &guami_item_p->gUAMI.aMFSetID; new_amf_set_id_p = calloc(1, sizeof(struct amf_set_id_s)); - OCTET_STRING_TO_INT16(amf_set_id_p, new_amf_set_id_p->amf_set_id); + new_amf_set_id_p->amf_set_id = BIT_STRING_to_uint16(&guami_item_p->gUAMI.aMFSetID); STAILQ_INSERT_TAIL(&new_guami_p->amf_set_ids, new_amf_set_id_p, next); new_guami_p->nb_amf_set_id++; - NGAP_AMFPointer_t *amf_pointer_p; struct amf_pointer_s *new_amf_pointer_p; - amf_pointer_p = &guami_item_p->gUAMI.aMFPointer; new_amf_pointer_p = calloc(1, sizeof(struct amf_pointer_s)); - OCTET_STRING_TO_INT8(amf_pointer_p, new_amf_pointer_p->amf_pointer); + new_amf_pointer_p->amf_pointer = BIT_STRING_to_uint8(&guami_item_p->gUAMI.aMFPointer); STAILQ_INSERT_TAIL(&new_guami_p->amf_pointers, new_amf_pointer_p, next); new_guami_p->nb_amf_pointer++;