l2_message.h 11.2 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.
 */
gauthier's avatar
 
gauthier committed
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*****************************************************************************

Source    as_message.h

Version   0.1

Date    2012/10/18

Product   NAS stack

Subsystem Application Programming Interface

Author    Frederic Maurel

Description Defines the messages supported by the Access Stratum sublayer
    protocol (usually RRC and S1AP for E-UTRAN) and functions used
    to encode and decode

*****************************************************************************/
#ifndef __AS_MESSAGE_H__
#define __AS_MESSAGE_H__

#include "commonDef.h"
#include "networkDef.h"

/****************************************************************************/
/*********************  G L O B A L    C O N S T A N T S  *******************/
/****************************************************************************/

/* Access Stratum Message types */
#define AS_REQUEST  0x0100
#define AS_RESPONSE 0x0200
#define AS_INDICATION 0x0400
#define AS_CONFIRM  0x0800

/*
 * Access Stratum Message identifiers
 * ----------------------------------
 */

/* Cell information relevant for cell selection processing */
#define AS_CELL_INFO      0x01
#define AS_CELL_INFO_REQ    (AS_CELL_INFO | AS_REQUEST)
#define AS_CELL_INFO_RSP    (AS_CELL_INFO | AS_RESPONSE)
#define AS_CELL_INFO_IND    (AS_CELL_INFO | AS_INDICATION)

/* Security mode control */
#define AS_SECURITY     0x02
#define AS_SECURITY_REQ     (AS_SECURITY | AS_REQUEST)
#define AS_SECURITY_RSP     (AS_SECURITY | AS_RESPONSE)

/* Paging information */
#define AS_PAGING     0x03
#define AS_PAGING_IND     (AS_PAGING | AS_INDICATION)

/* NAS signalling connection establishment */
#define AS_NAS_ESTABLISH    0x04
#define AS_NAS_ESTABLISH_REQ    (AS_NAS_ESTABLISH | AS_REQUEST)
#define AS_NAS_ESTABLISH_RSP    (AS_NAS_ESTABLISH | AS_RESPONSE)

/* NAS signalling connection release */
#define AS_NAS_RELEASE      0x05
#define AS_NAS_RELEASE_REQ    (AS_NAS_RELEASE | AS_REQUEST)
#define AS_NAS_RELEASE_IND    (AS_NAS_RELEASE | AS_INDICATION)

/* NAS information transfer */
#define AS_INFO_TRANSFER    0x10
#define AS_UL_INFO_TRANSFER   (AS_INFO_TRANSFER | AS_REQUEST)
#define AS_DL_INFO_TRANSFER   (AS_INFO_TRANSFER | AS_INDICATION)

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

/*
 * --------------------------------------------------------------------------
 *      Available PLMNs and cell Information
 * --------------------------------------------------------------------------
 */

/* Radio access technologies supported by the network */
#define AS_GSM        (1 << NET_ACCESS_GSM)
#define AS_COMPACT      (1 << NET_ACCESS_COMPACT)
#define AS_UTRAN      (1 << NET_ACCESS_UTRAN)
#define AS_EGPRS      (1 << NET_ACCESS_EGPRS)
#define AS_HSDPA      (1 << NET_ACCESS_HSDPA)
#define AS_HSUPA      (1 << NET_ACCESS_HSUPA)
#define AS_HSDUPA     (1 << NET_ACCESS_HSDUPA)
#define AS_EUTRAN     (1 << NET_ACCESS_EUTRAN)

119
120
121
122
123
124
125
126
/*
 * NAS->AS -K_eNB refresh request
 * NAS request AS to refresh its KeNB key
 */
typedef struct kenb_refresh_req_s {
  Byte_t kenb[32];
} kenb_refresh_req_t;

gauthier's avatar
 
gauthier committed
127
128
129
130
131
132
133
134
135
136
137
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
/*
 * NAS->AS - Cell Information request
 * NAS request AS to search for a suitable cell belonging to the selected
 * PLMN to camp on.
 */
typedef struct {
  plmn_t plmnID;  /* PLMN identifier         */
  Byte_t rat;   /* Bitmap - set of radio access technologies   */
} cell_info_req_t;

/*
 * AS->NAS - Cell Information response
 * AS search for a suitable cell and respond to NAS. If found, the cell
 * is selected to camp on.
 */
typedef struct {
  plmn_t plmnID;  /* PLMN identifier          */
  TAC_t tac;    /* identifies a tracking area the PLMN belongs to */
  CI_t cellID;  /* identifies a cell within a PLMN      */
  AcT_t rat;    /* radio access technology supported by the cell  */
} cell_info_rsp_t;

/*
 * AS->NAS - Cell Information indication
 * AS Reports available PLMNs with associated Radio Access Technologies
 * to NAS on request from NAS or autonomously.
 */
typedef struct {
#define PLMN_LIST_MAX_SIZE  6
  PLMN_LIST_T(PLMN_LIST_MAX_SIZE) plmnIDs; /* List of PLMN identifiers */
  Byte_t rat[PLMN_LIST_MAX_SIZE]; /* Radio access technologies   */
  TAC_t tac; /* identifies a tracking area within a scope of PLMNs   */
  CI_t cellID;  /* identifies a cell within a PLMN     */
} cell_info_ind_t;

/*
 * --------------------------------------------------------------------------
 *        Security mode control
 * --------------------------------------------------------------------------
 */

/*
 * TODO: NAS->AS - Security command request
 */
typedef struct {} security_req_t;


/*
 * TODO: AS->NAS - Security command response
 */
typedef struct {} security_rsp_t;


/*
 * --------------------------------------------------------------------------
 *        Paging information
 * --------------------------------------------------------------------------
 */

/*
 * TODO: AS->NAS - Paging Information indication
 */
typedef struct {} paging_ind_t;

/*
 * --------------------------------------------------------------------------
 *      NAS signalling connection establishment
 * --------------------------------------------------------------------------
 */

/* Cause of RRC connection establishment */
#define AS_CAUSE_EMERGENCY    (NET_ESTABLISH_CAUSE_EMERGENCY)
#define AS_CAUSE_HIGH_PRIO    (NET_ESTABLISH_CAUSE_HIGH_PRIO)
#define AS_CAUSE_MT_ACCESS    (NET_ESTABLISH_CAUSE_MT_ACCESS)
#define AS_CAUSE_MO_SIGNAL    (NET_ESTABLISH_CAUSE_MO_SIGNAL)
#define AS_CAUSE_MO_DATA    (NET_ESTABLISH_CAUSE_MO_DATA)
#define AS_CAUSE_V1020      (NET_ESTABLISH_CAUSE_V1020)

/* Type of the call associated to the RRC connection establishment */
#define AS_TYPE_ORIGINATING_SIGNAL  (NET_ESTABLISH_TYPE_ORIGINATING_SIGNAL)
#define AS_TYPE_EMERGENCY_CALLS   (NET_ESTABLISH_TYPE_EMERGENCY_CALLS)
#define AS_TYPE_ORIGINATING_CALLS (NET_ESTABLISH_TYPE_ORIGINATING_CALLS)
#define AS_TYPE_TERMINATING_CALLS (NET_ESTABLISH_TYPE_TERMINATING_CALLS)
#define AS_TYPE_MO_CS_FALLBACK    (NET_ESTABLISH_TYPE_MO_CS_FALLBACK)


/* Structure of the SAE Temporary Mobile Subscriber Identity */
typedef struct {
215
216
  uint8_t MMEcode;  /* MME code that allocated the GUTI   */
  uint32_t m_tmsi;  /* M-Temporary Mobile Subscriber Identity */
gauthier's avatar
 
gauthier committed
217
218
219
220
} as_stmsi_t;

/* Structure of the dedicated NAS information */
typedef struct {
221
  uint32_t length;  /* Length of the NAS information data   */
gauthier's avatar
 
gauthier committed
222
223
224
225
226
227
228
229
230
  Byte_t* data; /* Dedicated NAS information data container */
} as_nas_info_t;

/*
 * NAS->AS - NAS signalling connection establishment request
 * NAS request AS to perform the RRC connection establishment procedure
 * to transfer initial NAS message to the network while UE is in IDLE mode.
 */
typedef struct {
231
232
  uint8_t cause;    /* Connection establishment cause     */
  uint8_t type;   /* Associated call type         */
gauthier's avatar
 
gauthier committed
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
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
  plmn_t plmnID;    /* Identifier of the selected PLMN      */
  as_stmsi_t s_tmsi;    /* SAE Temporary Mobile Subscriber Identity */
  as_nas_info_t initialNasMsg;/* Initial NAS message to transfer      */
} nas_establish_req_t;

/*
 * TODO: AS->NAS - NAS signalling connection establishment response
 */
typedef struct {} nas_establish_rsp_t;

/*
 * --------------------------------------------------------------------------
 *      NAS signalling connection release
 * --------------------------------------------------------------------------
 */

/*
 * TODO: NAS->AS - NAS signalling connection release request
 */
typedef struct {} nas_release_req_t;

/*
 * TODO: AS->NAS - NAS signalling connection release indication
 */
typedef struct {} nas_release_ind_t;

/*
 * --------------------------------------------------------------------------
 *        NAS information transfer
 * --------------------------------------------------------------------------
 */

/*
 * AS->NAS - Downlink data transfer
 * AS notifies upper layer that NAS or non-3GPP dedicated downlink information
 * has to be transfered to NAS.
*/
typedef as_nas_info_t dl_info_transfer_t;

/*
 * NAS->AS - Uplink data transfer request
 * NAS requests under layer to transfer NAS or non-3GPP dedicated uplink
 * information to AS.
 */
typedef as_nas_info_t ul_info_transfer_t;

/*
 * --------------------------------------------------------------------------
 *  Structure of the AS messages handled by the network sublayer
 * --------------------------------------------------------------------------
 */
typedef struct {
285
  uint16_t msgID;
gauthier's avatar
 
gauthier committed
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
  union {
    cell_info_req_t cell_info_req;
    cell_info_rsp_t cell_info_rsp;
    cell_info_ind_t cell_info_ind;
    security_req_t security_req;
    security_rsp_t security_rsp;
    paging_ind_t paging_ind;
    nas_establish_req_t nas_establish_req;
    nas_establish_rsp_t nas_establish_rsp;
    nas_release_req_t nas_release_req;
    nas_release_ind_t nas_release_ind;
    ul_info_transfer_t ul_info_transfer;
    dl_info_transfer_t dl_info_transfer;
  } __attribute__((__packed__)) msg;
} as_message_t;

/****************************************************************************/
/********************  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  ******************/
/****************************************************************************/

int as_message_decode(const char* buffer, int length, as_message_t* msg);

int as_message_encode(char* buffer, int length, const as_message_t* msg);

/* Implemented in the network_api.c body file */
int as_message_send(as_message_t* as_msg, const void* nas_msg);

#endif /* __AS_MESSAGE_H__*/