Import sytem information related definitions + code from openbsc
[osmocom-bb.git] / include / osmocom / gsm / protocol / gsm_04_08.h
1 #ifndef PROTO_GSM_04_08_H
2 #define PROTO_GSM_04_08_H
3
4 #include <stdint.h>
5
6 /* GSM TS 04.08  definitions */
7 struct gsm_lchan;
8
9 /* Chapter 10.5.1.5 */
10 struct gsm48_classmark1 {
11         uint8_t pwr_lev:3,
12                  a5_1:1,
13                  es_ind:1,
14                  rev_lev:2,
15                  spare:1;
16 } __attribute__ ((packed));
17
18 /* Chapter 10.5.1.6 */
19 struct gsm48_classmark2 {
20         uint8_t pwr_lev:3,
21                  a5_1:1,
22                  es_ind:1,
23                  rev_lev:2,
24                  spare:1;
25         uint8_t fc:1,
26                  vgcs:1,
27                  vbs:1,
28                  sm_cap:1,
29                  ss_scr:2,
30                  ps_cap:1,
31                  spare2:1;
32         uint8_t a5_2:1,
33                  a5_3:1,
34                  cmsp:1,
35                  solsa:1,
36                  spare3:1,
37                  lcsva_cap:1,
38                  spare4:1,
39                  cm3:1;
40 } __attribute__ ((packed));
41
42 /* Chapter 10.5.2.1b.3 */
43 struct gsm48_range_1024 {
44         uint8_t w1_hi:2,
45                  f0:1,
46                  form_id:5;
47         uint8_t w1_lo;
48         uint8_t w2_hi;
49         uint8_t w3_hi:7,
50                  w2_lo:1;
51         uint8_t w4_hi:6,
52                  w3_lo:2;
53         uint8_t w5_hi:6,
54                  w4_lo:2;
55         uint8_t w6_hi:6,
56                  w5_lo:2;
57         uint8_t w7_hi:6,
58                  w6_lo:2;
59         uint8_t w8_hi:6,
60                  w7_lo:2;
61         uint8_t w9:7,
62                  w8_lo:1;
63         uint8_t w11_hi:1,
64                  w10:7;
65         uint8_t w12_hi:2,
66                  w11_lo:6;
67         uint8_t w13_hi:3,
68                  w12_lo:5;
69         uint8_t w14_hi:4,
70                  w13_lo:4;
71         uint8_t w15_hi:5,
72                  w14_lo:3;
73         uint8_t w16:6,
74                  w15_lo:2;
75 } __attribute__ ((packed));
76
77 /* Chapter 10.5.2.1b.4 */
78 struct gsm48_range_512 {
79         uint8_t orig_arfcn_hi:1,
80                  form_id:7;
81         uint8_t orig_arfcn_mid;
82         uint8_t w1_hi:7,
83                  orig_arfcn_lo:1;
84         uint8_t w2_hi:6,
85                  w1_lo:2;
86         uint8_t w3_hi:6,
87                  w2_lo:2;
88         uint8_t w4_hi:6,
89                  w3_lo:2;
90         uint8_t w5:7,
91                  w4_lo:1;
92         uint8_t w7_hi:1,
93                  w6:7;
94         uint8_t w8_hi:2,
95                  w7_lo:6;
96         uint8_t w9_hi:4,
97                  w8_lo:4;
98         uint8_t w10:6,
99                  w9_lo:2;
100         uint8_t w12_hi:2,
101                  w11:6;
102         uint8_t w13_hi:4,
103                  w12_lo:4;
104         uint8_t w14:6,
105                  w13_lo:2;
106         uint8_t w16_hi:2,
107                  w15:6;
108         uint8_t w17:5,
109                  w16_lo:3;
110 } __attribute__ ((packed));
111
112 /* Chapter 10.5.2.1b.5 */
113 struct gsm48_range_256 {
114         uint8_t orig_arfcn_hi:1,
115                  form_id:7;
116         uint8_t orig_arfcn_mid;
117         uint8_t w1_hi:7,
118                  orig_arfcn_lo:1;
119         uint8_t w2:7,
120                  w1_lo:1;
121         uint8_t w4_hi:1,
122                  w3:7;
123         uint8_t w5_hi:3,
124                  w4_lo:5;
125         uint8_t w6_hi:5,
126                  w5_lo:3;
127         uint8_t w8_hi:1,
128                  w7:6,
129                  w6_lo:1;
130         uint8_t w9_hi:4,
131                  w8_lo:4;
132         uint8_t w11_hi:2,
133                  w10:5,
134                  w9_lo:1;
135         uint8_t w12:5,
136                  w11_lo:3;
137         uint8_t w14_hi:3,
138                  w13:5;
139         uint8_t w16_hi:1,
140                  w15:5,
141                  w14_lo:2;
142         uint8_t w18_hi:1,
143                  w17:4,
144                  w16_lo:3;
145         uint8_t w20_hi:1,
146                  w19:4,
147                  w18_lo:3;
148         uint8_t spare:1,
149                  w21:4,
150                  w20_lo:3;
151 } __attribute__ ((packed));
152
153 /* Chapter 10.5.2.1b.6 */
154 struct gsm48_range_128 {
155         uint8_t orig_arfcn_hi:1,
156                  form_id:7;
157         uint8_t orig_arfcn_mid;
158         uint8_t w1:7,
159                  orig_arfcn_lo:1;
160         uint8_t w3_hi:2,
161                  w2:6;
162         uint8_t w4_hi:4,
163                  w3_lo:4;
164         uint8_t w6_hi:2,
165                  w5:5,
166                  w4_lo:1;
167         uint8_t w7:5,
168                  w6_lo:3;
169         uint8_t w9:4,
170                  w8:4;
171         uint8_t w11:4,
172                  w10:4;
173         uint8_t w13:4,
174                  w12:4;
175         uint8_t w15:4,
176                  w14:4;
177         uint8_t w18_hi:2,
178                  w17:3,
179                  w16:3;
180         uint8_t w21_hi:1,
181                  w20:3,
182                  w19:3,
183                  w18_lo:1;
184         uint8_t w23:3,
185                  w22:3,
186                  w21_lo:2;
187         uint8_t w26_hi:2,
188                  w25:3,
189                  w24:3;
190         uint8_t spare:1,
191                  w28:3,
192                  w27:3,
193                  w26_lo:1;
194 } __attribute__ ((packed));
195
196 /* Chapter 10.5.2.1b.7 */
197 struct gsm48_var_bit {
198         uint8_t orig_arfcn_hi:1,
199                  form_id:7;
200         uint8_t orig_arfcn_mid;
201         uint8_t rrfcn1_7:7,
202                  orig_arfcn_lo:1;
203         uint8_t rrfcn8_111[13];
204 } __attribute__ ((packed));
205
206 /* Chapter 10.5.2.5 */
207 struct gsm48_chan_desc {
208         uint8_t chan_nr;
209         union {
210                 struct {
211                         uint8_t maio_high:4,
212                                  h:1,
213                                  tsc:3;
214                         uint8_t hsn:6,
215                                  maio_low:2;
216                 } h1;
217                 struct {
218                         uint8_t arfcn_high:2,
219                                  spare:2,
220                                  h:1,
221                                  tsc:3;
222                         uint8_t arfcn_low;
223                 } h0;
224         };
225 } __attribute__ ((packed));
226
227 /* Chapter 10.5.2.20 */
228 struct gsm48_meas_res {
229         uint8_t rxlev_full:6,
230                  dtx_used:1,
231                  ba_used:1;
232         uint8_t rxlev_sub:6,
233                  meas_valid:1,
234                  spare:1;
235         uint8_t no_nc_n_hi:1,
236                  rxqual_sub:3,
237                  rxqual_full:3,
238                  spare2:1;
239         uint8_t rxlev_nc1:6,
240                  no_nc_n_lo:2;
241         uint8_t bsic_nc1_hi:3,
242                  bcch_f_nc1:5;
243         uint8_t rxlev_nc2_hi:5,
244                  bsic_nc1_lo:3;
245         uint8_t bsic_nc2_hi:2,
246                  bcch_f_nc2:5,
247                  rxlev_nc2_lo:1;
248         uint8_t rxlev_nc3_hi:4,
249                  bsic_nc2_lo:4;
250         uint8_t bsic_nc3_hi:1,
251                  bcch_f_nc3:5,
252                  rxlev_nc3_lo:2;
253         uint8_t rxlev_nc4_hi:3,
254                  bsic_nc3_lo:5;
255         uint8_t bcch_f_nc4:5,
256                  rxlev_nc4_lo:3;
257         uint8_t rxlev_nc5_hi:2,
258                  bsic_nc4:6;
259         uint8_t bcch_f_nc5_hi:4,
260                  rxlev_nc5_lo:4;
261         uint8_t rxlev_nc6_hi:1,
262                  bsic_nc5:6,
263                  bcch_f_nc5_lo:1;
264         uint8_t bcch_f_nc6_hi:3,
265                  rxlev_nc6_lo:5;
266         uint8_t bsic_nc6:6,
267                  bcch_f_nc6_lo:2;
268 } __attribute__ ((packed));
269
270 /* Chapter 10.5.2.21aa */
271 struct gsm48_multi_rate_conf {
272         uint8_t smod : 2,
273                  spare: 1,
274                  icmi : 1,
275                  nscb : 1,
276                  ver : 3;
277         uint8_t m4_75 : 1,
278                  m5_15 : 1,
279                  m5_90 : 1,
280                  m6_70 : 1,
281                  m7_40 : 1,
282                  m7_95 : 1,
283                  m10_2 : 1,
284                  m12_2 : 1;
285 } __attribute__((packed));
286
287 /* Chapter 10.5.2.28(a) */
288 struct gsm48_power_cmd {
289         uint8_t power_level:5,
290                  spare:2,
291                  atc:1;
292 } __attribute__((packed));
293
294 /* Chapter 10.5.2.29 */
295 struct gsm48_rach_control {
296         uint8_t re :1,
297                  cell_bar :1,
298                  tx_integer :4,
299                  max_trans :2;
300         uint8_t t2;
301         uint8_t t3;
302 } __attribute__ ((packed));
303
304
305 /* Chapter 10.5.2.30 */
306 struct gsm48_req_ref {
307         uint8_t ra;
308         uint8_t t3_high:3,
309                  t1:5;
310         uint8_t t2:5,
311                  t3_low:3;
312 } __attribute__ ((packed));
313
314 /* Chapter 10.5.2.38 */
315 struct gsm48_start_time {
316         uint8_t t3_high:3,
317                  t1:5;
318         uint8_t t2:5,
319                  t3_low:3;
320 } __attribute__ ((packed));
321
322 /* Chapter 10.5.2.39 */
323 struct gsm48_sync_ind {
324         uint8_t si:2,
325                  rot:1,
326                  nci:1,
327                  sync_ie:4;
328 } __attribute__((packed));
329
330 /*
331  * Chapter 9.1.5/9.1.6
332  *
333  * For 9.1.6 the chan_desc has the meaning of 10.5.2.5a
334  */
335 struct gsm48_chan_mode_modify {
336         struct gsm48_chan_desc chan_desc;
337         uint8_t mode;
338 } __attribute__ ((packed));
339
340 enum gsm48_chan_mode {
341         GSM48_CMODE_SIGN        = 0x00,
342         GSM48_CMODE_SPEECH_V1   = 0x01,
343         GSM48_CMODE_SPEECH_EFR  = 0x21,
344         GSM48_CMODE_SPEECH_AMR  = 0x41,
345         GSM48_CMODE_DATA_14k5   = 0x0f,
346         GSM48_CMODE_DATA_12k0   = 0x03,
347         GSM48_CMODE_DATA_6k0    = 0x0b,
348         GSM48_CMODE_DATA_3k6    = 0x23,
349 };
350
351 /* Chapter 9.1.2 */
352 struct gsm48_ass_cmd {
353         /* Semantic is from 10.5.2.5a */
354         struct gsm48_chan_desc chan_desc;
355         uint8_t power_command;
356         uint8_t data[0];
357 } __attribute__((packed));
358
359 /* Chapter 9.1.13 */
360 struct gsm48_frq_redef {
361         /* Semantic is from 10.5.2.5a */
362         struct gsm48_chan_desc chan_desc;
363         uint8_t mob_alloc_len;
364         uint8_t mob_alloc[0];
365 } __attribute__((packed));
366
367 /* Chapter 10.5.2.2 */
368 struct gsm48_cell_desc {
369         uint8_t bcc:3,
370                  ncc:3,
371                  arfcn_hi:2;
372         uint8_t arfcn_lo;
373 } __attribute__((packed));
374
375 /* Chapter 9.1.15 */
376 struct gsm48_ho_cmd {
377         struct gsm48_cell_desc cell_desc;
378         struct gsm48_chan_desc chan_desc;
379         uint8_t ho_ref;
380         uint8_t power_command;
381         uint8_t data[0];
382 } __attribute__((packed));
383
384 /* Chapter 9.1.18 */
385 struct gsm48_imm_ass {
386         uint8_t l2_plen;
387         uint8_t proto_discr;
388         uint8_t msg_type;
389         uint8_t page_mode;
390         struct gsm48_chan_desc chan_desc;
391         struct gsm48_req_ref req_ref;
392         uint8_t timing_advance;
393         uint8_t mob_alloc_len;
394         uint8_t mob_alloc[0];
395 } __attribute__ ((packed));
396
397 /* Chapter 9.1.25 */
398 struct gsm48_pag_resp {
399         uint8_t spare:4,
400                  key_seq:4;
401         uint32_t classmark2;
402         uint8_t mi_len;
403         uint8_t mi[0];
404 } __attribute__ ((packed));
405
406 /* Chapter 10.5.1.3 */
407 struct gsm48_loc_area_id {
408         uint8_t digits[3];      /* BCD! */
409         uint16_t lac;
410 } __attribute__ ((packed));
411
412 /* Section 9.2.2 */
413 struct gsm48_auth_req {
414         uint8_t key_seq:4,
415                  spare:4;
416         uint8_t rand[16];
417 } __attribute__ ((packed));
418
419 /* Section 9.2.3 */
420 struct gsm48_auth_resp {
421         uint8_t sres[4];
422 } __attribute__ ((packed));
423
424 /* Section 9.2.15 */
425 struct gsm48_loc_upd_req {
426         uint8_t type:4,
427                  key_seq:4;
428         struct gsm48_loc_area_id lai;
429         struct gsm48_classmark1 classmark1;
430         uint8_t mi_len;
431         uint8_t mi[0];
432 } __attribute__ ((packed));
433
434 /* Section 10.1 */
435 struct gsm48_hdr {
436         uint8_t proto_discr;
437         uint8_t msg_type;
438         uint8_t data[0];
439 } __attribute__ ((packed));
440
441 /* Section 9.1.3x System information Type header */
442 struct gsm48_system_information_type_header {
443         uint8_t l2_plen;
444         uint8_t rr_protocol_discriminator :4,
445                 skip_indicator:4; 
446         uint8_t system_information;
447 } __attribute__ ((packed));
448
449 /* Section 10.5.2.4 Cell Selection Parameters */
450 struct gsm48_cell_sel_par {
451         uint8_t ms_txpwr_max_ccch:5,    /* GSM 05.08 MS-TXPWR-MAX-CCCH */
452                  cell_resel_hyst:3;     /* GSM 05.08 CELL-RESELECT-HYSTERESIS */
453         uint8_t rxlev_acc_min:6,        /* GSM 05.08 RXLEV-ACCESS-MIN */
454                  neci:1,
455                  acs:1;
456 } __attribute__ ((packed));
457
458 /* Section 10.5.2.11 Control Channel Description , Figure 10.5.33 */
459 struct gsm48_control_channel_descr {
460         uint8_t ccch_conf :3,
461                 bs_ag_blks_res :3,
462                 att :1,
463                 spare1 :1;
464         uint8_t bs_pa_mfrms : 3,
465                 spare2 :5;
466         uint8_t t3212;
467 } __attribute__ ((packed));
468
469 struct gsm48_cell_options {
470         uint8_t radio_link_timeout:4,
471                  dtx:2,
472                  pwrc:1,
473                  spare:1;
474 } __attribute__ ((packed));
475
476 /* Section 9.2.9 CM service request */
477 struct gsm48_service_request {
478         uint8_t cm_service_type : 4,
479                  cipher_key_seq  : 4;
480         /* length + 3 bytes */
481         uint32_t classmark;
482         uint8_t mi_len;
483         uint8_t mi[0];
484         /* optional priority level */
485 } __attribute__ ((packed));
486
487 /* Section 9.1.31 System information Type 1 */
488 struct gsm48_system_information_type_1 {
489         struct gsm48_system_information_type_header header;
490         uint8_t cell_channel_description[16];
491         struct gsm48_rach_control rach_control;
492         uint8_t rest_octets[0]; /* NCH position on the CCCH */
493 } __attribute__ ((packed));
494
495 /* Section 9.1.32 System information Type 2 */
496 struct gsm48_system_information_type_2 {
497         struct gsm48_system_information_type_header header;
498         uint8_t bcch_frequency_list[16];
499         uint8_t ncc_permitted;
500         struct gsm48_rach_control rach_control;
501 } __attribute__ ((packed));
502
503 /* Section 9.1.33 System information Type 2bis */
504 struct gsm48_system_information_type_2bis {
505         struct gsm48_system_information_type_header header;
506         uint8_t bcch_frequency_list[16];
507         struct gsm48_rach_control rach_control;
508         uint8_t rest_octets[0];
509 } __attribute__ ((packed));
510
511 /* Section 9.1.34 System information Type 2ter */
512 struct gsm48_system_information_type_2ter {
513         struct gsm48_system_information_type_header header;
514         uint8_t ext_bcch_frequency_list[16];
515         uint8_t rest_octets[0];
516 } __attribute__ ((packed));
517
518 /* Section 9.1.35 System information Type 3 */
519 struct gsm48_system_information_type_3 {
520         struct gsm48_system_information_type_header header;
521         uint16_t cell_identity;
522         struct gsm48_loc_area_id lai;
523         struct gsm48_control_channel_descr control_channel_desc;
524         struct gsm48_cell_options cell_options;
525         struct gsm48_cell_sel_par cell_sel_par;
526         struct gsm48_rach_control rach_control;
527         uint8_t rest_octets[0];
528 } __attribute__ ((packed));
529
530 /* Section 9.1.36 System information Type 4 */
531 struct gsm48_system_information_type_4 {
532         struct gsm48_system_information_type_header header;
533         struct gsm48_loc_area_id lai;
534         struct gsm48_cell_sel_par cell_sel_par;
535         struct gsm48_rach_control rach_control;
536         /*      optional CBCH conditional CBCH... followed by
537                 mandantory SI 4 Reset Octets
538          */
539         uint8_t data[0];
540 } __attribute__ ((packed));
541
542 /* Section 9.1.37 System information Type 5 */
543 struct gsm48_system_information_type_5 {
544         uint8_t rr_protocol_discriminator :4,
545                 skip_indicator:4; 
546         uint8_t system_information;
547         uint8_t bcch_frequency_list[16];
548 } __attribute__ ((packed));
549
550 /* Section 9.1.38 System information Type 5bis */
551 struct gsm48_system_information_type_5bis {
552         uint8_t rr_protocol_discriminator :4,
553                  skip_indicator:4;
554         uint8_t system_information;
555         uint8_t bcch_frequency_list[16];
556 } __attribute__ ((packed));
557
558 /* Section 9.1.39 System information Type 5ter */
559 struct gsm48_system_information_type_5ter {
560         uint8_t rr_protocol_discriminator :4,
561                  skip_indicator:4;
562         uint8_t system_information;
563         uint8_t bcch_frequency_list[16];
564 } __attribute__ ((packed));
565
566 /* Section 9.1.40 System information Type 6 */
567 struct gsm48_system_information_type_6 {
568         uint8_t rr_protocol_discriminator :4,
569                 skip_indicator:4; 
570         uint8_t system_information;
571         uint16_t cell_identity;
572         struct gsm48_loc_area_id lai;
573         struct gsm48_cell_options cell_options;
574         uint8_t ncc_permitted;
575         uint8_t rest_octets[0];
576 } __attribute__ ((packed));
577
578 /* Section 9.1.43a System Information type 13 */
579 struct gsm48_system_information_type_13 {
580         struct gsm48_system_information_type_header header;
581         uint8_t rest_octets[0];
582 } __attribute__ ((packed));
583
584 /* Section 9.2.12 IMSI Detach Indication */
585 struct gsm48_imsi_detach_ind {
586         struct gsm48_classmark1 classmark1;
587         uint8_t mi_len;
588         uint8_t mi[0];
589 } __attribute__ ((packed));
590
591 /* Section 9.1.1 */
592 struct gsm48_add_ass {
593         /* Semantic is from 10.5.2.5 */
594         struct gsm48_chan_desc chan_desc;
595         uint8_t data[0];
596 } __attribute__((packed));
597
598 /* Section 9.1.3 */
599 struct gsm48_ass_cpl {
600         uint8_t rr_cause;
601 } __attribute__((packed));
602
603 /* Section 9.1.4 */
604 struct gsm48_ass_fail {
605         uint8_t rr_cause;
606 } __attribute__((packed));
607
608 /* Section 9.1.3 */
609 struct gsm48_ho_cpl {
610         uint8_t rr_cause;
611         uint8_t data[0];
612 } __attribute__((packed));
613
614 /* Section 9.1.4 */
615 struct gsm48_ho_fail {
616         uint8_t rr_cause;
617 } __attribute__((packed));
618
619 /* Section 9.1.7 */
620 struct gsm48_chan_rel {
621         uint8_t rr_cause;
622         uint8_t data[0];
623 } __attribute__((packed));
624
625 /* Section 9.1.9 */
626 struct gsm48_cip_mode_cmd {
627         uint8_t sc:1,
628                  alg_id:3,
629                  cr:1,
630                  spare:3;
631 } __attribute__((packed));
632
633 /* Section 9.1.11 */
634 struct gsm48_cm_change {
635         uint8_t cm2_len;
636         struct gsm48_classmark2 cm2;
637         uint8_t data[0];
638 } __attribute__((packed));
639
640 /* Section 9.1.19 */
641 struct gsm48_imm_ass_ext {
642         uint8_t l2_plen;
643         uint8_t proto_discr;
644         uint8_t msg_type;
645         uint8_t page_mode;
646         struct gsm48_chan_desc chan_desc1;
647         struct gsm48_req_ref req_ref1;
648         uint8_t timing_advance1;
649         struct gsm48_chan_desc chan_desc2;
650         struct gsm48_req_ref req_ref2;
651         uint8_t timing_advance2;
652         uint8_t mob_alloc_len;
653         uint8_t mob_alloc[0];
654 } __attribute__ ((packed));
655
656 /* Section 9.1.20 */
657 struct gsm48_imm_ass_rej {
658         uint8_t l2_plen;
659         uint8_t proto_discr;
660         uint8_t msg_type;
661         uint8_t page_mode;
662         struct gsm48_req_ref req_ref1;
663         uint8_t wait_ind1;
664         struct gsm48_req_ref req_ref2;
665         uint8_t wait_ind2;
666         struct gsm48_req_ref req_ref3;
667         uint8_t wait_ind3;
668         struct gsm48_req_ref req_ref4;
669         uint8_t wait_ind4;
670         uint8_t rest[0];
671 } __attribute__ ((packed));
672
673 /* Section 9.1.22 */
674 struct gsm48_paging1 {
675         uint8_t l2_plen;
676         uint8_t proto_discr;
677         uint8_t msg_type;
678         uint8_t pag_mode:2,
679                  spare:2,
680                  cneed1:2,
681                  cneed2:2;
682         uint8_t data[0];
683 } __attribute__((packed));
684
685 /* Section 9.1.23 */
686 struct gsm48_paging2 {
687         uint8_t l2_plen;
688         uint8_t proto_discr;
689         uint8_t msg_type;
690         uint8_t pag_mode:2,
691                  spare:2,
692                  cneed1:2,
693                  cneed2:2;
694         uint32_t tmsi1;
695         uint32_t tmsi2;
696         uint8_t data[0];
697 } __attribute__((packed));
698
699 /* Section 9.1.24 */
700 struct gsm48_paging3 {
701         uint8_t l2_plen;
702         uint8_t proto_discr;
703         uint8_t msg_type;
704         uint8_t pag_mode:2,
705                  spare:2,
706                  cneed1:2,
707                  cneed2:2;
708         uint32_t tmsi1;
709         uint32_t tmsi2;
710         uint32_t tmsi3;
711         uint32_t tmsi4;
712         uint8_t cneed3:2,
713                  cneed4:2,
714                  spare2:4;
715         uint8_t rest[0];
716 } __attribute__((packed));
717
718 /* Section 9.1.25 */
719 struct gsm48_pag_rsp {
720         uint8_t key_seq:3,
721                  spare:5;
722         uint8_t cm2_len;
723         struct gsm48_classmark2 cm2;
724         uint8_t data[0];
725 } __attribute__((packed));
726
727 /* Section 9.1.29 */
728 struct gsm48_rr_status {
729         uint8_t rr_cause;
730 } __attribute__((packed));
731
732 /* Section 10.2 + GSM 04.07 12.2.3.1.1 */
733 #define GSM48_PDISC_GROUP_CC    0x00
734 #define GSM48_PDISC_BCAST_CC    0x01
735 #define GSM48_PDISC_PDSS1       0x02
736 #define GSM48_PDISC_CC          0x03
737 #define GSM48_PDISC_PDSS2       0x04
738 #define GSM48_PDISC_MM          0x05
739 #define GSM48_PDISC_RR          0x06
740 #define GSM48_PDISC_MM_GPRS     0x08
741 #define GSM48_PDISC_SMS         0x09
742 #define GSM48_PDISC_SM_GPRS     0x0a
743 #define GSM48_PDISC_NC_SS       0x0b
744 #define GSM48_PDISC_LOC         0x0c
745 #define GSM48_PDISC_MASK        0x0f
746 #define GSM48_PDISC_USSD        0x11
747
748 /* Section 10.4 */
749 #define GSM48_MT_RR_INIT_REQ            0x3c
750 #define GSM48_MT_RR_ADD_ASS             0x3b
751 #define GSM48_MT_RR_IMM_ASS             0x3f
752 #define GSM48_MT_RR_IMM_ASS_EXT         0x39
753 #define GSM48_MT_RR_IMM_ASS_REJ         0x3a
754
755 #define GSM48_MT_RR_CIPH_M_CMD          0x35
756 #define GSM48_MT_RR_CIPH_M_COMPL        0x32
757
758 #define GSM48_MT_RR_CFG_CHG_CMD         0x30
759 #define GSM48_MT_RR_CFG_CHG_ACK         0x31
760 #define GSM48_MT_RR_CFG_CHG_REJ         0x33
761
762 #define GSM48_MT_RR_ASS_CMD             0x2e
763 #define GSM48_MT_RR_ASS_COMPL           0x29
764 #define GSM48_MT_RR_ASS_FAIL            0x2f
765 #define GSM48_MT_RR_HANDO_CMD           0x2b
766 #define GSM48_MT_RR_HANDO_COMPL         0x2c
767 #define GSM48_MT_RR_HANDO_FAIL          0x28
768 #define GSM48_MT_RR_HANDO_INFO          0x2d
769
770 #define GSM48_MT_RR_CELL_CHG_ORDER      0x08
771 #define GSM48_MT_RR_PDCH_ASS_CMD        0x23
772
773 #define GSM48_MT_RR_CHAN_REL            0x0d
774 #define GSM48_MT_RR_PART_REL            0x0a
775 #define GSM48_MT_RR_PART_REL_COMP       0x0f
776
777 #define GSM48_MT_RR_PAG_REQ_1           0x21
778 #define GSM48_MT_RR_PAG_REQ_2           0x22
779 #define GSM48_MT_RR_PAG_REQ_3           0x24
780 #define GSM48_MT_RR_PAG_RESP            0x27
781 #define GSM48_MT_RR_NOTIF_NCH           0x20
782 #define GSM48_MT_RR_NOTIF_FACCH         0x25
783 #define GSM48_MT_RR_NOTIF_RESP          0x26
784
785 #define GSM48_MT_RR_SYSINFO_8           0x18
786 #define GSM48_MT_RR_SYSINFO_1           0x19
787 #define GSM48_MT_RR_SYSINFO_2           0x1a
788 #define GSM48_MT_RR_SYSINFO_3           0x1b
789 #define GSM48_MT_RR_SYSINFO_4           0x1c
790 #define GSM48_MT_RR_SYSINFO_5           0x1d
791 #define GSM48_MT_RR_SYSINFO_6           0x1e
792 #define GSM48_MT_RR_SYSINFO_7           0x1f
793
794 #define GSM48_MT_RR_SYSINFO_2bis        0x02
795 #define GSM48_MT_RR_SYSINFO_2ter        0x03
796 #define GSM48_MT_RR_SYSINFO_5bis        0x05
797 #define GSM48_MT_RR_SYSINFO_5ter        0x06
798 #define GSM48_MT_RR_SYSINFO_9           0x04
799 #define GSM48_MT_RR_SYSINFO_13          0x00
800
801 #define GSM48_MT_RR_SYSINFO_16          0x3d
802 #define GSM48_MT_RR_SYSINFO_17          0x3e
803
804 #define GSM48_MT_RR_CHAN_MODE_MODIF     0x10
805 #define GSM48_MT_RR_STATUS              0x12
806 #define GSM48_MT_RR_CHAN_MODE_MODIF_ACK 0x17
807 #define GSM48_MT_RR_FREQ_REDEF          0x14
808 #define GSM48_MT_RR_MEAS_REP            0x15
809 #define GSM48_MT_RR_CLSM_CHG            0x16
810 #define GSM48_MT_RR_CLSM_ENQ            0x13
811 #define GSM48_MT_RR_EXT_MEAS_REP        0x36
812 #define GSM48_MT_RR_EXT_MEAS_REP_ORD    0x37
813 #define GSM48_MT_RR_GPRS_SUSP_REQ       0x34
814
815 #define GSM48_MT_RR_VGCS_UPL_GRANT      0x08
816 #define GSM48_MT_RR_UPLINK_RELEASE      0x0e
817 #define GSM48_MT_RR_UPLINK_FREE         0x0c
818 #define GSM48_MT_RR_UPLINK_BUSY         0x2a
819 #define GSM48_MT_RR_TALKER_IND          0x11
820
821 #define GSM48_MT_RR_APP_INFO            0x38
822
823 /* Table 10.2/3GPP TS 04.08 */
824 #define GSM48_MT_MM_IMSI_DETACH_IND     0x01
825 #define GSM48_MT_MM_LOC_UPD_ACCEPT      0x02
826 #define GSM48_MT_MM_LOC_UPD_REJECT      0x04
827 #define GSM48_MT_MM_LOC_UPD_REQUEST     0x08
828
829 #define GSM48_MT_MM_AUTH_REJ            0x11
830 #define GSM48_MT_MM_AUTH_REQ            0x12
831 #define GSM48_MT_MM_AUTH_RESP           0x14
832 #define GSM48_MT_MM_ID_REQ              0x18
833 #define GSM48_MT_MM_ID_RESP             0x19
834 #define GSM48_MT_MM_TMSI_REALL_CMD      0x1a
835 #define GSM48_MT_MM_TMSI_REALL_COMPL    0x1b
836
837 #define GSM48_MT_MM_CM_SERV_ACC         0x21
838 #define GSM48_MT_MM_CM_SERV_REJ         0x22
839 #define GSM48_MT_MM_CM_SERV_ABORT       0x23
840 #define GSM48_MT_MM_CM_SERV_REQ         0x24
841 #define GSM48_MT_MM_CM_SERV_PROMPT      0x25
842 #define GSM48_MT_MM_CM_REEST_REQ        0x28
843 #define GSM48_MT_MM_ABORT               0x29
844
845 #define GSM48_MT_MM_NULL                0x30
846 #define GSM48_MT_MM_STATUS              0x31
847 #define GSM48_MT_MM_INFO                0x32
848
849 /* Table 10.3/3GPP TS 04.08 */
850 #define GSM48_MT_CC_ALERTING            0x01
851 #define GSM48_MT_CC_CALL_CONF           0x08
852 #define GSM48_MT_CC_CALL_PROC           0x02
853 #define GSM48_MT_CC_CONNECT             0x07
854 #define GSM48_MT_CC_CONNECT_ACK         0x0f
855 #define GSM48_MT_CC_EMERG_SETUP         0x0e
856 #define GSM48_MT_CC_PROGRESS            0x03
857 #define GSM48_MT_CC_ESTAB               0x04
858 #define GSM48_MT_CC_ESTAB_CONF          0x06
859 #define GSM48_MT_CC_RECALL              0x0b
860 #define GSM48_MT_CC_START_CC            0x09
861 #define GSM48_MT_CC_SETUP               0x05
862
863 #define GSM48_MT_CC_MODIFY              0x17
864 #define GSM48_MT_CC_MODIFY_COMPL        0x1f
865 #define GSM48_MT_CC_MODIFY_REJECT       0x13
866 #define GSM48_MT_CC_USER_INFO           0x10
867 #define GSM48_MT_CC_HOLD                0x18
868 #define GSM48_MT_CC_HOLD_ACK            0x19
869 #define GSM48_MT_CC_HOLD_REJ            0x1a
870 #define GSM48_MT_CC_RETR                0x1c
871 #define GSM48_MT_CC_RETR_ACK            0x1d
872 #define GSM48_MT_CC_RETR_REJ            0x1e
873
874 #define GSM48_MT_CC_DISCONNECT          0x25
875 #define GSM48_MT_CC_RELEASE             0x2d
876 #define GSM48_MT_CC_RELEASE_COMPL       0x2a
877
878 #define GSM48_MT_CC_CONG_CTRL           0x39
879 #define GSM48_MT_CC_NOTIFY              0x3e
880 #define GSM48_MT_CC_STATUS              0x3d
881 #define GSM48_MT_CC_STATUS_ENQ          0x34
882 #define GSM48_MT_CC_START_DTMF          0x35
883 #define GSM48_MT_CC_STOP_DTMF           0x31
884 #define GSM48_MT_CC_STOP_DTMF_ACK       0x32
885 #define GSM48_MT_CC_START_DTMF_ACK      0x36
886 #define GSM48_MT_CC_START_DTMF_REJ      0x37
887 #define GSM48_MT_CC_FACILITY            0x3a
888
889 /* FIXME: Table 10.4 / 10.4a (GPRS) */
890
891 /* Section 10.5.3.3 CM service type */
892 #define GSM48_CMSERV_MO_CALL_PACKET     1
893 #define GSM48_CMSERV_EMERGENCY          2
894 #define GSM48_CMSERV_SMS                4
895 #define GSM48_CMSERV_SUP_SERV           8
896 #define GSM48_CMSERV_VGCS               9
897 #define GSM48_CMSERV_VBS                10
898 #define GSM48_CMSERV_LOC_SERV           11
899
900 /* Section 10.5.2.26, Table 10.5.64 */
901 #define GSM48_PM_MASK           0x03
902 #define GSM48_PM_NORMAL         0x00
903 #define GSM48_PM_EXTENDED       0x01
904 #define GSM48_PM_REORG          0x02
905 #define GSM48_PM_SAME           0x03
906
907 /* Chapter 10.5.3.5 / Table 10.5.93 */
908 #define GSM48_LUPD_NORMAL       0x0
909 #define GSM48_LUPD_PERIODIC     0x1
910 #define GSM48_LUPD_IMSI_ATT     0x2
911 #define GSM48_LUPD_RESERVED     0x3
912
913 /* Table 10.5.4 */
914 #define GSM_MI_TYPE_MASK        0x07
915 #define GSM_MI_TYPE_NONE        0x00
916 #define GSM_MI_TYPE_IMSI        0x01
917 #define GSM_MI_TYPE_IMEI        0x02
918 #define GSM_MI_TYPE_IMEISV      0x03
919 #define GSM_MI_TYPE_TMSI        0x04
920 #define GSM_MI_ODD              0x08
921
922 #define GSM48_IE_MOBILE_ID      0x17    /* 10.5.1.4 */
923 #define GSM48_IE_NAME_LONG      0x43    /* 10.5.3.5a */
924 #define GSM48_IE_NAME_SHORT     0x45    /* 10.5.3.5a */
925 #define GSM48_IE_UTC            0x46    /* 10.5.3.8 */
926 #define GSM48_IE_NET_TIME_TZ    0x47    /* 10.5.3.9 */
927 #define GSM48_IE_LSA_IDENT      0x48    /* 10.5.3.11 */
928
929 #define GSM48_IE_BEARER_CAP     0x04    /* 10.5.4.5 */
930 #define GSM48_IE_CAUSE          0x08    /* 10.5.4.11 */
931 #define GSM48_IE_CC_CAP         0x15    /* 10.5.4.5a */
932 #define GSM48_IE_ALERT          0x19    /* 10.5.4.26 */
933 #define GSM48_IE_FACILITY       0x1c    /* 10.5.4.15 */
934 #define GSM48_IE_PROGR_IND      0x1e    /* 10.5.4.21 */
935 #define GSM48_IE_AUX_STATUS     0x24    /* 10.5.4.4 */
936 #define GSM48_IE_NOTIFY         0x27    /* 10.5.4.20 */
937 #define GSM48_IE_KPD_FACILITY   0x2c    /* 10.5.4.17 */
938 #define GSM48_IE_SIGNAL         0x34    /* 10.5.4.23 */
939 #define GSM48_IE_CONN_BCD       0x4c    /* 10.5.4.13 */
940 #define GSM48_IE_CONN_SUB       0x4d    /* 10.5.4.14 */
941 #define GSM48_IE_CALLING_BCD    0x5c    /* 10.5.4.9 */
942 #define GSM48_IE_CALLING_SUB    0x5d    /* 10.5.4.10 */
943 #define GSM48_IE_CALLED_BCD     0x5e    /* 10.5.4.7 */
944 #define GSM48_IE_CALLED_SUB     0x6d    /* 10.5.4.8 */
945 #define GSM48_IE_REDIR_BCD      0x74    /* 10.5.4.21a */
946 #define GSM48_IE_REDIR_SUB      0x75    /* 10.5.4.21b */
947 #define GSM48_IE_LOWL_COMPAT    0x7c    /* 10.5.4.18 */
948 #define GSM48_IE_HIGHL_COMPAT   0x7d    /* 10.5.4.16 */
949 #define GSM48_IE_USER_USER      0x7e    /* 10.5.4.25 */
950 #define GSM48_IE_SS_VERS        0x7f    /* 10.5.4.24 */
951 #define GSM48_IE_MORE_DATA      0xa0    /* 10.5.4.19 */
952 #define GSM48_IE_CLIR_SUPP      0xa1    /* 10.5.4.11a */
953 #define GSM48_IE_CLIR_INVOC     0xa2    /* 10.5.4.11b */
954 #define GSM48_IE_REV_C_SETUP    0xa3    /* 10.5.4.22a */
955 #define GSM48_IE_REPEAT_CIR     0xd1    /* 10.5.4.22 */
956 #define GSM48_IE_REPEAT_SEQ     0xd3    /* 10.5.4.22 */
957
958 /* Section 10.5.4.11 / Table 10.5.122 */
959 #define GSM48_CAUSE_CS_GSM      0x60
960
961 /* Section 9.1.2 / Table 9.3 */
962 /* RR elements */
963 #define GSM48_IE_VGCS_TARGET    0x01
964 //#define GSM48_IE_VGCS_T_MODE_I        0x01
965 #define GSM48_IE_FRQSHORT_AFTER 0x02
966 #define GSM48_IE_MUL_RATE_CFG   0x03    /* 10.5.2.21aa */
967 #define GSM48_IE_FREQ_L_AFTER   0x05
968 #define GSM48_IE_MSLOT_DESC     0x10
969 #define GSM48_IE_CHANMODE_2     0x11
970 #define GSM48_IE_FRQSHORT_BEFORE 0x12
971 //#define GSM48_IE_FRQSHORT_BEFOR 0x12
972 #define GSM48_IE_CHANMODE_3     0x13
973 #define GSM48_IE_CHANMODE_4     0x14
974 #define GSM48_IE_CHANMODE_5     0x15
975 #define GSM48_IE_CHANMODE_6     0x16
976 #define GSM48_IE_CHANMODE_7     0x17
977 #define GSM48_IE_CHANMODE_8     0x18
978 #define GSM48_IE_CHANDESC_2     0x64
979 #define GSM48_IE_MA_AFTER       0x72
980 #define GSM48_IE_START_TIME     0x7c
981 #define GSM48_IE_FREQ_L_BEFORE  0x19
982 //#define GSM48_IE_FRQLIST_BEFORE       0x19
983 #define GSM48_IE_CH_DESC_1_BEFORE       0x1c
984 //#define GSM48_IE_CHDES_1_BEFORE 0x1c
985 #define GSM48_IE_CH_DESC_2_BEFORE       0x1d
986 //#define GSM48_IE_CHDES_2_BEFORE       0x1d
987 #define GSM48_IE_F_CH_SEQ_BEFORE        0x1e
988 //#define GSM48_IE_FRQSEQ_BEFORE        0x1e
989 #define GSM48_IE_CLASSMARK3     0x20
990 #define GSM48_IE_MA_BEFORE      0x21
991 #define GSM48_IE_RR_PACKET_UL   0x22
992 #define GSM48_IE_RR_PACKET_DL   0x23
993 #define GSM48_IE_CELL_CH_DESC   0x62
994 #define GSM48_IE_CHANMODE_1     0x63
995 #define GSM48_IE_CHDES_2_AFTER  0x64
996 #define GSM48_IE_MODE_SEC_CH    0x66
997 #define GSM48_IE_F_CH_SEQ_AFTER 0x69
998 #define GSM48_IE_MA_AFTER       0x72
999 #define GSM48_IE_BA_RANGE       0x73
1000 #define GSM48_IE_GROUP_CHDES    0x74
1001 #define GSM48_IE_BA_LIST_PREF   0x75
1002 #define GSM48_IE_MOB_OVSERV_DIF 0x77
1003 #define GSM48_IE_REALTIME_DIFF  0x7b
1004 #define GSM48_IE_START_TIME     0x7c
1005 #define GSM48_IE_TIMING_ADVANCE 0x7d
1006 #define GSM48_IE_GROUP_CIP_SEQ  0x80
1007 #define GSM48_IE_CIP_MODE_SET   0x90
1008 #define GSM48_IE_GPRS_RESUMPT   0xc0
1009 #define GSM48_IE_SYNC_IND       0xd0
1010 /* System Information 4 (types are equal IEs above) */
1011 #define GSM48_IE_CBCH_CHAN_DESC 0x64
1012 #define GSM48_IE_CBCH_MOB_AL    0x72
1013
1014 /* Additional MM elements */
1015 #define GSM48_IE_LOCATION_AREA  0x13
1016 #define GSM48_IE_PRIORITY_LEV   0x80
1017 #define GSM48_IE_FOLLOW_ON_PROC 0xa1
1018 #define GSM48_IE_CTS_PERMISSION 0xa2
1019
1020 /* Section 10.5.4.23 / Table 10.5.130 */
1021 enum gsm48_signal_val {
1022         GSM48_SIGNAL_DIALTONE   = 0x00,
1023         GSM48_SIGNAL_RINGBACK   = 0x01,
1024         GSM48_SIGNAL_INTERCEPT  = 0x02,
1025         GSM48_SIGNAL_NET_CONG   = 0x03,
1026         GSM48_SIGNAL_BUSY       = 0x04,
1027         GSM48_SIGNAL_CONFIRM    = 0x05,
1028         GSM48_SIGNAL_ANSWER     = 0x06,
1029         GSM48_SIGNAL_CALL_WAIT  = 0x07,
1030         GSM48_SIGNAL_OFF_HOOK   = 0x08,
1031         GSM48_SIGNAL_OFF        = 0x3f,
1032         GSM48_SIGNAL_ALERT_OFF  = 0x4f,
1033 };
1034
1035 enum gsm48_cause_loc {
1036         GSM48_CAUSE_LOC_USER            = 0x00,
1037         GSM48_CAUSE_LOC_PRN_S_LU        = 0x01,
1038         GSM48_CAUSE_LOC_PUN_S_LU        = 0x02,
1039         GSM48_CAUSE_LOC_TRANS_NET       = 0x03,
1040         GSM48_CAUSE_LOC_PUN_S_RU        = 0x04,
1041         GSM48_CAUSE_LOC_PRN_S_RU        = 0x05,
1042         /* not defined */
1043         GSM48_CAUSE_LOC_INN_NET         = 0x07,
1044         GSM48_CAUSE_LOC_NET_BEYOND      = 0x0a,
1045 };
1046
1047 /* Section 10.5.2.31 RR Cause / Table 10.5.70 */
1048 enum gsm48_rr_cause {
1049         GSM48_RR_CAUSE_NORMAL           = 0x00,
1050         GSM48_RR_CAUSE_ABNORMAL_UNSPEC  = 0x01,
1051         GSM48_RR_CAUSE_ABNORMAL_UNACCT  = 0x02,
1052         GSM48_RR_CAUSE_ABNORMAL_TIMER   = 0x03,
1053         GSM48_RR_CAUSE_ABNORMAL_NOACT   = 0x04,
1054         GSM48_RR_CAUSE_PREMPTIVE_REL    = 0x05,
1055         GSM48_RR_CAUSE_HNDOVER_IMP      = 0x06,
1056         GSM48_RR_CAUSE_CHAN_MODE_UNACCT = 0x07,
1057         GSM48_RR_CAUSE_FREQ_NOT_IMPL    = 0x08,
1058         GSM48_RR_CAUSE_CALL_CLEARED     = 0x41,
1059         GSM48_RR_CAUSE_SEMANT_INCORR    = 0x5f,
1060         GSM48_RR_CAUSE_INVALID_MAND_INF = 0x60,
1061         GSM48_RR_CAUSE_MSG_TYPE_N       = 0x61,
1062         GSM48_RR_CAUSE_MSG_TYPE_N_COMPAT= 0x62,
1063         GSM48_RR_CAUSE_COND_IE_ERROR    = 0x64,
1064         GSM48_RR_CAUSE_NO_CELL_ALLOC_A  = 0x65,
1065         GSM48_RR_CAUSE_PROT_ERROR_UNSPC = 0x6f,
1066 };
1067
1068 /* Section 10.5.4.11 CC Cause / Table 10.5.123 */
1069 enum gsm48_cc_cause {
1070         GSM48_CC_CAUSE_UNASSIGNED_NR    = 1,
1071         GSM48_CC_CAUSE_NO_ROUTE         = 3,
1072         GSM48_CC_CAUSE_CHAN_UNACCEPT    = 6,
1073         GSM48_CC_CAUSE_OP_DET_BARRING   = 8,
1074         GSM48_CC_CAUSE_NORM_CALL_CLEAR  = 16,
1075         GSM48_CC_CAUSE_USER_BUSY        = 17,
1076         GSM48_CC_CAUSE_USER_NOTRESPOND  = 18,
1077         GSM48_CC_CAUSE_USER_ALERTING_NA = 19,
1078         GSM48_CC_CAUSE_CALL_REJECTED    = 21,
1079         GSM48_CC_CAUSE_NUMBER_CHANGED   = 22,
1080         GSM48_CC_CAUSE_PRE_EMPTION      = 25,
1081         GSM48_CC_CAUSE_NONSE_USER_CLR   = 26,
1082         GSM48_CC_CAUSE_DEST_OOO         = 27,
1083         GSM48_CC_CAUSE_INV_NR_FORMAT    = 28,
1084         GSM48_CC_CAUSE_FACILITY_REJ     = 29,
1085         GSM48_CC_CAUSE_RESP_STATUS_INQ  = 30,
1086         GSM48_CC_CAUSE_NORMAL_UNSPEC    = 31,
1087         GSM48_CC_CAUSE_NO_CIRCUIT_CHAN  = 34,
1088         GSM48_CC_CAUSE_NETWORK_OOO      = 38,
1089         GSM48_CC_CAUSE_TEMP_FAILURE     = 41,
1090         GSM48_CC_CAUSE_SWITCH_CONG      = 42,
1091         GSM48_CC_CAUSE_ACC_INF_DISCARD  = 43,
1092         GSM48_CC_CAUSE_REQ_CHAN_UNAVAIL = 44,
1093         GSM48_CC_CAUSE_RESOURCE_UNAVAIL = 47,
1094         GSM48_CC_CAUSE_QOS_UNAVAIL      = 49,
1095         GSM48_CC_CAUSE_REQ_FAC_NOT_SUBSC= 50,
1096         GSM48_CC_CAUSE_INC_BARRED_CUG   = 55,
1097         GSM48_CC_CAUSE_BEARER_CAP_UNAUTH= 57,
1098         GSM48_CC_CAUSE_BEARER_CA_UNAVAIL= 58,
1099         GSM48_CC_CAUSE_SERV_OPT_UNAVAIL = 63,
1100         GSM48_CC_CAUSE_BEARERSERV_UNIMPL= 65,
1101         GSM48_CC_CAUSE_ACM_GE_ACM_MAX   = 68,
1102         GSM48_CC_CAUSE_REQ_FAC_NOTIMPL  = 69,
1103         GSM48_CC_CAUSE_RESTR_BCAP_AVAIL = 70,
1104         GSM48_CC_CAUSE_SERV_OPT_UNIMPL  = 79,
1105         GSM48_CC_CAUSE_INVAL_TRANS_ID   = 81,
1106         GSM48_CC_CAUSE_USER_NOT_IN_CUG  = 87,
1107         GSM48_CC_CAUSE_INCOMPAT_DEST    = 88,
1108         GSM48_CC_CAUSE_INVAL_TRANS_NET  = 91,
1109         GSM48_CC_CAUSE_SEMANTIC_INCORR  = 95,
1110         GSM48_CC_CAUSE_INVAL_MAND_INF   = 96,
1111         GSM48_CC_CAUSE_MSGTYPE_NOTEXIST = 97,
1112         GSM48_CC_CAUSE_MSGTYPE_INCOMPAT = 98,
1113         GSM48_CC_CAUSE_IE_NOTEXIST      = 99,
1114         GSM48_CC_CAUSE_COND_IE_ERR      = 100,
1115         GSM48_CC_CAUSE_MSG_INCOMP_STATE = 101,
1116         GSM48_CC_CAUSE_RECOVERY_TIMER   = 102,
1117         GSM48_CC_CAUSE_PROTO_ERR        = 111,
1118         GSM48_CC_CAUSE_INTERWORKING     = 127,
1119 };
1120
1121 /* Annex G, GSM specific cause values for mobility management */
1122 enum gsm48_reject_value {
1123         GSM48_REJECT_IMSI_UNKNOWN_IN_HLR        = 2,
1124         GSM48_REJECT_ILLEGAL_MS                 = 3,
1125         GSM48_REJECT_IMSI_UNKNOWN_IN_VLR        = 4,
1126         GSM48_REJECT_IMEI_NOT_ACCEPTED          = 5,
1127         GSM48_REJECT_ILLEGAL_ME                 = 6,
1128         GSM48_REJECT_PLMN_NOT_ALLOWED           = 11,
1129         GSM48_REJECT_LOC_NOT_ALLOWED            = 12,
1130         GSM48_REJECT_ROAMING_NOT_ALLOWED        = 13,
1131         GSM48_REJECT_NETWORK_FAILURE            = 17,
1132         GSM48_REJECT_CONGESTION                 = 22,
1133         GSM48_REJECT_SRV_OPT_NOT_SUPPORTED      = 32,
1134         GSM48_REJECT_RQD_SRV_OPT_NOT_SUPPORTED  = 33,
1135         GSM48_REJECT_SRV_OPT_TMP_OUT_OF_ORDER   = 34,
1136         GSM48_REJECT_CALL_CAN_NOT_BE_IDENTIFIED = 38,
1137         GSM48_REJECT_INCORRECT_MESSAGE          = 95,
1138         GSM48_REJECT_INVALID_MANDANTORY_INF     = 96,
1139         GSM48_REJECT_MSG_TYPE_NOT_IMPLEMENTED   = 97,
1140         GSM48_REJECT_MSG_TYPE_NOT_COMPATIBLE    = 98,
1141         GSM48_REJECT_INF_ELEME_NOT_IMPLEMENTED  = 99,
1142         GSM48_REJECT_CONDTIONAL_IE_ERROR        = 100,
1143         GSM48_REJECT_MSG_NOT_COMPATIBLE         = 101,
1144         GSM48_REJECT_PROTOCOL_ERROR             = 111,
1145
1146         /* according to G.6 Additional cause codes for GMM */
1147         GSM48_REJECT_GPRS_NOT_ALLOWED           = 7,
1148         GSM48_REJECT_SERVICES_NOT_ALLOWED       = 8,
1149         GSM48_REJECT_MS_IDENTITY_NOT_DERVIVABLE = 9,
1150         GSM48_REJECT_IMPLICITLY_DETACHED        = 10,
1151         GSM48_REJECT_GPRS_NOT_ALLOWED_IN_PLMN   = 14,
1152         GSM48_REJECT_MSC_TMP_NOT_REACHABLE      = 16,
1153 };
1154
1155 enum chreq_type {
1156         CHREQ_T_EMERG_CALL,
1157         CHREQ_T_CALL_REEST_TCH_F,
1158         CHREQ_T_CALL_REEST_TCH_H,
1159         CHREQ_T_CALL_REEST_TCH_H_DBL,
1160         CHREQ_T_SDCCH,
1161         CHREQ_T_TCH_F,
1162         CHREQ_T_VOICE_CALL_TCH_H,
1163         CHREQ_T_DATA_CALL_TCH_H,
1164         CHREQ_T_LOCATION_UPD,
1165         CHREQ_T_PAG_R_ANY_NECI0,
1166         CHREQ_T_PAG_R_ANY_NECI1,
1167         CHREQ_T_PAG_R_TCH_F,
1168         CHREQ_T_PAG_R_TCH_FH,
1169         CHREQ_T_LMU,
1170         CHREQ_T_RESERVED_SDCCH,
1171         CHREQ_T_RESERVED_IGNORE,
1172 };
1173
1174 /* Chapter 11.3 */
1175 #define GSM48_T301      180, 0
1176 #define GSM48_T303      30, 0
1177 #define GSM48_T305      30, 0
1178 #define GSM48_T306      30, 0
1179 #define GSM48_T308      10, 0
1180 #define GSM48_T310      180, 0
1181 #define GSM48_T313      30, 0
1182 #define GSM48_T323      30, 0
1183 #define GSM48_T331      30, 0
1184 #define GSM48_T333      30, 0
1185 #define GSM48_T334      25, 0 /* min 15 */
1186 #define GSM48_T338      30, 0
1187 #define GSM48_T303_MS   30, 0
1188 #define GSM48_T305_MS   30, 0
1189 #define GSM48_T308_MS   30, 0
1190 #define GSM48_T310_MS   30, 0
1191 #define GSM48_T313_MS   30, 0
1192 #define GSM48_T323_MS   30, 0
1193 #define GSM48_T332_MS   30, 0
1194 #define GSM48_T335_MS   30, 0
1195
1196 /* Chapter 5.1.2.2 */
1197 #define GSM_CSTATE_NULL                 0
1198 #define GSM_CSTATE_INITIATED            1
1199 #define GSM_CSTATE_MM_CONNECTION_PEND   2 /* see 10.5.4.6 */
1200 #define GSM_CSTATE_MO_CALL_PROC         3
1201 #define GSM_CSTATE_CALL_DELIVERED       4
1202 #define GSM_CSTATE_CALL_PRESENT         6
1203 #define GSM_CSTATE_CALL_RECEIVED        7
1204 #define GSM_CSTATE_CONNECT_REQUEST      8
1205 #define GSM_CSTATE_MO_TERM_CALL_CONF    9
1206 #define GSM_CSTATE_ACTIVE               10
1207 #define GSM_CSTATE_DISCONNECT_REQ       12
1208 #define GSM_CSTATE_DISCONNECT_IND       12
1209 #define GSM_CSTATE_RELEASE_REQ          19
1210 #define GSM_CSTATE_MO_ORIG_MODIFY       26
1211 #define GSM_CSTATE_MO_TERM_MODIFY       27
1212 #define GSM_CSTATE_CONNECT_IND          28
1213
1214 #define SBIT(a) (1 << a)
1215 #define ALL_STATES 0xffffffff
1216
1217 /* Table 10.5.3/3GPP TS 04.08: Location Area Identification information element */
1218 #define GSM_LAC_RESERVED_DETACHED       0x0
1219 #define GSM_LAC_RESERVED_ALL_BTS        0xfffe
1220
1221 /* GSM 04.08 Bearer Capability: Information Transfer Capability */
1222 enum gsm48_bcap_itcap {
1223         GSM48_BCAP_ITCAP_SPEECH         = 0,
1224         GSM48_BCAP_ITCAP_UNR_DIG_INF    = 1,
1225         GSM48_BCAP_ITCAP_3k1_AUDIO      = 2,
1226         GSM48_BCAP_ITCAP_FAX_G3         = 3,
1227         GSM48_BCAP_ITCAP_OTHER          = 5,
1228         GSM48_BCAP_ITCAP_RESERVED       = 7,
1229 };
1230
1231 /* GSM 04.08 Bearer Capability: Transfer Mode */
1232 enum gsm48_bcap_tmod {
1233         GSM48_BCAP_TMOD_CIRCUIT         = 0,
1234         GSM48_BCAP_TMOD_PACKET          = 1,
1235 };
1236
1237 /* GSM 04.08 Bearer Capability: Coding Standard */
1238 enum gsm48_bcap_coding {
1239         GSM48_BCAP_CODING_GSM_STD       = 0,
1240 };
1241
1242 /* GSM 04.08 Bearer Capability: Radio Channel Requirements */
1243 enum gsm48_bcap_rrq {
1244         GSM48_BCAP_RRQ_FR_ONLY  = 1,
1245         GSM48_BCAP_RRQ_DUAL_HR  = 2,
1246         GSM48_BCAP_RRQ_DUAL_FR  = 3,
1247 };
1248
1249 #define GSM48_TMSI_LEN  5
1250 #define GSM48_MID_TMSI_LEN      (GSM48_TMSI_LEN + 2)
1251 #define GSM48_MI_SIZE 32
1252
1253 /* Chapter 10.4.4.15 */
1254 struct gsm48_ra_id {
1255         uint8_t digits[3];      /* MCC + MNC BCD digits */
1256         uint16_t lac;           /* Location Area Code */
1257         uint8_t rac;            /* Routing Area Code */
1258 } __attribute__ ((packed));
1259
1260 #define GSM48_CELL_CHAN_DESC_SIZE       16
1261
1262 #define GSM_MACBLOCK_LEN        23
1263 #define GSM_MACBLOCK_PADDING    0x2b
1264
1265 #endif /* PROTO_GSM_04_08_H */