From 1f5551df6f2ef04e577cb6ba80b8f7d9c8e2caae Mon Sep 17 00:00:00 2001 From: Lionel Gauthier <lionel.gauthier@eurecom.fr> Date: Wed, 22 Oct 2014 13:00:58 +0000 Subject: [PATCH] Encoding of apn was wrong git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5931 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- .../NAS/EURECOM-NAS/src/ies/AccessPointName.c | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/openair-cn/NAS/EURECOM-NAS/src/ies/AccessPointName.c b/openair-cn/NAS/EURECOM-NAS/src/ies/AccessPointName.c index e7aa2569c3..f9d32caf24 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/ies/AccessPointName.c +++ b/openair-cn/NAS/EURECOM-NAS/src/ies/AccessPointName.c @@ -62,6 +62,11 @@ int encode_access_point_name(AccessPointName *accesspointname, uint8_t iei, uint uint8_t *lenPtr; uint32_t encoded = 0; int encode_result; + OctetString apn_encoded; + uint32_t length_index; + uint32_t index; + uint32_t index_copy; + /* Checking IEI and pointer */ CHECK_PDU_POINTER_AND_LENGTH_ENCODER(buffer, ACCESS_POINT_NAME_MINIMUM_LENGTH, len); #if defined (NAS_DEBUG) @@ -74,11 +79,34 @@ int encode_access_point_name(AccessPointName *accesspointname, uint8_t iei, uint } lenPtr = (buffer + encoded); encoded ++; - if ((encode_result = encode_octet_string(&accesspointname->accesspointnamevalue, buffer + encoded, len - encoded)) < 0) + + apn_encoded.length = 0; + apn_encoded.value = calloc(1, ACCESS_POINT_NAME_MAXIMUM_LENGTH); + index = 0; // index on original APN string + length_index = 0; // marker where to write partial length + index_copy = 1; + while ((accesspointname->accesspointnamevalue.value[index] != 0) && (index < accesspointname->accesspointnamevalue.length)) { + if (accesspointname->accesspointnamevalue.value[index] == '.') { + apn_encoded.value[length_index] = index_copy - length_index - 1; + length_index = index_copy; + index_copy = length_index + 1; + } else { + apn_encoded.value[index_copy] = accesspointname->accesspointnamevalue.value[index]; + index_copy++; + } + index++; + } + apn_encoded.value[length_index] = index_copy - length_index - 1; + apn_encoded.length = index_copy; + + if ((encode_result = encode_octet_string(&apn_encoded, buffer + encoded, len - encoded)) < 0) { + free(apn_encoded.value); return encode_result; - else + } else encoded += encode_result; *lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0); + + free(apn_encoded.value); return encoded; } -- GitLab