From 459a6ec37233cd9ff24d689739b81f4b8d5ccbd8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Leroy?= <frederic.leroy@b-com.com>
Date: Tue, 23 Aug 2016 14:46:25 +0200
Subject: [PATCH] refactor(conf2uedata): use user_plmns struct to store plmns
 lists

This remove the old static lists
---
 openair3/NAS/TOOLS/conf2uedata.c | 27 ++++++++++------------
 openair3/NAS/TOOLS/conf2uedata.h | 15 +++++++-----
 openair3/NAS/TOOLS/conf_emm.c    |  4 ++--
 openair3/NAS/TOOLS/conf_emm.h    |  3 ++-
 openair3/NAS/TOOLS/conf_usim.c   | 39 ++++++++++++++++----------------
 openair3/NAS/TOOLS/conf_usim.h   |  3 ++-
 6 files changed, 47 insertions(+), 44 deletions(-)

diff --git a/openair3/NAS/TOOLS/conf2uedata.c b/openair3/NAS/TOOLS/conf2uedata.c
index 3a783c2fe3..2e9317dc1c 100644
--- a/openair3/NAS/TOOLS/conf2uedata.c
+++ b/openair3/NAS/TOOLS/conf2uedata.c
@@ -12,12 +12,6 @@
 #include "conf_user_data.h"
 #include "conf_usim.h"
 
-plmns_list ucplmns;
-plmns_list oplmns;
-plmns_list ocplmns;
-plmns_list fplmns;
-plmns_list ehplmns;
-
 int plmn_nb = 0;
 
 plmn_conf_param_t* user_plmn_list=NULL;
@@ -106,6 +100,8 @@ int parse_config_file(const char *output_dir, const char *conf_filename) {
 	    usim_data_t usim_data;
 	    usim_data_conf_t usim_data_conf;
 
+		user_plmns_t user_plmns;
+
         sprintf(user, "%s%d", UE, i);
 
         ue_setting = config_setting_get_member(root_setting, user);
@@ -114,7 +110,7 @@ int parse_config_file(const char *output_dir, const char *conf_filename) {
             return EXIT_FAILURE;
         }
 
-        rc = parse_ue_plmn_param(ue_setting, i, &usim_data_conf.hplmn);
+        rc = parse_user_plmns_conf(ue_setting, i, &user_plmns, &usim_data_conf.hplmn);
         if (rc != EXIT_SUCCESS) {
             return EXIT_FAILURE;
         }
@@ -132,10 +128,10 @@ int parse_config_file(const char *output_dir, const char *conf_filename) {
             printf("Problem in SIM section for UE%d. EXITING...\n", i);
             return EXIT_FAILURE;
         }
-        gen_usim_data(&usim_data_conf, &usim_data);
+        gen_usim_data(&usim_data_conf, &usim_data, &user_plmns);
         write_usim_data(output_dir, i, &usim_data);
 
-        gen_emm_data(&emm_data, usim_data_conf.hplmn, usim_data_conf.msin);
+        gen_emm_data(&emm_data, usim_data_conf.hplmn, usim_data_conf.msin, user_plmns.equivalents_home.size);
         write_emm_data(output_dir, i, &emm_data);
 
      }
@@ -221,7 +217,8 @@ int parse_plmns(config_setting_t *all_plmn_setting) {
 	return rc;
 }
 
-int parse_ue_plmn_param(config_setting_t *ue_setting, int user_id, const char **h) {
+int parse_user_plmns_conf(config_setting_t *ue_setting, int user_id,
+                          user_plmns_t *user_plmns, const char **h) {
 	int nb_errors = 0;
 	const char *hplmn;
 
@@ -236,15 +233,15 @@ int parse_ue_plmn_param(config_setting_t *ue_setting, int user_id, const char **
 		return EXIT_FAILURE;
 	}
 
-	if ( parse_Xplmn(ue_setting, UCPLMN, user_id, &ucplmns) == EXIT_FAILURE )
+	if ( parse_Xplmn(ue_setting, UCPLMN, user_id, &user_plmns->users_controlled) == EXIT_FAILURE )
 		nb_errors++;
-	if ( parse_Xplmn(ue_setting, OPLMN, user_id, &oplmns) == EXIT_FAILURE )
+	if ( parse_Xplmn(ue_setting, OPLMN, user_id, &user_plmns->operators) == EXIT_FAILURE )
 		nb_errors++;
-	if ( parse_Xplmn(ue_setting, OCPLMN, user_id, &ocplmns) == EXIT_FAILURE )
+	if ( parse_Xplmn(ue_setting, OCPLMN, user_id, &user_plmns->operators_controlled) == EXIT_FAILURE )
 		nb_errors++;
-	if ( parse_Xplmn(ue_setting, FPLMN, user_id, &fplmns) == EXIT_FAILURE )
+	if ( parse_Xplmn(ue_setting, FPLMN, user_id, &user_plmns->forbiddens) == EXIT_FAILURE )
 		nb_errors++;
-	if ( parse_Xplmn(ue_setting, EHPLMN, user_id, &ehplmns) == EXIT_FAILURE )
+	if ( parse_Xplmn(ue_setting, EHPLMN, user_id, &user_plmns->equivalents_home) == EXIT_FAILURE )
 		nb_errors++;
 
 	if ( nb_errors > 0 )
diff --git a/openair3/NAS/TOOLS/conf2uedata.h b/openair3/NAS/TOOLS/conf2uedata.h
index 64a182af75..21cc2c3fbd 100644
--- a/openair3/NAS/TOOLS/conf2uedata.h
+++ b/openair3/NAS/TOOLS/conf2uedata.h
@@ -48,11 +48,13 @@ typedef struct {
     int *items;
 } plmns_list;
 
-extern plmns_list ucplmns;
-extern plmns_list oplmns;
-extern plmns_list ocplmns;
-extern plmns_list fplmns;
-extern plmns_list ehplmns;
+typedef struct {
+    plmns_list users_controlled;
+    plmns_list operators;
+    plmns_list operators_controlled;
+    plmns_list forbiddens;
+    plmns_list equivalents_home;
+} user_plmns_t;
 
 extern int plmn_nb;
 
@@ -68,7 +70,8 @@ void fill_network_record_list(void);
 int parse_plmn_param(config_setting_t *plmn_setting, int index);
 int parse_plmns(config_setting_t *all_plmn_setting);
 int get_plmn_index(const char * mccmnc);
-int parse_ue_plmn_param(config_setting_t *ue_setting, int user_id, const char **hplmn);
+int parse_user_plmns_conf(config_setting_t *ue_setting, int user_id,
+                          user_plmns_t *user_plmns, const char **h);
 int parse_Xplmn(config_setting_t *ue_setting, const char *section,
                int user_id, plmns_list *plmns);
 
diff --git a/openair3/NAS/TOOLS/conf_emm.c b/openair3/NAS/TOOLS/conf_emm.c
index ca9665e6d6..bc9f3441ae 100644
--- a/openair3/NAS/TOOLS/conf_emm.c
+++ b/openair3/NAS/TOOLS/conf_emm.c
@@ -5,7 +5,7 @@
 #include "conf_emm.h"
 #include "fs.h"
 
-void gen_emm_data(emm_nvdata_t *emm_data, const char *hplmn, const char *msin) {
+void gen_emm_data(emm_nvdata_t *emm_data, const char *hplmn, const char *msin, int ehplmn_count) {
 	memset(emm_data, 0, sizeof(emm_nvdata_t));
 	int hplmn_index = get_plmn_index(hplmn);
 	emm_data->imsi.length = 8;
@@ -53,7 +53,7 @@ void gen_emm_data(emm_nvdata_t *emm_data, const char *hplmn, const char *msin) {
 	emm_data->rplmn.MNCdigit1 = user_plmn_list[hplmn_index].mnc[0];
 	emm_data->rplmn.MNCdigit2 = user_plmn_list[hplmn_index].mnc[1];
 
-	emm_data->eplmn.n_plmns = ehplmns.size;
+	emm_data->eplmn.n_plmns = ehplmn_count;
 }
 
 int write_emm_data(const char *directory, int user_id, emm_nvdata_t *emm_data) {
diff --git a/openair3/NAS/TOOLS/conf_emm.h b/openair3/NAS/TOOLS/conf_emm.h
index 996e63ca05..c405e02612 100644
--- a/openair3/NAS/TOOLS/conf_emm.h
+++ b/openair3/NAS/TOOLS/conf_emm.h
@@ -3,7 +3,8 @@
 
 #include "emmData.h"
 
-void gen_emm_data(emm_nvdata_t *emm_data, const char *hplmn, const char *msin);
+void gen_emm_data(emm_nvdata_t *emm_data, const char *hplmn, const char *msin,
+                  int ehplmn_count);
 int write_emm_data(const char *directory, int user_id, emm_nvdata_t *emm_data);
 int get_msin_parity(const char * msin, const char *mcc, const char *mnc);
 
diff --git a/openair3/NAS/TOOLS/conf_usim.c b/openair3/NAS/TOOLS/conf_usim.c
index 9161041862..8b1a80ad52 100644
--- a/openair3/NAS/TOOLS/conf_usim.c
+++ b/openair3/NAS/TOOLS/conf_usim.c
@@ -5,8 +5,8 @@
 #include "utils.h"
 #include "conf_emm.h"
 #include "fs.h"
-#include "conf_usim.h"
 #include "conf2uedata.h"
+#include "conf_usim.h"
 
 int parse_ue_sim_param(config_setting_t *ue_setting, int user_id, usim_data_conf_t *u) {
 	int rc = EXIT_SUCCESS;
@@ -40,7 +40,8 @@ int parse_ue_sim_param(config_setting_t *ue_setting, int user_id, usim_data_conf
 	return EXIT_SUCCESS;
 }
 
-void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data) {
+void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data,
+                   const user_plmns_t *user_plmns) {
     int hplmn_index = get_plmn_index(u->hplmn);
 	memset(usim_data, 0, sizeof(usim_data_t));
 	usim_data->imsi.length = 8;
@@ -96,9 +97,9 @@ void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data) {
 	for (int i = 0; i < USIM_FPLMN_MAX; i++) {
 		memset(&usim_data->fplmn[i], 0xff, sizeof(plmn_t));
 	}
-	if (fplmns.size > 0) {
-		for (int i = 0; i < fplmns.size; i++) {
-			usim_data->fplmn[i] = user_network_record_list[fplmns.items[i]].plmn;
+	if (user_plmns->forbiddens.size > 0) {
+		for (int i = 0; i < user_plmns->forbiddens.size; i++) {
+			usim_data->fplmn[i] = user_network_record_list[user_plmns->forbiddens.items[i]].plmn;
 		}
 	}
 
@@ -183,8 +184,8 @@ void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data) {
 	/*
 	 * PLMN Network Name and Operator PLMN List
 	 */
-	for (int i = 0; i < oplmns.size; i++) {
-		network_record_t record = user_network_record_list[oplmns.items[i]];
+	for (int i = 0; i < user_plmns->operators.size; i++) {
+		network_record_t record = user_network_record_list[user_plmns->operators.items[i]];
 		usim_data->pnn[i].fullname.type = USIM_PNN_FULLNAME_TAG;
 		usim_data->pnn[i].fullname.length = strlen(record.fullname);
 		strncpy((char*) usim_data->pnn[i].fullname.value, record.fullname,
@@ -198,8 +199,8 @@ void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data) {
 		usim_data->opl[i].end = record.tac_end;
 		usim_data->opl[i].record_id = i;
 	}
-	if (oplmns.size < USIM_OPL_MAX) {
-		for (int i = oplmns.size; i < USIM_OPL_MAX; i++) {
+	if (user_plmns->operators.size < USIM_OPL_MAX) {
+		for (int i = user_plmns->operators.size; i < USIM_OPL_MAX; i++) {
 			memset(&usim_data->opl[i].plmn, 0xff, sizeof(plmn_t));
 		}
 	}
@@ -207,11 +208,11 @@ void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data) {
 	/*
 	 * List of Equivalent HPLMNs
 	 */
-	for (int i = 0; i < ehplmns.size; i++) {
-		usim_data->ehplmn[i] = user_network_record_list[ehplmns.items[i]].plmn;
+	for (int i = 0; i < user_plmns->equivalents_home.size; i++) {
+		usim_data->ehplmn[i] = user_network_record_list[user_plmns->equivalents_home.items[i]].plmn;
 	}
-	if (ehplmns.size < USIM_EHPLMN_MAX) {
-		for (int i = ehplmns.size; i < USIM_EHPLMN_MAX; i++) {
+	if (user_plmns->equivalents_home.size < USIM_EHPLMN_MAX) {
+		for (int i = user_plmns->equivalents_home.size; i < USIM_EHPLMN_MAX; i++) {
 			memset(&usim_data->ehplmn[i], 0xff, sizeof(plmn_t));
 		}
 	}
@@ -227,9 +228,9 @@ void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data) {
 	for (int i = 0; i < USIM_PLMN_MAX; i++) {
 		memset(&usim_data->plmn[i], 0xff, sizeof(plmn_t));
 	}
-	if (ucplmns.size > 0) {
-		for (int i = 0; i < ucplmns.size; i++) {
-			usim_data->plmn[i].plmn = user_network_record_list[ucplmns.items[i]].plmn;
+	if (user_plmns->users_controlled.size > 0) {
+		for (int i = 0; i < user_plmns->users_controlled.size; i++) {
+			usim_data->plmn[i].plmn = user_network_record_list[user_plmns->users_controlled.items[i]].plmn;
 		}
 	}
 
@@ -238,9 +239,9 @@ void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data) {
 	for (int i = 0; i < USIM_OPLMN_MAX; i++) {
 		memset(&usim_data->oplmn[i], 0xff, sizeof(plmn_t));
 	}
-	if (ocplmns.size > 0) {
-		for (int i = 0; i < ocplmns.size; i++) {
-			usim_data->oplmn[i].plmn = user_network_record_list[ocplmns.items[i]].plmn;
+	if (user_plmns->operators_controlled.size > 0) {
+		for (int i = 0; i < user_plmns->operators_controlled.size; i++) {
+			usim_data->oplmn[i].plmn = user_network_record_list[user_plmns->operators_controlled.items[i]].plmn;
 			usim_data->oplmn[i].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN
 					| USIM_ACT_EUTRAN);
 		}
diff --git a/openair3/NAS/TOOLS/conf_usim.h b/openair3/NAS/TOOLS/conf_usim.h
index 3375bf9d5d..5018be8148 100644
--- a/openair3/NAS/TOOLS/conf_usim.h
+++ b/openair3/NAS/TOOLS/conf_usim.h
@@ -40,6 +40,7 @@ typedef struct {
 
 int parse_ue_sim_param(config_setting_t *ue_setting, int user_id, usim_data_conf_t *u);
 int write_usim_data(const char *directory, int user_id, usim_data_t *usim_data);
-void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data);
+void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data,
+                   const user_plmns_t *user_plmns);
 
 #endif
-- 
2.26.2