diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_recv.c b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_recv.c
index 46cb710958..993bfa53c9 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_recv.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_recv.c
@@ -124,10 +124,6 @@ int emm_recv_attach_accept(attach_accept_msg *msg, int *emm_cause)
/* Only list of TACs belonging to one PLMN with consecutive
* TAC values is supported */
*emm_cause = EMM_CAUSE_IE_NOT_IMPLEMENTED;
- } else if (msg->tailist.numberofelements < 1) {
- /* The tracking area identity list shall contain
- * at leat one TAI value */
- *emm_cause = EMM_CAUSE_INVALID_MANDATORY_INFO;
} else if ( (msg->presencemask & ATTACH_ACCEPT_GUTI_PRESENT) &&
(msg->guti.guti.typeofidentity != EPS_MOBILE_IDENTITY_GUTI) ) {
/* The only supported type of EPS mobile identity is GUTI */
@@ -151,7 +147,10 @@ int emm_recv_attach_accept(attach_accept_msg *msg, int *emm_cause)
T3423 = gprs_timer_value(&msg->t3423value);
}
/* Get the tracking area list the UE is registered to */
- int n_tais = msg->tailist.numberofelements;
+
+ /* LW: number of elements is coded as N-1 (0 -> 1 element, 1 -> 2 elements...),
+ * see 3GPP TS 24.301, section 9.9.3.33.1 */
+ int n_tais = msg->tailist.numberofelements + 1;
tai_t tai[n_tais];
for (i = 0; i < n_tais; i++) {
tai[i].plmn.MCCdigit1 = msg->tailist.mccdigit1;
diff --git a/openair-cn/NAS/EURECOM-NAS/src/ies/TrackingAreaIdentityList.c b/openair-cn/NAS/EURECOM-NAS/src/ies/TrackingAreaIdentityList.c
index 90ab0da926..0e5021b309 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/ies/TrackingAreaIdentityList.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/ies/TrackingAreaIdentityList.c
@@ -79,7 +79,9 @@ void dump_tracking_area_identity_list_xml(TrackingAreaIdentityList *trackingarea
/* Don't display IEI if = 0 */
printf(" 0x%X\n", iei);
printf(" %u\n", trackingareaidentitylist->typeoflist);
- printf(" %u\n", trackingareaidentitylist->numberofelements);
+ /* LW: number of elements is coded as N-1 (0 -> 1 element, 1 -> 2 elements...),
+ * see 3GPP TS 24.301, section 9.9.3.33.1 */
+ printf(" %u\n", trackingareaidentitylist->numberofelements + 1);
printf(" %u\n", trackingareaidentitylist->mccdigit2);
printf(" %u\n", trackingareaidentitylist->mccdigit1);
printf(" %u\n", trackingareaidentitylist->mncdigit3);
diff --git a/openair-cn/NAS/EURECOM-NAS/tst/as_simulator/nas_data.c b/openair-cn/NAS/EURECOM-NAS/tst/as_simulator/nas_data.c
index 07cd019600..1411c8315e 100644
--- a/openair-cn/NAS/EURECOM-NAS/tst/as_simulator/nas_data.c
+++ b/openair-cn/NAS/EURECOM-NAS/tst/as_simulator/nas_data.c
@@ -731,11 +731,12 @@ ssize_t taiList(char* buffer, size_t len, const TrackingAreaIdentityList* tai)
tai->mncdigit3);
}
- if (tai->numberofelements > 0) {
- index += snprintf(buffer + index, len - index,
- ", n_tacs = %u, tac = 0x%.4x",
- tai->numberofelements, tai->tac);
- }
+ index += snprintf(buffer + index, len - index,
+ ", n_tacs = %u, tac = 0x%.4x",
+ /* LW: number of elements is coded as N-1 (0 -> 1 element, 1 -> 2 elements...),
+ * see 3GPP TS 24.301, section 9.9.3.33.1 */
+ tai->numberofelements + 1,
+ tai->tac);
index += snprintf(buffer + index, len - index, "}");