commonDef.h 10.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
/*
 * Copyright (c) 2015, EURECOM (www.eurecom.fr)
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice, this
 *    list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * The views and conclusions contained in the software and documentation are those
 * of the authors and should not be interpreted as representing official policies,
 * either expressed or implied, of the FreeBSD Project.
 */
29
/*
Cedric Roux's avatar
 
Cedric Roux committed
30

31
Source      commonDef.h
Cedric Roux's avatar
 
Cedric Roux committed
32

33
Version     0.1
Cedric Roux's avatar
 
Cedric Roux committed
34

35
Date        2012/02/27
Cedric Roux's avatar
 
Cedric Roux committed
36

37
Product     NAS stack
Cedric Roux's avatar
 
Cedric Roux committed
38

39
Subsystem   include
Cedric Roux's avatar
 
Cedric Roux committed
40

41
Author      Frederic Maurel
Cedric Roux's avatar
 
Cedric Roux committed
42

43
Description Contains global common definitions
Cedric Roux's avatar
 
Cedric Roux committed
44 45 46 47 48 49 50

*****************************************************************************/
#ifndef __COMMONDEF_H__
#define __COMMONDEF_H__

#include <stdint.h>
#include <stddef.h>
51
#include <stdbool.h>
Cedric Roux's avatar
 
Cedric Roux committed
52

53 54 55 56 57 58 59 60 61 62 63
typedef signed char        boolean_t;

#if !defined(TRUE)
#define TRUE               (boolean_t)0x01
#endif

#if !defined(FALSE)
#define FALSE              (boolean_t)0x00
#endif

#define BOOL_NOT(b) (b^TRUE)
64 65 66

#define NAS_UE_ID_FMT "0x%06x"

Cedric Roux's avatar
 
Cedric Roux committed
67 68 69 70
/****************************************************************************/
/*********************  G L O B A L    C O N S T A N T S  *******************/
/****************************************************************************/

71 72
#define RETURNok        (0)
#define RETURNerror     (-1)
Cedric Roux's avatar
 
Cedric Roux committed
73 74 75 76 77 78

/*
 * Name of the environment variable which defines the default directory
 * where the NAS application is executed and where are located files
 * where non-volatile data are stored
 */
79
#define DEFAULT_NAS_PATH    "PWD"
Cedric Roux's avatar
 
Cedric Roux committed
80 81 82 83 84 85 86

/****************************************************************************/
/************************  G L O B A L    T Y P E S  ************************/
/****************************************************************************/

/*
-----------------------------------------------------------------------------
87
            Standard data type definitions
Cedric Roux's avatar
 
Cedric Roux committed
88 89
-----------------------------------------------------------------------------
*/
90
typedef int8_t      SByte_t;    /* 8 bit  signed integer     */
91
typedef uint8_t     Byte_t;     /* 8 bit unsigned integer   */
92

Cedric Roux's avatar
 
Cedric Roux committed
93 94 95

/*
-----------------------------------------------------------------------------
96
            Common NAS data type definitions
Cedric Roux's avatar
 
Cedric Roux committed
97 98 99
-----------------------------------------------------------------------------
*/

100 101 102 103 104 105
typedef uint8_t     Stat_t;     /* Registration status  */
typedef uint16_t    lac_t;      /* Location Area Code   */
typedef uint8_t     rac_t;      /* Routing Area Code    */
typedef uint16_t    tac_t;      /* Tracking Area Code   */
typedef uint32_t    ci_t;       /* Cell Identifier  */
typedef uint8_t     AcT_t;      /* Access Technology    */
Cedric Roux's avatar
 
Cedric Roux committed
106 107 108 109 110

/*
 * International Mobile Subscriber Identity
 */
typedef struct {
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
  Byte_t length;
  union {
    struct {
      Byte_t digit2:4;
      Byte_t digit1:4;
      Byte_t digit4:4;
      Byte_t digit3:4;
      Byte_t digit6:4;
      Byte_t digit5:4;
      Byte_t digit8:4;
      Byte_t digit7:4;
      Byte_t digit10:4;
      Byte_t digit9:4;
      Byte_t digit12:4;
      Byte_t digit11:4;
      Byte_t digit14:4;
      Byte_t digit13:4;
128 129
#define EVEN_PARITY 0
#define ODD_PARITY  1
130 131 132
      Byte_t parity:4;
      Byte_t digit15:4;
    } num;
133
#define IMSI_SIZE   8
134 135
    Byte_t value[IMSI_SIZE];
  } u;
Cedric Roux's avatar
 
Cedric Roux committed
136 137
} imsi_t;

138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
#define NAS_IMSI2STR(iMsI_t_PtR,iMsI_sTr, MaXlEn) \
        {\
          int l_offset = 0;\
          int l_ret    = 0;\
          l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u%u%u%u%u",\
	    		  iMsI_t_PtR->u.num.digit1, iMsI_t_PtR->u.num.digit2,\
	    		  iMsI_t_PtR->u.num.digit3, iMsI_t_PtR->u.num.digit4,\
	    		  iMsI_t_PtR->u.num.digit5);\
	      if ((iMsI_t_PtR->u.num.digit6 != 0xf)  && (l_ret > 0)) {\
	    	l_offset += l_ret;\
	    	l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset,  "%u", iMsI_t_PtR->u.num.digit6);\
	      }\
	      if (l_ret > 0) {\
	    	l_offset += l_ret;\
	    	l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u%u%u%u%u%u%u%u",\
	    		  iMsI_t_PtR->u.num.digit7, iMsI_t_PtR->u.num.digit8,\
	    		  iMsI_t_PtR->u.num.digit9, iMsI_t_PtR->u.num.digit10,\
	    		  iMsI_t_PtR->u.num.digit11, iMsI_t_PtR->u.num.digit12,\
	    		  iMsI_t_PtR->u.num.digit13, iMsI_t_PtR->u.num.digit14);\
	      }\
	      if ((iMsI_t_PtR->u.num.digit15 != 0xf)   && (l_ret > 0)) {\
	    	l_offset += l_ret;\
	    	l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u", iMsI_t_PtR->u.num.digit15);\
	      }\
	    }

Cedric Roux's avatar
 
Cedric Roux committed
164 165 166 167
/*
 * Mobile subscriber dialing number
 */
typedef struct {
168 169
  Byte_t ext:1;
  /* Type Of Number           */
170 171 172 173 174 175 176
#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
177 178
  Byte_t ton:3;
  /* Numbering Plan Identification    */
179 180 181 182 183 184 185 186 187 188
#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
189 190 191 192 193
  Byte_t npi:4;
  /* Dialing Number           */
  struct {
    Byte_t lsb:4;
    Byte_t msb:4;
194
#define MSISDN_DIGIT_SIZE   10
195
  } digit[MSISDN_DIGIT_SIZE];
Cedric Roux's avatar
 
Cedric Roux committed
196 197 198 199 200 201 202 203 204 205 206 207
} msisdn_t;

/*
 * International Mobile Equipment Identity
 */
typedef imsi_t imei_t;

/*
 * Public Land Mobile Network identifier
 * PLMN = BCD encoding (Mobile Country Code + Mobile Network Code)
 */
typedef struct {
208 209 210 211 212 213
  Byte_t MCCdigit2:4;
  Byte_t MCCdigit1:4;
  Byte_t MNCdigit3:4;
  Byte_t MCCdigit3:4;
  Byte_t MNCdigit2:4;
  Byte_t MNCdigit1:4;
Cedric Roux's avatar
 
Cedric Roux committed
214 215 216 217 218 219
} plmn_t;

/*
 * Location Area Identification
 */
typedef struct {
220 221
  plmn_t plmn;    /* <MCC> + <MNC>    */
  lac_t lac;      /* Location Area Code   */
Cedric Roux's avatar
 
Cedric Roux committed
222 223 224 225 226 227
} lai_t;

/*
 * GPRS Routing Area Identification
 */
typedef struct {
228 229 230
  plmn_t plmn;    /* <MCC> + <MNC>    */
  lac_t lac;      /* Location Area Code   */
  rac_t rac;      /* Routing Area Code    */
Cedric Roux's avatar
 
Cedric Roux committed
231 232 233 234 235 236
} RAI_t;

/*
 * EPS Tracking Area Identification
 */
typedef struct {
237 238
  plmn_t plmn;    /* <MCC> + <MNC>    */
  tac_t tac;      /* Tracking Area Code   */
Cedric Roux's avatar
 
Cedric Roux committed
239 240 241 242 243 244
} tai_t;

/*
 * EPS Globally Unique MME Identity
 */
typedef struct {
245
  plmn_t plmn;    /* <MCC> + <MNC>    */
246 247
  uint16_t MMEgid;    /* MME group identifier */
  uint8_t MMEcode;    /* MME code     */
Cedric Roux's avatar
 
Cedric Roux committed
248 249 250 251 252 253
} gummei_t;

/*
 * EPS Globally Unique Temporary UE Identity
 */
typedef struct {
254
  gummei_t gummei;    /* Globally Unique MME Identity         */
255
  uint32_t m_tmsi;    /* M-Temporary Mobile Subscriber Identity   */
Cedric Roux's avatar
 
Cedric Roux committed
256
} GUTI_t;
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284
#define GUTI2STR(GuTi_PtR, GuTi_StR, MaXlEn) \
        {\
          int l_offset = 0;\
          int l_ret    = 0;\
          l_ret += snprintf(GuTi_StR + l_offset,MaXlEn-l_offset, "%03u.",\
	    		  GuTi_PtR->gummei.plmn.MCCdigit3 * 100 +\
                  GuTi_PtR->gummei.plmn.MCCdigit2 * 10 +\
                  GuTi_PtR->gummei.plmn.MCCdigit1);\
          if (l_ret > 0) {\
        	l_offset += l_ret;\
          }  else {\
        	l_offset = MaXlEn;\
          }\
          if (GuTi_PtR->gummei.plmn.MNCdigit1 != 0xf) {\
              l_ret += snprintf(GuTi_StR + l_offset,MaXlEn-l_offset, "%03u|%04x|%02x|%08x",\
    	    		  GuTi_PtR->gummei.plmn.MNCdigit3 * 100 +\
                      GuTi_PtR->gummei.plmn.MNCdigit2 * 10 +\
                      GuTi_PtR->gummei.plmn.MNCdigit1,\
                      GuTi_PtR->gummei.MMEgid,\
                      GuTi_PtR->gummei.MMEcode,\
                      GuTi_PtR->m_tmsi);\
          } else {\
              l_ret += snprintf(GuTi_StR + l_offset,MaXlEn-l_offset, "%02u|%04x|%02x|%08x",\
                      GuTi_PtR->gummei.plmn.MNCdigit2 * 10 +\
                      GuTi_PtR->gummei.plmn.MNCdigit1,\
                      GuTi_PtR->gummei.MMEgid,\
                      GuTi_PtR->gummei.MMEcode,\
                      GuTi_PtR->m_tmsi);\
Lionel Gauthier's avatar
typo  
Lionel Gauthier committed
285
          }\
286 287 288
	    }


Lionel Gauthier's avatar
typo  
Lionel Gauthier committed
289 290


Cedric Roux's avatar
 
Cedric Roux committed
291
/* Checks PLMN validity */
292 293 294
#define PLMN_IS_VALID(plmn) (((plmn).MCCdigit1 &    \
                              (plmn).MCCdigit2 &    \
                              (plmn).MCCdigit3) != 0x0F)
Cedric Roux's avatar
 
Cedric Roux committed
295 296

/* Checks TAC validity */
297
#define TAC_IS_VALID(tac)   (((tac) != 0x0000) && ((tac) != 0xFFF0))
Cedric Roux's avatar
 
Cedric Roux committed
298 299

/* Checks TAI validity */
300 301
#define TAI_IS_VALID(tai)   (PLMN_IS_VALID((tai).plmn) &&   \
                             TAC_IS_VALID((tai).tac))
Cedric Roux's avatar
 
Cedric Roux committed
302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322
/*
 * A list of PLMNs
 */
#define PLMN_LIST_T(SIZE) struct {Byte_t n_plmns; plmn_t plmn[SIZE];}

/*
 * A list of TACs
 */
#define TAC_LIST_T(SIZE) struct {Byte_t n_tacs; TAC_t tac[SIZE];}

/*
 * A list of TAIs
 */
#define TAI_LIST_T(SIZE) struct {Byte_t n_tais; tai_t tai[SIZE];}

/*
 * User notification callback, executed whenever a change of data with
 * respect of network information (e.g. network registration and/or
 * location change, new PLMN becomes available) is notified by the
 * EPS Mobility Management sublayer
 */
323
typedef int (*emm_indication_callback_t) (Stat_t, tac_t, ci_t, AcT_t,
324
    const char*, size_t);
Cedric Roux's avatar
 
Cedric Roux committed
325

winckel's avatar
winckel committed
326
typedef enum eps_protocol_discriminator_e {
327 328
  /* Protocol discriminator identifier for EPS Mobility Management */
  EPS_MOBILITY_MANAGEMENT_MESSAGE =   0x7,
winckel's avatar
winckel committed
329

330 331
  /* Protocol discriminator identifier for EPS Session Management */
  EPS_SESSION_MANAGEMENT_MESSAGE =    0x2,
winckel's avatar
winckel committed
332 333
} eps_protocol_discriminator_t;

Cedric Roux's avatar
 
Cedric Roux committed
334 335 336 337 338 339 340 341 342
/****************************************************************************/
/********************  G L O B A L    V A R I A B L E S  ********************/
/****************************************************************************/

/****************************************************************************/
/******************  E X P O R T E D    F U N C T I O N S  ******************/
/****************************************************************************/

#endif /* __COMMONDEF_H__*/