diff --git a/openair-cn/NAS/EURECOM-NAS/Makefile b/openair-cn/NAS/EURECOM-NAS/Makefile index 7f62d1ca5345c5c8098db187e3cf1f1ab3f96257..c4a02b99d7c3bb07e3262a40f8dd80012281db00 100644 --- a/openair-cn/NAS/EURECOM-NAS/Makefile +++ b/openair-cn/NAS/EURECOM-NAS/Makefile @@ -37,7 +37,7 @@ export PROJDIR = $(CURDIR) all: ifeq ($(PROCESS), UE) - @$(CD) $(SECUDIR) && $(MAKE) + @$(CD) $(SECUDIR) && $(MAKE) -f Makefile.NAS endif @$(CD) $(UTILDIR) && $(MAKE) @$(CD) $(APIDIR) && $(MAKE) diff --git a/openair-cn/NAS/EURECOM-NAS/tools/Makefile b/openair-cn/NAS/EURECOM-NAS/tools/Makefile index 0e56cfce852bb7a48ed36f04b5df6603e1721212..9c3c54e602f1c1005003fc1be5b137a113d4298f 100644 --- a/openair-cn/NAS/EURECOM-NAS/tools/Makefile +++ b/openair-cn/NAS/EURECOM-NAS/tools/Makefile @@ -34,13 +34,14 @@ endif include $(PROJDIR)/Makerules include $(PROJDIR)/Makefile.inc +include $(PROJDIR)/../Makefile.tools export LD_RUN_PATH = $(LIBDIR):$(LIBPROCESS) -LIBS = -lapi -lutil -lEMMmsg -lESMmsg -lies -lrt +LIBS = -luenas.a -lrt INCLUDES = -I. -I$(INCDIR) -I$(UTILDIR) -I$(USIMAPIDIR) -I$(EMMDIR) -I$(ESMDIR) -I$(IESDIR) -LIBSUTIL = $(LIBDIR)/$(LIBUTIL).a $(LIBDIR)/$(LIBUTIL).so +#LIBSUTIL = $(LIBDIR)/$(LIBUTIL).a $(LIBDIR)/$(LIBUTIL).so USIM_OBJ = usim_data.o UE_OBJ = ue_data.o @@ -57,13 +58,13 @@ all: $(TARGETS) $(CC) $(CFLAGS) -c $< -o $@ $(USIM_TARGET): $(USIM_OBJ) $(LIBSUTIL) - $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) $(SECUDIR)/*.o -lnettle -lcrypto -lm + $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) -lnettle -lcrypto -lm @echo Replacing $@ to $(BINDIR) @$(RM) $(BINDIR)/$@ @$(CP) $@ $(BINDIR) $(UE_TARGET): $(UE_OBJ) $(LIBSUTIL) - $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) $(SECUDIR)/*.o -lnettle -lcrypto -lm + $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) -lnettle -lcrypto -lm @echo Replacing $@ to $(BINDIR) @$(RM) $(BINDIR)/$@ @$(CP) $@ $(BINDIR) @@ -74,6 +75,10 @@ clean: veryclean: clean $(RM) $(TARGETS) +veryveryclean: veryclean + $(RM) -Rf *.o $(PROJDIR) + $(RM) -Rf *.a $(PROJDIR) + depend: makedepend -- ${CFLAGS} -- ${SRCS} diff --git a/openair-cn/NAS/EURECOM-NAS/tools/ue_data.c b/openair-cn/NAS/EURECOM-NAS/tools/ue_data.c index f3a1fb67ded1808e38dd38e12d7224c80b587496..12110a5026e07086993db1b7740a11dec0a5f275 100644 --- a/openair-cn/NAS/EURECOM-NAS/tools/ue_data.c +++ b/openair-cn/NAS/EURECOM-NAS/tools/ue_data.c @@ -53,8 +53,7 @@ Description Implements the utility used to generate data stored in the #include <stdlib.h> // exit, free #include <string.h> // memset, strncpy -//#define SELECTED_PLMN SFR1 -#define SELECTED_PLMN FCT1 +#define SELECTED_PLMN SFR1 /****************************************************************************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/ @@ -290,7 +289,7 @@ static void _gen_user_data(user_nvdata_t* data) static void _gen_emm_data(emm_nvdata_t* data) { //#if (SELECTED_PLMN == FCT1) -#if 1 +#if 0 /* * International Mobile Subscriber Identity * IMSI = MCC + MNC + MSIN = 310 (USA) + 028 (UNKNOWN) + 90832150 diff --git a/openair-cn/NAS/EURECOM-NAS/tools/usim_data.c b/openair-cn/NAS/EURECOM-NAS/tools/usim_data.c index cee5c804274fccda83dfb26f05e1848b6aa1e85f..a2dba0d275bd2b5ac2cad43c4f3dd76e55d4c81d 100644 --- a/openair-cn/NAS/EURECOM-NAS/tools/usim_data.c +++ b/openair-cn/NAS/EURECOM-NAS/tools/usim_data.c @@ -1,48 +1,48 @@ /******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see <http://www.gnu.org/licenses/>. + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see <http://www.gnu.org/licenses/>. - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@eurecom.fr - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. + Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. *******************************************************************************/ /***************************************************************************** -Source usim_data.c + Source usim_data.c -Version 0.1 + Version 0.1 -Date 2012/10/31 + Date 2012/10/31 -Product USIM data generator + Product USIM data generator -Subsystem USIM data generator main process + Subsystem USIM data generator main process -Author Frederic Maurel + Author Frederic Maurel -Description Implements the utility used to generate data stored in the - USIM application + Description Implements the utility used to generate data stored in the + USIM application -*****************************************************************************/ + *****************************************************************************/ #include "network.h" @@ -53,8 +53,7 @@ Description Implements the utility used to generate data stored in the #include <stdlib.h> // exit #include <string.h> // memset, memcpy, strncpy -//#define SELECTED_PLMN SFR1 -#define SELECTED_PLMN FCT1 +#define SELECTED_PLMN SFR1 /****************************************************************************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/ @@ -82,12 +81,12 @@ Description Implements the utility used to generate data stored in the #define PRINT_PLMN_DIGIT(d) if ((d) != 0xf) printf("%u", (d)) #define PRINT_PLMN(plmn) \ - PRINT_PLMN_DIGIT((plmn).MCCdigit1); \ - PRINT_PLMN_DIGIT((plmn).MCCdigit2); \ - PRINT_PLMN_DIGIT((plmn).MCCdigit3); \ - PRINT_PLMN_DIGIT((plmn).MNCdigit1); \ - PRINT_PLMN_DIGIT((plmn).MNCdigit2); \ - PRINT_PLMN_DIGIT((plmn).MNCdigit3) + PRINT_PLMN_DIGIT((plmn).MCCdigit1); \ + PRINT_PLMN_DIGIT((plmn).MCCdigit2); \ + PRINT_PLMN_DIGIT((plmn).MCCdigit3); \ + PRINT_PLMN_DIGIT((plmn).MNCdigit1); \ + PRINT_PLMN_DIGIT((plmn).MNCdigit2); \ + PRINT_PLMN_DIGIT((plmn).MNCdigit3) /****************************************************************************/ /******************* L O C A L D E F I N I T I O N S *******************/ @@ -103,323 +102,330 @@ static void _display_usim_data(const usim_data_t* data); int main (int argc, const char* argv[]) { - int rc; - usim_data_t usim_data; - - unsigned char gen_data; - - /* - * Read command line parameters - */ - if (argc != 2) { - fprintf(stderr, "Invalid parameter\n"); - _display_usage(argv[0]); - exit(EXIT_FAILURE); - } - else if ( (strcmp(argv[1], "--gen") == 0) || - (strcmp(argv[1], "-g") == 0) ) { - /* Generate USIM data files */ - gen_data = TRUE; - } - else if ( (strcmp(argv[1], "--print") == 0) || - (strcmp(argv[1], "-p") == 0) ) { - /* Display content of USIM data files */ - gen_data = FALSE; - } - else { - /* Display usage */ - _display_usage(argv[0]); - exit(EXIT_SUCCESS); - } + int rc; + usim_data_t usim_data; + int i; + + unsigned char gen_data; - if (gen_data) - { /* - * Initialize USIM data + * Read command line parameters */ - memset(&usim_data, 0, sizeof(usim_data_t)); + if (argc != 2) { + fprintf(stderr, "Invalid parameter\n"); + _display_usage(argv[0]); + exit(EXIT_FAILURE); + } else if ((strcmp(argv[1], "--gen") == 0) + || (strcmp(argv[1], "-g") == 0)) { + /* Generate USIM data files */ + gen_data = TRUE; + } else if ((strcmp(argv[1], "--print") == 0) + || (strcmp(argv[1], "-p") == 0)) { + /* Display content of USIM data files */ + gen_data = FALSE; + } else { + /* Display usage */ + _display_usage(argv[0]); + exit(EXIT_SUCCESS); + } -//#if (SELECTED_PLMN == FCT1) -#if 1 - /* - * International Mobile Subscriber Identity - * IMSI = MCC + MNC + MSIN = 310 (USA) + 028 (UNKNOWN) + 90832150 - */ + if (gen_data) { + /* + * Initialize USIM data + */ + memset(&usim_data, 0, sizeof(usim_data_t)); + + //#if (SELECTED_PLMN == FCT1) +#if 0 + /* + * International Mobile Subscriber Identity + * IMSI = MCC + MNC + MSIN = 310 (USA) + 028 (UNKNOWN) + 90832150 + */ #warning "IMSI 310.028.90832150" - usim_data.imsi.length = 8; - usim_data.imsi.u.num.parity = EVEN_PARITY; // Parity: even - usim_data.imsi.u.num.digit1 = 3; // MCC digit 1 - usim_data.imsi.u.num.digit2 = 1; // MCC digit 2 - usim_data.imsi.u.num.digit3 = 0; // MCC digit 3 - usim_data.imsi.u.num.digit4 = 0; // MNC digit 1 - usim_data.imsi.u.num.digit5 = 2; // MNC digit 2 - usim_data.imsi.u.num.digit6 = 8; // MNC digit 3 - usim_data.imsi.u.num.digit7 = 9; - usim_data.imsi.u.num.digit8 = 0; - usim_data.imsi.u.num.digit9 = 8; - usim_data.imsi.u.num.digit10 = 3; - usim_data.imsi.u.num.digit11 = 2; - usim_data.imsi.u.num.digit12 = 1; - usim_data.imsi.u.num.digit13 = 5; - usim_data.imsi.u.num.digit14 = 0; - usim_data.imsi.u.num.digit15 = 0b1111; + usim_data.imsi.length = 8; + usim_data.imsi.u.num.parity = EVEN_PARITY; // Parity: even + usim_data.imsi.u.num.digit1 = 3; // MCC digit 1 + usim_data.imsi.u.num.digit2 = 1; // MCC digit 2 + usim_data.imsi.u.num.digit3 = 0; // MCC digit 3 + usim_data.imsi.u.num.digit4 = 0; // MNC digit 1 + usim_data.imsi.u.num.digit5 = 2; // MNC digit 2 + usim_data.imsi.u.num.digit6 = 8; // MNC digit 3 + usim_data.imsi.u.num.digit7 = 9; + usim_data.imsi.u.num.digit8 = 0; + usim_data.imsi.u.num.digit9 = 8; + usim_data.imsi.u.num.digit10 = 3; + usim_data.imsi.u.num.digit11 = 2; + usim_data.imsi.u.num.digit12 = 1; + usim_data.imsi.u.num.digit13 = 5; + usim_data.imsi.u.num.digit14 = 0; + usim_data.imsi.u.num.digit15 = 0b1111; #else - /* - * International Mobile Subscriber Identity - * IMSI = MCC + MNC + MSIN = 208 (France) + 10 (SFR) + 00001234 - */ + /* + * International Mobile Subscriber Identity + * IMSI = MCC + MNC + MSIN = 208 (France) + 10 (SFR) + 00001234 + */ #warning "IMSI 208.10.00001234" -/* usim_data.imsi.length = 8; - usim_data.imsi.u.num.parity = EVEN_PARITY; // Parity: even - usim_data.imsi.u.num.digit1 = 2; // MCC digit 1 - usim_data.imsi.u.num.digit2 = 0; // MCC digit 2 - usim_data.imsi.u.num.digit3 = 8; // MCC digit 3 - usim_data.imsi.u.num.digit4 = 1; // MNC digit 1 - usim_data.imsi.u.num.digit5 = 0; // MNC digit 2 - usim_data.imsi.u.num.digit6 = 0b1111; // MNC digit 3 - usim_data.imsi.u.num.digit7 = 0; - usim_data.imsi.u.num.digit8 = 0; - usim_data.imsi.u.num.digit9 = 0; - usim_data.imsi.u.num.digit10 = 0; - usim_data.imsi.u.num.digit11 = 1; - usim_data.imsi.u.num.digit12 = 2; - usim_data.imsi.u.num.digit13 = 3; - usim_data.imsi.u.num.digit14 = 4; - usim_data.imsi.u.num.digit15 = 0b1111;*/ - usim_data.imsi.length = 8; - usim_data.imsi.u.num.parity = 0x0; // Type of identity = IMSI, even - usim_data.imsi.u.num.digit1 = 2; // MCC digit 1 - usim_data.imsi.u.num.digit2 = 0; // MCC digit 2 - usim_data.imsi.u.num.digit3 = 8; // MCC digit 3 - usim_data.imsi.u.num.digit4 = 1; // MNC digit 1 - usim_data.imsi.u.num.digit5 = 0; // MNC digit 2 - usim_data.imsi.u.num.digit6 = 0; - usim_data.imsi.u.num.digit7 = 0; - usim_data.imsi.u.num.digit8 = 0; - usim_data.imsi.u.num.digit9 = 0; - usim_data.imsi.u.num.digit10 = 0; - usim_data.imsi.u.num.digit11 = 1; - usim_data.imsi.u.num.digit12 = 2; - usim_data.imsi.u.num.digit13 = 3; - usim_data.imsi.u.num.digit14 = 4; - usim_data.imsi.u.num.digit15 = 0xF; + /* usim_data.imsi.length = 8; + usim_data.imsi.u.num.parity = EVEN_PARITY; // Parity: even + usim_data.imsi.u.num.digit1 = 2; // MCC digit 1 + usim_data.imsi.u.num.digit2 = 0; // MCC digit 2 + usim_data.imsi.u.num.digit3 = 8; // MCC digit 3 + usim_data.imsi.u.num.digit4 = 1; // MNC digit 1 + usim_data.imsi.u.num.digit5 = 0; // MNC digit 2 + usim_data.imsi.u.num.digit6 = 0b1111; // MNC digit 3 + usim_data.imsi.u.num.digit7 = 0; + usim_data.imsi.u.num.digit8 = 0; + usim_data.imsi.u.num.digit9 = 0; + usim_data.imsi.u.num.digit10 = 0; + usim_data.imsi.u.num.digit11 = 1; + usim_data.imsi.u.num.digit12 = 2; + usim_data.imsi.u.num.digit13 = 3; + usim_data.imsi.u.num.digit14 = 4; + usim_data.imsi.u.num.digit15 = 0b1111;*/ + usim_data.imsi.length = 8; + usim_data.imsi.u.num.parity = 0x0; // Type of identity = IMSI, even + usim_data.imsi.u.num.digit1 = 2;// MCC digit 1 + usim_data.imsi.u.num.digit2 = 0;// MCC digit 2 + usim_data.imsi.u.num.digit3 = 8;// MCC digit 3 + usim_data.imsi.u.num.digit4 = 1;// MNC digit 1 + usim_data.imsi.u.num.digit5 = 0;// MNC digit 2 + usim_data.imsi.u.num.digit6 = 0; + usim_data.imsi.u.num.digit7 = 0; + usim_data.imsi.u.num.digit8 = 0; + usim_data.imsi.u.num.digit9 = 0; + usim_data.imsi.u.num.digit10 = 0; + usim_data.imsi.u.num.digit11 = 1; + usim_data.imsi.u.num.digit12 = 2; + usim_data.imsi.u.num.digit13 = 3; + usim_data.imsi.u.num.digit14 = 4; + usim_data.imsi.u.num.digit15 = 0xF; #endif - /* - * Ciphering and Integrity Keys - */ - usim_data.keys.ksi = KSI; - memset(&usim_data.keys.ck, 0, USIM_CK_SIZE); - memset(&usim_data.keys.ik, 0, USIM_IK_SIZE); - - /* - * Higher Priority PLMN search period - */ - usim_data.hpplmn = 0x00; /* Disable timer */ - /* - * List of Forbidden PLMNs - */ - for (int i = 0; i < USIM_FPLMN_MAX; i++) { - memset(&usim_data.fplmn[i], 0xff, sizeof(plmn_t)); - } - /* - * Location Information - */ - usim_data.loci.tmsi = DEFAULT_TMSI; - usim_data.loci.lai.plmn = network_records[SELECTED_PLMN].plmn; - usim_data.loci.lai.lac = DEFAULT_LAC; - usim_data.loci.status = USIM_LOCI_NOT_UPDATED; - /* - * Packet Switched Location Information - */ - usim_data.psloci.p_tmsi = DEFAULT_P_TMSI; - usim_data.psloci.signature[0] = 0x01; - usim_data.psloci.signature[1] = 0x02; - usim_data.psloci.signature[2] = 0x03; - usim_data.psloci.rai.plmn = network_records[SELECTED_PLMN].plmn; - usim_data.psloci.rai.lac = DEFAULT_LAC; - usim_data.psloci.rai.rac = DEFAULT_RAC; - usim_data.psloci.status = USIM_PSLOCI_NOT_UPDATED; - /* - * Administrative Data - */ - usim_data.ad.UE_Operation_Mode = USIM_NORMAL_MODE; - usim_data.ad.Additional_Info = 0xffff; - usim_data.ad.MNC_Length = 2; - /* - * EPS NAS security context - */ - usim_data.securityctx.length = 52; - usim_data.securityctx.KSIasme.type = USIM_KSI_ASME_TAG; - usim_data.securityctx.KSIasme.length = 1; - usim_data.securityctx.KSIasme.value[0] = KSI_ASME; - usim_data.securityctx.Kasme.type = USIM_K_ASME_TAG; - usim_data.securityctx.Kasme.length = USIM_K_ASME_SIZE; - memset(usim_data.securityctx.Kasme.value, 0, - usim_data.securityctx.Kasme.length); - usim_data.securityctx.ulNAScount.type = USIM_UL_NAS_COUNT_TAG; - usim_data.securityctx.ulNAScount.length = USIM_UL_NAS_COUNT_SIZE; - memset(usim_data.securityctx.ulNAScount.value, 0, - usim_data.securityctx.ulNAScount.length); - usim_data.securityctx.dlNAScount.type = USIM_DL_NAS_COUNT_TAG; - usim_data.securityctx.dlNAScount.length = USIM_DL_NAS_COUNT_SIZE; - memset(usim_data.securityctx.dlNAScount.value, 0, - usim_data.securityctx.dlNAScount.length); - usim_data.securityctx.algorithmID.type = USIM_INT_ENC_ALGORITHMS_TAG; - usim_data.securityctx.algorithmID.length = 1; - usim_data.securityctx.algorithmID.value[0] = SECURITY_ALGORITHMS; - /* - * Subcriber's Number - */ - usim_data.msisdn.length = 7; - usim_data.msisdn.number.ext = 1; - usim_data.msisdn.number.ton = MSISDN_TON_UNKNOWKN; - usim_data.msisdn.number.npi = MSISDN_NPI_ISDN_TELEPHONY; - usim_data.msisdn.number.digit[0].msb = 3; - usim_data.msisdn.number.digit[0].lsb = 3; - usim_data.msisdn.number.digit[1].msb = 6; - usim_data.msisdn.number.digit[1].lsb = 1; - usim_data.msisdn.number.digit[2].msb = 1; - usim_data.msisdn.number.digit[2].lsb = 1; - usim_data.msisdn.number.digit[3].msb = 2; - usim_data.msisdn.number.digit[3].lsb = 3; - usim_data.msisdn.number.digit[4].msb = 4; - usim_data.msisdn.number.digit[4].lsb = 5; - usim_data.msisdn.number.digit[5].msb = 6; - usim_data.msisdn.number.digit[5].lsb = 0xf; - usim_data.msisdn.number.digit[6].msb = 0xf; - usim_data.msisdn.number.digit[6].lsb = 0xf; - usim_data.msisdn.number.digit[7].msb = 0xf; - usim_data.msisdn.number.digit[7].lsb = 0xf; - usim_data.msisdn.number.digit[8].msb = 0xf; - usim_data.msisdn.number.digit[8].lsb = 0xf; - usim_data.msisdn.number.digit[9].msb = 0xf; - usim_data.msisdn.number.digit[9].lsb = 0xf; - usim_data.msisdn.conf1_record_id = 0xff; /* Not used */ - usim_data.msisdn.ext1_record_id = 0xff; /* Not used */ - /* - * PLMN Network Name and Operator PLMN List - */ - for (int i = SFR1; i < VDF2; i++) { - network_record_t record = network_records[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, - usim_data.pnn[i].fullname.length); - usim_data.pnn[i].shortname.type = USIM_PNN_SHORTNAME_TAG; - usim_data.pnn[i].shortname.length = strlen(record.shortname); - strncpy((char*)usim_data.pnn[i].shortname.value, record.shortname, - usim_data.pnn[i].shortname.length); - usim_data.opl[i].plmn = record.plmn; - usim_data.opl[i].start = record.tac_start; - usim_data.opl[i].end = record.tac_end; - usim_data.opl[i].record_id = i; - } - for (int i = VDF2; i < USIM_OPL_MAX; i++) { - memset(&usim_data.opl[i].plmn, 0xff, sizeof(plmn_t)); + /* + * Ciphering and Integrity Keys + */ + usim_data.keys.ksi = KSI; + memset(&usim_data.keys.ck, 0, USIM_CK_SIZE); + memset(&usim_data.keys.ik, 0, USIM_IK_SIZE); + + /* + * Higher Priority PLMN search period + */ + usim_data.hpplmn = 0x00; /* Disable timer */ + /* + * List of Forbidden PLMNs + */ + for (i = 0; i < USIM_FPLMN_MAX; i++) { + memset(&usim_data.fplmn[i], 0xff, sizeof(plmn_t)); + } + /* + * Location Information + */ + usim_data.loci.tmsi = DEFAULT_TMSI; + usim_data.loci.lai.plmn = network_records[SELECTED_PLMN].plmn; + usim_data.loci.lai.lac = DEFAULT_LAC; + usim_data.loci.status = USIM_LOCI_NOT_UPDATED; + /* + * Packet Switched Location Information + */ + usim_data.psloci.p_tmsi = DEFAULT_P_TMSI; + usim_data.psloci.signature[0] = 0x01; + usim_data.psloci.signature[1] = 0x02; + usim_data.psloci.signature[2] = 0x03; + usim_data.psloci.rai.plmn = network_records[SELECTED_PLMN].plmn; + usim_data.psloci.rai.lac = DEFAULT_LAC; + usim_data.psloci.rai.rac = DEFAULT_RAC; + usim_data.psloci.status = USIM_PSLOCI_NOT_UPDATED; + /* + * Administrative Data + */ + usim_data.ad.UE_Operation_Mode = USIM_NORMAL_MODE; + usim_data.ad.Additional_Info = 0xffff; + usim_data.ad.MNC_Length = 2; + /* + * EPS NAS security context + */ + usim_data.securityctx.length = 52; + usim_data.securityctx.KSIasme.type = USIM_KSI_ASME_TAG; + usim_data.securityctx.KSIasme.length = 1; + usim_data.securityctx.KSIasme.value[0] = KSI_ASME; + usim_data.securityctx.Kasme.type = USIM_K_ASME_TAG; + usim_data.securityctx.Kasme.length = USIM_K_ASME_SIZE; + memset(usim_data.securityctx.Kasme.value, 0, + usim_data.securityctx.Kasme.length); + usim_data.securityctx.ulNAScount.type = USIM_UL_NAS_COUNT_TAG; + usim_data.securityctx.ulNAScount.length = USIM_UL_NAS_COUNT_SIZE; + memset(usim_data.securityctx.ulNAScount.value, 0, + usim_data.securityctx.ulNAScount.length); + usim_data.securityctx.dlNAScount.type = USIM_DL_NAS_COUNT_TAG; + usim_data.securityctx.dlNAScount.length = USIM_DL_NAS_COUNT_SIZE; + memset(usim_data.securityctx.dlNAScount.value, 0, + usim_data.securityctx.dlNAScount.length); + usim_data.securityctx.algorithmID.type = USIM_INT_ENC_ALGORITHMS_TAG; + usim_data.securityctx.algorithmID.length = 1; + usim_data.securityctx.algorithmID.value[0] = SECURITY_ALGORITHMS; + /* + * Subcriber's Number + */ + usim_data.msisdn.length = 7; + usim_data.msisdn.number.ext = 1; + usim_data.msisdn.number.ton = MSISDN_TON_UNKNOWKN; + usim_data.msisdn.number.npi = MSISDN_NPI_ISDN_TELEPHONY; + usim_data.msisdn.number.digit[0].msb = 3; + usim_data.msisdn.number.digit[0].lsb = 3; + usim_data.msisdn.number.digit[1].msb = 6; + usim_data.msisdn.number.digit[1].lsb = 1; + usim_data.msisdn.number.digit[2].msb = 1; + usim_data.msisdn.number.digit[2].lsb = 1; + usim_data.msisdn.number.digit[3].msb = 2; + usim_data.msisdn.number.digit[3].lsb = 3; + usim_data.msisdn.number.digit[4].msb = 4; + usim_data.msisdn.number.digit[4].lsb = 5; + usim_data.msisdn.number.digit[5].msb = 6; + usim_data.msisdn.number.digit[5].lsb = 0xf; + usim_data.msisdn.number.digit[6].msb = 0xf; + usim_data.msisdn.number.digit[6].lsb = 0xf; + usim_data.msisdn.number.digit[7].msb = 0xf; + usim_data.msisdn.number.digit[7].lsb = 0xf; + usim_data.msisdn.number.digit[8].msb = 0xf; + usim_data.msisdn.number.digit[8].lsb = 0xf; + usim_data.msisdn.number.digit[9].msb = 0xf; + usim_data.msisdn.number.digit[9].lsb = 0xf; + usim_data.msisdn.conf1_record_id = 0xff; /* Not used */ + usim_data.msisdn.ext1_record_id = 0xff; /* Not used */ + /* + * PLMN Network Name and Operator PLMN List + */ + for (i = SFR1; i < VDF2; i++) { + network_record_t record = network_records[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, + usim_data.pnn[i].fullname.length); + usim_data.pnn[i].shortname.type = USIM_PNN_SHORTNAME_TAG; + usim_data.pnn[i].shortname.length = strlen(record.shortname); + strncpy((char*) usim_data.pnn[i].shortname.value, record.shortname, + usim_data.pnn[i].shortname.length); + usim_data.opl[i].plmn = record.plmn; + usim_data.opl[i].start = record.tac_start; + usim_data.opl[i].end = record.tac_end; + usim_data.opl[i].record_id = i; + } + for (i = VDF2; i < USIM_OPL_MAX; i++) { + memset(&usim_data.opl[i].plmn, 0xff, sizeof(plmn_t)); + } + + /* + * List of Equivalent HPLMNs + */ + usim_data.ehplmn[0] = network_records[SFR2].plmn; + usim_data.ehplmn[1] = network_records[SFR3].plmn; + /* + * Home PLMN Selector with Access Technology + */ + usim_data.hplmn.plmn = network_records[SELECTED_PLMN].plmn; + usim_data.hplmn.AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN); + /* + * List of user controlled PLMN selector with Access Technology + */ + for (i = 0; i < USIM_PLMN_MAX; i++) { + memset(&usim_data.plmn[i], 0xff, sizeof(plmn_t)); + } + /* + * List of operator controlled PLMN selector with Access Technology + */ + usim_data.oplmn[0].plmn = network_records[VDF1].plmn; + usim_data.oplmn[0].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN + | USIM_ACT_EUTRAN); + usim_data.oplmn[1].plmn = network_records[VDF2].plmn; + usim_data.oplmn[1].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN + | USIM_ACT_EUTRAN); + usim_data.oplmn[2].plmn = network_records[VDF3].plmn; + usim_data.oplmn[2].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN + | USIM_ACT_EUTRAN); + usim_data.oplmn[3].plmn = network_records[VDF4].plmn; + usim_data.oplmn[3].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN + | USIM_ACT_EUTRAN); + usim_data.oplmn[4].plmn = network_records[VDF5].plmn; + usim_data.oplmn[4].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN + | USIM_ACT_EUTRAN); + for (i = 5; i < USIM_OPLMN_MAX; i++) { + memset(&usim_data.oplmn[i], 0xff, sizeof(plmn_t)); + } + /* + * EPS Location Information + */ + usim_data.epsloci.guti.gummei.plmn = + network_records[SELECTED_PLMN].plmn; + usim_data.epsloci.guti.gummei.MMEgid = DEFAULT_MME_ID; + usim_data.epsloci.guti.gummei.MMEcode = DEFAULT_MME_CODE; + usim_data.epsloci.guti.m_tmsi = DEFAULT_M_TMSI; + usim_data.epsloci.tai.plmn = usim_data.epsloci.guti.gummei.plmn; + usim_data.epsloci.tai.tac = DEFAULT_TAC; + usim_data.epsloci.status = USIM_EPSLOCI_UPDATED; + /* + * Non-Access Stratum configuration + */ + usim_data.nasconfig.NAS_SignallingPriority.type = + USIM_NAS_SIGNALLING_PRIORITY_TAG; + usim_data.nasconfig.NAS_SignallingPriority.length = 1; + usim_data.nasconfig.NAS_SignallingPriority.value[0] = 0x00; + usim_data.nasconfig.NMO_I_Behaviour.type = USIM_NMO_I_BEHAVIOUR_TAG; + usim_data.nasconfig.NMO_I_Behaviour.length = 1; + usim_data.nasconfig.NMO_I_Behaviour.value[0] = 0x00; + usim_data.nasconfig.AttachWithImsi.type = USIM_ATTACH_WITH_IMSI_TAG; + usim_data.nasconfig.AttachWithImsi.length = 1; +#if defined(START_WITH_GUTI) + usim_data.nasconfig.AttachWithImsi.value[0] = 0x00; +#else + usim_data.nasconfig.AttachWithImsi.value[0] = 0x01; +#endif + usim_data.nasconfig.MinimumPeriodicSearchTimer.type = + USIM_MINIMUM_PERIODIC_SEARCH_TIMER_TAG; + usim_data.nasconfig.MinimumPeriodicSearchTimer.length = 1; + usim_data.nasconfig.MinimumPeriodicSearchTimer.value[0] = 0x00; + usim_data.nasconfig.ExtendedAccessBarring.type = + USIM_EXTENDED_ACCESS_BARRING_TAG; + usim_data.nasconfig.ExtendedAccessBarring.length = 1; + usim_data.nasconfig.ExtendedAccessBarring.value[0] = 0x00; + usim_data.nasconfig.Timer_T3245_Behaviour.type = + USIM_TIMER_T3245_BEHAVIOUR_TAG; + usim_data.nasconfig.Timer_T3245_Behaviour.length = 1; + usim_data.nasconfig.Timer_T3245_Behaviour.value[0] = 0x00; + + /* + * Write USIM application data + */ + rc = usim_api_write(&usim_data); + if (rc != RETURNok) { + perror("ERROR\t: usim_api_write() failed"); + exit(EXIT_FAILURE); + } } /* - * List of Equivalent HPLMNs - */ - usim_data.ehplmn[0] = network_records[SFR2].plmn; - usim_data.ehplmn[1] = network_records[SFR3].plmn; - /* - * Home PLMN Selector with Access Technology + * Read USIM application data */ - usim_data.hplmn.plmn = network_records[SELECTED_PLMN].plmn; - usim_data.hplmn.AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN); - /* - * List of user controlled PLMN selector with Access Technology - */ - for (int i = 0; i < USIM_PLMN_MAX; i++) { - memset(&usim_data.plmn[i], 0xff, sizeof(plmn_t)); - } - /* - * List of operator controlled PLMN selector with Access Technology - */ - usim_data.oplmn[0].plmn = network_records[VDF1].plmn; - usim_data.oplmn[0].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN); - usim_data.oplmn[1].plmn = network_records[VDF2].plmn; - usim_data.oplmn[1].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN); - usim_data.oplmn[2].plmn = network_records[VDF3].plmn; - usim_data.oplmn[2].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN); - usim_data.oplmn[3].plmn = network_records[VDF4].plmn; - usim_data.oplmn[3].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN); - usim_data.oplmn[4].plmn = network_records[VDF5].plmn; - usim_data.oplmn[4].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN); - for (int i = 5; i < USIM_OPLMN_MAX; i++) { - memset(&usim_data.oplmn[i], 0xff, sizeof(plmn_t)); + memset(&usim_data, 0, sizeof(usim_data_t)); + rc = usim_api_read(&usim_data); + if (rc != RETURNok) { + perror("ERROR\t: usim_api_read() failed"); + exit(EXIT_FAILURE); } + /* - * EPS Location Information - */ - usim_data.epsloci.guti.gummei.plmn = network_records[SELECTED_PLMN].plmn; - usim_data.epsloci.guti.gummei.MMEgid = DEFAULT_MME_ID; - usim_data.epsloci.guti.gummei.MMEcode = DEFAULT_MME_CODE; - usim_data.epsloci.guti.m_tmsi = DEFAULT_M_TMSI; - usim_data.epsloci.tai.plmn = usim_data.epsloci.guti.gummei.plmn; - usim_data.epsloci.tai.tac = DEFAULT_TAC; - usim_data.epsloci.status = USIM_EPSLOCI_UPDATED; - /* - * Non-Access Stratum configuration + * Display USIM application data */ - usim_data.nasconfig.NAS_SignallingPriority.type = USIM_NAS_SIGNALLING_PRIORITY_TAG; - usim_data.nasconfig.NAS_SignallingPriority.length = 1; - usim_data.nasconfig.NAS_SignallingPriority.value[0] = 0x00; - usim_data.nasconfig.NMO_I_Behaviour.type = USIM_NMO_I_BEHAVIOUR_TAG; - usim_data.nasconfig.NMO_I_Behaviour.length = 1; - usim_data.nasconfig.NMO_I_Behaviour.value[0] = 0x00; - usim_data.nasconfig.AttachWithImsi.type = USIM_ATTACH_WITH_IMSI_TAG; - usim_data.nasconfig.AttachWithImsi.length = 1; -#if defined(START_WITH_GUTI) - usim_data.nasconfig.AttachWithImsi.value[0] = 0x00; -#else - usim_data.nasconfig.AttachWithImsi.value[0] = 0x01; -#endif - usim_data.nasconfig.MinimumPeriodicSearchTimer.type = USIM_MINIMUM_PERIODIC_SEARCH_TIMER_TAG; - usim_data.nasconfig.MinimumPeriodicSearchTimer.length = 1; - usim_data.nasconfig.MinimumPeriodicSearchTimer.value[0] = 0x00; - usim_data.nasconfig.ExtendedAccessBarring.type = USIM_EXTENDED_ACCESS_BARRING_TAG; - usim_data.nasconfig.ExtendedAccessBarring.length = 1; - usim_data.nasconfig.ExtendedAccessBarring.value[0] = 0x00; - usim_data.nasconfig.Timer_T3245_Behaviour.type = USIM_TIMER_T3245_BEHAVIOUR_TAG; - usim_data.nasconfig.Timer_T3245_Behaviour.length = 1; - usim_data.nasconfig.Timer_T3245_Behaviour.value[0] = 0x00; + printf("\nUSIM data:\n\n"); + _display_usim_data(&usim_data); /* - * Write USIM application data + * Display USIM file location */ - rc = usim_api_write(&usim_data); - if (rc != RETURNok) { - perror("ERROR\t: usim_api_write() failed"); - exit(EXIT_FAILURE); - } - } - - /* - * Read USIM application data - */ - memset(&usim_data, 0, sizeof(usim_data_t)); - rc = usim_api_read(&usim_data); - if (rc != RETURNok) { - perror("ERROR\t: usim_api_read() failed"); - exit(EXIT_FAILURE); - } - - /* - * Display USIM application data - */ - printf("\nUSIM data:\n\n"); - _display_usim_data(&usim_data); - - /* - * Display USIM file location - */ - char* path = memory_get_path("USIM_DIR", ".usim.nvram"); - printf("\nUSIM data file: %s\n", path); - free(path); - - exit(EXIT_SUCCESS); + char* path = memory_get_path("USIM_DIR", ".usim.nvram"); + printf("\nUSIM data file: %s\n", path); + free(path); + + exit(EXIT_SUCCESS); } /****************************************************************************/ @@ -429,182 +435,181 @@ int main (int argc, const char* argv[]) /* * Displays command line usage */ -static void _display_usage(const char* command) -{ - fprintf(stderr, "usage: %s [OPTION]\n", command); - fprintf(stderr, "\t[--gen|-g]\tGenerate the USIM data file\n"); - fprintf(stderr, "\t[--print|-p]\tDisplay the content of the USIM data file\n"); - fprintf(stderr, "\t[--help|-h]\tDisplay this usage\n"); - const char* path = getenv("USIM_DIR"); - if (path != NULL) { - fprintf(stderr, "USIM_DIR = %s\n", path); - } - else { - fprintf(stderr, "USIM_DIR environment variable is not defined\n"); - } +static void _display_usage(const char* command) { + fprintf(stderr, "usage: %s [OPTION]\n", command); + fprintf(stderr, "\t[--gen|-g]\tGenerate the USIM data file\n"); + fprintf(stderr, + "\t[--print|-p]\tDisplay the content of the USIM data file\n"); + fprintf(stderr, "\t[--help|-h]\tDisplay this usage\n"); + const char* path = getenv("USIM_DIR"); + if (path != NULL) { + fprintf(stderr, "USIM_DIR = %s\n", path); + } else { + fprintf(stderr, "USIM_DIR environment variable is not defined\n"); + } } /* * Displays USIM application data */ -static void _display_usim_data(const usim_data_t* data) -{ - int digits; - - printf("Administrative Data:\n"); - printf("\tUE_Operation_Mode\t= 0x%.2x\n", data->ad.UE_Operation_Mode); - printf("\tAdditional_Info\t\t= 0x%.4x\n", data->ad.Additional_Info); - printf("\tMNC_Length\t\t= %d\n\n", data->ad.MNC_Length); - - printf("IMSI:\n"); - printf("\tlength\t= %d\n", data->imsi.length); - printf("\tparity\t= %s\n", data->imsi.u.num.parity == EVEN_PARITY ? "Even" : "Odd"); - digits = (data->imsi.length * 2) - 1 - (data->imsi.u.num.parity == EVEN_PARITY ? 1 : 0); - printf("\tdigits\t= %d\n", digits); - printf("\tdigits\t= %u%u%u%u%u%x%u%u%u%u", - data->imsi.u.num.digit1, // MCC digit 1 - data->imsi.u.num.digit2, // MCC digit 2 - data->imsi.u.num.digit3, // MCC digit 3 - data->imsi.u.num.digit4, // MNC digit 1 - data->imsi.u.num.digit5, // MNC digit 2 - data->imsi.u.num.digit6, // MNC digit 3 - data->imsi.u.num.digit7, - data->imsi.u.num.digit8, - data->imsi.u.num.digit9, - data->imsi.u.num.digit10); - if (digits >= 11) - printf("%x", data->imsi.u.num.digit11); - if (digits >= 12) - printf("%x", data->imsi.u.num.digit12); - if (digits >= 13) - printf("%x", data->imsi.u.num.digit13); - if (digits >= 14) - printf("%x", data->imsi.u.num.digit14); - if (digits >= 15) - printf("%x", data->imsi.u.num.digit15); - printf("\n\n"); - - printf("Ciphering and Integrity Keys:\n"); - printf("\tKSI\t: 0x%.2x\n", data->keys.ksi); - char key[USIM_CK_SIZE+1]; - key[USIM_CK_SIZE] = '\0'; - memcpy(key, data->keys.ck, USIM_CK_SIZE); - printf("\tCK\t: \"%s\"\n", key); - memcpy(key, data->keys.ik, USIM_IK_SIZE); - printf("\tIK\t: \"%s\"\n", key); - - printf("EPS NAS security context:\n"); - printf("\tKSIasme\t: 0x%.2x\n", data->securityctx.KSIasme.value[0]); - char kasme[USIM_K_ASME_SIZE+1]; - kasme[USIM_K_ASME_SIZE] = '\0'; - memcpy(kasme, data->securityctx.Kasme.value, USIM_K_ASME_SIZE); - printf("\tKasme\t: \"%s\"\n", kasme); - printf("\tulNAScount\t: 0x%.8x\n", - *(UInt32_t*)data->securityctx.ulNAScount.value); - printf("\tdlNAScount\t: 0x%.8x\n", - *(UInt32_t*)data->securityctx.dlNAScount.value); - printf("\talgorithmID\t: 0x%.2x\n\n", - data->securityctx.algorithmID.value[0]); - - printf("MSISDN\t= %u%u%u %u%u%u%u %u%u%u%u\n\n", - data->msisdn.number.digit[0].msb, - data->msisdn.number.digit[0].lsb, - data->msisdn.number.digit[1].msb, - data->msisdn.number.digit[1].lsb, - data->msisdn.number.digit[2].msb, - data->msisdn.number.digit[2].lsb, - data->msisdn.number.digit[3].msb, - data->msisdn.number.digit[3].lsb, - data->msisdn.number.digit[4].msb, - data->msisdn.number.digit[4].lsb, - data->msisdn.number.digit[5].msb); - - for (int i = 0; i < USIM_PNN_MAX; i++) { - printf("PNN[%d]\t= {%s, %s}\n", i, - data->pnn[i].fullname.value, data->pnn[i].shortname.value); - } - printf("\n"); - - for (int i = 0; i < USIM_OPL_MAX; i++) { - printf("OPL[%d]\t= ", i); PRINT_PLMN(data->opl[i].plmn); - printf(", TAC = [%.4x - %.4x], record_id = %d\n", - data->opl[i].start, data->opl[i].end, data->opl[i].record_id); - } - printf("\n"); - - printf("HPLMN\t\t= "); PRINT_PLMN(data->hplmn.plmn); - printf(", AcT = 0x%x\n\n", data->hplmn.AcT); - - for (int i = 0; i < USIM_FPLMN_MAX; i++) { - printf("FPLMN[%d]\t= ", i); PRINT_PLMN(data->fplmn[i]); +static void _display_usim_data(const usim_data_t* data) { + int digits; + int i; + + printf("Administrative Data:\n"); + printf("\tUE_Operation_Mode\t= 0x%.2x\n", data->ad.UE_Operation_Mode); + printf("\tAdditional_Info\t\t= 0x%.4x\n", data->ad.Additional_Info); + printf("\tMNC_Length\t\t= %d\n\n", data->ad.MNC_Length); + + printf("IMSI:\n"); + printf("\tlength\t= %d\n", data->imsi.length); + printf("\tparity\t= %s\n", + data->imsi.u.num.parity == EVEN_PARITY ? "Even" : "Odd"); + digits = (data->imsi.length * 2) - 1 + - (data->imsi.u.num.parity == EVEN_PARITY ? 1 : 0); + printf("\tdigits\t= %d\n", digits); + printf("\tdigits\t= %u%u%u%u%u%x%u%u%u%u", + data->imsi.u.num.digit1, // MCC digit 1 + data->imsi.u.num.digit2, // MCC digit 2 + data->imsi.u.num.digit3, // MCC digit 3 + data->imsi.u.num.digit4, // MNC digit 1 + data->imsi.u.num.digit5, // MNC digit 2 + data->imsi.u.num.digit6, // MNC digit 3 + data->imsi.u.num.digit7, data->imsi.u.num.digit8, + data->imsi.u.num.digit9, data->imsi.u.num.digit10); + if (digits >= 11) + printf("%x", data->imsi.u.num.digit11); + if (digits >= 12) + printf("%x", data->imsi.u.num.digit12); + if (digits >= 13) + printf("%x", data->imsi.u.num.digit13); + if (digits >= 14) + printf("%x", data->imsi.u.num.digit14); + if (digits >= 15) + printf("%x", data->imsi.u.num.digit15); + printf("\n\n"); + + printf("Ciphering and Integrity Keys:\n"); + printf("\tKSI\t: 0x%.2x\n", data->keys.ksi); + char key[USIM_CK_SIZE + 1]; + key[USIM_CK_SIZE] = '\0'; + memcpy(key, data->keys.ck, USIM_CK_SIZE); + printf("\tCK\t: \"%s\"\n", key); + memcpy(key, data->keys.ik, USIM_IK_SIZE); + printf("\tIK\t: \"%s\"\n", key); + + printf("EPS NAS security context:\n"); + printf("\tKSIasme\t: 0x%.2x\n", data->securityctx.KSIasme.value[0]); + char kasme[USIM_K_ASME_SIZE + 1]; + kasme[USIM_K_ASME_SIZE] = '\0'; + memcpy(kasme, data->securityctx.Kasme.value, USIM_K_ASME_SIZE); + printf("\tKasme\t: \"%s\"\n", kasme); + printf("\tulNAScount\t: 0x%.8x\n", + *(UInt32_t*) data->securityctx.ulNAScount.value); + printf("\tdlNAScount\t: 0x%.8x\n", + *(UInt32_t*) data->securityctx.dlNAScount.value); + printf("\talgorithmID\t: 0x%.2x\n\n", + data->securityctx.algorithmID.value[0]); + + printf("MSISDN\t= %u%u%u %u%u%u%u %u%u%u%u\n\n", + data->msisdn.number.digit[0].msb, data->msisdn.number.digit[0].lsb, + data->msisdn.number.digit[1].msb, data->msisdn.number.digit[1].lsb, + data->msisdn.number.digit[2].msb, data->msisdn.number.digit[2].lsb, + data->msisdn.number.digit[3].msb, data->msisdn.number.digit[3].lsb, + data->msisdn.number.digit[4].msb, data->msisdn.number.digit[4].lsb, + data->msisdn.number.digit[5].msb); + + for (i = 0; i < USIM_PNN_MAX; i++) { + printf("PNN[%d]\t= {%s, %s}\n", i, data->pnn[i].fullname.value, + data->pnn[i].shortname.value); + } + printf("\n"); + + for (i = 0; i < USIM_OPL_MAX; i++) { + printf("OPL[%d]\t= ", i); + PRINT_PLMN(data->opl[i].plmn); + printf(", TAC = [%.4x - %.4x], record_id = %d\n", data->opl[i].start, + data->opl[i].end, data->opl[i].record_id); + } printf("\n"); - } - printf("\n"); - for (int i = 0; i < USIM_EHPLMN_MAX; i++) { - printf("EHPLMN[%d]\t= ", i); PRINT_PLMN(data->ehplmn[i]); + printf("HPLMN\t\t= "); + PRINT_PLMN(data->hplmn.plmn); + printf(", AcT = 0x%x\n\n", data->hplmn.AcT); + + for (i = 0; i < USIM_FPLMN_MAX; i++) { + printf("FPLMN[%d]\t= ", i); + PRINT_PLMN(data->fplmn[i]); + printf("\n"); + } + printf("\n"); + + for (i = 0; i < USIM_EHPLMN_MAX; i++) { + printf("EHPLMN[%d]\t= ", i); + PRINT_PLMN(data->ehplmn[i]); + printf("\n"); + } printf("\n"); - } - printf("\n"); - for (int i = 0; i < USIM_PLMN_MAX; i++) { - printf("PLMN[%d]\t\t= ", i); PRINT_PLMN(data->plmn[i].plmn); - printf(", AcTPLMN = 0x%x", data->plmn[i].AcT); + for (i = 0; i < USIM_PLMN_MAX; i++) { + printf("PLMN[%d]\t\t= ", i); + PRINT_PLMN(data->plmn[i].plmn); + printf(", AcTPLMN = 0x%x", data->plmn[i].AcT); + printf("\n"); + } printf("\n"); - } - printf("\n"); - for (int i = 0; i < USIM_OPLMN_MAX; i++) { - printf("OPLMN[%d]\t= ", i); PRINT_PLMN(data->oplmn[i].plmn); - printf(", AcTPLMN = 0x%x", data->oplmn[i].AcT); + for (i = 0; i < USIM_OPLMN_MAX; i++) { + printf("OPLMN[%d]\t= ", i); + PRINT_PLMN(data->oplmn[i].plmn); + printf(", AcTPLMN = 0x%x", data->oplmn[i].AcT); + printf("\n"); + } printf("\n"); - } - printf("\n"); - - printf("HPPLMN\t\t= 0x%.2x (%d minutes)\n\n", data->hpplmn, data->hpplmn); - - printf("LOCI:\n"); - printf("\tTMSI = 0x%.4x\n", data->loci.tmsi); - printf("\tLAI\t: PLMN = "); PRINT_PLMN(data->loci.lai.plmn); - printf(", LAC = 0x%.2x\n", data->loci.lai.lac); - printf("\tstatus\t= %d\n\n", data->loci.status); - - printf("PSLOCI:\n"); - printf("\tP-TMSI = 0x%.4x\n", data->psloci.p_tmsi); - printf("\tsignature = 0x%x 0x%x 0x%x\n", - data->psloci.signature[0], - data->psloci.signature[1], - data->psloci.signature[2]); - printf("\tRAI\t: PLMN = "); PRINT_PLMN(data->psloci.rai.plmn); - printf(", LAC = 0x%.2x, RAC = 0x%.1x\n", - data->psloci.rai.lac, data->psloci.rai.rac); - printf("\tstatus\t= %d\n\n", data->psloci.status); - - printf("EPSLOCI:\n"); - printf("\tGUTI\t: GUMMEI\t: (PLMN = "); - PRINT_PLMN(data->epsloci.guti.gummei.plmn); - printf(", MMEgid = 0x%.2x, MMEcode = 0x%.1x)", - data->epsloci.guti.gummei.MMEgid, - data->epsloci.guti.gummei.MMEcode); - printf(", M-TMSI = 0x%.4x\n", data->epsloci.guti.m_tmsi); - printf("\tTAI\t: PLMN = "); - PRINT_PLMN(data->epsloci.tai.plmn); - printf(", TAC = 0x%.2x\n", - data->epsloci.tai.tac); - printf("\tstatus\t= %d\n\n", data->epsloci.status); - - printf("NASCONFIG:\n"); - printf("\tNAS_SignallingPriority\t\t: 0x%.2x\n", - data->nasconfig.NAS_SignallingPriority.value[0]); - printf("\tNMO_I_Behaviour\t\t\t: 0x%.2x\n", - data->nasconfig.NMO_I_Behaviour.value[0]); - printf("\tAttachWithImsi\t\t\t: 0x%.2x\n", - data->nasconfig.AttachWithImsi.value[0]); - printf("\tMinimumPeriodicSearchTimer\t: 0x%.2x\n", - data->nasconfig.MinimumPeriodicSearchTimer.value[0]); - printf("\tExtendedAccessBarring\t\t: 0x%.2x\n", - data->nasconfig.ExtendedAccessBarring.value[0]); - printf("\tTimer_T3245_Behaviour\t\t: 0x%.2x\n", - data->nasconfig.Timer_T3245_Behaviour.value[0]); + + printf("HPPLMN\t\t= 0x%.2x (%d minutes)\n\n", data->hpplmn, data->hpplmn); + + printf("LOCI:\n"); + printf("\tTMSI = 0x%.4x\n", data->loci.tmsi); + printf("\tLAI\t: PLMN = "); + PRINT_PLMN(data->loci.lai.plmn); + printf(", LAC = 0x%.2x\n", data->loci.lai.lac); + printf("\tstatus\t= %d\n\n", data->loci.status); + + printf("PSLOCI:\n"); + printf("\tP-TMSI = 0x%.4x\n", data->psloci.p_tmsi); + printf("\tsignature = 0x%x 0x%x 0x%x\n", data->psloci.signature[0], + data->psloci.signature[1], data->psloci.signature[2]); + printf("\tRAI\t: PLMN = "); + PRINT_PLMN(data->psloci.rai.plmn); + printf(", LAC = 0x%.2x, RAC = 0x%.1x\n", data->psloci.rai.lac, + data->psloci.rai.rac); + printf("\tstatus\t= %d\n\n", data->psloci.status); + + printf("EPSLOCI:\n"); + printf("\tGUTI\t: GUMMEI\t: (PLMN = "); + PRINT_PLMN(data->epsloci.guti.gummei.plmn); + printf(", MMEgid = 0x%.2x, MMEcode = 0x%.1x)", + data->epsloci.guti.gummei.MMEgid, + data->epsloci.guti.gummei.MMEcode); + printf(", M-TMSI = 0x%.4x\n", data->epsloci.guti.m_tmsi); + printf("\tTAI\t: PLMN = "); + PRINT_PLMN(data->epsloci.tai.plmn); + printf(", TAC = 0x%.2x\n", data->epsloci.tai.tac); + printf("\tstatus\t= %d\n\n", data->epsloci.status); + + printf("NASCONFIG:\n"); + printf("\tNAS_SignallingPriority\t\t: 0x%.2x\n", + data->nasconfig.NAS_SignallingPriority.value[0]); + printf("\tNMO_I_Behaviour\t\t\t: 0x%.2x\n", + data->nasconfig.NMO_I_Behaviour.value[0]); + printf("\tAttachWithImsi\t\t\t: 0x%.2x\n", + data->nasconfig.AttachWithImsi.value[0]); + printf("\tMinimumPeriodicSearchTimer\t: 0x%.2x\n", + data->nasconfig.MinimumPeriodicSearchTimer.value[0]); + printf("\tExtendedAccessBarring\t\t: 0x%.2x\n", + data->nasconfig.ExtendedAccessBarring.value[0]); + printf("\tTimer_T3245_Behaviour\t\t: 0x%.2x\n", + data->nasconfig.Timer_T3245_Behaviour.value[0]); } diff --git a/openair-cn/OPENAIRHSS/auc/auc.h b/openair-cn/OPENAIRHSS/auc/auc.h index 960ec229719eb11dd4253bdf6c14c57293b88965..7f2e64a69b48e18270324036eee4af1db3a7f227 100644 --- a/openair-cn/OPENAIRHSS/auc/auc.h +++ b/openair-cn/OPENAIRHSS/auc/auc.h @@ -28,6 +28,7 @@ *******************************************************************************/ #include <stdint.h> #include <stdio.h> +#include <unistd.h> #include <gmp.h> #ifndef AUC_H_ diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h index 0ec0c023f2b41b7c628d6fd31d7c1720fd756542..e2076a3a63a44831126fee44c73b8696d8d3610a 100644 --- a/openair1/PHY/LTE_TRANSPORT/defs.h +++ b/openair1/PHY/LTE_TRANSPORT/defs.h @@ -70,11 +70,21 @@ #define MAX_NUM_CHANNEL_BITS (14*1200*6) // 14 symbols, 1200 REs, 12 bits/RE #define MAX_NUM_RE (14*1200) +#if !defined(SI_RNTI) #define SI_RNTI (rnti_t)0xffff +#endif +#if !defined(M_RNTI) #define M_RNTI (rnti_t)0xfffd +#endif +#if !defined(P_RNTI) #define P_RNTI (rnti_t)0xfffe +#endif +#if !defined(CBA_RNTI) #define CBA_RNTI (rnti_t)0xfff4 +#endif +#if !defined(C_RNTI) #define C_RNTI (rnti_t)0x1234 +#endif #define PMI_2A_11 0 #define PMI_2A_1m1 1 diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index dc067becc34a7606a4b671fb9c5d59a6ff6268c4..6c0d2f3bf18f8f02584d952d9f819ac14443212d 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -159,7 +159,6 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); void fill_ue_band_info(void); - #ifdef XFORMS // current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0) // at eNB 0, an UL scope for every UE @@ -250,6 +249,7 @@ static uint32_t downlink_frequency[MAX_NUM_CCs][4];/* = {{19 {1907600000,1907600000,1907600000,1907600000}};*/ static int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; /*= {{0,0,0,0},{0,0,0,0}}; */ + openair0_rf_map rf_map[MAX_NUM_CCs]; static char *conf_config_file_name = NULL; @@ -464,7 +464,6 @@ static const eutra_band_t eutra_bands[] = {43, 3600 * MHz, 3800 * MHz, 3600 * MHz, 3800 * MHz, TDD}, {44, 703 * MHz, 803 * MHz, 703 * MHz, 803 * MHz, TDD}, }; - unsigned int build_rflocal(int txi, int txq, int rxi, int rxq) { return (txi + (txq<<6) + (rxi<<12) + (rxq<<18)); @@ -980,13 +979,13 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) { #ifdef EXMIMO ((short*)dummy_tx_b)[2*i]<<4; #else - ((short*)dummy_tx_b)[2*i]<<5; + ((short*)dummy_tx_b)[2*i]<<5; #endif ((short*)&phy_vars_eNB->lte_eNB_common_vars.txdata[0][aa][tx_offset])[1]= #ifdef EXMIMO ((short*)dummy_tx_b)[2*i+1]<<4; #else - ((short*)dummy_tx_b)[2*i+1]<<5; + ((short*)dummy_tx_b)[2*i+1]<<5; #endif } } @@ -1021,15 +1020,15 @@ static void * eNB_thread_tx(void *param) { task = rt_task_init_schmod(nam2num(task_name), 0, 0, 0, SCHED_FIFO, 0xF); if (task==NULL) { - LOG_E(PHY,"[SCHED][eNB] Problem starting eNB_proc_TX thread_index %d (%s)!!!!\n",proc->subframe,task_name); - return 0; - } + LOG_E(PHY,"[SCHED][eNB] Problem starting eNB_proc_TX thread_index %d (%s)!!!!\n",proc->subframe,task_name); + return 0; +} else { - LOG_I(PHY,"[SCHED][eNB] eNB TX thread CC %d SF %d started with id %p\n", - proc->CC_id, - proc->subframe, - task); - } + LOG_I(PHY,"[SCHED][eNB] eNB TX thread CC %d SF %d started with id %p\n", + proc->CC_id, + proc->subframe, + task); +} #else #ifdef LOWLATENCY attr.size = sizeof(attr); @@ -1044,14 +1043,14 @@ static void * eNB_thread_tx(void *param) { attr.sched_period = 1 * 10000000; // each tx thread has a period of 10ms from the starting point if (sched_setattr(0, &attr, flags) < 0 ){ - perror("[SCHED] eNB tx thread: sched_setattr failed\n"); - exit(-1); - } + perror("[SCHED] eNB tx thread: sched_setattr failed\n"); + exit(-1); +} LOG_I(HW,"[SCHED] eNB TX deadline thread %d(id %ld) started on CPU %d\n", - proc->subframe, gettid(),sched_getcpu()); + proc->subframe, gettid(),sched_getcpu()); #else LOG_I(HW,"[SCHED] eNB TX thread %d started on CPU %d\n", - proc->subframe,sched_getcpu()); + proc->subframe,sched_getcpu()); #endif #endif @@ -1067,10 +1066,10 @@ static void * eNB_thread_tx(void *param) { while (!oai_exit){ - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe),0); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe),0); - //LOG_I(PHY,"Locking mutex for eNB proc %d (IC %d,mutex %p)\n",proc->subframe,proc->instance_cnt,&proc->mutex); - // printf("Locking mutex for eNB proc %d (subframe_tx %d))\n",proc->subframe,proc->instance_cnt_tx); + //LOG_I(PHY,"Locking mutex for eNB proc %d (IC %d,mutex %p)\n",proc->subframe,proc->instance_cnt,&proc->mutex); + // printf("Locking mutex for eNB proc %d (subframe_tx %d))\n",proc->subframe,proc->instance_cnt_tx); if (pthread_mutex_lock(&proc->mutex_tx) != 0) { LOG_E(PHY,"[SCHED][eNB] error locking mutex for eNB TX proc %d\n",proc->subframe); @@ -1078,9 +1077,9 @@ static void * eNB_thread_tx(void *param) { } else { - while (proc->instance_cnt_tx < 0) { - // LOG_I(PHY,"Waiting and unlocking mutex for eNB proc %d (IC %d,lock %d)\n",proc->subframe,proc->instance_cnt,pthread_mutex_trylock(&proc->mutex)); - //printf("Waiting and unlocking mutex for eNB proc %d (subframe_tx %d)\n",proc->subframe,proc->instance_cnt_tx); + while (proc->instance_cnt_tx < 0) { + // LOG_I(PHY,"Waiting and unlocking mutex for eNB proc %d (IC %d,lock %d)\n",proc->subframe,proc->instance_cnt,pthread_mutex_trylock(&proc->mutex)); + //printf("Waiting and unlocking mutex for eNB proc %d (subframe_tx %d)\n",proc->subframe,proc->instance_cnt_tx); pthread_cond_wait(&proc->cond_tx,&proc->mutex_tx); } @@ -1094,39 +1093,39 @@ static void * eNB_thread_tx(void *param) { vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, proc->frame_tx); start_meas(&softmodem_stats_tx_sf[proc->subframe]); - if (oai_exit) break; + if (oai_exit) break; - if ((((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD)&& - (subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx)==SF_DL))|| - (PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD))) { + if ((((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD)&& + (subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx)==SF_DL))|| + (PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD))) { - phy_procedures_eNB_TX(proc->subframe,PHY_vars_eNB_g[0][proc->CC_id],0,no_relay,NULL); + phy_procedures_eNB_TX(proc->subframe,PHY_vars_eNB_g[0][proc->CC_id],0,no_relay,NULL); - } - if ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx)==SF_S)) { - phy_procedures_eNB_TX(proc->subframe,PHY_vars_eNB_g[0][proc->CC_id],0,no_relay,NULL); - } +} + if ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx)==SF_S)) { + phy_procedures_eNB_TX(proc->subframe,PHY_vars_eNB_g[0][proc->CC_id],0,no_relay,NULL); +} - do_OFDM_mod_rt(proc->subframe_tx,PHY_vars_eNB_g[0][proc->CC_id]); + do_OFDM_mod_rt(proc->subframe_tx,PHY_vars_eNB_g[0][proc->CC_id]); - if (pthread_mutex_lock(&proc->mutex_tx) != 0) { - printf("[openair][SCHED][eNB] error locking mutex for eNB TX proc %d\n",proc->subframe); - } - else { - proc->instance_cnt_tx--; + if (pthread_mutex_lock(&proc->mutex_tx) != 0) { + printf("[openair][SCHED][eNB] error locking mutex for eNB TX proc %d\n",proc->subframe); +} + else { + proc->instance_cnt_tx--; - if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { - printf("[openair][SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->subframe); - } - } + if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { + printf("[openair][SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->subframe); +} +} - proc->frame_tx++; - if (proc->frame_tx==1024) - proc->frame_tx=0; + proc->frame_tx++; + if (proc->frame_tx==1024) + proc->frame_tx=0; - } +} stop_meas(&softmodem_stats_tx_sf[proc->subframe]); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe),0); #ifdef HARD_RT @@ -1149,8 +1148,8 @@ static void * eNB_thread_tx(void *param) { #endif } -int eNB_thread_rx_status[10]; -static void * eNB_thread_rx(void *param) { + int eNB_thread_rx_status[10]; + static void * eNB_thread_rx(void *param) { //unsigned long cpuid; eNB_proc_t *proc = (eNB_proc_t*)param; @@ -1175,9 +1174,9 @@ static void * eNB_thread_rx(void *param) { task = rt_task_init_schmod(nam2num(task_name), 0, 0, 0, SCHED_FIFO, 0xF); if (task==NULL) { - LOG_E(PHY,"[SCHED][eNB] Problem starting eNB_proc_RX thread_index %d (%s)!!!!\n",proc->subframe,task_name); - return 0; - } + LOG_E(PHY,"[SCHED][eNB] Problem starting eNB_proc_RX thread_index %d (%s)!!!!\n",proc->subframe,task_name); + return 0; +} else { LOG_I(PHY,"[SCHED][eNB] eNB RX thread CC_id %d SF %d started with id %p\n", /* on CPU %d*/ proc->CC_id, @@ -1475,6 +1474,7 @@ static void *eNB_thread(void *arg) attr.sched_runtime = 0.1 * 1000000; attr.sched_deadline = 0.5 * 1000000; attr.sched_period = 1.0 * 1000000; + /* pin the eNB main thread to CPU0*/ /* if (pthread_setaffinity_np(pthread_self(), sizeof(mask),&mask) <0) { @@ -1648,7 +1648,7 @@ static void *eNB_thread(void *arg) vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE,0); /* - if (trace_cnt++<10) + if (trace_cnt++<10) printf("TRX: t1 %llu (trx_read), t2 %llu (trx_write)\n",(long long unsigned int)(trx_time1.tv_nsec - trx_time0.tv_nsec), (long long unsigned int)(trx_time2.tv_nsec - trx_time1.tv_nsec)); */ #else @@ -1851,7 +1851,7 @@ static void *UE_thread_synch(void *arg) { printf("unlocked sync_mutex (UE_sync_thread)\n"); #endif printf("starting UE synch thread\n"); - + if (UE_scan == 1) { for (card=0;card<MAX_CARDS;card++) { for (i=0; i<openair0_cfg[card].rx_num_channels; i++) { @@ -1875,7 +1875,6 @@ static void *UE_thread_synch(void *arg) { LOG_D(PHY,"[SCHED][UE] Check absolute frequency %u\n",downlink_frequency[0][0]); sync_mode=pbch; } - while (!oai_exit) { if (pthread_mutex_lock(&UE->mutex_synch) != 0) { @@ -1890,9 +1889,8 @@ static void *UE_thread_synch(void *arg) { LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for UE Initial Synch thread\n"); exit_fun("nothing to add"); } - + } // mutex_lock - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SYNCH,1); switch (sync_mode) { @@ -1930,7 +1928,7 @@ static void *UE_thread_synch(void *arg) { break; case pbch: - + if (initial_sync(UE,mode)==0) { /* lte_adjust_synch(&PHY_vars_UE_g[0]->lte_frame_parms, @@ -1966,14 +1964,14 @@ static void *UE_thread_synch(void *arg) { openair_daq_vars.freq_offset += 100; openair_daq_vars.freq_offset *= -1; } - else { + else { openair_daq_vars.freq_offset *= -1; } - if (abs(openair_daq_vars.freq_offset) > 7500) { + if (abs(openair_daq_vars.freq_offset) > 7500) { LOG_I(PHY,"[initial_sync] No cell synchronization found, abandoning\n"); mac_xface->macphy_exit("No cell synchronization found, abandoning"); } - else { + else { LOG_I(PHY,"[initial_sync] trying carrier off %d Hz, rxgain %d\n",openair_daq_vars.freq_offset, UE->rx_total_gain_dB); for (card=0;card<MAX_CARDS;card++) { @@ -1991,15 +1989,16 @@ static void *UE_thread_synch(void *arg) { } // openair0_dump_config(&openair0_cfg[0],UE_flag); - - // rt_sleep_ns(FRAME_PERIOD); - } // freq_offset - } // initial_sync=0 - break; - case si: - default: - break; - } + + // rt_sleep_ns(FRAME_PERIOD); + } // freq_offset + } // initial_sync=0 + + break; + case si: + default: +break; +} vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SYNCH,0); printf("Finished synch : Locking synch mutex (thread_sync)\n"); if (pthread_mutex_lock(&UE->mutex_synch) != 0) { @@ -2012,6 +2011,7 @@ static void *UE_thread_synch(void *arg) { printf("[openair][SCHED][eNB] error unlocking mutex for UE synch\n"); } } + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SYNCH,0); } // while !oai_exit return(0); @@ -2156,7 +2156,7 @@ static void *UE_thread_rx(void *arg) { #endif UE->instance_cnt_rx=-1; - + #ifdef LOWLATENCY attr.size = sizeof(attr); attr.sched_flags = 0; @@ -2174,7 +2174,7 @@ static void *UE_thread_rx(void *arg) { exit(-1); } #endif - + mlockall(MCL_CURRENT | MCL_FUTURE); #ifndef EXMIMO @@ -2302,11 +2302,11 @@ static void *UE_thread(void *arg) { void *rxp[2],*txp[2]; /* - #ifdef LOWLATENCY - struct sched_attr attr; - unsigned int flags = 0; +#ifdef LOWLATENCY + struct sched_attr attr; + unsigned int flags = 0; unsigned long mask = 1; // processor 0 - #endif +#endif */ printf("waiting for sync (UE_thread)\n"); @@ -2323,31 +2323,31 @@ static void *UE_thread(void *arg) { printf("starting UE thread\n"); /* - #ifdef LOWLATENCY - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; +#ifdef LOWLATENCY + attr.size = sizeof(attr); + attr.sched_flags = 0; + attr.sched_nice = 0; + attr.sched_priority = 0; // This creates a .5 ms reservation - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = 0.5 * 1000000; - attr.sched_deadline = 0.5 * 1000000; - attr.sched_period = 1 * 1000000; + attr.sched_policy = SCHED_DEADLINE; + attr.sched_runtime = 0.5 * 1000000; + attr.sched_deadline = 0.5 * 1000000; + attr.sched_period = 1 * 1000000; // pin the UE main thread to CPU0 // if (pthread_setaffinity_np(pthread_self(), sizeof(mask),&mask) <0) { // perror("[MAIN_ENB_THREAD] pthread_setaffinity_np failed\n"); // } - if (sched_setattr(0, &attr, flags) < 0 ){ + if (sched_setattr(0, &attr, flags) < 0 ){ perror("[SCHED] main eNB thread: sched_setattr failed\n"); exit_fun("Nothing to add"); - } else { + } else { LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %ld started on CPU %d\n", - gettid(),sched_getcpu()); - } - #endif + gettid(),sched_getcpu()); + } +#endif */ mlockall(MCL_CURRENT | MCL_FUTURE); @@ -2497,7 +2497,6 @@ static void *UE_thread(void *arg) { //LOG_D(PHY,"HW RESYNC: hw_frame %d: Resynchronizing sample stream\n"); frame=0; // dump ahead in time to start of frame - #ifndef USRP_DEBUG rxs = openair0.trx_read_func(&openair0, ×tamp, @@ -2941,7 +2940,6 @@ void init_UE_threads(void) { } - void fill_ue_band_info() { UE_EUTRA_Capability_t *UE_EUTRA_Capability = UE_rrc_inst[0].UECap->UE_EUTRA_Capability; @@ -2969,7 +2967,6 @@ void fill_ue_band_info() { } } } - static void get_options (int argc, char **argv) { int c; // char line[1000]; @@ -2986,7 +2983,6 @@ static void get_options (int argc, char **argv) { #endif - const Enb_properties_array_t *enb_properties; @@ -3309,7 +3305,7 @@ int main(int argc, char **argv) { // int *eNB_thread_status_rx[10],*eNB_thread_status_tx[10]; #endif int i,aa,card; -#if defined (XFORMS) || defined (EMOS) || defined(EXMIMO) +#if defined (XFORMS) || defined (EMOS) || defined (EXMIMO) void *status; #endif @@ -3334,7 +3330,6 @@ int main(int argc, char **argv) { memset(&openair0_cfg[0],0,sizeof(openair0_config_t)*MAX_CARDS); memset(tx_max_power,0,sizeof(int)*MAX_NUM_CCs); - set_latency_target(); mode = normal_txrx; @@ -3799,7 +3794,6 @@ int main(int argc, char **argv) { } printf("ITTI tasks created\n"); #endif - printf("Filling UE band info\n"); if (UE_flag==1) fill_ue_band_info(); diff --git a/targets/build_helper.bash b/targets/build_helper.bash index 4a0b4b010a19bbaf7c398a2478b2b44273fe56e0..2f6b3488b079d603c2a8b166fc760d96b1d26c29 100755 --- a/targets/build_helper.bash +++ b/targets/build_helper.bash @@ -846,6 +846,29 @@ compile_unisim() { return 1 fi } + +compile_nas_tools() { + + export NVRAM_DIR=$OPENAIR_TARGETS/bin + + cd $NVRAM_DIR + + if [ ! -f /tmp/nas_cleaned ]; then + echo_success "make --directory=$OPENAIRCN_DIR/NAS/EURECOM-NAS/tools veryveryclean" + make --directory=$OPENAIRCN_DIR/NAS/EURECOM-NAS/tools veryveryclean + fi + echo_success "make --directory=$OPENAIRCN_DIR/NAS/EURECOM-NAS/tools all" + make --directory=$OPENAIRCN_DIR/NAS/EURECOM-NAS/tools all + rm .ue.nvram + rm .usim.nvram + touch /tmp/nas_cleaned +} + + +compile_ue_ip_nw_driver() { + cd $OPENAIR2_DIR && make ue_ip.ko +} + ################################################ # 1. check if the executable functions exist ############################################### @@ -935,14 +958,24 @@ check_for_mbmssim_executable() { fi } +check_for_nas_ue_executable() { + if [ ! -f $OPENAIRCN_DIR/NAS/EURECOM-NAS/bin/UserProcess ]; then + echo_error "Cannot find UserProcess executable object in directory $OPENAIRCN_DIR/NAS/EURECOM-NAS/bin" + echo_fatal "Check the compilation logs in bin/install_log.txt" + fi +} + ################################################ # 1. check if the executable functions exist ############################################### +# arg1 is RT +# arg2 is HW +# arg3 is ENB_S1 install_ltesoftmodem() { # RT if [ $1 = "RTAI" ]; then - if [ ! -f /tmp/init_rt_done.tmp ]; then + if [ ! -f /tmp/init_rt_done.tmp ]; then echo_info " 8.1 Insert RTAI modules" $SUDO insmod /usr/realtime/modules/rtai_hal.ko > /dev/null 2>&1 $SUDO insmod /usr/realtime/modules/rtai_sched.ko > /dev/null 2>&1 @@ -980,20 +1013,40 @@ install_ltesoftmodem() { # ENB_S1 if [ $3 = 0 ]; then - cd $OPENAIR2_DIR && make clean && make nasmesh_netlink.ko #|| exit 1 - cd $OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL && make clean && make # || exit 1 + cd $OPENAIR2_DIR && make clean && make nasmesh_netlink.ko #|| exit 1 + cd $OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL && make clean && make # || exit 1 fi } +# arg1 is ENB_S1 'boolean' install_oaisim() { if [ $1 = 0 ]; then - cd $OPENAIR2_DIR && make clean && make nasmesh_netlink.ko #|| exit 1 - cd $OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL && make clean && make # || exit 1 + cd $OPENAIR2_DIR && make clean && make nasmesh_netlink.ko #|| exit 1 + cd $OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL && make clean && make # || exit 1 + else + compile_ue_ip_nw_driver + install_nas_tools fi } + +install_nas_tools() { + cd $OPENAIR_TARGETS/bin + if [ ! -f .ue.nvram ]; then + echo_success "generate .ue_emm.nvram .ue.nvram" + $OPENAIRCN_DIR/NAS/EURECOM-NAS/bin/ue_data --gen + fi + + if [ ! -f .usim.nvram ]; then + echo_success "generate .usim.nvram" + $OPENAIRCN_DIR/NAS/EURECOM-NAS/bin/usim_data --gen + fi + $OPENAIRCN_DIR/NAS/EURECOM-NAS/bin/ue_data --print + $OPENAIRCN_DIR/NAS/EURECOM-NAS/bin/usim_data --print +} + ################################## # create HSS DB ################################ diff --git a/targets/build_oai.bash b/targets/build_oai.bash index 89ca4705cca4182dc2884b4457226b0c52c64544..450b412be398168d5d72f4b9b17284d381ba791f 100755 --- a/targets/build_oai.bash +++ b/targets/build_oai.bash @@ -472,7 +472,13 @@ build_enb(){ oaisim_compiled=$? check_for_oaisim_executable echo_info "7.2 finished oaisim target: check the installation log file bin/install_log.txt" - + + if [ $ENB_S1 -eq 1 ]; then + compile_nas_tools 2>&1 + nas_tools_compiled=$? + check_for_nas_tools_executable + echo_info "7.2.1 finished nas ue target: check the installation log file bin/install_log.txt" + fi fi if [ $TARGET = "UNISIM" ]; then echo "################## compile_unisim ##################" >> bin/install_log.txt @@ -800,6 +806,39 @@ if [ $RUN -ne 0 ]; then $SUDO echo "run" >> ~/.gdb_lte_softmodem $SUDO gdb -nh -x ~/.gdb_lte_softmodem 2>&1 fi + + elif [ $TARGET == "OAISIM" ]; then + + if [ $ENB_S1 -eq 0 ]; then + echo_error "TODO: LOAD NASMESH IP DRIVER FOR UE AND eNB" + else + # prepare NAS for UE + if [ ! -f .ue.nvram ]; then + echo_success "generate .ue_emm.nvram .ue.nvram" + $OPENAIRCN_DIR/NAS/EURECOM-NAS/bin/ue_data --gen + fi + + if [ ! -f .usim.nvram ]; then + echo_success "generate .usim.nvram" + $OPENAIRCN_DIR/NAS/EURECOM-NAS/bin/usim_data --gen + fi + $OPENAIRCN_DIR/NAS/EURECOM-NAS/bin/ue_data --print + $OPENAIRCN_DIR/NAS/EURECOM-NAS/bin/usim_data --print + + insmod $OPENAIR2_DIR/NETWORK_DRIVER/UE_IP/ue_ip.ko + + fi + + if [ $RUN_GDB -eq 0 ]; then + $SUDO exec $OPENAIR_TARGETS/bin/oaisim `echo $EXE_ARGUMENTS` + else + $SUDO setenv MALLOC_CHECK_ 2 + $SUDO touch ~/.gdb_oaisim + $SUDO echo "file $OPENAIR_TARGETS/bin/lte-oaisim" > ~/.gdb_oaisim + $SUDO echo "set args $EXE_ARGUMENTS" >> ~/.gdb_oaisim + $SUDO echo "run" >> ~/.gdb_oaisim + $SUDO gdb -nh -x ~/.gdb_oaisim 2>&1 + fi fi ;;