Commit 91343e3d authored by gauthier's avatar gauthier
Browse files

air mouvement around namespaces continued, dynamic PAA, conversions , toString() member functions

parent 89d52393
......@@ -50,6 +50,7 @@ function help()
echo_error " -h, --help Print this help."
echo_error " -I, --install-deps Check installed software necessary to build and run S/P-GW-C (support $SUPPORTED_DISTRO)."
echo_error " -i, --install-min-deps Check installed software necessary to run a statically linked S/P-GW-C (support $SUPPORTED_DISTRO)."
echo_error " -j, --jobs Multiple jobs for compiling."
echo_error " -v, --verbose Build process verbose."
echo_error " -V, --Verbose CMake only build process verbose, display compilation warnings and errors."
echo_error " "
......@@ -64,7 +65,7 @@ function main()
local -i var_check_install_min_deps=0
local -i var_check_install_deps=0
local cmake_args=" "
export make_args="-j`nproc`"
export make_args=" "
until [ -z "$1" ]
......@@ -109,6 +110,10 @@ function main()
var_check_install_min_deps=1
shift;
;;
-j | --jobs)
make_args="$make_args -j`nproc`"
shift;
;;
-v | --verbose)
echo "Make build process verbose"
cmake_args="$cmake_args -DCMAKE_VERBOSE_MAKEFILE=ON"
......@@ -121,7 +126,7 @@ function main()
verbose=1
shift;
;;
*)
*)
echo "Unknown option $1"
help
return 1
......@@ -129,16 +134,16 @@ function main()
esac
done
if [ ! -d /usr/local/etc/oai ]; then
$SUDO mkdir -m 777 -p /usr/local/etc/oai
fi
set_openair_env
set_openair_env
local dlog=$OPENAIRCN_DIR/build/log
local dext=$OPENAIRCN_DIR/build/ext
mkdir -m 777 -p $dlog
mkdir -m 777 -p $dext
......@@ -154,7 +159,7 @@ function main()
return 0
fi
fi
if [ $var_check_install_deps -gt 0 ];then
disable_ipv6
check_install_spgwc_deps $force $debug
......@@ -167,7 +172,7 @@ function main()
return 0
fi
fi
cmake_args="$cmake_args -DBUILD_SHARED_LIBS=OFF"
##############################################################################
......@@ -189,7 +194,7 @@ function main()
if [ ! -d ./build ]; then
mkdir -m 777 -p -v build
fi
cd ./build
$CMAKE $cmake_args .. > /dev/null
ret=$?;[[ $ret -ne 0 ]] && return $ret
......
......@@ -3,9 +3,9 @@
# Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The OpenAirInterface Software Alliance licenses this file to You under
# The OpenAirInterface Software Alliance licenses this file to You under
# the Apache License, Version 2.0 (the "License"); you may not use this file
# except in compliance with the License.
# except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
......@@ -50,6 +50,7 @@ function help()
echo_error " -h, --help Print this help."
echo_error " -I, --install-deps Check installed software necessary to build and run S/P-GW-U (support $SUPPORTED_DISTRO)."
echo_error " -i, --install-min-deps Check installed software necessary to run a statically linked S/P-GW-U (support $SUPPORTED_DISTRO)."
echo_error " -j, --jobs Multiple jobs for compiling."
echo_error " -v, --verbose Build process verbose."
echo_error " -V, --Verbose CMake only build process verbose, display compilation warnings and errors."
echo_error " "
......@@ -64,7 +65,7 @@ function main()
local -i var_check_install_min_deps=0
local -i var_check_install_deps=0
local cmake_args=" "
export make_args="-j`nproc`"
export make_args=" "
until [ -z "$1" ]
......@@ -105,6 +106,10 @@ function main()
var_check_install_min_deps=1
shift;
;;
-j | --jobs)
make_args="$make_args -j`nproc`"
shift;
;;
-v | --verbose)
echo "Make build process verbose"
cmake_args="$cmake_args -DCMAKE_VERBOSE_MAKEFILE=ON"
......@@ -117,7 +122,7 @@ function main()
verbose=1
shift;
;;
*)
*)
echo "Unknown option $1"
help
return 1
......@@ -130,11 +135,11 @@ function main()
$SUDO mkdir -m 777 -p /usr/local/etc/oai
fi
set_openair_env
set_openair_env
local dlog=$OPENAIRCN_DIR/build/log
local dext=$OPENAIRCN_DIR/build/ext
mkdir -m 777 -p $dlog
mkdir -m 777 -p $dext
......@@ -162,7 +167,7 @@ function main()
return 0
fi
fi
cmake_args="$cmake_args -DBUILD_SHARED_LIBS=OFF"
##############################################################################
# Clean
......@@ -183,7 +188,7 @@ function main()
if [ ! -d ./build ]; then
mkdir -m 777 -p -v build
fi
cd ./build
$CMAKE $cmake_args .. > /dev/null
ret=$?;[[ $ret -ne 0 ]] && return $ret
......
......@@ -18,12 +18,46 @@
# For more information about the OpenAirInterface (OAI) Software Alliance:
# contact@openairinterface.org
################################################################################
S-GW =
S-GW =
{
INSTANCE = @INSTANCE@; # 0 is the default
PID_DIRECTORY = "@PID_DIRECTORY@"; # /var/run is the default
INTERFACES :
ITTI_TASKS :
{
ITTI_TIMER_SCHED_PARAMS :
{
CPU_ID = 1;
SCHED_POLICY = "SCHED_FIFO"; # Values in { SCHED_OTHER, SCHED_IDLE, SCHED_BATCH, SCHED_FIFO, SCHED_RR }
SCHED_PRIORITY = 85;
};
S11_SCHED_PARAMS :
{
CPU_ID = 1;
SCHED_POLICY = "SCHED_FIFO"; # Values in { SCHED_OTHER, SCHED_IDLE, SCHED_BATCH, SCHED_FIFO, SCHED_RR }
SCHED_PRIORITY = 84;
};
S5S8_SCHED_PARAMS :
{
CPU_ID = 1;
SCHED_POLICY = "SCHED_FIFO"; # Values in { SCHED_OTHER, SCHED_IDLE, SCHED_BATCH, SCHED_FIFO, SCHED_RR }
SCHED_PRIORITY = 84;
};
SX_SCHED_PARAMS :
{
CPU_ID = 1;
SCHED_POLICY = "SCHED_FIFO"; # Values in { SCHED_OTHER, SCHED_IDLE, SCHED_BATCH, SCHED_FIFO, SCHED_RR }
SCHED_PRIORITY = 84;
};
ASYNC_CMD_SCHED_PARAMS :
{
CPU_ID = 1;
SCHED_POLICY = "SCHED_FIFO"; # Values in { SCHED_OTHER, SCHED_IDLE, SCHED_BATCH, SCHED_FIFO, SCHED_RR }
SCHED_PRIORITY = 84;
};
};
INTERFACES :
{
S11_CP :
{
......@@ -31,6 +65,12 @@ S-GW =
INTERFACE_NAME = "@SGW_INTERFACE_NAME_FOR_S11@"; # STRING, interface name, YOUR NETWORK CONFIG HERE
IPV4_ADDRESS = "read"; # STRING, CIDR or read to let app read interface configured IP address, YOUR NETWORK CONFIG HERE
PORT = 2123; # INTEGER, port number, PREFER NOT CHANGE UNLESS YOU KNOW WHAT YOU ARE DOING
SCHED_PARAMS : # SCHEADULING PARAMS OF THE LOOPING RECEIVER THREAD BOUND TO THIS INTERFACE/PROTOCOL
{
CPU_ID = 1;
SCHED_POLICY = "SCHED_FIFO"; # Values in { SCHED_OTHER, SCHED_IDLE, SCHED_BATCH, SCHED_FIFO, SCHED_RR }
SCHED_PRIORITY = 95;
};
};
S5_S8_CP :
{
......@@ -38,16 +78,22 @@ S-GW =
INTERFACE_NAME = "@SGW_INTERFACE_NAME_FOR_S5_S8_CP@"; # STRING, interface name
IPV4_ADDRESS = "read"; # STRING, CIDR or read to let app read interface configured IP address
PORT = 2123;
SCHED_PARAMS : # SCHEADULING PARAMS OF THE LOOPING RECEIVER THREAD BOUND TO THIS INTERFACE/PROTOCOL
{
CPU_ID = 1;
SCHED_POLICY = "SCHED_FIFO"; # Values in { SCHED_OTHER, SCHED_IDLE, SCHED_BATCH, SCHED_FIFO, SCHED_RR }
SCHED_PRIORITY = 95;
};
};
};
};
P-GW =
P-GW =
{
INSTANCE = @INSTANCE@; # 0 is the default
PID_DIRECTORY = "@PID_DIRECTORY@"; # /var/run is the default
INTERFACES :
INTERFACES :
{
S5_S8_CP :
{
......@@ -55,6 +101,12 @@ P-GW =
INTERFACE_NAME = "@PGW_INTERFACE_NAME_FOR_S5_S8_CP@"; # STRING, interface name
IPV4_ADDRESS = "read"; # STRING, CIDR or read to let app read interface configured IP address
PORT = 2123;
SCHED_PARAMS : # SCHEADULING PARAMS OF THE LOOPING RECEIVER THREAD BOUND TO THIS INTERFACE/PROTOCOL
{
CPU_ID = 1;
SCHED_POLICY = "SCHED_FIFO"; # Values in { SCHED_OTHER, SCHED_IDLE, SCHED_BATCH, SCHED_FIFO, SCHED_RR }
SCHED_PRIORITY = 95;
};
};
SX :
{
......@@ -62,10 +114,16 @@ P-GW =
INTERFACE_NAME = "@PGW_INTERFACE_NAME_FOR_SX@"; # STRING, interface name
IPV4_ADDRESS = "read"; # STRING, CIDR or read to let app read interface configured IP address
PORT = 8805;
SCHED_PARAMS : # SCHEADULING PARAMS OF THE LOOPING RECEIVER THREAD BOUND TO THIS INTERFACE/PROTOCOL
{
CPU_ID = 1;
SCHED_POLICY = "SCHED_FIFO"; # Values in { SCHED_OTHER, SCHED_IDLE, SCHED_BATCH, SCHED_FIFO, SCHED_RR }
SCHED_PRIORITY = 95;
};
};
};
# Pool of UE assigned IP addresses
# Do not make IP pools overlap
# first IPv4 address X.Y.Z.1 is reserved for GTP network device on SPGW
......@@ -88,16 +146,16 @@ P-GW =
{PREFIX = "4001:1:2::/64";} # STRING, IPv6 prefix, YOUR NETWORK CONFIG HERE.
);
};
APN_LIST = (
# IPV4_POOL, IPV6_POOL are index in IPV4_LIST, IPV6_LIST, PDN_TYPE choice in {IPv4, IPv6, IPv4v6}
{APN_NI = "default"; PDN_TYPE = "IPv4"; IPV4_POOL = 0; IPV6_POOL = -1; SNAT = "no"},
{APN_NI = "default"; PDN_TYPE = "IPv4"; IPV4_POOL = 0; IPV6_POOL = -1; SNAT = "no"},
{APN_NI = "apn1"; PDN_TYPE = "IPv4"; IPV4_POOL = 1; IPV6_POOL = -1; SNAT = "no"},
{APN_NI = "apn2"; PDN_TYPE = "IPv4"; IPV4_POOL = 2; IPV6_POOL = -1; SNAT = "no"},
{APN_NI = "apn3"; PDN_TYPE = "IPv4"; IPV4_POOL = 3; IPV6_POOL = -1; SNAT = "no"},
{APN_NI = "apn2"; PDN_TYPE = "IPv4"; IPV4_POOL = 4; IPV6_POOL = -1; SNAT = "no"}
);
# DNS address communicated to UEs
DEFAULT_DNS_IPV4_ADDRESS = "@DEFAULT_DNS_IPV4_ADDRESS@"; # YOUR NETWORK CONFIG HERE
DEFAULT_DNS_SEC_IPV4_ADDRESS = "@DEFAULT_DNS_SEC_IPV4_ADDRESS@"; # YOUR NETWORK CONFIG HERE
......@@ -105,8 +163,8 @@ P-GW =
DEFAULT_DNS_SEC_IPV6_ADDRESS = "2001:4860:4860::8844"; # FFU
# Non standard feature, normally should be set to "no", but you may need to set to yes for UE that do not explicitly request a PDN address through NAS signalling
FORCE_PUSH_PROTOCOL_CONFIGURATION_OPTIONS = "no"; # STRING, {"yes", "no"}.
FORCE_PUSH_PROTOCOL_CONFIGURATION_OPTIONS = "no"; # STRING, {"yes", "no"}.
PCEF :
{
# Waiting for HSS APN-AMBR IE ...
......
......@@ -28,408 +28,4 @@
#ifndef FILE_3GPP_23_003_SEEN
#define FILE_3GPP_23_003_SEEN
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
//==============================================================================
// 12 Identification of PLMN, RNC, Service Area, CN domain and Shared Network Area
//==============================================================================
//------------------------------------------------------------------------------
// 12.1 PLMN Identifier
//------------------------------------------------------------------------------
/*
* A Public Land Mobile Network is uniquely identified by its PLMN identifier. PLMN-Id consists of Mobile Country Code (MCC) and Mobile Network Code (MNC).
*/
/*
* Public Land Mobile Network identifier
* PLMN = BCD encoding (Mobile Country Code + Mobile Network Code)
*/
/*! \struct plmn_t
* \brief Public Land Mobile Network identifier.
* PLMN = BCD encoding (Mobile Country Code + Mobile Network Code).
*/
typedef struct plmn_s {
uint8_t mcc_digit2:4;
uint8_t mcc_digit1:4;
uint8_t mnc_digit3:4;
uint8_t mcc_digit3:4;
uint8_t mnc_digit2:4;
uint8_t mnc_digit1:4;
} plmn_t;
//------------------------------------------------------------------------------
// 12.2 CN Domain Identifier
// 12.3 CN Identifier
// 12.4 RNC Identifier
// 12.5 Service Area Identifier
// 12.6 Shared Network Area Identifier
//------------------------------------------------------------------------------
//==============================================================================
// 2 Identification of mobile subscribers
//==============================================================================
//------------------------------------------------------------------------------
// 2.2 Composition of IMSI
//------------------------------------------------------------------------------
/*! \struct imsi_t
* \brief Structure containing an IMSI, BCD structure.
*/
typedef struct imsi_s {
union {
struct {
uint8_t digit2:4;
uint8_t digit1:4;
uint8_t digit4:4;
uint8_t digit3:4;
uint8_t digit6:4;
uint8_t digit5:4;
uint8_t digit8:4;
uint8_t digit7:4;
uint8_t digit10:4;
uint8_t digit9:4;
uint8_t digit12:4;
uint8_t digit11:4;
uint8_t digit14:4;
uint8_t digit13:4;
#define EVEN_PARITY 0
#define ODD_PARITY 1
uint8_t parity:4;
uint8_t digit15:4;
} num; /*!< \brief IMSI shall consist of decimal digits (0 through 9) only.*/
#define IMSI_BCD8_SIZE 8 /*!< \brief The number of digits in IMSI shall not exceed 15. */
uint8_t value[IMSI_BCD8_SIZE];
} u;
uint8_t length;
} imsi_t;
#define IMSI_BCD_DIGITS_MAX 15
//------------------------------------------------------------------------------
// 2.4 Structure of TMSI
//------------------------------------------------------------------------------
#define TMSI_SIZE 4
typedef uint32_t tmsi_t; /*!< \brief Since the TMSI has only local significance (i.e. within a VLR and the area controlled by a VLR,
or within an SGSN and the area controlled by an SGSN, or within an MME and the area controlled by an MME),
the structure and coding of it can be chosen by agreement between operator and manufacturer in order to meet local needs.
The TMSI consists of 4 octets. It can be coded using a full hexadecimal representation. */
#define INVALID_TMSI UINT32_MAX /*!< \brief The network shall not allocate a TMSI with all 32 bits equal to 1
(this is because the TMSI must be stored in the SIM, and the SIM uses 4 octets with all bits
equal to 1 to indicate that no valid TMSI is available). */
// 2.5 Structure of LMSI
// 2.6 Structure of TLLI
// 2.7 Structure of P-TMSI Signature
//------------------------------------------------------------------------------
// 2.8 Globally Unique Temporary UE Identity (GUTI)
//------------------------------------------------------------------------------
#define INVALID_M_TMSI UINT32_MAX /*!< \brief The network shall not allocate a TMSI with all 32 bits equal to 1
(this is because the TMSI must be stored in the SIM, and the SIM uses 4 octets with all bits
equal to 1 to indicate that no valid TMSI is available). */
typedef uint16_t mme_gid_t; /*!< \brief MME Group ID shall be of 16 bits length. */
typedef uint8_t mme_code_t; /*!< \brief MME Code shall be of 8 bits length. */
/*! \struct gummei_t
* \brief Structure containing the Globally Unique MME Identity.
*/
typedef struct gummei_s {
plmn_t plmn; /*!< \brief GUMMEI */
mme_gid_t mme_gid; /*!< \brief MME group identifier */
mme_code_t mme_code; /*!< \brief MME code */
} gummei_t;
/*! \struct guti_t
* \brief Structure containing the Globally Unique Temporary UE Identity.
*/
typedef struct guti_s {
gummei_t gummei; /*!< \brief Globally Unique MME Identity */
tmsi_t m_tmsi; /*!< \brief M-Temporary Mobile Subscriber Identity */
} guti_t;
// 2.9 Structure of the S-Temporary Mobile Subscriber Identity (S-TMSI)
/*! \struct s_tmsi_t
* \brief Structure of the S-Temporary Mobile Subscriber Identity (S-TMSI).
*/
typedef struct s_tmsi_s {
mme_code_t mme_code; /* MME code that allocated the GUTI */
tmsi_t m_tmsi; /* M-Temporary Mobile Subscriber Identity */
} s_tmsi_t;
//==============================================================================
// 3 Numbering plan for mobile stations
//==============================================================================
//------------------------------------------------------------------------------
// 3.3 Structure of MS international PSTN/ISDN number (MSISDN)
//------------------------------------------------------------------------------
/*! \struct msisdn_t
* \brief MS international PSTN/ISDN number (MSISDN).
*/
typedef struct msisdn_s {
uint8_t ext:1;
/* Type Of Number */
#define MSISDN_TON_UNKNOWKN 0b000
#define MSISDN_TON_INTERNATIONAL 0b001
#define MSISDN_TON_NATIONAL 0b010
#define MSISDN_TON_NETWORK 0b011
#define MSISDN_TON_SUBCRIBER 0b100
#define MSISDN_TON_ABBREVIATED 0b110
#define MSISDN_TON_RESERVED 0b111
uint8_t ton:3;
/* Numbering Plan Identification */
#define MSISDN_NPI_UNKNOWN 0b0000
#define MSISDN_NPI_ISDN_TELEPHONY 0b0001
#define MSISDN_NPI_GENERIC 0b0010
#define MSISDN_NPI_DATA 0b0011
#define MSISDN_NPI_TELEX 0b0100
#define MSISDN_NPI_MARITIME_MOBILE 0b0101
#define MSISDN_NPI_LAND_MOBILE 0b0110
#define MSISDN_NPI_ISDN_MOBILE 0b0111
#define MSISDN_NPI_PRIVATE 0b1110
#define MSISDN_NPI_RESERVED 0b1111
uint8_t npi:4;
/* Dialing Number */
struct {
uint8_t lsb:4;
uint8_t msb:4;
#define MSISDN_DIGIT_SIZE 10
} digit[MSISDN_DIGIT_SIZE];
} msisdn_t;
// 3.4 Mobile Station Roaming Number (MSRN) for PSTN/ISDN routeing
// 3.5 Structure of Mobile Station International Data Number
// 3.6 Handover Number
// 3.7 Structure of an IP v4 address
// 3.8 Structure of an IP v6 address
//==============================================================================
// 4 Identification of location areas and base stations
//==============================================================================
//------------------------------------------------------------------------------
// 4.1 Composition of the Location Area Identification (LAI)
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// 4.2 Composition of the Routing Area Identification (RAI)
//------------------------------------------------------------------------------
// 4.3 Base station identification
// 4.3.1 Cell Identity (CI) and Cell Global Identification (CGI)
// 4.3.2 Base Station Identify Code (BSIC)
// 4.4 Regional Subscription Zone Identity (RSZI)
// 4.5 Location Number
// 4.6 Composition of the Service Area Identification (SAI)
//------------------------------------------------------------------------------
// 4.7 Closed Subscriber Group
//------------------------------------------------------------------------------
typedef uint32_t csg_id_t; /*!< \brief The CSG‑ID shall be fix length 27 bit value. */
// 4.8 HNB Name
// 4.9 CSG Type
// 4.10 HNB Unique Identity
// 5 Identification of MSCs, GSNs and location registers
//==============================================================================
// 6 International Mobile Station Equipment Identity and Software Version Number
//==============================================================================
//------------------------------------------------------------------------------
// 6.2.1 Composition of IMEI
//------------------------------------------------------------------------------
/*! \struct imei_t
* \brief Structure containing an International Mobile station Equipment Identity, BCD structure.
* The IMEI is composed of the following elements (each element shall consist of decimal digits only):
* - Type Allocation Code (TAC). Its length is 8 digits;
* - Serial Number (SNR) is an individual serial number uniquely identifying each equipment within the TAC. Its length is 6 digits;
* - Check Digit (CD) / Spare Digit (SD): If this is the Check Digit see paragraph below; if this digit is Spare Digit it shall be
* set to zero, when transmitted by the MS.
*
* The IMEI (14 digits) is complemented by a Check Digit (CD). The Check Digit is not part of the digits transmitted when
* the IMEI is checked, as described below. The Check Digit is intended to avoid manual transmission errors, e.g. when customers
* register stolen MEs at the operator's customer care desk. The Check Digit is defined according to the Luhn formula, as defined in annex B.
*
* NOTE: The Check Digit is not applied to the Software Version Number.
*/
typedef struct imei_s {
uint8_t length;
union {
struct {
uint8_t tac2:4;
uint8_t tac1:4;
uint8_t tac4:4;
uint8_t tac3:4;
uint8_t tac6:4;
uint8_t tac5:4;
uint8_t tac8:4;
uint8_t tac7:4;
uint8_t snr2:4;
uint8_t snr1:4;
uint8_t snr4:4;
uint8_t snr3:4;
uint8_t snr6:4;
uint8_t snr5:4;
#define EVEN_PARITY 0
#define ODD_PARITY 1
uint8_t parity:4;
uint8_t cdsd:4;
} num;
#define IMEI_BCD8_SIZE 8
uint8_t value[IMEI_BCD8_SIZE];
} u;
} imei_t;
//------------------------------------------------------------------------------
// 6.2.2 Composition of IMEISV
//------------------------------------------------------------------------------
/*! \struct imeisv_t
* \brief Structure containing an International Mobile station Equipment Identity, BCD structure.
* The IMEISV is composed of the following elements (each element shall consist of decimal digits only):
* - Type Allocation Code (TAC). Its length is 8 digits;
* - Serial Number (SNR) is an individual serial number uniquely identifying each equipment within each TAC. Its length is 6 digits;
* - Software Version Number (SVN) identifies the software version number of the mobile equipment. Its length is 2 digits.
* Regarding updates of the IMEISV: The security requirements of 3GPP TS 22.016 [32] apply only to the TAC and SNR, but not to the SVN part of the IMEISV.
*/
typedef struct imeisv_s {
uint8_t length;
union {
struct {
uint8_t tac2:4;
uint8_t tac1:4;
uint8_t tac4:4;
uint8_t tac3:4;
uint8_t tac6:4;
uint8_t tac5:4;
uint8_t tac8:4;
uint8_t tac7:4;
uint8_t snr2:4;
uint8_t snr1:4;
uint8_t snr4:4;
uint8_t snr3:4;
uint8_t snr6:4;
uint8_t snr5:4;
uint8_t svn2:4;
uint8_t svn1:4;
#define EVEN_PARITY 0
#define ODD_PARITY 1
uint8_t parity:4;
} num;
#define IMEISV_BCD8_SIZE 9
uint8_t value[IMEISV_BCD8_SIZE];
} u;
} imeisv_t;
// 7 Identification of Voice Group Call and Voice Broadcast Call Entities
// 8 SCCP subsystem numbers
//==============================================================================
//9 Definition of Access Point Name
//==============================================================================
// TODO
// 10 Identification of the Cordless Telephony System entities
// 11 Identification of Localised Service Area
// 12 -> section moved to the top of this file.
// 13 Numbering, addressing and identification within the IP multimedia core network subsystem
// 14 Numbering, addressing and identification for 3GPP System to WLAN Interworking
// 15 Identification of Multimedia Broadcast/Multicast Service
// 15.2 Structure of TMGI
// TODO NAS ?
// 15.3 Str