as_message.h 17.8 KB
Newer Older
Cedric Roux's avatar
   
Cedric Roux committed
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
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
119
120
121
122
123
124
125
126
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
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
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
285
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
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
/*****************************************************************************
			Eurecom OpenAirInterface 3
			Copyright(c) 2012 Eurecom

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

/* Broadcast information */
#define AS_BROADCAST_INFO		0x01
#define AS_BROADCAST_INFO_IND		(AS_BROADCAST_INFO | AS_INDICATION)

/* Cell information relevant for cell selection processing */
#define AS_CELL_INFO			0x02
#define AS_CELL_INFO_REQ		(AS_CELL_INFO | AS_REQUEST)
#define AS_CELL_INFO_CNF		(AS_CELL_INFO | AS_CONFIRM)
#define AS_CELL_INFO_IND		(AS_CELL_INFO | AS_INDICATION)

/* Paging information */
#define AS_PAGING			0x03
#define AS_PAGING_REQ			(AS_PAGING | AS_REQUEST)
#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_IND		(AS_NAS_ESTABLISH | AS_INDICATION)
#define AS_NAS_ESTABLISH_RSP		(AS_NAS_ESTABLISH | AS_RESPONSE)
#define AS_NAS_ESTABLISH_CNF		(AS_NAS_ESTABLISH | AS_CONFIRM)

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

/* Uplink information transfer */
#define AS_UL_INFO_TRANSFER		0x06
#define AS_UL_INFO_TRANSFER_REQ		(AS_UL_INFO_TRANSFER | AS_REQUEST)
#define AS_UL_INFO_TRANSFER_CNF		(AS_UL_INFO_TRANSFER | AS_CONFIRM)
#define AS_UL_INFO_TRANSFER_IND		(AS_UL_INFO_TRANSFER | AS_INDICATION)

/* Downlink information transfer */
#define AS_DL_INFO_TRANSFER		0x07
#define AS_DL_INFO_TRANSFER_REQ		(AS_DL_INFO_TRANSFER | AS_REQUEST)
#define AS_DL_INFO_TRANSFER_CNF		(AS_DL_INFO_TRANSFER | AS_CONFIRM)
#define AS_DL_INFO_TRANSFER_IND		(AS_DL_INFO_TRANSFER | AS_INDICATION)

/* Radio Access Bearer establishment */
#define AS_RAB_ESTABLISH		0x08
#define AS_RAB_ESTABLISH_REQ		(AS_RAB_ESTABLISH | AS_REQUEST)
#define AS_RAB_ESTABLISH_IND		(AS_RAB_ESTABLISH | AS_INDICATION)
#define AS_RAB_ESTABLISH_RSP		(AS_RAB_ESTABLISH | AS_RESPONSE)
#define AS_RAB_ESTABLISH_CNF		(AS_RAB_ESTABLISH | AS_CONFIRM)

/* Radio Access Bearer release */
#define AS_RAB_RELEASE			0x09
#define AS_RAB_RELEASE_REQ		(AS_RAB_RELEASE | AS_REQUEST)
#define AS_RAB_RELEASE_IND		(AS_RAB_RELEASE | AS_INDICATION)

/* NAS Cause */
#define EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED (8)
#define EPS_SERVICES_NOT_ALLOWED                      (7)
#define PLMN_NOT_ALLOWED                              (11)
#define TRACKING_AREA_NOT_ALLOWED                     (12)
#define ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA     (13)
#define EPS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN         (14)
#define NO_SUITABLE_CELLS_IN_TRACKING_AREA            (15)
#define NETWORK_FAILURE                               (17)
#define ESM_FAILURE                                   (19)

/*
 * --------------------------------------------------------------------------
 * 		    Access Stratum message global parameters
 * --------------------------------------------------------------------------
 */

/* Error code */
enum {
    AS_SUCCESS = 1,	/* Success code, transaction is going on	*/
    AS_TERMINATED_NAS,	/* Transaction terminated by NAS		*/
    AS_TERMINATED_AS,	/* Transaction terminated by AS			*/
    AS_FAILURE		/* Failure code					*/
};

/* Core network domain */
enum {
    AS_PS = 1,		/* Packet-Switched	*/
    AS_CS		/* Circuit-Switched	*/
};

/* SAE Temporary Mobile Subscriber Identity */
typedef struct {
    UInt8_t MMEcode;	/* MME code that allocated the GUTI		*/
    UInt32_t m_tmsi;	/* M-Temporary Mobile Subscriber Identity	*/
} as_stmsi_t;

/* Dedicated NAS information */
typedef struct {
    UInt32_t length;	/* Length of the NAS information data		*/
    Byte_t* data;	/* Dedicated NAS information data container	*/
} as_nas_info_t;

/* Radio Access Bearer identity */
typedef UInt8_t as_rab_id_t;

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

/*
 * --------------------------------------------------------------------------
 * 				Broadcast information
 * --------------------------------------------------------------------------
 */

/*
 * AS->NAS - Broadcast information indication
 * AS may asynchronously report to NAS available PLMNs within specific
 * location area 
 */
typedef struct {
#define PLMN_LIST_MAX_SIZE	6
    PLMN_LIST_T(PLMN_LIST_MAX_SIZE) plmnIDs; /* List of PLMN identifiers */
    ci_t cellID;	/* Identity of the cell serving the listed PLMNs */
    tac_t tac;		/* Code of the tracking area the cell belongs to */
} broadcast_info_ind_t;

/*
 * --------------------------------------------------------------------------
 *	   Cell information relevant for cell selection processing
 * --------------------------------------------------------------------------
 */

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

/*
 * 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;	/* Selected PLMN identity			*/
    Byte_t rat;		/* Bitmap - set of radio access technologies	*/
} cell_info_req_t;

/*
 * AS->NAS - Cell Information confirm
 * AS search for a suitable cell and respond to NAS. If found, the cell
 * is selected to camp on.
 */
typedef struct {
    UInt8_t errCode;	/* Error code					  */
    ci_t cellID;	/* Identity of the cell serving the selected PLMN */
    tac_t tac;		/* Code of the tracking area the cell belongs to  */
    AcT_t rat;		/* Radio access technology supported by the cell  */
    UInt8_t rsrq;	/* Reference signal received quality		 */
    UInt8_t rsrp;	/* Reference signal received power		 */
} cell_info_cnf_t;

/*
 * AS->NAS - Cell Information indication
 * AS may change cell selection if a more suitable cell is found.
 */
typedef struct {
    ci_t cellID;	/* Identity of the new serving cell		 */
    tac_t tac;		/* Code of the tracking area the cell belongs to */
} cell_info_ind_t;

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

/* Paging cause */
enum {
    AS_CONNECTION_ESTABLISH,	/* Establish NAS signalling connection	*/
    AS_EPS_ATTACH,		/* Perform local detach and initiate EPS
				 * attach procedure			*/
    AS_CS_FALLBACK		/* Inititate CS fallback procedure	*/
};

/*
 * NAS->AS - Paging Information request
 * NAS requests the AS that NAS signalling messages or user data is pending
 * to be sent.
 */
typedef struct {
    as_stmsi_t s_tmsi;	/* UE identity					*/
    UInt8_t CN_domain;	/* Core network domain				*/
} paging_req_t;

/*
 * AS->NAS - Paging Information indication
 * AS reports to the NAS that appropriate procedure has to be initiated.
 */
typedef struct {
    UInt8_t cause;	/* Paging cause					*/
} 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)


/*
 * NAS->AS - NAS signalling connection establishment request
 * NAS requests the AS to perform the RRC connection establishment procedure
 * to transfer initial NAS message to the network while UE is in IDLE mode.
 */
typedef struct {
    UInt8_t cause;		 /* RRC connection establishment cause	*/
    UInt8_t type;		 /* RRC associated call type		*/
    as_stmsi_t s_tmsi;		 /* UE identity				*/
    plmn_t plmnID;		 /* Selected PLMN identity		*/
    as_nas_info_t initialNasMsg; /* Initial NAS message to transfer	*/
} nas_establish_req_t;

/*
 * AS->NAS - NAS signalling connection establishment indication
 * AS transfers the initial NAS message to the NAS.
 */
typedef struct {
    UInt32_t UEid;		 /* UE lower layer identifier		*/
    tac_t tac;			 /* Code of the tracking area the initiating
				  * UE belongs to			*/
    as_nas_info_t initialNasMsg; /* Initial NAS message to transfer	*/
} nas_establish_ind_t;

/*
 * NAS->AS - NAS signalling connection establishment response
 * NAS responds to the AS that initial answer message has to be provided to
 * the UE.
 */
typedef struct {
    UInt32_t UEid;		 /* UE lower layer identifier		*/
    as_stmsi_t s_tmsi;		 /* UE identity				*/
    UInt8_t errCode;		 /* Transaction status			*/
    as_nas_info_t nasMsg;	 /* NAS message to transfer		*/
} nas_establish_rsp_t;

/*
 * AS->NAS - NAS signalling connection establishment confirm
 * AS transfers the initial answer message to the NAS.
 */
typedef struct {
    UInt8_t errCode;		 /* Transaction status			*/
    as_nas_info_t nasMsg; 	 /* NAS message to transfer		*/
} nas_establish_cnf_t;

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

/* Release cause */
enum {
    AS_AUTHENTICATION_FAILURE = 1, /* Authentication procedure failed	*/
    AS_DETACH			   /* Detach requested			*/
};

/*
 * NAS->AS - NAS signalling connection release request
 * NAS requests the termination of the connection with the UE.
 */
typedef struct {
    UInt32_t UEid;		/* UE lower layer identifier		*/
    as_stmsi_t s_tmsi;		/* UE identity				*/
    UInt8_t cause;		/* Release cause			*/
} nas_release_req_t;

/*
 * AS->NAS - NAS signalling connection release indication
 * AS reports that connection has been terminated by the network.
 */
typedef struct {
    UInt8_t cause;		/* Release cause			*/
} nas_release_ind_t;

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

/*
 * NAS->AS - Uplink data transfer request
 * NAS requests the AS to transfer uplink information to the NAS that
 * operates at the network side.
 */
typedef struct {
    UInt32_t UEid;		/* UE lower layer identifier		*/
    as_stmsi_t s_tmsi;		/* UE identity				*/
    as_nas_info_t nasMsg;	/* Uplink NAS message			*/
} ul_info_transfer_req_t;

/*
 * AS->NAS - Uplink data transfer confirm
 * AS immediately notifies the NAS whether uplink information has been
 * successfully sent to the network or not.
 */
typedef struct {
    UInt32_t UEid;		/* UE lower layer identifier		*/
    UInt8_t errCode;		/* Transaction status			*/
} ul_info_transfer_cnf_t;

/*
 * AS->NAS - Uplink data transfer indication
 * AS delivers the uplink information message to the NAS that operates
 * at the network side.
 */
typedef struct {
    UInt32_t UEid;		/* UE lower layer identifier		*/
    as_nas_info_t nasMsg;	/* Uplink NAS message			*/
} ul_info_transfer_ind_t;

/*
 * NAS->AS - Downlink data transfer request
 * NAS requests the AS to transfer downlink information to the NAS that
 * operates at the UE side.
 */
typedef ul_info_transfer_req_t dl_info_transfer_req_t;

/*
 * AS->NAS - Downlink data transfer confirm
 * AS immediately notifies the NAS whether downlink information has been
 * successfully sent to the network or not.
 */
typedef ul_info_transfer_cnf_t dl_info_transfer_cnf_t;

/*
 * AS->NAS - Downlink data transfer indication
 * AS delivers the downlink information message to the NAS that operates
 * at the UE side.
 */
typedef ul_info_transfer_ind_t dl_info_transfer_ind_t;

/*
 * --------------------------------------------------------------------------
 * 			Radio Access Bearer establishment
 * --------------------------------------------------------------------------
 */

/* TODO: Quality of Service parameters */
typedef struct {} as_qos_t;

/*
 * NAS->AS - Radio access bearer establishment request
 * NAS requests the AS to allocate transmission resources to radio access
 * bearer initialized at the network side.
 */
typedef struct {
    as_stmsi_t s_tmsi;		/* UE identity				*/
    as_rab_id_t rabID;		/* Radio access bearer identity		*/
    as_qos_t QoS;		/* Requested Quality of Service		*/
} rab_establish_req_t;

/*
 * AS->NAS - Radio access bearer establishment indication
 * AS notifies the NAS that specific radio access bearer has to be setup.
 */
typedef struct {
    as_rab_id_t rabID;		/* Radio access bearer identity		*/
} rab_establish_ind_t;

/*
 * NAS->AS - Radio access bearer establishment response
 * NAS responds to AS whether the specified radio access bearer has been 
 * successfully setup or not.
 */
typedef struct {
    as_stmsi_t s_tmsi;		/* UE identity				*/
    as_rab_id_t rabID;		/* Radio access bearer identity		*/
    UInt8_t errCode;		/* Transaction status			*/
} rab_establish_rsp_t;

/*
 * AS->NAS - Radio access bearer establishment confirm
 * AS notifies NAS whether the specified radio access bearer has been 
 * successfully setup at the UE side or not.
 */
typedef struct {
    as_rab_id_t rabID;		/* Radio access bearer identity		*/
    UInt8_t errCode;		/* Transaction status			*/
} rab_establish_cnf_t;

/*
 * --------------------------------------------------------------------------
 *			    Radio Access Bearer release
 * --------------------------------------------------------------------------
 */

/*
 * NAS->AS - Radio access bearer release request
 * NAS requests the AS to release transmission resources previously allocated
 * to specific radio access bearer at the network side.
 */
typedef struct {
    as_stmsi_t s_tmsi;		/* UE identity				*/
    as_rab_id_t rabID;		/* Radio access bearer identity		*/
} rab_release_req_t;

/*
 * AS->NAS - Radio access bearer release indication
 * AS notifies NAS that specific radio access bearer has been released.
 */
typedef struct {
    as_rab_id_t rabID;		/* Radio access bearer identity		*/
} rab_release_ind_t;

/*
 * --------------------------------------------------------------------------
 *	Structure of the AS messages handled by the network sublayer
 * --------------------------------------------------------------------------
 */
typedef struct {
    UInt16_t msgID;
    union {
	broadcast_info_ind_t broadcast_info_ind;
	cell_info_req_t cell_info_req;
	cell_info_cnf_t cell_info_cnf;
	cell_info_ind_t cell_info_ind;
	paging_req_t paging_req;
	paging_ind_t paging_ind;
	nas_establish_req_t nas_establish_req;
	nas_establish_ind_t nas_establish_ind;
	nas_establish_rsp_t nas_establish_rsp;
	nas_establish_cnf_t nas_establish_cnf;
	nas_release_req_t nas_release_req;
	nas_release_ind_t nas_release_ind;
	ul_info_transfer_req_t ul_info_transfer_req;
	ul_info_transfer_cnf_t ul_info_transfer_cnf;
	ul_info_transfer_ind_t ul_info_transfer_ind;
	dl_info_transfer_req_t dl_info_transfer_req;
	dl_info_transfer_cnf_t dl_info_transfer_cnf;
	dl_info_transfer_ind_t dl_info_transfer_ind;
	rab_establish_req_t rab_establish_req;
	rab_establish_ind_t rab_establish_ind;
	rab_establish_rsp_t rab_establish_rsp;
	rab_establish_cnf_t rab_establish_cnf;
	rab_release_req_t rab_release_req;
	rab_release_ind_t rab_release_ind;
    } __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, as_message_t* msg, int length);

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

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

#endif /* __AS_MESSAGE_H__*/