From 2a03d8736cd2fb79fded813cc63efda7345487d5 Mon Sep 17 00:00:00 2001
From: winckel <winckel@eurecom.fr>
Date: Tue, 28 Jan 2014 13:16:30 +0000
Subject: [PATCH] Fixed PDN address lenght issue by replacing MME supported PDN
 type by requested PDN type.

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4972 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
 .../NAS/EURECOM-NAS/src/api/mme/mme_api.c     | 14 ++++----------
 .../NAS/EURECOM-NAS/src/api/mme/mme_api.h     | 10 +++++++++-
 .../NAS/EURECOM-NAS/src/esm/PdnConnectivity.c | 19 ++++++++++++++++++-
 3 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/openair-cn/NAS/EURECOM-NAS/src/api/mme/mme_api.c b/openair-cn/NAS/EURECOM-NAS/src/api/mme/mme_api.c
index d1b4966cef..5b970e8f68 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/api/mme/mme_api.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/api/mme/mme_api.c
@@ -82,13 +82,7 @@ static const UInt8_t _mme_api_xres[AUTH_XRES_SIZE] = {
     0x00, 0x00, 0x00, 0x00
 };
 
-/* Network IP version capability */
-enum {
-    MME_API_IPV4_ADDR,
-    MME_API_IPV6_ADDR,
-    MME_API_IPV4V6_ADDR,
-    MME_API_ADDR_MAX
-} _mme_api_ip_capability = MME_API_IPV4V6_ADDR;
+static mme_api_ip_version_t _mme_api_ip_capability = MME_API_IPV4V6_ADDR;
 
 /* Pool of IPv4 addresses */
 static uint8_t _mme_api_ipv4_addr[MME_API_PDN_MAX][4] = {
@@ -439,7 +433,7 @@ int mme_api_new_guti(const imsi_t *imsi, GUTI_t *guti, tac_t *tac, int *n_tacs)
  **                  Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int mme_api_subscribe(OctetString *apn, OctetString *pdn_addr,
+int mme_api_subscribe(OctetString *apn, mme_api_ip_version_t mme_pdn_index, OctetString *pdn_addr,
                       int is_emergency, mme_api_qos_t *qos)
 {
     int rc = RETURNok;
@@ -460,9 +454,9 @@ int mme_api_subscribe(OctetString *apn, OctetString *pdn_addr,
     /* Assign PDN address */
     if ( pdn_addr && (_mme_api_pdn_id < MME_API_PDN_MAX) ) {
         pdn_addr->length =
-            _mme_api_pdn_addr[_mme_api_ip_capability][_mme_api_pdn_id].length;
+            _mme_api_pdn_addr[mme_pdn_index][_mme_api_pdn_id].length;
         pdn_addr->value =
-            _mme_api_pdn_addr[_mme_api_ip_capability][_mme_api_pdn_id].value;
+            _mme_api_pdn_addr[mme_pdn_index][_mme_api_pdn_id].value;
         /* Increment the total number of PDN connections */
         _mme_api_pdn_id += 1;
     } else {
diff --git a/openair-cn/NAS/EURECOM-NAS/src/api/mme/mme_api.h b/openair-cn/NAS/EURECOM-NAS/src/api/mme/mme_api.h
index 644b4155f6..30dc443063 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/api/mme/mme_api.h
+++ b/openair-cn/NAS/EURECOM-NAS/src/api/mme/mme_api.h
@@ -49,6 +49,14 @@ typedef enum mme_api_feature_s {
     MME_API_SINGLE_ADDR_BEARERS     = (1<<4),
 } mme_api_feature_t;
 
+/* Network IP version capability */
+typedef enum mme_api_ip_version_e {
+    MME_API_IPV4_ADDR,
+    MME_API_IPV6_ADDR,
+    MME_API_IPV4V6_ADDR,
+    MME_API_ADDR_MAX
+} mme_api_ip_version_t;
+
 /*
  * EPS Mobility Management configuration data
  * ------------------------------------------
@@ -105,7 +113,7 @@ int mme_api_identify_imsi(const imsi_t *imsi, auth_vector_t *vector);
 int mme_api_identify_imei(const imei_t *imei, auth_vector_t *vector);
 int mme_api_new_guti(const imsi_t *imsi, GUTI_t *guti, tac_t *tac, int *n_tacs);
 
-int mme_api_subscribe(OctetString *apn, OctetString *pdn_addr,
+int mme_api_subscribe(OctetString *apn, mme_api_ip_version_t mme_pdn_index, OctetString *pdn_addr,
                       int is_emergency, mme_api_qos_t *qos);
 int mme_api_unsubscribe(OctetString *apn);
 
diff --git a/openair-cn/NAS/EURECOM-NAS/src/esm/PdnConnectivity.c b/openair-cn/NAS/EURECOM-NAS/src/esm/PdnConnectivity.c
index 98ad89dead..6bddcc2b92 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/esm/PdnConnectivity.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/esm/PdnConnectivity.c
@@ -663,11 +663,28 @@ int esm_proc_pdn_connectivity_request(emm_data_context_t *ctx, int pti,
     }
 
     if (rc != RETURNerror) {
+        mme_api_ip_version_t mme_pdn_index;
         int is_emergency = (request_type == ESM_PDN_REQUEST_EMERGENCY);
         mme_api_qos_t qos;
 
+        switch (pdn_type)
+        {
+            case ESM_PDN_TYPE_IPV4:
+                mme_pdn_index = MME_API_IPV4_ADDR;
+                break;
+
+            case ESM_PDN_TYPE_IPV6:
+                mme_pdn_index = MME_API_IPV6_ADDR;
+                break;
+
+            case ESM_PDN_TYPE_IPV4V6:
+            default:
+                mme_pdn_index = MME_API_IPV4V6_ADDR;
+                break;
+        }
+
         /* Check if connectivity with the requested PDN can be established */
-        rc = mme_api_subscribe(apn, pdn_addr, is_emergency, &qos);
+        rc = mme_api_subscribe(apn, mme_pdn_index, pdn_addr, is_emergency, &qos);
 
         if (rc != RETURNok) {
             LOG_TRACE(WARNING, "ESM-PROC  - Connectivity to the requested PDN "
-- 
GitLab