libosmogsm  1.0.1.85-9f28
Osmocom GSM library
gsm_04_08.h
Go to the documentation of this file.
1 
4 #pragma once
5 
6 #include <stdint.h>
7 #include <stdbool.h>
8 
9 #include <osmocom/core/utils.h>
10 #include <osmocom/core/endian.h>
11 
12 struct gsm_lchan;
13 
14 /* Chapter 10.5.1.5 */
16 #if OSMO_IS_LITTLE_ENDIAN
17  uint8_t pwr_lev:3,
18  a5_1:1,
19  es_ind:1,
20  rev_lev:2,
21  spare:1;
22 #elif OSMO_IS_BIG_ENDIAN
23 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
24  uint8_t spare:1, rev_lev:2, es_ind:1, a5_1:1, pwr_lev:3;
25 #endif
26 } __attribute__ ((packed));
27 
28 /* Chapter 10.5.1.6 */
30 #if OSMO_IS_LITTLE_ENDIAN
31  uint8_t pwr_lev:3,
32  a5_1:1,
33  es_ind:1,
34  rev_lev:2,
35  spare:1;
36  uint8_t fc:1,
37  vgcs:1,
38  vbs:1,
39  sm_cap:1,
40  ss_scr:2,
41  ps_cap:1,
42  spare2:1;
43  uint8_t a5_2:1,
44  a5_3:1,
45  cmsp:1,
46  solsa:1,
47  spare3:1,
48  lcsva_cap:1,
49  spare4:1,
50  cm3:1;
51 #elif OSMO_IS_BIG_ENDIAN
52 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
53  uint8_t spare:1, rev_lev:2, es_ind:1, a5_1:1, pwr_lev:3;
54  uint8_t spare2:1, ps_cap:1, ss_scr:2, sm_cap:1, vbs:1, vgcs:1, fc:1;
55  uint8_t cm3:1, spare4:1, lcsva_cap:1, spare3:1, solsa:1, cmsp:1, a5_3:1, a5_2:1;
56 #endif
57 } __attribute__ ((packed));
58 
62  uint8_t classmark2_len;
63  struct gsm48_classmark2 classmark2;
64  uint8_t classmark3_len;
65  uint8_t classmark3[14]; /* if cm3 gets extended by spec, it will be truncated */
66 };
67 
69 bool osmo_gsm48_classmark1_is_r99(const struct gsm48_classmark1 *cm1);
70 bool osmo_gsm48_classmark2_is_r99(const struct gsm48_classmark2 *cm2, uint8_t cm2_len);
71 int osmo_gsm48_classmark_supports_a5(const struct osmo_gsm48_classmark *cm, uint8_t a5);
72 const char *osmo_gsm48_classmark_a5_name(const struct osmo_gsm48_classmark *cm);
73 void osmo_gsm48_classmark_update(struct osmo_gsm48_classmark *dst, const struct osmo_gsm48_classmark *src);
74 
75 /* Chapter 10.5.2.1b.3 */
76 #if OSMO_IS_LITTLE_ENDIAN == 1
77 struct gsm48_range_1024 {
78 #if OSMO_IS_LITTLE_ENDIAN
79  uint8_t w1_hi:2,
80  f0:1,
81  form_id:5;
82  uint8_t w1_lo;
83  uint8_t w2_hi;
84  uint8_t w3_hi:7,
85  w2_lo:1;
86  uint8_t w4_hi:6,
87  w3_lo:2;
88  uint8_t w5_hi:6,
89  w4_lo:2;
90  uint8_t w6_hi:6,
91  w5_lo:2;
92  uint8_t w7_hi:6,
93  w6_lo:2;
94  uint8_t w8_hi:6,
95  w7_lo:2;
96  uint8_t w9:7,
97  w8_lo:1;
98  uint8_t w11_hi:1,
99  w10:7;
100  uint8_t w12_hi:2,
101  w11_lo:6;
102  uint8_t w13_hi:3,
103  w12_lo:5;
104  uint8_t w14_hi:4,
105  w13_lo:4;
106  uint8_t w15_hi:5,
107  w14_lo:3;
108  uint8_t w16:6,
109  w15_lo:2;
110 #elif OSMO_IS_BIG_ENDIAN
111 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
112  uint8_t form_id:5, f0:1, w1_hi:2;
113  uint8_t w1_lo;
114  uint8_t w2_hi;
115  uint8_t w2_lo:1, w3_hi:7;
116  uint8_t w3_lo:2, w4_hi:6;
117  uint8_t w4_lo:2, w5_hi:6;
118  uint8_t w5_lo:2, w6_hi:6;
119  uint8_t w6_lo:2, w7_hi:6;
120  uint8_t w7_lo:2, w8_hi:6;
121  uint8_t w8_lo:1, w9:7;
122  uint8_t w10:7, w11_hi:1;
123  uint8_t w11_lo:6, w12_hi:2;
124  uint8_t w12_lo:5, w13_hi:3;
125  uint8_t w13_lo:4, w14_hi:4;
126  uint8_t w14_lo:3, w15_hi:5;
127  uint8_t w15_lo:2, w16:6;
128 #endif
129 } __attribute__ ((packed));
130 #else
132 #if OSMO_IS_LITTLE_ENDIAN
133  uint8_t form_id:5,
134  f0:1,
135  w1_hi:2;
136  uint8_t w1_lo;
137  uint8_t w2_hi;
138  uint8_t w2_lo:1,
139  w3_hi:7;
140  uint8_t w3_lo:2,
141  w4_hi:6;
142  uint8_t w4_lo:2,
143  w5_hi:6;
144  uint8_t w5_lo:2,
145  w6_hi:6;
146  uint8_t w6_lo:2,
147  w7_hi:6;
148  uint8_t w7_lo:2,
149  w8_hi:6;
150  uint8_t w8_lo:1,
151  w9:7;
152  uint8_t w10:7,
153  w11_hi:1;
154  uint8_t w11_lo:6,
155  w12_hi:2;
156  uint8_t w12_lo:5,
157  w13_hi:3;
158  uint8_t w13_lo:4,
159  w14_hi:4;
160  uint8_t w14_lo:3,
161  w15_hi:5;
162  uint8_t w15_lo:2,
163  w16:6;
164 #elif OSMO_IS_BIG_ENDIAN
165 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
166  uint8_t w1_hi:2, f0:1, form_id:5;
167  uint8_t w1_lo;
168  uint8_t w2_hi;
169  uint8_t w3_hi:7, w2_lo:1;
170  uint8_t w4_hi:6, w3_lo:2;
171  uint8_t w5_hi:6, w4_lo:2;
172  uint8_t w6_hi:6, w5_lo:2;
173  uint8_t w7_hi:6, w6_lo:2;
174  uint8_t w8_hi:6, w7_lo:2;
175  uint8_t w9:7, w8_lo:1;
176  uint8_t w11_hi:1, w10:7;
177  uint8_t w12_hi:2, w11_lo:6;
178  uint8_t w13_hi:3, w12_lo:5;
179  uint8_t w14_hi:4, w13_lo:4;
180  uint8_t w15_hi:5, w14_lo:3;
181  uint8_t w16:6, w15_lo:2;
182 #endif
183 } __attribute__ ((packed));
184 #endif
185 
186 /* Chapter 10.5.2.1b.4 */
187 #if OSMO_IS_LITTLE_ENDIAN == 1
188 struct gsm48_range_512 {
189 #if OSMO_IS_LITTLE_ENDIAN
190  uint8_t orig_arfcn_hi:1,
191  form_id:7;
192  uint8_t orig_arfcn_mid;
193  uint8_t w1_hi:7,
194  orig_arfcn_lo:1;
195  uint8_t w2_hi:6,
196  w1_lo:2;
197  uint8_t w3_hi:6,
198  w2_lo:2;
199  uint8_t w4_hi:6,
200  w3_lo:2;
201  uint8_t w5:7,
202  w4_lo:1;
203  uint8_t w7_hi:1,
204  w6:7;
205  uint8_t w8_hi:2,
206  w7_lo:6;
207  uint8_t w9_hi:4,
208  w8_lo:4;
209  uint8_t w10:6,
210  w9_lo:2;
211  uint8_t w12_hi:2,
212  w11:6;
213  uint8_t w13_hi:4,
214  w12_lo:4;
215  uint8_t w14:6,
216  w13_lo:2;
217  uint8_t w16_hi:2,
218  w15:6;
219  uint8_t w17:5,
220  w16_lo:3;
221 #elif OSMO_IS_BIG_ENDIAN
222 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
223  uint8_t form_id:7, orig_arfcn_hi:1;
224  uint8_t orig_arfcn_mid;
225  uint8_t orig_arfcn_lo:1, w1_hi:7;
226  uint8_t w1_lo:2, w2_hi:6;
227  uint8_t w2_lo:2, w3_hi:6;
228  uint8_t w3_lo:2, w4_hi:6;
229  uint8_t w4_lo:1, w5:7;
230  uint8_t w6:7, w7_hi:1;
231  uint8_t w7_lo:6, w8_hi:2;
232  uint8_t w8_lo:4, w9_hi:4;
233  uint8_t w9_lo:2, w10:6;
234  uint8_t w11:6, w12_hi:2;
235  uint8_t w12_lo:4, w13_hi:4;
236  uint8_t w13_lo:2, w14:6;
237  uint8_t w15:6, w16_hi:2;
238  uint8_t w16_lo:3, w17:5;
239 #endif
240 } __attribute__ ((packed));
241 #else
243 #if OSMO_IS_LITTLE_ENDIAN
244  uint8_t form_id:7,
245  orig_arfcn_hi:1;
246  uint8_t orig_arfcn_mid;
247  uint8_t orig_arfcn_lo:1,
248  w1_hi:7;
249  uint8_t w1_lo:2,
250  w2_hi:6;
251  uint8_t w2_lo:2,
252  w3_hi:6;
253  uint8_t w3_lo:2,
254  w4_hi:6;
255  uint8_t w4_lo:1,
256  w5:7;
257  uint8_t w6:7,
258  w7_hi:1;
259  uint8_t w7_lo:6,
260  w8_hi:2;
261  uint8_t w8_lo:4,
262  w9_hi:4;
263  uint8_t w9_lo:2,
264  w10:6;
265  uint8_t w11:6,
266  w12_hi:2;
267  uint8_t w12_lo:4,
268  w13_hi:4;
269  uint8_t w13_lo:2,
270  w14:6;
271  uint8_t w15:6,
272  w16_hi:2;
273  uint8_t w16_lo:3,
274  w17:5;
275 #elif OSMO_IS_BIG_ENDIAN
276 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
277  uint8_t orig_arfcn_hi:1, form_id:7;
278  uint8_t orig_arfcn_mid;
279  uint8_t w1_hi:7, orig_arfcn_lo:1;
280  uint8_t w2_hi:6, w1_lo:2;
281  uint8_t w3_hi:6, w2_lo:2;
282  uint8_t w4_hi:6, w3_lo:2;
283  uint8_t w5:7, w4_lo:1;
284  uint8_t w7_hi:1, w6:7;
285  uint8_t w8_hi:2, w7_lo:6;
286  uint8_t w9_hi:4, w8_lo:4;
287  uint8_t w10:6, w9_lo:2;
288  uint8_t w12_hi:2, w11:6;
289  uint8_t w13_hi:4, w12_lo:4;
290  uint8_t w14:6, w13_lo:2;
291  uint8_t w16_hi:2, w15:6;
292  uint8_t w17:5, w16_lo:3;
293 #endif
294 } __attribute__ ((packed));
295 #endif
296 
297 /* Chapter 10.5.2.1b.5 */
298 #if OSMO_IS_LITTLE_ENDIAN == 1
299 struct gsm48_range_256 {
300 #if OSMO_IS_LITTLE_ENDIAN
301  uint8_t orig_arfcn_hi:1,
302  form_id:7;
303  uint8_t orig_arfcn_mid;
304  uint8_t w1_hi:7,
305  orig_arfcn_lo:1;
306  uint8_t w2:7,
307  w1_lo:1;
308  uint8_t w4_hi:1,
309  w3:7;
310  uint8_t w5_hi:3,
311  w4_lo:5;
312  uint8_t w6_hi:5,
313  w5_lo:3;
314  uint8_t w8_hi:1,
315  w7:6,
316  w6_lo:1;
317  uint8_t w9_hi:4,
318  w8_lo:4;
319  uint8_t w11_hi:2,
320  w10:5,
321  w9_lo:1;
322  uint8_t w12:5,
323  w11_lo:3;
324  uint8_t w14_hi:3,
325  w13:5;
326  uint8_t w16_hi:1,
327  w15:5,
328  w14_lo:2;
329  uint8_t w18_hi:1,
330  w17:4,
331  w16_lo:3;
332  uint8_t w20_hi:1,
333  w19:4,
334  w18_lo:3;
335  uint8_t spare:1,
336  w21:4,
337  w20_lo:3;
338 #elif OSMO_IS_BIG_ENDIAN
339 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
340  uint8_t form_id:7, orig_arfcn_hi:1;
341  uint8_t orig_arfcn_mid;
342  uint8_t orig_arfcn_lo:1, w1_hi:7;
343  uint8_t w1_lo:1, w2:7;
344  uint8_t w3:7, w4_hi:1;
345  uint8_t w4_lo:5, w5_hi:3;
346  uint8_t w5_lo:3, w6_hi:5;
347  uint8_t w6_lo:1, w7:6, w8_hi:1;
348  uint8_t w8_lo:4, w9_hi:4;
349  uint8_t w9_lo:1, w10:5, w11_hi:2;
350  uint8_t w11_lo:3, w12:5;
351  uint8_t w13:5, w14_hi:3;
352  uint8_t w14_lo:2, w15:5, w16_hi:1;
353  uint8_t w16_lo:3, w17:4, w18_hi:1;
354  uint8_t w18_lo:3, w19:4, w20_hi:1;
355  uint8_t w20_lo:3, w21:4, spare:1;
356 #endif
357 } __attribute__ ((packed));
358 #else
360 #if OSMO_IS_LITTLE_ENDIAN
361  uint8_t form_id:7,
362  orig_arfcn_hi:1;
363  uint8_t orig_arfcn_mid;
364  uint8_t orig_arfcn_lo:1,
365  w1_hi:7;
366  uint8_t w1_lo:1,
367  w2:7;
368  uint8_t w3:7,
369  w4_hi:1;
370  uint8_t w4_lo:5,
371  w5_hi:3;
372  uint8_t w5_lo:3,
373  w6_hi:5;
374  uint8_t w6_lo:1,
375  w7:6,
376  w8_hi:1;
377  uint8_t w8_lo:4,
378  w9_hi:4;
379  uint8_t w9_lo:1,
380  w10:5,
381  w11_hi:2;
382  uint8_t w11_lo:3,
383  w12:5;
384  uint8_t w13:5,
385  w14_hi:3;
386  uint8_t w14_lo:2,
387  w15:5,
388  w16_hi:1;
389  uint8_t w16_lo:3,
390  w17:4,
391  w18_hi:1;
392  uint8_t w18_lo:3,
393  w19:4,
394  w20_hi:1;
395  uint8_t w20_lo:3,
396  w21:4,
397  spare:1;
398 #elif OSMO_IS_BIG_ENDIAN
399 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
400  uint8_t orig_arfcn_hi:1, form_id:7;
401  uint8_t orig_arfcn_mid;
402  uint8_t w1_hi:7, orig_arfcn_lo:1;
403  uint8_t w2:7, w1_lo:1;
404  uint8_t w4_hi:1, w3:7;
405  uint8_t w5_hi:3, w4_lo:5;
406  uint8_t w6_hi:5, w5_lo:3;
407  uint8_t w8_hi:1, w7:6, w6_lo:1;
408  uint8_t w9_hi:4, w8_lo:4;
409  uint8_t w11_hi:2, w10:5, w9_lo:1;
410  uint8_t w12:5, w11_lo:3;
411  uint8_t w14_hi:3, w13:5;
412  uint8_t w16_hi:1, w15:5, w14_lo:2;
413  uint8_t w18_hi:1, w17:4, w16_lo:3;
414  uint8_t w20_hi:1, w19:4, w18_lo:3;
415  uint8_t spare:1, w21:4, w20_lo:3;
416 #endif
417 } __attribute__ ((packed));
418 #endif
419 
420 /* Chapter 10.5.2.1b.6 */
421 #if OSMO_IS_LITTLE_ENDIAN == 1
422 struct gsm48_range_128 {
423 #if OSMO_IS_LITTLE_ENDIAN
424  uint8_t orig_arfcn_hi:1,
425  form_id:7;
426  uint8_t orig_arfcn_mid;
427  uint8_t w1:7,
428  orig_arfcn_lo:1;
429  uint8_t w3_hi:2,
430  w2:6;
431  uint8_t w4_hi:4,
432  w3_lo:4;
433  uint8_t w6_hi:2,
434  w5:5,
435  w4_lo:1;
436  uint8_t w7:5,
437  w6_lo:3;
438  uint8_t w9:4,
439  w8:4;
440  uint8_t w11:4,
441  w10:4;
442  uint8_t w13:4,
443  w12:4;
444  uint8_t w15:4,
445  w14:4;
446  uint8_t w18_hi:2,
447  w17:3,
448  w16:3;
449  uint8_t w21_hi:1,
450  w20:3,
451  w19:3,
452  w18_lo:1;
453  uint8_t w23:3,
454  w22:3,
455  w21_lo:2;
456  uint8_t w26_hi:2,
457  w25:3,
458  w24:3;
459  uint8_t spare:1,
460  w28:3,
461  w27:3,
462  w26_lo:1;
463 #elif OSMO_IS_BIG_ENDIAN
464 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
465  uint8_t form_id:7, orig_arfcn_hi:1;
466  uint8_t orig_arfcn_mid;
467  uint8_t orig_arfcn_lo:1, w1:7;
468  uint8_t w2:6, w3_hi:2;
469  uint8_t w3_lo:4, w4_hi:4;
470  uint8_t w4_lo:1, w5:5, w6_hi:2;
471  uint8_t w6_lo:3, w7:5;
472  uint8_t w8:4, w9:4;
473  uint8_t w10:4, w11:4;
474  uint8_t w12:4, w13:4;
475  uint8_t w14:4, w15:4;
476  uint8_t w16:3, w17:3, w18_hi:2;
477  uint8_t w18_lo:1, w19:3, w20:3, w21_hi:1;
478  uint8_t w21_lo:2, w22:3, w23:3;
479  uint8_t w24:3, w25:3, w26_hi:2;
480  uint8_t w26_lo:1, w27:3, w28:3, spare:1;
481 #endif
482 } __attribute__ ((packed));
483 #else
485 #if OSMO_IS_LITTLE_ENDIAN
486  uint8_t form_id:7,
487  orig_arfcn_hi:1;
488  uint8_t orig_arfcn_mid;
489  uint8_t orig_arfcn_lo:1,
490  w1:7;
491  uint8_t w2:6,
492  w3_hi:2;
493  uint8_t w3_lo:4,
494  w4_hi:4;
495  uint8_t w4_lo:1,
496  w5:5,
497  w6_hi:2;
498  uint8_t w6_lo:3,
499  w7:5;
500  uint8_t w8:4,
501  w9:4;
502  uint8_t w10:4,
503  w11:4;
504  uint8_t w12:4,
505  w13:4;
506  uint8_t w14:4,
507  w15:4;
508  uint8_t w16:3,
509  w17:3,
510  w18_hi:2;
511  uint8_t w18_lo:1,
512  w19:3,
513  w20:3,
514  w21_hi:1;
515  uint8_t w21_lo:2,
516  w22:3,
517  w23:3;
518  uint8_t w24:3,
519  w25:3,
520  w26_hi:2;
521  uint8_t w26_lo:1,
522  w27:3,
523  w28:3,
524  spare:1;
525 #elif OSMO_IS_BIG_ENDIAN
526 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
527  uint8_t orig_arfcn_hi:1, form_id:7;
528  uint8_t orig_arfcn_mid;
529  uint8_t w1:7, orig_arfcn_lo:1;
530  uint8_t w3_hi:2, w2:6;
531  uint8_t w4_hi:4, w3_lo:4;
532  uint8_t w6_hi:2, w5:5, w4_lo:1;
533  uint8_t w7:5, w6_lo:3;
534  uint8_t w9:4, w8:4;
535  uint8_t w11:4, w10:4;
536  uint8_t w13:4, w12:4;
537  uint8_t w15:4, w14:4;
538  uint8_t w18_hi:2, w17:3, w16:3;
539  uint8_t w21_hi:1, w20:3, w19:3, w18_lo:1;
540  uint8_t w23:3, w22:3, w21_lo:2;
541  uint8_t w26_hi:2, w25:3, w24:3;
542  uint8_t spare:1, w28:3, w27:3, w26_lo:1;
543 #endif
544 } __attribute__ ((packed));
545 #endif
546 
547 /* Chapter 10.5.2.1b.7 */
549 #if OSMO_IS_LITTLE_ENDIAN
550  uint8_t orig_arfcn_hi:1,
551  form_id:7;
552  uint8_t orig_arfcn_mid;
553  uint8_t rrfcn1_7:7,
554  orig_arfcn_lo:1;
555  uint8_t rrfcn8_111[13];
556 #elif OSMO_IS_BIG_ENDIAN
557 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
558  uint8_t form_id:7, orig_arfcn_hi:1;
559  uint8_t orig_arfcn_mid;
560  uint8_t orig_arfcn_lo:1, rrfcn1_7:7;
561  uint8_t rrfcn8_111[13];
562 #endif
563 } __attribute__ ((packed));
564 
565 /* Chapter 10.5.2.5 */
567  uint8_t chan_nr;
568  union {
569  struct {
570 #if OSMO_IS_LITTLE_ENDIAN
571  uint8_t maio_high:4,
572  h:1,
573  tsc:3;
574  uint8_t hsn:6,
575  maio_low:2;
576 #elif OSMO_IS_BIG_ENDIAN
577 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
578  uint8_t tsc:3, h:1, maio_high:4;
579  uint8_t maio_low:2, hsn:6;
580 #endif
581  } __attribute__ ((packed)) h1;
582  struct {
583 #if OSMO_IS_LITTLE_ENDIAN
584  uint8_t arfcn_high:2,
585  spare:2,
586  h:1,
587  tsc:3;
588  uint8_t arfcn_low;
589 #elif OSMO_IS_BIG_ENDIAN
590 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
591  uint8_t tsc:3, h:1, spare:2, arfcn_high:2;
592  uint8_t arfcn_low;
593 #endif
594  } __attribute__ ((packed)) h0;
595  } __attribute__ ((packed));
596 } __attribute__ ((packed));
597 
598 /* Chapter 10.5.2.20 */
600 #if OSMO_IS_LITTLE_ENDIAN
601  uint8_t rxlev_full:6,
602  dtx_used:1,
603  ba_used:1;
604  uint8_t rxlev_sub:6,
605  meas_valid:1,
606  spare:1;
607  uint8_t no_nc_n_hi:1,
608  rxqual_sub:3,
609  rxqual_full:3,
610  spare2:1;
611  uint8_t rxlev_nc1:6,
612  no_nc_n_lo:2;
613  uint8_t bsic_nc1_hi:3,
614  bcch_f_nc1:5;
615  uint8_t rxlev_nc2_hi:5,
616  bsic_nc1_lo:3;
617  uint8_t bsic_nc2_hi:2,
618  bcch_f_nc2:5,
619  rxlev_nc2_lo:1;
620  uint8_t rxlev_nc3_hi:4,
621  bsic_nc2_lo:4;
622  uint8_t bsic_nc3_hi:1,
623  bcch_f_nc3:5,
624  rxlev_nc3_lo:2;
625  uint8_t rxlev_nc4_hi:3,
626  bsic_nc3_lo:5;
627  uint8_t bcch_f_nc4:5,
628  rxlev_nc4_lo:3;
629  uint8_t rxlev_nc5_hi:2,
630  bsic_nc4:6;
631  uint8_t bcch_f_nc5_hi:4,
632  rxlev_nc5_lo:4;
633  uint8_t rxlev_nc6_hi:1,
634  bsic_nc5:6,
635  bcch_f_nc5_lo:1;
636  uint8_t bcch_f_nc6_hi:3,
637  rxlev_nc6_lo:5;
638  uint8_t bsic_nc6:6,
639  bcch_f_nc6_lo:2;
640 #elif OSMO_IS_BIG_ENDIAN
641 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
642  uint8_t ba_used:1, dtx_used:1, rxlev_full:6;
643  uint8_t spare:1, meas_valid:1, rxlev_sub:6;
644  uint8_t spare2:1, rxqual_full:3, rxqual_sub:3, no_nc_n_hi:1;
645  uint8_t no_nc_n_lo:2, rxlev_nc1:6;
646  uint8_t bcch_f_nc1:5, bsic_nc1_hi:3;
647  uint8_t bsic_nc1_lo:3, rxlev_nc2_hi:5;
648  uint8_t rxlev_nc2_lo:1, bcch_f_nc2:5, bsic_nc2_hi:2;
649  uint8_t bsic_nc2_lo:4, rxlev_nc3_hi:4;
650  uint8_t rxlev_nc3_lo:2, bcch_f_nc3:5, bsic_nc3_hi:1;
651  uint8_t bsic_nc3_lo:5, rxlev_nc4_hi:3;
652  uint8_t rxlev_nc4_lo:3, bcch_f_nc4:5;
653  uint8_t bsic_nc4:6, rxlev_nc5_hi:2;
654  uint8_t rxlev_nc5_lo:4, bcch_f_nc5_hi:4;
655  uint8_t bcch_f_nc5_lo:1, bsic_nc5:6, rxlev_nc6_hi:1;
656  uint8_t rxlev_nc6_lo:5, bcch_f_nc6_hi:3;
657  uint8_t bcch_f_nc6_lo:2, bsic_nc6:6;
658 #endif
659 } __attribute__ ((packed));
660 
661 /* Chapter 10.5.2.21aa */
663 #if OSMO_IS_LITTLE_ENDIAN
664  uint8_t smod : 2,
665  spare: 1,
666  icmi : 1,
667  nscb : 1,
668  ver : 3;
669  uint8_t m4_75 : 1,
670  m5_15 : 1,
671  m5_90 : 1,
672  m6_70 : 1,
673  m7_40 : 1,
674  m7_95 : 1,
675  m10_2 : 1,
676  m12_2 : 1;
677 #elif OSMO_IS_BIG_ENDIAN
678 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
679  uint8_t ver:3, nscb:1, icmi:1, spare:1, smod:2;
680  uint8_t m12_2:1, m10_2:1, m7_95:1, m7_40:1, m6_70:1, m5_90:1, m5_15:1, m4_75:1;
681 #endif
682 } __attribute__((packed));
683 
684 /* Chapter 10.5.2.28(a) */
686 #if OSMO_IS_LITTLE_ENDIAN
687  uint8_t power_level:5,
688  spare:2,
689  atc:1;
690 #elif OSMO_IS_BIG_ENDIAN
691 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
692  uint8_t atc:1, spare:2, power_level:5;
693 #endif
694 } __attribute__((packed));
695 
696 /* Chapter 10.5.2.29 */
698 #if OSMO_IS_LITTLE_ENDIAN
699  uint8_t re :1,
700  cell_bar :1,
701  tx_integer :4,
702  max_trans :2;
703  uint8_t t2; /* ACC 8-15 barred flags */
704  uint8_t t3; /* ACC 0-7 barred flags */
705 #elif OSMO_IS_BIG_ENDIAN
706 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
707  uint8_t max_trans:2, tx_integer:4, cell_bar:1, re:1;
708  uint8_t t2;
709  uint8_t t3;
710 #endif
711 } __attribute__ ((packed));
712 
713 /*
714  * Mark an Access Control Class as barred.
715  * \param[in] rach_control A Rach Control Information Element.
716  * \param[in] acc Access Control Class number (0 - 15) which shall be barred.
717  */
718 static inline void gsm48_barr_acc(struct gsm48_rach_control *rach_control, unsigned int acc)
719 {
720  OSMO_ASSERT(acc >= 0 && acc <= 15);
721  if (acc >= 8)
722  rach_control->t2 |= (1 << (acc - 8));
723  else
724  rach_control->t3 |= (1 << (acc));
725 }
726 
727 /*
728  * Mark an Access Control Class as allowed.
729  * \param[in] rach_control A Rach Control Information Element.
730  * \param[in] acc Access Control Class number (0 - 15) which shall be allowed.
731  */
732 static inline void gsm48_allow_acc(struct gsm48_rach_control *rach_control, unsigned int acc)
733 {
734  OSMO_ASSERT(acc >= 0 && acc <= 15);
735  if (acc >= 8)
736  rach_control->t2 &= ~(1 << (acc - 8));
737  else
738  rach_control->t3 &= ~(1 << (acc));
739 }
740 
741 /*
742  * Indicate whether an Access Control Class is barred.
743  * \param[in] rach_control A Rach Control Information Element.
744  * \param[in] acc Access Control Class number (0 - 15).
745  * \returns true if the Access Control class is barred, false otherwise
746  */
747 static inline bool gsm48_acc_is_barred(struct gsm48_rach_control *rach_control, unsigned int acc)
748 {
749  OSMO_ASSERT(acc >= 0 && acc <= 15);
750  if (acc >= 8)
751  return (rach_control->t2 & (1 << (acc - 8))) != 0;
752  return (rach_control->t3 & (1 << (acc))) != 0;
753 }
754 
755 /* Chapter 10.5.2.30 */
757 #if OSMO_IS_LITTLE_ENDIAN
758  uint8_t ra;
759  uint8_t t3_high:3,
760  t1:5;
761  uint8_t t2:5,
762  t3_low:3;
763 #elif OSMO_IS_BIG_ENDIAN
764 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
765  uint8_t ra;
766  uint8_t t1:5, t3_high:3;
767  uint8_t t3_low:3, t2:5;
768 #endif
769 } __attribute__ ((packed));
770 
771 /* Chapter 10.5.2.38 */
773 #if OSMO_IS_LITTLE_ENDIAN
774  uint8_t t3_high:3,
775  t1:5;
776  uint8_t t2:5,
777  t3_low:3;
778 #elif OSMO_IS_BIG_ENDIAN
779 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
780  uint8_t t1:5, t3_high:3;
781  uint8_t t3_low:3, t2:5;
782 #endif
783 } __attribute__ ((packed));
784 
785 /* Chapter 10.5.2.39 */
787 #if OSMO_IS_LITTLE_ENDIAN
788  uint8_t si:2,
789  rot:1,
790  nci:1,
791  sync_ie:4;
792 #elif OSMO_IS_BIG_ENDIAN
793 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
794  uint8_t sync_ie:4, nci:1, rot:1, si:2;
795 #endif
796 } __attribute__((packed));
797 
798 /*
799  * Chapter 9.1.5/9.1.6
800  *
801  * For 9.1.6 the chan_desc has the meaning of 10.5.2.5a
802  */
805  uint8_t mode;
806 } __attribute__ ((packed));
807 
817 };
818 
819 extern const struct value_string gsm48_chan_mode_names[];
820 static inline const char *gsm48_chan_mode_name(enum gsm48_chan_mode val)
823 /* Chapter 9.1.2 */
825  /* Semantic is from 10.5.2.5a */
827  uint8_t power_command;
828  uint8_t data[0];
829 } __attribute__((packed));
831 /* Chapter 9.1.13 */
833  /* Semantic is from 10.5.2.5a */
835  uint8_t mob_alloc_len;
836  uint8_t mob_alloc[0];
837 } __attribute__((packed));
838 
839 /* Chapter 9.1.13b GPRS suspension request */
841  uint32_t tlli;
842  uint8_t ra_id[6];
843  uint8_t cause;
844  uint8_t options[0];
845 } __attribute__ ((packed));
846 
847 /* Chapter 10.5.2.2 */
849 #if OSMO_IS_LITTLE_ENDIAN
850  uint8_t bcc:3,
851  ncc:3,
852  arfcn_hi:2;
853  uint8_t arfcn_lo;
854 #elif OSMO_IS_BIG_ENDIAN
855 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
856  uint8_t arfcn_hi:2, ncc:3, bcc:3;
857  uint8_t arfcn_lo;
858 #endif
859 } __attribute__((packed));
860 
861 /* Chapter 9.1.15 */
862 struct gsm48_ho_cmd {
865  uint8_t ho_ref;
866  uint8_t power_command;
867  uint8_t data[0];
868 } __attribute__((packed));
869 
870 /* Chapter 9.1.18 */
872  uint8_t l2_plen;
873  uint8_t proto_discr;
874  uint8_t msg_type;
875  uint8_t page_mode;
878  uint8_t timing_advance;
879  uint8_t mob_alloc_len;
880  uint8_t mob_alloc[0];
881 } __attribute__ ((packed));
882 
883 /* Chapter 9.1.25 */
885 #if OSMO_IS_LITTLE_ENDIAN
886  uint8_t spare:4,
887  key_seq:4;
888  uint32_t classmark2;
889  uint8_t mi_len;
890  uint8_t mi[0];
891 #elif OSMO_IS_BIG_ENDIAN
892 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
893  uint8_t key_seq:4, spare:4;
894  uint32_t classmark2;
895  uint8_t mi_len;
896  uint8_t mi[0];
897 #endif
898 } __attribute__ ((packed));
899 
900 /* Chapter 10.5.1.3 */
902  uint8_t digits[3]; /* BCD! */
903  uint16_t lac;
904 } __attribute__ ((packed));
905 
906 /* Section 9.2.2 */
908 #if OSMO_IS_LITTLE_ENDIAN
909  uint8_t key_seq:4,
910  spare:4;
911  uint8_t rand[16];
912 #elif OSMO_IS_BIG_ENDIAN
913 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
914  uint8_t spare:4, key_seq:4;
915  uint8_t rand[16];
916 #endif
917 } __attribute__ ((packed));
918 
919 /* Section 9.2.3 */
921  uint8_t sres[4];
922 } __attribute__ ((packed));
923 
924 /* Section 9.2.15 */
926 #if OSMO_IS_LITTLE_ENDIAN
927  uint8_t type:4,
928  key_seq:4;
929  struct gsm48_loc_area_id lai;
930  struct gsm48_classmark1 classmark1;
931  uint8_t mi_len;
932  uint8_t mi[0];
933 #elif OSMO_IS_BIG_ENDIAN
934 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
935  uint8_t key_seq:4, type:4;
936  struct gsm48_loc_area_id lai;
937  struct gsm48_classmark1 classmark1;
938  uint8_t mi_len;
939  uint8_t mi[0];
940 #endif
941 } __attribute__ ((packed));
942 
943 /* Section 10.1 */
944 struct gsm48_hdr {
945  uint8_t proto_discr;
946  uint8_t msg_type;
947  uint8_t data[0];
948 } __attribute__ ((packed));
949 
950 /* Section 9.1.3x System information Type header */
952 #if OSMO_IS_LITTLE_ENDIAN
953  uint8_t l2_plen;
954  uint8_t rr_protocol_discriminator :4,
955  skip_indicator:4;
956  uint8_t system_information;
957 #elif OSMO_IS_BIG_ENDIAN
958 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
959  uint8_t l2_plen;
960  uint8_t skip_indicator:4, rr_protocol_discriminator:4;
961  uint8_t system_information;
962 #endif
963 } __attribute__ ((packed));
964 
965 /* Section 10.5.2.4 Cell Selection Parameters */
967 #if OSMO_IS_LITTLE_ENDIAN
968  uint8_t ms_txpwr_max_ccch:5, /* GSM 05.08 MS-TXPWR-MAX-CCCH */
969  cell_resel_hyst:3; /* GSM 05.08 CELL-RESELECT-HYSTERESIS */
970  uint8_t rxlev_acc_min:6, /* GSM 05.08 RXLEV-ACCESS-MIN */
971  neci:1,
972  acs:1;
973 #elif OSMO_IS_BIG_ENDIAN
974 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
975  uint8_t cell_resel_hyst:3, ms_txpwr_max_ccch:5;
976  uint8_t acs:1, neci:1, rxlev_acc_min:6;
977 #endif
978 } __attribute__ ((packed));
979 
980 /* 3GPP TS 44.018 Section 10.5.2.11 Control Channel Description */
982 #if OSMO_IS_LITTLE_ENDIAN
983  uint8_t ccch_conf :3,
984  bs_ag_blks_res :3,
985  att :1,
986  mscr :1;
987  uint8_t bs_pa_mfrms : 3,
988  spare_1 :2,
989  cbq3 :2,
990  spare_2 :1;
991  uint8_t t3212;
992 #elif OSMO_IS_BIG_ENDIAN
993 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
994  uint8_t mscr:1, att:1, bs_ag_blks_res:3, ccch_conf:3;
995  uint8_t spare_2:1, cbq3:2, spare_1:2, bs_pa_mfrms:3;
996  uint8_t t3212;
997 #endif
998 } __attribute__ ((packed));
999 
1004 };
1005 
1006 /* Cell Options for SI6, SACCH (10.5.2.3a.2) or SI3, BCCH (Table 10.5.2.3.1),
1007  3GPP TS 44.018 */
1009 #if OSMO_IS_LITTLE_ENDIAN
1010  uint8_t radio_link_timeout:4,
1011  dtx:2,
1012  pwrc:1,
1013  /* either DN-IND or top bit of DTX IND */
1014  d:1;
1015 #elif OSMO_IS_BIG_ENDIAN
1016 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
1017  uint8_t d:1, pwrc:1, dtx:2, radio_link_timeout:4;
1018 #endif
1019 } __attribute__ ((packed));
1020 
1021 /* Section 9.2.9 CM service request */
1023 #if OSMO_IS_LITTLE_ENDIAN
1024  uint8_t cm_service_type : 4,
1025  cipher_key_seq : 4;
1026  /* length + 3 bytes */
1027  uint32_t classmark;
1028  uint8_t mi_len;
1029  uint8_t mi[0];
1030  /* optional priority level */
1031 #elif OSMO_IS_BIG_ENDIAN
1032 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
1033  uint8_t cipher_key_seq:4, cm_service_type:4;
1034  uint32_t classmark;
1035  uint8_t mi_len;
1036  uint8_t mi[0];
1037 #endif
1038 } __attribute__ ((packed));
1039 
1040 /* Section 9.1.31 System information Type 1 */
1044  struct gsm48_rach_control rach_control;
1045  uint8_t rest_octets[0]; /* NCH position on the CCCH */
1046 } __attribute__ ((packed));
1047 
1048 /* Section 9.1.32 System information Type 2 */
1051  uint8_t bcch_frequency_list[16];
1052  uint8_t ncc_permitted;
1053  struct gsm48_rach_control rach_control;
1054 } __attribute__ ((packed));
1055 
1056 /* Section 9.1.33 System information Type 2bis */
1059  uint8_t bcch_frequency_list[16];
1060  struct gsm48_rach_control rach_control;
1061  uint8_t rest_octets[0];
1062 } __attribute__ ((packed));
1063 
1064 /* Section 9.1.34 System information Type 2ter */
1068  uint8_t rest_octets[0];
1069 } __attribute__ ((packed));
1070 
1071 /* Section 9.1.34a System information Type 2quater */
1074  uint8_t rest_octets[0];
1075 } __attribute__ ((packed));
1076 
1077 /* Section 9.1.35 System information Type 3 */
1080  uint16_t cell_identity;
1085  struct gsm48_rach_control rach_control;
1086  uint8_t rest_octets[0];
1087 } __attribute__ ((packed));
1088 
1089 /* Section 9.1.36 System information Type 4 */
1094  struct gsm48_rach_control rach_control;
1095  /* optional CBCH conditional CBCH... followed by
1096  mandantory SI 4 Reset Octets
1097  */
1098  uint8_t data[0];
1099 } __attribute__ ((packed));
1100 
1101 /* Section 9.1.37 System information Type 5 */
1103 #if OSMO_IS_LITTLE_ENDIAN
1104  uint8_t rr_protocol_discriminator :4,
1105  skip_indicator:4;
1106  uint8_t system_information;
1107  uint8_t bcch_frequency_list[16];
1108 #elif OSMO_IS_BIG_ENDIAN
1109 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
1110  uint8_t skip_indicator:4, rr_protocol_discriminator:4;
1111  uint8_t system_information;
1112  uint8_t bcch_frequency_list[16];
1113 #endif
1114 } __attribute__ ((packed));
1115 
1116 /* Section 9.1.38 System information Type 5bis */
1118 #if OSMO_IS_LITTLE_ENDIAN
1119  uint8_t rr_protocol_discriminator :4,
1120  skip_indicator:4;
1121  uint8_t system_information;
1122  uint8_t bcch_frequency_list[16];
1123 #elif OSMO_IS_BIG_ENDIAN
1124 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
1125  uint8_t skip_indicator:4, rr_protocol_discriminator:4;
1126  uint8_t system_information;
1127  uint8_t bcch_frequency_list[16];
1128 #endif
1129 } __attribute__ ((packed));
1130 
1131 /* Section 9.1.39 System information Type 5ter */
1133 #if OSMO_IS_LITTLE_ENDIAN
1134  uint8_t rr_protocol_discriminator :4,
1135  skip_indicator:4;
1136  uint8_t system_information;
1137  uint8_t bcch_frequency_list[16];
1138 #elif OSMO_IS_BIG_ENDIAN
1139 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
1140  uint8_t skip_indicator:4, rr_protocol_discriminator:4;
1141  uint8_t system_information;
1142  uint8_t bcch_frequency_list[16];
1143 #endif
1144 } __attribute__ ((packed));
1145 
1146 /* Section 9.1.40 System information Type 6 */
1148 #if OSMO_IS_LITTLE_ENDIAN
1149  uint8_t rr_protocol_discriminator :4,
1150  skip_indicator:4;
1151  uint8_t system_information;
1152  uint16_t cell_identity;
1153  struct gsm48_loc_area_id lai;
1154  struct gsm48_cell_options cell_options;
1155  uint8_t ncc_permitted;
1156  uint8_t rest_octets[0];
1157 #elif OSMO_IS_BIG_ENDIAN
1158 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
1159  uint8_t skip_indicator:4, rr_protocol_discriminator:4;
1160  uint8_t system_information;
1161  uint16_t cell_identity;
1162  struct gsm48_loc_area_id lai;
1163  struct gsm48_cell_options cell_options;
1164  uint8_t ncc_permitted;
1165  uint8_t rest_octets[0];
1166 #endif
1167 } __attribute__ ((packed));
1168 
1169 /* Section 9.1.43a System Information type 13 */
1172  uint8_t rest_octets[0];
1173 } __attribute__ ((packed));
1174 
1175 /* Section 9.2.12 IMSI Detach Indication */
1178  uint8_t mi_len;
1179  uint8_t mi[0];
1180 } __attribute__ ((packed));
1181 
1182 /* Section 9.1.1 */
1184  /* Semantic is from 10.5.2.5 */
1186  uint8_t data[0];
1187 } __attribute__((packed));
1188 
1189 /* Section 9.1.3 */
1191  uint8_t rr_cause;
1192 } __attribute__((packed));
1193 
1194 /* Section 9.1.4 */
1196  uint8_t rr_cause;
1197 } __attribute__((packed));
1198 
1199 /* Section 9.1.3 */
1201  uint8_t rr_cause;
1202  uint8_t data[0];
1203 } __attribute__((packed));
1204 
1205 /* Section 9.1.4 */
1207  uint8_t rr_cause;
1208 } __attribute__((packed));
1209 
1210 /* Section 9.1.7 */
1212  uint8_t rr_cause;
1213  uint8_t data[0];
1214 } __attribute__((packed));
1215 
1216 /* Section 9.1.9 */
1218 #if OSMO_IS_LITTLE_ENDIAN
1219  uint8_t sc:1,
1220  alg_id:3,
1221  cr:1,
1222  spare:3;
1223 #elif OSMO_IS_BIG_ENDIAN
1224 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
1225  uint8_t spare:3, cr:1, alg_id:3, sc:1;
1226 #endif
1227 } __attribute__((packed));
1228 
1229 /* Section 9.1.11 */
1231  uint8_t cm2_len;
1233  uint8_t data[0];
1234 } __attribute__((packed));
1235 
1236 /* Section 9.1.19 */
1238  uint8_t l2_plen;
1239  uint8_t proto_discr;
1240  uint8_t msg_type;
1241  uint8_t page_mode;
1248  uint8_t mob_alloc_len;
1249  uint8_t mob_alloc[0];
1250 } __attribute__ ((packed));
1251 
1252 /* Section 9.1.20 */
1254  uint8_t l2_plen;
1255  uint8_t proto_discr;
1256  uint8_t msg_type;
1257  uint8_t page_mode;
1259  uint8_t wait_ind1;
1261  uint8_t wait_ind2;
1263  uint8_t wait_ind3;
1265  uint8_t wait_ind4;
1266  uint8_t rest[0];
1267 } __attribute__ ((packed));
1268 
1269 /* Section 9.1.22 */
1271 #if OSMO_IS_LITTLE_ENDIAN
1272  uint8_t l2_plen;
1273  uint8_t proto_discr;
1274  uint8_t msg_type;
1275  uint8_t pag_mode:2,
1276  spare:2,
1277  cneed1:2,
1278  cneed2:2;
1279  uint8_t data[0];
1280 #elif OSMO_IS_BIG_ENDIAN
1281 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
1282  uint8_t l2_plen;
1283  uint8_t proto_discr;
1284  uint8_t msg_type;
1285  uint8_t cneed2:2, cneed1:2, spare:2, pag_mode:2;
1286  uint8_t data[0];
1287 #endif
1288 } __attribute__((packed));
1289 
1290 /* Section 9.1.23 */
1292 #if OSMO_IS_LITTLE_ENDIAN
1293  uint8_t l2_plen;
1294  uint8_t proto_discr;
1295  uint8_t msg_type;
1296  uint8_t pag_mode:2,
1297  spare:2,
1298  cneed1:2,
1299  cneed2:2;
1300  uint32_t tmsi1;
1301  uint32_t tmsi2;
1302  uint8_t data[0];
1303 #elif OSMO_IS_BIG_ENDIAN
1304 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
1305  uint8_t l2_plen;
1306  uint8_t proto_discr;
1307  uint8_t msg_type;
1308  uint8_t cneed2:2, cneed1:2, spare:2, pag_mode:2;
1309  uint32_t tmsi1;
1310  uint32_t tmsi2;
1311  uint8_t data[0];
1312 #endif
1313 } __attribute__((packed));
1314 
1315 /* Section 9.1.24 */
1317 #if OSMO_IS_LITTLE_ENDIAN
1318  uint8_t l2_plen;
1319  uint8_t proto_discr;
1320  uint8_t msg_type;
1321  uint8_t pag_mode:2,
1322  spare:2,
1323  cneed1:2,
1324  cneed2:2;
1325  uint32_t tmsi1;
1326  uint32_t tmsi2;
1327  uint32_t tmsi3;
1328  uint32_t tmsi4;
1329  uint8_t cneed3:2,
1330  cneed4:2,
1331  spare2:4;
1332  uint8_t rest[0];
1333 #elif OSMO_IS_BIG_ENDIAN
1334 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
1335  uint8_t l2_plen;
1336  uint8_t proto_discr;
1337  uint8_t msg_type;
1338  uint8_t cneed2:2, cneed1:2, spare:2, pag_mode:2;
1339  uint32_t tmsi1;
1340  uint32_t tmsi2;
1341  uint32_t tmsi3;
1342  uint32_t tmsi4;
1343  uint8_t spare2:4, cneed4:2, cneed3:2;
1344  uint8_t rest[0];
1345 #endif
1346 } __attribute__((packed));
1347 
1348 /* Section 9.1.25 */
1350 #if OSMO_IS_LITTLE_ENDIAN
1351  uint8_t key_seq:3,
1352  spare:5;
1353  uint8_t cm2_len;
1354  struct gsm48_classmark2 cm2;
1355  uint8_t data[0];
1356 #elif OSMO_IS_BIG_ENDIAN
1357 /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
1358  uint8_t spare:5, key_seq:3;
1359  uint8_t cm2_len;
1360  struct gsm48_classmark2 cm2;
1361  uint8_t data[0];
1362 #endif
1363 } __attribute__((packed));
1364 
1365 /* Section 9.1.29 */
1367  uint8_t rr_cause;
1368 } __attribute__((packed));
1369 
1370 /* Section 10.2 + GSM 04.07 12.2.3.1.1 + 3GPP TS 24.007 11.2.3.1.1 */
1371 #define GSM48_PDISC_GROUP_CC 0x00
1372 #define GSM48_PDISC_BCAST_CC 0x01
1373 #define GSM48_PDISC_PDSS1 0x02 /* 04.07 only */
1374 #define GSM48_PDISC_CC 0x03
1375 #define GSM48_PDISC_PDSS2 0x04 /* 04.07 only */
1376 #define GSM48_PDISC_GTTP 0x04 /* 24.007 only */
1377 #define GSM48_PDISC_MM 0x05
1378 #define GSM48_PDISC_RR 0x06
1379 #define GSM48_PDISC_MM_GPRS 0x08
1380 #define GSM48_PDISC_SMS 0x09
1381 #define GSM48_PDISC_SM_GPRS 0x0a
1382 #define GSM48_PDISC_NC_SS 0x0b
1383 #define GSM48_PDISC_LOC 0x0c
1384 #define GSM48_PDISC_EXTEND 0x0e
1385 #define GSM48_PDISC_TEST 0x0f /* as per 11.10, 04.14 */
1386 #define GSM48_PDISC_MASK 0x0f
1387 
1388 extern const struct value_string gsm48_pdisc_names[];
1389 static inline const char *gsm48_pdisc_name(uint8_t val)
1390 { return get_value_string(gsm48_pdisc_names, val); }
1391 
1392 bool gsm48_hdr_gmm_cipherable(const struct gsm48_hdr *hdr);
1393 
1394 static inline uint8_t gsm48_hdr_pdisc(const struct gsm48_hdr *hdr)
1395 {
1396  /*
1397  * 3GPP TS 24.007 version 12.0.0 Release 12,
1398  * 11.2.3.1.1 Protocol discriminator
1399  */
1400  uint8_t pdisc = hdr->proto_discr & GSM48_PDISC_MASK;
1401  if (pdisc == GSM48_PDISC_EXTEND)
1402  return hdr->proto_discr;
1403  return pdisc;
1404 }
1405 
1406 static inline uint8_t gsm48_hdr_trans_id(const struct gsm48_hdr *hdr)
1407 {
1408  /*
1409  * 3GPP TS 24.007 version 12.0.0 Release 12,
1410  * 11.2.3.1.3 Transaction identifier
1411  */
1412  return (hdr->proto_discr & 0xf0) >> 4;
1413 }
1414 
1415 #define GSM48_TA_INVALID 220
1416 
1422 static inline bool gsm48_ta_is_valid(uint8_t ta)
1423 {
1424  return (ta < 64);
1425 }
1426 
1427 static inline uint8_t gsm48_hdr_trans_id_flip_ti(const struct gsm48_hdr *hdr)
1428 {
1429  return gsm48_hdr_trans_id(hdr) ^ 0x08;
1430 }
1431 
1432 static inline uint8_t gsm48_hdr_trans_id_no_ti(const struct gsm48_hdr *hdr)
1433 {
1434  return gsm48_hdr_trans_id(hdr) & 0x07;
1435 }
1436 
1437 static inline uint8_t gsm48_hdr_msg_type_r98(const struct gsm48_hdr *hdr)
1438 {
1439  /*
1440  * 3GPP TS 24.007 version 12.0.0 Release 12,
1441  * 11.2.3.2.1 Message type octet (when accessing Release 98 and older
1442  * networks only)
1443  */
1444  switch (gsm48_hdr_pdisc(hdr)) {
1445  case GSM48_PDISC_MM:
1446  case GSM48_PDISC_CC:
1447  case GSM48_PDISC_NC_SS:
1448  case GSM48_PDISC_GROUP_CC:
1449  case GSM48_PDISC_BCAST_CC:
1450  case GSM48_PDISC_LOC:
1451  return hdr->msg_type & 0x3f;
1452  default:
1453  return hdr->msg_type;
1454  }
1455 }
1456 
1457 static inline uint8_t gsm48_hdr_msg_type_r99(const struct gsm48_hdr *hdr)
1458 {
1459  /*
1460  * 3GPP TS 24.007 version 12.0.0 Release 12,
1461  * 11.2.3.2.2 Message type octet (when accessing Release 99 and newer
1462  * networks)
1463  */
1464  switch (gsm48_hdr_pdisc(hdr)) {
1465  case GSM48_PDISC_MM:
1466  case GSM48_PDISC_CC:
1467  case GSM48_PDISC_NC_SS:
1468  return hdr->msg_type & 0x3f;
1469  case GSM48_PDISC_GROUP_CC:
1470  case GSM48_PDISC_BCAST_CC:
1471  case GSM48_PDISC_LOC:
1472  return hdr->msg_type & 0x3f;
1473  default:
1474  return hdr->msg_type;
1475  }
1476 }
1477 
1478 void gsm48_set_dtx(struct gsm48_cell_options *op, enum gsm48_dtx_mode full,
1479  enum gsm48_dtx_mode half, bool is_bcch);
1480 
1481 #define gsm48_hdr_msg_type gsm48_hdr_msg_type_r99
1482 
1483 /* Section 10.4 */
1484 #define GSM48_MT_RR_INIT_REQ 0x3c
1485 #define GSM48_MT_RR_ADD_ASS 0x3b
1486 #define GSM48_MT_RR_IMM_ASS 0x3f
1487 #define GSM48_MT_RR_IMM_ASS_EXT 0x39
1488 #define GSM48_MT_RR_IMM_ASS_REJ 0x3a
1489 #define GSM48_MT_RR_DTM_ASS_FAIL 0x48
1490 #define GSM48_MT_RR_DTM_REJECT 0x49
1491 #define GSM48_MT_RR_DTM_REQUEST 0x4A
1492 #define GSM48_MT_RR_PACKET_ASS 0x4B
1493 
1494 #define GSM48_MT_RR_CIPH_M_CMD 0x35
1495 #define GSM48_MT_RR_CIPH_M_COMPL 0x32
1496 
1497 #define GSM48_MT_RR_CFG_CHG_CMD 0x30
1498 #define GSM48_MT_RR_CFG_CHG_ACK 0x31
1499 #define GSM48_MT_RR_CFG_CHG_REJ 0x33
1500 
1501 #define GSM48_MT_RR_ASS_CMD 0x2e
1502 #define GSM48_MT_RR_ASS_COMPL 0x29
1503 #define GSM48_MT_RR_ASS_FAIL 0x2f
1504 #define GSM48_MT_RR_HANDO_CMD 0x2b
1505 #define GSM48_MT_RR_HANDO_COMPL 0x2c
1506 #define GSM48_MT_RR_HANDO_FAIL 0x28
1507 #define GSM48_MT_RR_HANDO_INFO 0x2d
1508 #define GSM48_MT_RR_HANDO_INFO 0x2d
1509 #define GSM48_MT_RR_DTM_ASS_CMD 0x4c
1510 
1511 #define GSM48_MT_RR_CELL_CHG_ORDER 0x08
1512 #define GSM48_MT_RR_PDCH_ASS_CMD 0x23
1513 
1514 #define GSM48_MT_RR_CHAN_REL 0x0d
1515 #define GSM48_MT_RR_PART_REL 0x0a
1516 #define GSM48_MT_RR_PART_REL_COMP 0x0f
1517 
1518 #define GSM48_MT_RR_PAG_REQ_1 0x21
1519 #define GSM48_MT_RR_PAG_REQ_2 0x22
1520 #define GSM48_MT_RR_PAG_REQ_3 0x24
1521 #define GSM48_MT_RR_PAG_RESP 0x27
1522 #define GSM48_MT_RR_NOTIF_NCH 0x20
1523 #define GSM48_MT_RR_NOTIF_FACCH 0x25 /* (Reserved) */
1524 #define GSM48_MT_RR_NOTIF_RESP 0x26
1525 #define GSM48_MT_RR_PACKET_NOTIF 0x4e
1526 #define GSM48_MT_RR_UTRAN_CLSM_CHG 0x60
1527 #define GSM48_MT_RR_CDMA2K_CLSM_CHG 0x62
1528 #define GSM48_MT_RR_IS_TO_UTRAN_HANDO 0x63
1529 #define GSM48_MT_RR_IS_TO_CDMA2K_HANDO 0x64
1530 
1531 #define GSM48_MT_RR_SYSINFO_8 0x18
1532 #define GSM48_MT_RR_SYSINFO_1 0x19
1533 #define GSM48_MT_RR_SYSINFO_2 0x1a
1534 #define GSM48_MT_RR_SYSINFO_3 0x1b
1535 #define GSM48_MT_RR_SYSINFO_4 0x1c
1536 #define GSM48_MT_RR_SYSINFO_5 0x1d
1537 #define GSM48_MT_RR_SYSINFO_6 0x1e
1538 #define GSM48_MT_RR_SYSINFO_7 0x1f
1539 
1540 #define GSM48_MT_RR_SYSINFO_2bis 0x02
1541 #define GSM48_MT_RR_SYSINFO_2ter 0x03
1542 #define GSM48_MT_RR_SYSINFO_2quater 0x07
1543 #define GSM48_MT_RR_SYSINFO_5bis 0x05
1544 #define GSM48_MT_RR_SYSINFO_5ter 0x06
1545 #define GSM48_MT_RR_SYSINFO_9 0x04
1546 #define GSM48_MT_RR_SYSINFO_13 0x00
1547 
1548 #define GSM48_MT_RR_SYSINFO_16 0x3d
1549 #define GSM48_MT_RR_SYSINFO_17 0x3e
1550 
1551 #define GSM48_MT_RR_SYSINFO_18 0x40
1552 #define GSM48_MT_RR_SYSINFO_19 0x41
1553 #define GSM48_MT_RR_SYSINFO_20 0x42
1554 
1555 #define GSM48_MT_RR_CHAN_MODE_MODIF 0x10
1556 #define GSM48_MT_RR_STATUS 0x12
1557 #define GSM48_MT_RR_CHAN_MODE_MODIF_ACK 0x17
1558 #define GSM48_MT_RR_FREQ_REDEF 0x14
1559 #define GSM48_MT_RR_MEAS_REP 0x15
1560 #define GSM48_MT_RR_CLSM_CHG 0x16
1561 #define GSM48_MT_RR_CLSM_ENQ 0x13
1562 #define GSM48_MT_RR_EXT_MEAS_REP 0x36
1563 #define GSM48_MT_RR_EXT_MEAS_REP_ORD 0x37
1564 #define GSM48_MT_RR_GPRS_SUSP_REQ 0x34
1565 #define GSM48_MT_RR_DTM_INFO 0x4d
1566 
1567 #define GSM48_MT_RR_VGCS_UPL_GRANT 0x09
1568 #define GSM48_MT_RR_UPLINK_RELEASE 0x0e
1569 #define GSM48_MT_RR_UPLINK_FREE 0x0c
1570 #define GSM48_MT_RR_UPLINK_BUSY 0x2a
1571 #define GSM48_MT_RR_TALKER_IND 0x11
1572 
1573 #define GSM48_MT_RR_APP_INFO 0x38
1574 
1575 /* Table 10.2/3GPP TS 04.08 */
1576 #define GSM48_MT_MM_IMSI_DETACH_IND 0x01
1577 #define GSM48_MT_MM_LOC_UPD_ACCEPT 0x02
1578 #define GSM48_MT_MM_LOC_UPD_REJECT 0x04
1579 #define GSM48_MT_MM_LOC_UPD_REQUEST 0x08
1580 
1581 #define GSM48_MT_MM_AUTH_REJ 0x11
1582 #define GSM48_MT_MM_AUTH_REQ 0x12
1583 #define GSM48_MT_MM_AUTH_RESP 0x14
1584 #define GSM48_MT_MM_AUTH_FAIL 0x1c
1585 #define GSM48_MT_MM_ID_REQ 0x18
1586 #define GSM48_MT_MM_ID_RESP 0x19
1587 #define GSM48_MT_MM_TMSI_REALL_CMD 0x1a
1588 #define GSM48_MT_MM_TMSI_REALL_COMPL 0x1b
1589 
1590 #define GSM48_MT_MM_CM_SERV_ACC 0x21
1591 #define GSM48_MT_MM_CM_SERV_REJ 0x22
1592 #define GSM48_MT_MM_CM_SERV_ABORT 0x23
1593 #define GSM48_MT_MM_CM_SERV_REQ 0x24
1594 #define GSM48_MT_MM_CM_SERV_PROMPT 0x25
1595 #define GSM48_MT_MM_CM_REEST_REQ 0x28
1596 #define GSM48_MT_MM_ABORT 0x29
1597 
1598 #define GSM48_MT_MM_NULL 0x30
1599 #define GSM48_MT_MM_STATUS 0x31
1600 #define GSM48_MT_MM_INFO 0x32
1601 
1602 /* Table 10.3/3GPP TS 04.08 */
1603 #define GSM48_MT_CC_ALERTING 0x01
1604 #define GSM48_MT_CC_CALL_CONF 0x08
1605 #define GSM48_MT_CC_CALL_PROC 0x02
1606 #define GSM48_MT_CC_CONNECT 0x07
1607 #define GSM48_MT_CC_CONNECT_ACK 0x0f
1608 #define GSM48_MT_CC_EMERG_SETUP 0x0e
1609 #define GSM48_MT_CC_PROGRESS 0x03
1610 #define GSM48_MT_CC_ESTAB 0x04
1611 #define GSM48_MT_CC_ESTAB_CONF 0x06
1612 #define GSM48_MT_CC_RECALL 0x0b
1613 #define GSM48_MT_CC_START_CC 0x09
1614 #define GSM48_MT_CC_SETUP 0x05
1615 
1616 #define GSM48_MT_CC_MODIFY 0x17
1617 #define GSM48_MT_CC_MODIFY_COMPL 0x1f
1618 #define GSM48_MT_CC_MODIFY_REJECT 0x13
1619 #define GSM48_MT_CC_USER_INFO 0x10
1620 #define GSM48_MT_CC_HOLD 0x18
1621 #define GSM48_MT_CC_HOLD_ACK 0x19
1622 #define GSM48_MT_CC_HOLD_REJ 0x1a
1623 #define GSM48_MT_CC_RETR 0x1c
1624 #define GSM48_MT_CC_RETR_ACK 0x1d
1625 #define GSM48_MT_CC_RETR_REJ 0x1e
1626 
1627 #define GSM48_MT_CC_DISCONNECT 0x25
1628 #define GSM48_MT_CC_RELEASE 0x2d
1629 #define GSM48_MT_CC_RELEASE_COMPL 0x2a
1630 
1631 #define GSM48_MT_CC_CONG_CTRL 0x39
1632 #define GSM48_MT_CC_NOTIFY 0x3e
1633 #define GSM48_MT_CC_STATUS 0x3d
1634 #define GSM48_MT_CC_STATUS_ENQ 0x34
1635 #define GSM48_MT_CC_START_DTMF 0x35
1636 #define GSM48_MT_CC_STOP_DTMF 0x31
1637 #define GSM48_MT_CC_STOP_DTMF_ACK 0x32
1638 #define GSM48_MT_CC_START_DTMF_ACK 0x36
1639 #define GSM48_MT_CC_START_DTMF_REJ 0x37
1640 #define GSM48_MT_CC_FACILITY 0x3a
1641 
1642 extern const struct value_string gsm48_rr_msgtype_names[];
1643 extern const struct value_string gsm48_mm_msgtype_names[];
1644 extern const struct value_string gsm48_cc_msgtype_names[];
1645 const char *gsm48_pdisc_msgtype_name(uint8_t pdisc, uint8_t msg_type);
1646 
1647 /* FIXME: Table 10.4 / 10.4a (GPRS) */
1648 
1649 /* Section 10.5.3.3 CM service type */
1659 };
1660 
1661 extern const struct value_string osmo_cm_service_type_names[];
1662 static inline const char *osmo_cm_service_type_name(enum osmo_cm_service_type val)
1664 
1665 /* Section 10.5.2.26, Table 10.5.64 */
1666 #define GSM48_PM_MASK 0x03
1667 #define GSM48_PM_NORMAL 0x00
1668 #define GSM48_PM_EXTENDED 0x01
1669 #define GSM48_PM_REORG 0x02
1670 #define GSM48_PM_SAME 0x03
1671 
1672 /* Chapter 10.5.3.5 / Table 10.5.93 */
1673 #define GSM48_LUPD_NORMAL 0x0
1674 #define GSM48_LUPD_PERIODIC 0x1
1675 #define GSM48_LUPD_IMSI_ATT 0x2
1676 #define GSM48_LUPD_RESERVED 0x3
1677 
1678 extern const struct value_string osmo_lu_type_names[];
1679 static inline const char *osmo_lu_type_name(uint8_t lu_type)
1680 { return get_value_string(osmo_lu_type_names, lu_type); }
1681 
1682 /* Table 10.5.4 */
1683 #define GSM_MI_TYPE_MASK 0x07
1684 #define GSM_MI_TYPE_NONE 0x00
1685 #define GSM_MI_TYPE_IMSI 0x01
1686 #define GSM_MI_TYPE_IMEI 0x02
1687 #define GSM_MI_TYPE_IMEISV 0x03
1688 #define GSM_MI_TYPE_TMSI 0x04
1689 #define GSM_MI_ODD 0x08
1690 
1691 #define GSM48_IE_MOBILE_ID 0x17 /* 10.5.1.4 */
1692 #define GSM48_IE_NAME_LONG 0x43 /* 10.5.3.5a */
1693 #define GSM48_IE_NAME_SHORT 0x45 /* 10.5.3.5a */
1694 #define GSM48_IE_UTC 0x46 /* 10.5.3.8 */
1695 #define GSM48_IE_NET_TIME_TZ 0x47 /* 10.5.3.9 */
1696 #define GSM48_IE_LSA_IDENT 0x48 /* 10.5.3.11 */
1697 #define GSM48_IE_NET_DST 0x49 /* 10.5.3.12 [24.008] */
1698 
1699 #define GSM48_IE_BEARER_CAP 0x04 /* 10.5.4.5 */
1700 #define GSM48_IE_CAUSE 0x08 /* 10.5.4.11 */
1701 #define GSM48_IE_CC_CAP 0x15 /* 10.5.4.5a */
1702 #define GSM48_IE_ALERT 0x19 /* 10.5.4.26 */
1703 #define GSM48_IE_FACILITY 0x1c /* 10.5.4.15 */
1704 #define GSM48_IE_PROGR_IND 0x1e /* 10.5.4.21 */
1705 #define GSM48_IE_AUX_STATUS 0x24 /* 10.5.4.4 */
1706 #define GSM48_IE_NOTIFY 0x27 /* 10.5.4.20 */
1707 #define GSM48_IE_KPD_FACILITY 0x2c /* 10.5.4.17 */
1708 #define GSM48_IE_SIGNAL 0x34 /* 10.5.4.23 */
1709 #define GSM48_IE_CONN_BCD 0x4c /* 10.5.4.13 */
1710 #define GSM48_IE_CONN_SUB 0x4d /* 10.5.4.14 */
1711 #define GSM48_IE_CALLING_BCD 0x5c /* 10.5.4.9 */
1712 #define GSM48_IE_CALLING_SUB 0x5d /* 10.5.4.10 */
1713 #define GSM48_IE_CALLED_BCD 0x5e /* 10.5.4.7 */
1714 #define GSM48_IE_CALLED_SUB 0x6d /* 10.5.4.8 */
1715 #define GSM48_IE_REDIR_BCD 0x74 /* 10.5.4.21a */
1716 #define GSM48_IE_REDIR_SUB 0x75 /* 10.5.4.21b */
1717 #define GSM48_IE_LOWL_COMPAT 0x7c /* 10.5.4.18 */
1718 #define GSM48_IE_HIGHL_COMPAT 0x7d /* 10.5.4.16 */
1719 #define GSM48_IE_USER_USER 0x7e /* 10.5.4.25 */
1720 #define GSM48_IE_SS_VERS 0x7f /* 10.5.4.24 */
1721 #define GSM48_IE_MORE_DATA 0xa0 /* 10.5.4.19 */
1722 #define GSM48_IE_CLIR_SUPP 0xa1 /* 10.5.4.11a */
1723 #define GSM48_IE_CLIR_INVOC 0xa2 /* 10.5.4.11b */
1724 #define GSM48_IE_REV_C_SETUP 0xa3 /* 10.5.4.22a */
1725 #define GSM48_IE_REPEAT_CIR 0xd1 /* 10.5.4.22 */
1726 #define GSM48_IE_REPEAT_SEQ 0xd3 /* 10.5.4.22 */
1727 
1728 /* Section 10.5.4.11 / Table 10.5.122 */
1729 #define GSM48_CAUSE_CS_GSM 0x60
1730 
1731 /* Section 9.1.2 / Table 9.3 */
1732 /* RR elements */
1733 #define GSM48_IE_VGCS_TARGET 0x01
1734 //#define GSM48_IE_VGCS_T_MODE_I 0x01
1735 #define GSM48_IE_FRQSHORT_AFTER 0x02
1736 #define GSM48_IE_MUL_RATE_CFG 0x03 /* 10.5.2.21aa */
1737 #define GSM48_IE_FREQ_L_AFTER 0x05
1738 #define GSM48_IE_MSLOT_DESC 0x10
1739 #define GSM48_IE_CHANMODE_2 0x11
1740 #define GSM48_IE_FRQSHORT_BEFORE 0x12
1741 //#define GSM48_IE_FRQSHORT_BEFOR 0x12
1742 #define GSM48_IE_CHANMODE_3 0x13
1743 #define GSM48_IE_CHANMODE_4 0x14
1744 #define GSM48_IE_CHANMODE_5 0x15
1745 #define GSM48_IE_CHANMODE_6 0x16
1746 #define GSM48_IE_CHANMODE_7 0x17
1747 #define GSM48_IE_CHANMODE_8 0x18
1748 #define GSM48_IE_CHANDESC_2 0x64
1749 #define GSM48_IE_MA_AFTER 0x72
1750 #define GSM48_IE_START_TIME 0x7c
1751 #define GSM48_IE_FREQ_L_BEFORE 0x19
1752 //#define GSM48_IE_FRQLIST_BEFORE 0x19
1753 #define GSM48_IE_CH_DESC_1_BEFORE 0x1c
1754 //#define GSM48_IE_CHDES_1_BEFORE 0x1c
1755 #define GSM48_IE_CH_DESC_2_BEFORE 0x1d
1756 //#define GSM48_IE_CHDES_2_BEFORE 0x1d
1757 #define GSM48_IE_F_CH_SEQ_BEFORE 0x1e
1758 //#define GSM48_IE_FRQSEQ_BEFORE 0x1e
1759 #define GSM48_IE_CLASSMARK3 0x20
1760 #define GSM48_IE_MA_BEFORE 0x21
1761 #define GSM48_IE_RR_PACKET_UL 0x22
1762 #define GSM48_IE_RR_PACKET_DL 0x23
1763 #define GSM48_IE_CELL_CH_DESC 0x62
1764 #define GSM48_IE_CHANMODE_1 0x63
1765 #define GSM48_IE_CHDES_2_AFTER 0x64
1766 #define GSM48_IE_MODE_SEC_CH 0x66
1767 #define GSM48_IE_F_CH_SEQ_AFTER 0x69
1768 #define GSM48_IE_MA_AFTER 0x72
1769 #define GSM48_IE_BA_RANGE 0x73
1770 #define GSM48_IE_GROUP_CHDES 0x74
1771 #define GSM48_IE_BA_LIST_PREF 0x75
1772 #define GSM48_IE_MOB_OVSERV_DIF 0x77
1773 #define GSM48_IE_CELL_SEL_IND_AFTER_REL 0x77 /* 44.018 Section 9.1.7 */
1774 #define GSM48_IE_REALTIME_DIFF 0x7b
1775 #define GSM48_IE_START_TIME 0x7c
1776 #define GSM48_IE_INDIVIDUAL_PRIORITIES 0x7c /* 44.018 Section 9.1.7 */
1777 #define GSM48_IE_TIMING_ADVANCE 0x7d
1778 #define GSM48_IE_GROUP_CIP_SEQ 0x80
1779 #define GSM48_IE_CIP_MODE_SET 0x90
1780 #define GSM48_IE_GPRS_RESUMPT 0xc0
1781 #define GSM48_IE_SYNC_IND 0xd0
1782 /* System Information 4 (types are equal IEs above) */
1783 #define GSM48_IE_CBCH_CHAN_DESC 0x64
1784 #define GSM48_IE_CBCH_MOB_AL 0x72
1785 
1786 /* Additional MM elements */
1787 #define GSM48_IE_LOCATION_AREA 0x13
1788 #define GSM48_IE_AUTN 0x20
1789 #define GSM48_IE_AUTH_RES_EXT 0x21
1790 #define GSM48_IE_AUTS 0x22
1791 #define GSM48_IE_PRIORITY_LEV 0x80
1792 #define GSM48_IE_FOLLOW_ON_PROC 0xa1
1793 #define GSM48_IE_CTS_PERMISSION 0xa2
1794 
1795 /* Section 10.5.4.21 / Table 10.5.127 */
1796 
1805 };
1806 
1807 /* Section 10.5.4.23 / Table 10.5.130 */
1820 };
1821 
1822 /* Section 10.5.4.11 / Table 10.5.122 */
1828 };
1829 
1837  /* not defined */
1840 };
1841 
1842 /* 3GPP TS 44.018 10.5.2.31 RR Cause / Table 10.5.70 */
1861 };
1862 
1863 /* Section 10.5.4.11 CC Cause / Table 10.5.123 */
1914 };
1915 
1916 extern const struct value_string gsm48_cc_cause_names[];
1917 static inline const char *gsm48_cc_cause_name(enum gsm48_cc_cause val)
1918 { return get_value_string(gsm48_cc_cause_names, val); }
1919 
1920 /* Annex G, GSM specific cause values for mobility management */
1945 
1946  /* according to G.6 Additional cause codes for GMM */
1953 };
1954 
1955 extern const struct value_string gsm48_reject_value_names[];
1956 static inline const char *gsm48_reject_value_name(enum gsm48_reject_value val)
1958 
1979 };
1980 
1981 /* Chapter 11.3 */
1982 #define GSM48_T301 180, 0
1983 #define GSM48_T303 30, 0
1984 #define GSM48_T305 30, 0
1985 #define GSM48_T306 30, 0
1986 #define GSM48_T308 10, 0 /* no spec default */
1987 #define GSM48_T310 30, 0 /* no spec default */
1988 #define GSM48_T313 30, 0 /* no spec default */
1989 #define GSM48_T323 30, 0
1990 #define GSM48_T331 30, 0 /* no spec default */
1991 #define GSM48_T333 30, 0 /* no spec default */
1992 #define GSM48_T334 25, 0 /* min 15s */
1993 #define GSM48_T338 30, 0 /* no spec default */
1994 #define GSM48_T303_MS 30, 0
1995 #define GSM48_T305_MS 30, 0
1996 #define GSM48_T308_MS 30, 0
1997 #define GSM48_T310_MS 30, 0
1998 #define GSM48_T313_MS 30, 0
1999 #define GSM48_T323_MS 30, 0
2000 #define GSM48_T332_MS 30, 0
2001 #define GSM48_T335_MS 30, 0
2002 
2003 /* Chapter 5.1.2.2 */
2004 #define GSM_CSTATE_NULL 0
2005 #define GSM_CSTATE_INITIATED 1
2006 #define GSM_CSTATE_MM_CONNECTION_PEND 2 /* see 10.5.4.6 */
2007 #define GSM_CSTATE_MO_CALL_PROC 3
2008 #define GSM_CSTATE_CALL_DELIVERED 4
2009 #define GSM_CSTATE_CALL_PRESENT 6
2010 #define GSM_CSTATE_CALL_RECEIVED 7
2011 #define GSM_CSTATE_CONNECT_REQUEST 8
2012 #define GSM_CSTATE_MO_TERM_CALL_CONF 9
2013 #define GSM_CSTATE_ACTIVE 10
2014 #define GSM_CSTATE_DISCONNECT_REQ 12
2015 #define GSM_CSTATE_DISCONNECT_IND 12
2016 #define GSM_CSTATE_RELEASE_REQ 19
2017 #define GSM_CSTATE_MO_ORIG_MODIFY 26
2018 #define GSM_CSTATE_MO_TERM_MODIFY 27
2019 #define GSM_CSTATE_CONNECT_IND 28
2020 
2021 #define SBIT(a) (1 << a)
2022 #define ALL_STATES 0xffffffff
2023 
2024 /* Table 10.5.3/3GPP TS 04.08: Location Area Identification information element */
2025 #define GSM_LAC_RESERVED_DETACHED 0x0
2026 #define GSM_LAC_RESERVED_ALL_BTS 0xfffe
2027 
2028 /* GSM 04.08 Bearer Capability: Information Transfer Capability */
2036 };
2037 
2038 /* GSM 04.08 Bearer Capability: Transfer Mode */
2042 };
2043 
2044 /* GSM 04.08 Bearer Capability: Coding Standard */
2047 };
2048 
2049 /* GSM 04.08 Bearer Capability: Radio Channel Requirements */
2054 };
2055 
2056 /* GSM 04.08 Bearer Capability: Rate Adaption */
2062 };
2063 
2064 /* GSM 04.08 Bearer Capability: Signalling access protocol */
2072 };
2073 
2074 /* GSM 04.08 Bearer Capability: User Rate */
2083 };
2084 
2085 /* GSM 04.08 Bearer Capability: Parity */
2092 };
2093 
2094 /* GSM 04.08 Bearer Capability: Intermediate Rate */
2098 };
2099 
2100 /* GSM 04.08 Bearer Capability: Transparency */
2106 };
2107 
2108 /* GSM 04.08 Bearer Capability: Modem Type */
2119 };
2120 
2133 };
2134 
2135 #define GSM48_TMSI_LEN 5
2136 #define GSM48_MID_TMSI_LEN (GSM48_TMSI_LEN + 2)
2137 #define GSM48_MI_SIZE 32
2138 
2139 /* 3GPP TS 24.008 ยง 10.5.5.15 Routing area identification */
2140 struct gsm48_ra_id {
2141  uint8_t digits[3]; /* MCC + MNC BCD digits */
2142  uint16_t lac; /* Location Area Code */
2143  uint8_t rac; /* Routing Area Code */
2144 } __attribute__ ((packed));
2145 
2146 #define GSM48_CELL_CHAN_DESC_SIZE 16
2147 
2148 #define GSM_MACBLOCK_LEN 23
2149 #define GSM_MACBLOCK_PADDING 0x2b
2150 
2151 /* Table 10.5.118 / 3GPP TS 24.008 Section 10.5.4.7 */
2158  /* reserved */
2159 };
2160 
2161 /* Table 10.5.118 / 3GPP TS 24.008 Section 10.5.4.7 */
2170  /* reserved */
2171 };
Definition: gsm_04_08.h:824
gsm48_bcap_parity
Definition: gsm_04_08.h:2086
uint16_t lac
Definition: gsm_04_08.h:903
Definition: gsm_04_08.h:1815
Definition: gsm_04_08.h:2088
Definition: gsm_04_08.h:1217
Definition: gsm_04_08.h:810
Definition: gsm_04_08.h:1889
uint8_t msg_type
Definition: gsm_04_08.h:823
Definition: gsm_04_08.h:1190
Definition: gsm_04_08.h:2154
uint8_t mi[0]
Definition: gsm_04_08.h:823
Definition: gsm_04_08.h:944
gsm48_bcap_rrq
Definition: gsm_04_08.h:2050
Definition: gsm_04_08.h:1872
Definition: gsm_04_08.h:1950
Definition: gsm_04_08.h:1901
Definition: gsm_04_08.h:1875
Definition: gsm_04_08.h:1941
Definition: gsm_04_08.h:2157
Definition: gsm_04_08.h:2156
gsm48_numbering_plan
Definition: gsm_04_08.h:2162
bool osmo_gsm48_classmark1_is_r99(const struct gsm48_classmark1 *cm1)
Definition: gsm48.c:1163
Definition: gsm_04_08.h:1922
Definition: gsm_04_08.h:1814
Definition: gsm_04_08.h:1891
gsm48_bcap_sig_access
Definition: gsm_04_08.h:2065
uint8_t type
Definition: gsm_08_08.h:469
static int32_t smod(int32_t n, int32_t m)
Definition: gsm48_ie.c:797
uint8_t wait_ind4
Definition: gsm_04_08.h:1265
Definition: gsm_04_08.h:1898
Definition: gsm_04_08.h:1804
Definition: gsm_04_08.h:840
Definition: gsm_04_08.h:1849
Definition: gsm_04_08.h:1827
Definition: gsm_04_08.h:1878
struct osmo_gsm48_classmark __attribute__
Definition: gsm_04_08.h:1893
gsm48_chan_mode
Definition: gsm_04_08.h:808
Definition: gsm_04_08.h:862
Definition: gsm_04_08.h:1366
uint8_t l2_plen
Definition: gsm_04_08.h:821
Definition: gsm_04_08.h:772
Definition: gsm_04_08.h:1926
Definition: gsm_04_08.h:1147
Definition: gsm_04_08.h:1961
Definition: gsm_04_08.h:1869
gsm48_rr_cause
Definition: gsm_04_08.h:1843
void gsm48_set_dtx(struct gsm48_cell_options *op, enum gsm48_dtx_mode full, enum gsm48_dtx_mode half, bool is_bcch)
Set DTX mode in Cell Options IE (3GPP TS 44.018)
Definition: gsm48.c:591
Definition: gsm_04_08.h:1894
Definition: gsm_04_08.h:1908
Definition: gsm_04_08.h:816
Definition: gsm_04_08.h:2096
uint8_t mob_alloc_len
Definition: gsm_04_08.h:1248
const char * get_value_string(const struct value_string *vs, uint32_t val)
Definition: gsm_04_08.h:1802
Definition: gsm_04_08.h:1887
Definition: gsm_04_08.h:1938
Definition: gsm_04_08.h:809
Definition: gsm_04_08.h:1817
Definition: gsm_04_08.h:1072
gsm48_bcap_user_rate
Definition: gsm_04_08.h:2075
Definition: gsm_04_08.h:1853
Definition: gsm_04_08.h:814
Definition: gsm_04_08.h:1963
uint8_t rr_cause
Definition: gsm_04_08.h:1196
uint8_t ho_ref
Definition: gsm_04_08.h:865
Definition: gsm_04_08.h:1846
Definition: gsm_04_08.h:1906
Definition: gsm_04_08.h:1818
Definition: gsm_04_08.h:1813
uint8_t wait_ind1
Definition: gsm_04_08.h:1259
Definition: gsm_04_08.h:1969
Definition: gsm_04_08.h:2168
Definition: gsm_04_08.h:1973
static uint8_t gsm48_hdr_msg_type_r99(const struct gsm48_hdr *hdr)
Definition: gsm_04_08.h:1457
Definition: gsm_04_08.h:1844
Definition: gsm_04_08.h:951
gsm48_reject_value
Definition: gsm_04_08.h:1921
Definition: gsm_04_08.h:1948
Definition: gsm_04_08.h:1871
Definition: gsm_04_08.h:1022
Definition: gsm_04_08.h:1877
Definition: gsm_04_08.h:1897
Definition: gsm_04_08.h:2090
Definition: gsm_04_08.h:1859
Definition: gsm_04_08.h:1831
Definition: gsm_04_08.h:1971
gsm48_bcap_tmod
Definition: gsm_04_08.h:2039
Definition: gsm_04_08.h:548
Definition: gsm_04_08.h:1873
Definition: gsm_04_08.h:1923
uint8_t ext_bcch_frequency_list[16]
Definition: gsm_04_08.h:822
bool gsm48_hdr_gmm_cipherable(const struct gsm48_hdr *hdr)
Checks is particular message is cipherable in A/Gb mode according to 3GPP TS 24.008 ยง 4...
Definition: gsm48.c:477
static bool gsm48_acc_is_barred(struct gsm48_rach_control *rach_control, unsigned int acc)
Definition: gsm_04_08.h:747
gsm48_bcap_modem_type
Definition: gsm_04_08.h:2109
uint8_t proto_discr
Definition: gsm_04_08.h:945
Definition: gsm_04_08.h:1886
Definition: gsm_04_08.h:1857
Definition: gsm_04_08.h:1866
Definition: gsm_04_08.h:1931
uint8_t options[0]
Definition: gsm_04_08.h:824
Definition: gsm_04_08.h:1819
Definition: gsm_04_08.h:1316
Definition: gsm_04_08.h:1900
#define GSM48_PDISC_BCAST_CC
Definition: gsm_04_08.h:1372
Definition: gsm_04_08.h:2061
gsm48_signal_val
Definition: gsm_04_08.h:1808
uint8_t mode
Definition: gsm_04_08.h:805
Definition: gsm_04_08.h:2110
Definition: gsm_04_08.h:2104
#define OSMO_ASSERT(exp)
Definition: gsm_04_08.h:2070
Definition: gsm_04_08.h:1811
Definition: gsm_04_08.h:1976
uint8_t ra_id[6]
Definition: gsm_04_08.h:822
uint8_t wait_ind3
Definition: gsm_04_08.h:1263
static void gsm48_allow_acc(struct gsm48_rach_control *rach_control, unsigned int acc)
Definition: gsm_04_08.h:732
Definition: gsm_04_08.h:1003
Definition: gsm_04_08.h:2032
uint8_t page_mode
Definition: gsm_04_08.h:1257
Definition: gsm_04_08.h:2081
Definition: gsm_04_08.h:1836
Definition: gsm_04_08.h:2167
Definition: gsm_04_08.h:2165
gsm48_dtx_mode
Definition: gsm_04_08.h:1000
Definition: gsm_04_08.h:1824
Definition: gsm_04_08.h:2067
#define GSM48_PDISC_CC
Definition: gsm_04_08.h:1374
uint8_t mob_alloc_len
Definition: gsm_04_08.h:835
const struct value_string gsm48_mm_msgtype_names[]
TS 04.08 MM Message Type names.
Definition: gsm48.c:919
Definition: gsm_04_08.h:697
Definition: gsm_04_08.h:1102
uint8_t timing_advance1
Definition: gsm_04_08.h:1244
Definition: gsm_04_08.h:1065
Definition: gsm_04_08.h:1911
uint8_t cell_channel_description[16]
Definition: gsm_04_08.h:822
Definition: gsm_04_08.h:832
Definition: gsm_04_08.h:29
uint8_t rr_cause
Definition: gsm_04_08.h:1212
gsm48_cc_cause
Definition: gsm_04_08.h:1864
Definition: gsm_04_08.h:1860
Definition: gsm_04_08.h:1905
#define GSM48_PDISC_NC_SS
Definition: gsm_04_08.h:1382
Definition: gsm_04_08.h:1884
Definition: gsm_04_08.h:1856
Definition: gsm_04_08.h:1892
Definition: gsm_04_08.h:2053
struct gsm48_req_ref req_ref3
Definition: gsm_04_08.h:829
const struct value_string gsm48_cc_msgtype_names[]
TS 04.08 CC Message Type names.
Definition: gsm48.c:949
static const char * gsm48_pdisc_name(uint8_t val)
Definition: gsm_04_08.h:1389
Definition: gsm_04_08.h:359
uint8_t proto_discr
Definition: gsm_04_08.h:1255
Definition: gsm_04_08.h:1939
Definition: gsm_04_08.h:2140
Definition: gsm_04_08.h:2091
static uint8_t gsm48_hdr_trans_id_no_ti(const struct gsm48_hdr *hdr)
Definition: gsm_04_08.h:1432
uint8_t proto_discr
Definition: gsm_04_08.h:1239
Definition: gsm_04_08.h:2035
Definition: gsm_04_08.h:2079
Definition: gsm_04_08.h:2153
struct gsm48_req_ref req_ref
Definition: gsm_04_08.h:826
uint8_t page_mode
Definition: gsm_04_08.h:875
gsm48_bcap_coding
Definition: gsm_04_08.h:2045
struct gsm48_chan_desc chan_desc2
Definition: gsm_04_08.h:828
Definition: gsm_04_08.h:2117
Definition: gsm_04_08.h:1132
static uint8_t gsm48_hdr_trans_id(const struct gsm48_hdr *hdr)
Definition: gsm_04_08.h:1406
Definition: gsm_04_08.h:966
Definition: gsm_04_08.h:1270
const struct value_string gsm48_rr_msgtype_names[]
TS 04.08 RR Message Type names.
Definition: gsm48.c:826
Definition: gsm_04_08.h:1810
Definition: gsm_04_08.h:1206
Definition: gsm_04_08.h:815
Definition: gsm_04_08.h:1885
gsm48_bcap_ra
Definition: gsm_04_08.h:2057
Definition: gsm_04_08.h:1651
Definition: gsm_04_08.h:1211
#define GSM48_PDISC_MM
Definition: gsm_04_08.h:1377
GSM HR V4 (OHR AMR-WB)
Definition: gsm_04_08.h:2130
struct gsm48_cell_desc cell_desc
Definition: gsm_04_08.h:821
Definition: gsm_04_08.h:2112
Definition: gsm_04_08.h:1834
Definition: gsm_04_08.h:1932
struct gsm48_req_ref req_ref4
Definition: gsm_04_08.h:831
Definition: gsm_04_08.h:1927
Definition: gsm_04_08.h:1855
Definition: gsm_04_08.h:1854
uint8_t ncc_permitted
Definition: gsm_04_08.h:1052
uint32_t tlli
Definition: gsm_04_08.h:841
uint8_t mi_len
Definition: gsm_04_08.h:822
uint8_t rr_cause
Definition: gsm_04_08.h:1207
Definition: gsm_04_08.h:1838
static uint8_t gsm48_hdr_trans_id_flip_ti(const struct gsm48_hdr *hdr)
Definition: gsm_04_08.h:1427
Definition: gsm_04_08.h:1975
Definition: gsm_04_08.h:2089
Definition: gsm_04_08.h:1833
struct gsm48_control_channel_descr control_channel_desc
Definition: gsm_04_08.h:824
const struct value_string osmo_lu_type_names[]
Definition: gsm48.c:1144
GSM HR V6 (OHR AMR)
Definition: gsm_04_08.h:2132
Definition: gsm_04_08.h:871
Definition: gsm_04_08.h:1910
uint8_t proto_discr
Definition: gsm_04_08.h:822
Definition: gsm_04_08.h:1974
Definition: gsm_04_08.h:2116
GSM FR V5 (FR AMR-WB)
Definition: gsm_04_08.h:2131
struct gsm48_cell_options cell_options
Definition: gsm_04_08.h:825
Definition: gsm_04_08.h:2082
Definition: gsm_04_08.h:1825
Definition: gsm_04_08.h:1845
Definition: gsm_04_08.h:756
Definition: gsm_04_08.h:1658
Definition: gsm_04_08.h:2105
Definition: gsm_04_08.h:599
Definition: gsm_04_08.h:2060
Definition: gsm_04_08.h:1972
Definition: gsm_04_08.h:1952
Definition: gsm_04_08.h:1656
Definition: gsm_04_08.h:925
Definition: gsm_04_08.h:1964
uint8_t power_command
Definition: gsm_04_08.h:866
Definition: gsm_04_08.h:1800
Definition: gsm_04_08.h:1799
struct gsm48_rach_control rach_control
Definition: gsm_04_08.h:823
Definition: gsm_04_08.h:1883
Definition: gsm_04_08.h:2046
Definition: gsm_04_08.h:1049
Definition: gsm_04_08.h:1881
Definition: gsm_04_08.h:1942
Definition: gsm_04_08.h:1899
Definition: gsm_04_08.h:242
Definition: gsm_04_08.h:1909
Definition: gsm_04_08.h:1929
void osmo_gsm48_classmark_update(struct osmo_gsm48_classmark *dst, const struct osmo_gsm48_classmark *src)
Overwrite dst with the Classmark information present in src.
Definition: gsm48.c:1226
Definition: gsm_04_08.h:901
Definition: gsm_04_08.h:2080
Definition: gsm_04_08.h:1090
Definition: gsm_04_08.h:15
Definition: gsm_04_08.h:1839
uint8_t digits[3]
Definition: gsm_04_08.h:821
Definition: gsm_04_08.h:2103
Definition: gsm_04_08.h:1944
uint8_t timing_advance2
Definition: gsm_04_08.h:1247
int osmo_gsm48_classmark_supports_a5(const struct osmo_gsm48_classmark *cm, uint8_t a5)
Determine if the given Classmark (1/2/3) value permits a given A5/n cipher.
Definition: gsm48.c:1251
uint8_t bcch_frequency_list[16]
Definition: gsm_04_08.h:822
uint8_t msg_type
Definition: gsm_04_08.h:946
Definition: gsm_04_08.h:1882
Definition: gsm_04_08.h:1851
Definition: gsm_04_08.h:1924
Definition: gsm_04_08.h:2155
Definition: gsm_04_08.h:1936
Definition: gsm_04_08.h:2115
chreq_type
Definition: gsm_04_08.h:1959
gsm48_bcap_itcap
Definition: gsm_04_08.h:2029
Definition: gsm_04_08.h:1655
const struct value_string gsm48_reject_value_names[]
Definition: gsm48.c:1091
Definition: gsm_04_08.h:1951
Definition: gsm_04_08.h:2169
struct gsm48_chan_desc chan_desc
Definition: gsm_04_08.h:748
uint8_t classmark3_len
Definition: gsm_04_08.h:64
Definition: gsm_04_08.h:1928
uint8_t wait_ind2
Definition: gsm_04_08.h:1261
uint8_t page_mode
Definition: gsm_04_08.h:1241
static const char * osmo_lu_type_name(uint8_t lu_type)
Definition: gsm_04_08.h:1679
struct gsm48_classmark2 cm2
Definition: gsm_04_08.h:822
#define GSM48_PDISC_LOC
Definition: gsm_04_08.h:1383
Definition: gsm_04_08.h:1291
const char * gsm48_pdisc_msgtype_name(uint8_t pdisc, uint8_t msg_type)
Compose a string naming the message type for given protocol.
Definition: gsm48.c:1060
#define GSM48_PDISC_MASK
Definition: gsm_04_08.h:1386
uint8_t cause
Definition: gsm_04_08.h:843
GSM FR V4 (OFR AMR-WB)
Definition: gsm_04_08.h:2129
static const char * gsm48_reject_value_name(enum gsm48_reject_value val)
Definition: gsm_04_08.h:1956
Definition: gsm_04_08.h:1809
Definition: gsm_04_08.h:2078
Definition: gsm_04_08.h:1001
uint8_t data[0]
Definition: gsm_04_08.h:824
Definition: gsm_04_08.h:2040
uint8_t mob_alloc[0]
Definition: gsm_04_08.h:824
Definition: gsm_04_08.h:1812
Definition: gsm_04_08.h:1895
Definition: gsm_04_08.h:2058
static const char * osmo_cm_service_type_name(enum osmo_cm_service_type val)
Definition: gsm_04_08.h:1662
gsm48_bcap_interm_rate
Definition: gsm_04_08.h:2095
Definition: gsm_04_08.h:1200
Definition: gsm_04_08.h:1870
Definition: gsm_04_08.h:1798
Definition: gsm_04_08.h:2059
uint8_t classmark2_len
Definition: gsm_04_08.h:62
Definition: gsm_04_08.h:685
uint8_t l2_plen
Definition: gsm_04_08.h:872
uint8_t timing_advance
Definition: gsm_04_08.h:878
uint8_t rest_octets[0]
Definition: gsm_04_08.h:824
Definition: gsm_04_08.h:1978
Definition: gsm_04_08.h:1195
Definition: gsm_04_08.h:131
Definition: gsm_04_08.h:1966
uint16_t cell_identity
Definition: gsm_04_08.h:1080
Definition: gsm_04_08.h:813
Definition: gsm_04_08.h:2111
Definition: gsm_04_08.h:1930
struct gsm48_system_information_type_header header
Definition: gsm_04_08.h:821
Definition: gsm_04_08.h:1947
Definition: gsm_04_08.h:1880
Definition: gsm_04_08.h:812
gsm48_bcap_transp
Definition: gsm_04_08.h:2101
GSM HR V1 (GSM HR)
Definition: gsm_04_08.h:2125
bool osmo_gsm48_classmark_is_r99(const struct osmo_gsm48_classmark *cm)
Return true if any of Classmark 1 or Classmark 2 are present and indicate R99 capability.
Definition: gsm48.c:1179
uint8_t rac
Definition: gsm_04_08.h:2143
const struct value_string osmo_cm_service_type_names[]
Definition: gsm48.c:1152
uint8_t msg_type
Definition: gsm_04_08.h:1256
Definition: gsm_04_08.h:1960
const struct value_string gsm48_chan_mode_names[]
Definition: gsm48.c:397
Definition: gsm_04_08.h:1041
Definition: gsm_04_08.h:1852
Definition: gsm_04_08.h:1183
uint8_t l2_plen
Definition: gsm_04_08.h:1238
bool osmo_gsm48_classmark2_is_r99(const struct gsm48_classmark2 *cm2, uint8_t cm2_len)
Definition: gsm48.c:1168
uint8_t msg_type
Definition: gsm_04_08.h:1240
Definition: gsm_04_08.h:907
static const char * gsm48_cc_cause_name(enum gsm48_cc_cause val)
Definition: gsm_04_08.h:1917
uint8_t mi_len
Definition: gsm_04_08.h:1178
uint8_t rr_cause
Definition: gsm_04_08.h:1191
Definition: gsm_04_08.h:1902
struct gsm48_req_ref req_ref2
Definition: gsm_04_08.h:829
Definition: gsm_04_08.h:1868
Definition: gsm_04_08.h:1867
Definition: gsm_04_08.h:1078
Definition: gsm_04_08.h:1816
Definition: gsm_04_08.h:1896
Definition: gsm_04_08.h:2034
Definition: gsm_04_08.h:981
gsm48_progress_desc
Definition: gsm_04_08.h:1797
#define GSM48_PDISC_EXTEND
Definition: gsm_04_08.h:1384
Definition: gsm_04_08.h:920
Definition: gsm_04_08.h:1904
Definition: gsm_04_08.h:1937
Definition: gsm_04_08.h:1835
uint8_t msg_type
Definition: gsm_04_08.h:874
Definition: gsm_04_08.h:1865
Definition: gsm_04_08.h:1967
Definition: gsm_04_08.h:2164
uint16_t lac
Definition: gsm_04_08.h:2142
Definition: gsm_04_08.h:2068
Definition: gsm_04_08.h:484
Definition: gsm_04_08.h:1970
const char * osmo_gsm48_classmark_a5_name(const struct osmo_gsm48_classmark *cm)
Return a string representation of A5 cipher algorithms indicated by Classmark 1, 2 and 3...
Definition: gsm48.c:1190
Definition: gsm_04_08.h:2041
Definition: gsm_04_08.h:786
uint8_t rr_cause
Definition: gsm_04_08.h:1201
osmo_cm_service_type
Definition: gsm_04_08.h:1650
Definition: gsm_04_08.h:884
uint8_t mob_alloc_len
Definition: gsm_04_08.h:879
Definition: gsm_04_08.h:1848
Definition: gsm_04_08.h:2077
uint8_t sres[4]
Definition: gsm_04_08.h:821
Definition: gsm_04_08.h:1888
gsm48_cause_loc
Definition: gsm_04_08.h:1830
Definition: gsm_04_08.h:2031
Definition: gsm_04_08.h:1858
Definition: gsm_04_08.h:1940
Definition: gsm_04_08.h:803
Definition: gsm_04_08.h:1907
Definition: gsm_04_08.h:1170
Definition: gsm_04_08.h:1876
Definition: gsm_04_08.h:1002
Definition: gsm_04_08.h:2102
uint16_t cell_identity
Definition: gsm_04_08.h:822
Definition: gsm_04_08.h:1652
bool classmark1_set
Definition: gsm_04_08.h:60
static const char * gsm48_chan_mode_name(enum gsm48_chan_mode val)
Definition: gsm_04_08.h:820
struct gsm48_classmark1 classmark1
Definition: gsm_04_08.h:821
Definition: gsm_04_08.h:1653
Definition: gsm_04_08.h:2087
Definition: gsm_04_08.h:2166
Definition: gsm_04_08.h:1117
uint8_t cm2_len
Definition: gsm_04_08.h:821
Definition: gsm_04_08.h:1349
Definition: gsm_04_08.h:2071
Definition: gsm_04_08.h:662
gsm48_type_of_number
Definition: gsm_04_08.h:2152
uint8_t cm2_len
Definition: gsm_04_08.h:1231
uint8_t ncc_permitted
Definition: gsm_04_08.h:823
Definition: gsm_04_08.h:1935
const struct value_string gsm48_pdisc_names[]
TS 04.08 Protocol Descriptor names.
Definition: gsm48.c:807
const struct value_string gsm48_cc_cause_names[]
TS 04.08 10.5..4.11 Call Control Cause Values.
Definition: gsm48.c:992
Definition: gsm_04_08.h:1057
gsm48_cause_coding
Definition: gsm_04_08.h:1823
GSM FR V3 (FR AMR)
Definition: gsm_04_08.h:2127
Definition: gsm_04_08.h:1176
Definition: gsm_04_08.h:59
gsm48_bcap_speech_ver
GSM 04.08 Bearer Capability: Speech Version Indication (See also 3GPP TS 24.008, Table 10...
Definition: gsm_04_08.h:2123
uint8_t chan_nr
Definition: gsm_04_08.h:567
Definition: gsm_04_08.h:1657
Definition: gsm_04_08.h:2069
Definition: gsm_04_08.h:2118
struct gsm48_loc_area_id lai
Definition: gsm_04_08.h:823
GSM FR V2 (GSM EFR)
Definition: gsm_04_08.h:2126
Definition: gsm_04_08.h:1832
Definition: gsm_04_08.h:1968
Definition: gsm_04_08.h:1949
Definition: gsm_04_08.h:1913
Definition: gsm_04_08.h:1874
#define GSM48_PDISC_GROUP_CC
Definition: gsm_04_08.h:1371
uint8_t power_command
Definition: gsm_04_08.h:823
struct gsm48_chan_desc chan_desc1
Definition: gsm_04_08.h:825
GSM HR V3 (HR_AMR)
Definition: gsm_04_08.h:2128
struct gsm48_req_ref req_ref1
Definition: gsm_04_08.h:826
Definition: gsm_04_08.h:1962
Definition: gsm_04_08.h:2030
struct gsm48_cell_sel_par cell_sel_par
Definition: gsm_04_08.h:826
Definition: gsm_04_08.h:1237
Definition: gsm_04_08.h:1847
Definition: gsm_04_08.h:2076
Definition: gsm_04_08.h:1008
Definition: gsm_04_08.h:1965
Definition: gsm_04_08.h:1803
Definition: gsm_04_08.h:1850
Definition: gsm_04_08.h:1903
static bool gsm48_ta_is_valid(uint8_t ta)
Check if TA is valid according to 3GPP TS 44.018 ยง 10.5.2.40.
Definition: gsm_04_08.h:1422
uint8_t rest[0]
Definition: gsm_04_08.h:833
Definition: gsm_04_08.h:1890
Definition: gsm_04_08.h:1801
Definition: gsm_04_08.h:1925
Definition: gsm_04_08.h:811
uint8_t l2_plen
Definition: gsm_04_08.h:1254
Definition: gsm_04_08.h:848
Definition: gsm_04_08.h:2052
Definition: gsm_04_08.h:2097
Definition: gsm_04_08.h:1933
Definition: gsm_04_08.h:566
Definition: gsm_04_08.h:1654
Definition: gsm_04_08.h:1826
Definition: gsm_04_08.h:1943
static void gsm48_barr_acc(struct gsm48_rach_control *rach_control, unsigned int acc)
Definition: gsm_04_08.h:718
Definition: gsm_04_08.h:2113
Definition: gsm_04_08.h:1977
uint8_t proto_discr
Definition: gsm_04_08.h:873
Definition: gsm_04_08.h:1934
Definition: gsm_04_08.h:2033
static uint8_t gsm48_hdr_pdisc(const struct gsm48_hdr *hdr)
Definition: gsm_04_08.h:1394
Definition: gsm_04_08.h:2066
Definition: gsm_04_08.h:2114
Definition: gsm_04_08.h:1230
Definition: gsm_04_08.h:1912
static uint8_t gsm48_hdr_msg_type_r98(const struct gsm48_hdr *hdr)
Definition: gsm_04_08.h:1437
Definition: gsm_04_08.h:2163
Definition: gsm_04_08.h:1253
uint8_t rr_cause
Definition: gsm_04_08.h:1367
GSM FR V1 (GSM FR)
Definition: gsm_04_08.h:2124
Definition: gsm_04_08.h:2051
Definition: gsm_04_08.h:1879