FIXUP: WIP: verification_trailer
[wireshark-wip.git] / epan / dissectors / packet-gmr1_bcch.c
blob10350be73c555b365b208113b719655d8fbfd590
1 /* packet-gmr1_bcch.c
3 * Routines for GMR-1 BCCH dissection in wireshark.
4 * Copyright (c) 2011 Sylvain Munaut <tnt@246tNt.com>
6 * References:
7 * [1] ETSI TS 101 376-4-8 V1.3.1 - GMR-1 04.008
8 * [2] ETSI TS 101 376-4-8 V2.2.1 - GMPRS-1 04.008
9 * [3] ETSI TS 101 376-4-8 V3.1.1 - GMR-1 3G 44.008
11 * $Id$
13 * Wireshark - Network traffic analyzer
14 * By Gerald Combs <gerald@wireshark.org>
15 * Copyright 1998 Gerald Combs
17 * This program is free software; you can redistribute it and/or
18 * modify it under the terms of the GNU General Public License
19 * as published by the Free Software Foundation; either version 2
20 * of the License, or (at your option) any later version.
22 * This program is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 * GNU General Public License for more details.
27 * You should have received a copy of the GNU General Public License
28 * along with this program; if not, write to the Free Software
29 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
32 #include "config.h"
34 #include <glib.h>
35 #include <epan/packet.h>
36 #include <epan/wmem/wmem.h>
38 #include "packet-csn1.h"
41 /* GMR-1 BCCH proto */
42 static int proto_gmr1_bcch = -1;
44 /* GMR-1 BCCH sub tree */
45 static gint ett_gmr1_bcch = -1;
48 /* ------------------------------------------------------------------------ */
49 /* CSN1 fields */
50 /* ------------------------------------------------------------------------ */
52 /* Segment 1A fields - [3] 11.5.2.66 */
53 static int hf_seg1a_class_2_version = -1;
54 static int hf_seg1a_class_3_version = -1;
56 static int hf_seg1a_syncinfo_sb_frame_ts_offset = -1;
57 static int hf_seg1a_syncinfo_sb_symbol_offset = -1;
58 static int hf_seg1a_syncinfo_sa_freq_offset = -1;
60 static int hf_seg1a_rachctrl_max_retrans = -1;
61 static int hf_seg1a_rachctrl_acc[16] = { -1, -1, -1, -1, -1, -1, -1, -1,
62 -1, -1, -1, -1, -1, -1, -1, -1 };
63 static int hf_seg1a_rachctrl_cell_bar_access = -1;
65 static int hf_seg1a_miscinfo_sb_reselection_hysteresis = -1;
66 static int hf_seg1a_miscinfo_spare = -1;
67 static int hf_seg1a_miscinfo_priority_access_ind = -1;
69 static int hf_seg1a_gbch_present = -1;
70 static int hf_seg1a_test_gs = -1;
71 static int hf_seg1a_test_gs2 = -1;
72 static int hf_seg1a_spare1 = -1;
73 static int hf_seg1a_cell_bar_access_extension2 = -1;
74 static int hf_seg1a_spare2 = -1;
75 static int hf_seg1a_cell_bar_access_extension = -1;
77 /* Segment 2A & 2Abis fields - [3] 11.5.2.67 / 11.5.2.68 */
78 static int hf_seg2a_class_4_version = -1;
80 static int hf_seg2a_syncinfo_sa_sirfn_delay = -1;
81 static int hf_seg2a_syncinfo_sa_bcch_stn = -1;
82 static int hf_seg2a_syncinfo_superframe_num = -1;
83 static int hf_seg2a_syncinfo_multiframe_num = -1;
84 static int hf_seg2a_syncinfo_mffn_high_bit = -1;
86 static int hf_seg2a_selcrit_rxlev_select_min = -1;
88 static int hf_seg2a_miscinfo_sb_selection_power = -1;
90 static int hf_seg2a_lainfo_sa_pch_config = -1;
91 static int hf_seg2a_lainfo_sa_bach_config = -1;
92 static int hf_seg2a_lainfo_rach_ts_offset = -1;
93 static int hf_seg2a_lainfo_n_page_occurrences = -1;
94 static int hf_seg2a_lainfo_imsi_attach_detach_ind = -1;
95 static int hf_seg2a_lainfo_ecsc_indication = -1;
96 static int hf_seg2a_lainfo_si_update_ind = -1;
98 /* Segment 2B fields */
99 /* Segment 2Bbis fields */
101 /* Segment 3A fields - [1] 11.5.2.71 */
102 static int hf_seg3a_lai_mcc = -1;
103 static int hf_seg3a_lai_mnc = -1;
104 static int hf_seg3a_lai_lac = -1;
105 static int hf_seg3a_lai_msc_id = -1;
106 static int hf_seg3a_lai_spot_beam_id = -1;
108 static int hf_seg3a_system_sat_id = -1;
109 static int hf_seg3a_system_sys_id = -1;
111 static int hf_seg3a_satpos_latitude = -1;
112 static int hf_seg3a_satpos_longitude = -1;
113 static int hf_seg3a_satpos_radius = -1;
115 static int hf_seg3a_beam_latitude = -1;
116 static int hf_seg3a_beam_longitude = -1;
118 static int hf_seg3a_miscinfo_sb_reselection_timer = -1;
120 static int hf_seg3a_spare = -1;
122 /* Segment 3B fields */
123 /* Segment 3Bbis fields */
124 /* Segment 3C fields */
125 /* Segment 3D fields */
126 /* Segment 3E fields */
127 /* Segment 3Ebis fields */
128 /* Segment 3F fields */
129 /* Segment 3G fields */
130 /* Segment 3Gbis fields */
131 /* Segment 3H fields */
132 /* Segment 3I fields */
133 /* Segment 3J fields */
134 /* Segment 3Jbis fields */
135 /* Segment 3Kbis fields */
136 /* Segment 3L fields */
137 /* Segment 3M fields */
138 /* Segment 4A fields */
139 /* Segment 4B fields */
140 /* Segment 4C fields */
141 /* Segment 4D fields */
142 /* Segment 4E fields */
143 /* Segment 4F fields */
144 /* Segment 4G fields */
145 /* Segment 4H fields */
146 /* Segment 4I fields */
147 /* Segment 4J fields */
148 /* Segment 4K fields */
150 /* System Information fields [1] 10.1.31 & 10.1.32 */
151 static int hf_si_protocol_version = -1;
152 static int hf_si_block_type = -1;
153 static int hf_si_spare = -1;
155 static int hf_si1_randomization_period = -1;
158 /* ------------------------------------------------------------------------ */
159 /* CSN1 parsing structure */
160 /* ------------------------------------------------------------------------ */
162 /* Segments structures */
164 /* Segment 1A - [3] 11.5.2.66 */
165 typedef struct {
166 guint8 SB_FRAME_TS_OFFSET;
167 gint8 SB_SYMBOL_OFFSET;
168 gint8 SA_FREQ_OFFSET;
169 } Seg1A_SyncInfo_t;
171 typedef struct {
172 guint8 AC15;
173 guint8 AC14;
174 guint8 AC13;
175 guint8 AC12;
176 guint8 AC11;
177 guint8 EC10;
178 guint8 AC9;
179 guint8 AC8;
180 guint8 AC7;
181 guint8 AC6;
182 guint8 AC5;
183 guint8 AC4;
184 guint8 AC3;
185 guint8 AC2;
186 guint8 AC1;
187 guint8 AC0;
188 } Seg1A_AccessClasses_t;
190 typedef struct {
191 guint8 Max_Retrans;
192 Seg1A_AccessClasses_t AccessClasses;
193 guint8 CELL_BAR_ACCESS;
194 } Seg1A_RACHCtrlParams_t;
196 typedef struct {
197 guint8 SB_RESELECTION_HYSTERESIS;
198 guint8 Spare;
199 guint8 PriorityAccessInd;
200 } Seg1A_MiscInfo_t;
202 typedef struct {
203 guint8 Class_2_version;
204 guint8 Class_3_version;
205 Seg1A_SyncInfo_t SyncInfo;
206 Seg1A_RACHCtrlParams_t RACHCtrlParams;
207 Seg1A_MiscInfo_t MiscInfo;
208 guint8 GBCH_Present;
209 guint8 Test_GS;
210 guint8 Test_GS2;
211 guint8 Spare1;
212 guint8 CELL_BAR_ACCESS_EXTENSION2;
213 guint8 Spare2;
214 guint8 CELL_BAR_ACCESS_EXTENSION;
215 } Segment1A_t;
217 /* Segment 2A & 2Abis - [3] 11.5.2.67 / 11.5.2.68 */
218 typedef struct {
219 guint8 SA_SIRFN_DELAY;
220 guint8 SA_BCCH_STN;
221 guint16 SuperframeNum;
222 guint8 MultiframeNum;
223 guint8 MFFN_HighBit;
224 } Seg2A_SyncInfo_t;
226 typedef struct {
227 guint8 RXLEV_SELECT_MIN;
228 } Seg2A_SelectionCriterion_t;
230 typedef struct {
231 guint8 SB_SELECTION_POWER;
232 } Seg2A_MiscInfo_t;
234 typedef struct {
235 guint8 SA_PCH_CONFIG;
236 guint8 SA_BACH_CONFIG;
237 guint8 RACH_TS_OFFSET;
238 guint8 N_Page_Occurrences;
239 guint8 IMSI_attach_detach_ind;
240 guint8 ECSC_ind;
241 guint8 SI_update_ind;
242 } Seg2A_LAInfo_t;
244 typedef struct {
245 guint8 Class_4_version;
246 Seg2A_SyncInfo_t SyncInfo;
247 Seg2A_SelectionCriterion_t SelectionCriterion;
248 Seg2A_MiscInfo_t MiscInfo;
249 Seg2A_LAInfo_t LAInfo;
250 } Segment2A_t;
252 typedef struct {
253 guint8 Class_4_version;
254 Seg2A_SyncInfo_t SyncInfo;
255 Seg2A_SelectionCriterion_t SelectionCriterion;
256 Seg2A_MiscInfo_t MiscInfo;
257 Seg2A_LAInfo_t LAInfo;
258 } Segment2Abis_t;
260 typedef struct {
261 guint8 _dummy; /* Remove when dissection is written */
262 } Segment2B_t;
264 typedef struct {
265 guint8 _dummy; /* Remove when dissection is written */
266 } Segment2Bbis_t;
268 /* Segment 3A - [1] 11.5.2.71 */
269 typedef struct {
270 guint16 MCC;
271 guint16 MNC;
272 guint16 LAC;
273 guint8 MSC_ID; /* splitted version of LAC */
274 guint16 Spot_Beam_ID; /* splitted version of LAC */
275 } Seg3A_LAI_t;
277 typedef struct {
278 guint8 Satellite_ID;
279 guint8 System_ID;
280 } Seg3A_System_t;
282 typedef struct {
283 gint8 Latitude;
284 guint16 Longitude;
285 gint16 Radius;
286 } Seg3A_SatellitePosition_t;
288 typedef struct {
289 gint16 Latitude;
290 guint16 Longitude;
291 } Seg3A_BeamPosition_t;
293 typedef struct {
294 guint8 SB_RESELECTION_TIMER;
295 } Seg3A_MiscInfo_t;
297 typedef struct {
298 Seg3A_LAI_t LAI;
299 Seg3A_System_t System;
300 Seg3A_SatellitePosition_t SatellitePosition;
301 Seg3A_BeamPosition_t BeamPosition;
302 Seg3A_MiscInfo_t MiscInfo;
303 guint8 Spare;
304 } Segment3A_t;
306 typedef struct {
307 guint8 _dummy; /* Remove when dissection is written */
308 } Segment3B_t;
310 typedef struct {
311 guint8 _dummy; /* Remove when dissection is written */
312 } Segment3Bbis_t;
314 typedef struct {
315 guint8 _dummy; /* Remove when dissection is written */
316 } Segment3C_t;
318 typedef struct {
319 guint8 _dummy; /* Remove when dissection is written */
320 } Segment3D_t;
322 typedef struct {
323 guint8 _dummy; /* Remove when dissection is written */
324 } Segment3E_t;
326 typedef struct {
327 guint8 _dummy; /* Remove when dissection is written */
328 } Segment3Ebis_t;
330 typedef struct {
331 guint8 _dummy; /* Remove when dissection is written */
332 } Segment3F_t;
334 typedef struct {
335 guint8 _dummy; /* Remove when dissection is written */
336 } Segment3G_t;
338 typedef struct {
339 guint8 _dummy; /* Remove when dissection is written */
340 } Segment3Gbis_t;
342 typedef struct {
343 guint8 _dummy; /* Remove when dissection is written */
344 } Segment3H_t;
346 typedef struct {
347 guint8 _dummy; /* Remove when dissection is written */
348 } Segment3I_t;
350 typedef struct {
351 guint8 _dummy; /* Remove when dissection is written */
352 } Segment3J_t;
354 typedef struct {
355 guint8 _dummy; /* Remove when dissection is written */
356 } Segment3Jbis_t;
358 typedef struct {
359 guint8 _dummy; /* Remove when dissection is written */
360 } Segment3Kbis_t;
362 typedef struct {
363 guint8 _dummy; /* Remove when dissection is written */
364 } Segment3L_t;
366 typedef struct {
367 guint8 _dummy; /* Remove when dissection is written */
368 } Segment3M_t;
370 typedef struct {
371 guint8 _dummy; /* Remove when dissection is written */
372 } Segment4A_t;
374 typedef struct {
375 guint8 _dummy; /* Remove when dissection is written */
376 } Segment4B_t;
378 typedef struct {
379 guint8 _dummy; /* Remove when dissection is written */
380 } Segment4C_t;
382 typedef struct {
383 guint8 _dummy; /* Remove when dissection is written */
384 } Segment4D_t;
386 typedef struct {
387 guint8 _dummy; /* Remove when dissection is written */
388 } Segment4E_t;
390 typedef struct {
391 guint8 _dummy; /* Remove when dissection is written */
392 } Segment4F_t;
394 typedef struct {
395 guint8 _dummy; /* Remove when dissection is written */
396 } Segment4G_t;
398 typedef struct {
399 guint8 _dummy; /* Remove when dissection is written */
400 } Segment4H_t;
402 typedef struct {
403 guint8 _dummy; /* Remove when dissection is written */
404 } Segment4I_t;
406 typedef struct {
407 guint8 _dummy; /* Remove when dissection is written */
408 } Segment4J_t;
410 typedef struct {
411 guint8 _dummy; /* Remove when dissection is written */
412 } Segment4K_t;
414 /* System informations structures */
416 /* System Information type 1 - [1] 10.1.31 */
417 typedef struct {
418 guint8 Protocol_Version;
419 guint8 Block_Type;
420 guint8 Randomization_Period;
421 guint8 Spare;
422 } SI1_Block_Header_t;
424 typedef struct {
425 SI1_Block_Header_t Block_Header;
426 Segment1A_t Segment1A;
427 guint8 SegmentType;
428 union {
429 Segment2Abis_t Segment2Abis;
430 Segment2Bbis_t Segment2Bbis;
431 Segment3A_t Segment3A;
432 Segment3Bbis_t Segment3Bbis;
433 Segment3C_t Segment3C;
434 Segment3D_t Segment3D;
435 Segment3Ebis_t Segment3Ebis;
436 Segment3F_t Segment3F;
437 Segment3Gbis_t Segment3Gbis;
438 Segment3H_t Segment3H;
439 Segment3I_t Segment3I;
440 Segment3Jbis_t Segment3Jbis;
441 Segment3Kbis_t Segment3Kbis;
442 Segment4A_t Segment4A;
443 Segment4B_t Segment4B;
444 Segment4C_t Segment4C;
445 Segment4D_t Segment4D;
446 Segment4E_t Segment4E;
447 Segment4F_t Segment4F;
448 Segment4G_t Segment4G;
449 Segment4H_t Segment4H;
450 Segment4I_t Segment4I;
451 Segment4J_t Segment4J;
452 Segment4K_t Segment4K;
453 } u;
454 } SystemInformation1_t;
456 /* System Information type 2 - [1] 10.1.32 */
457 typedef struct {
458 guint8 Protocol_Version;
459 guint8 Block_Type;
460 guint8 Spare;
461 } SI2_Block_Header_t;
463 typedef struct {
464 SI2_Block_Header_t Block_Header;
465 guint8 SegmentType;
466 union {
467 Segment2A_t Segment2A;
468 Segment2B_t Segment2B;
469 Segment3B_t Segment3B;
470 Segment3E_t Segment3E;
471 Segment3G_t Segment3G;
472 Segment3J_t Segment3J;
473 } u;
474 } SystemInformation2_t;
477 /* ------------------------------------------------------------------------ */
478 /* CSN1 parsing definitions */
479 /* ------------------------------------------------------------------------ */
481 /* Segments */
483 /* Segment 1A - [3] 11.5.2.66 */
484 static const
485 CSN_DESCR_BEGIN(Seg1A_SyncInfo_t)
486 M_UINT (Seg1A_SyncInfo_t, SB_FRAME_TS_OFFSET, 5, &hf_seg1a_syncinfo_sb_frame_ts_offset),
487 M_UINT (Seg1A_SyncInfo_t, SB_SYMBOL_OFFSET, 6, &hf_seg1a_syncinfo_sb_symbol_offset),
488 M_UINT (Seg1A_SyncInfo_t, SA_FREQ_OFFSET, 8, &hf_seg1a_syncinfo_sa_freq_offset),
489 CSN_DESCR_END (Seg1A_SyncInfo_t)
491 static const
492 CSN_DESCR_BEGIN(Seg1A_AccessClasses_t)
493 M_UINT (Seg1A_AccessClasses_t, AC15, 1, &hf_seg1a_rachctrl_acc[15]),
494 M_UINT (Seg1A_AccessClasses_t, AC14, 1, &hf_seg1a_rachctrl_acc[14]),
495 M_UINT (Seg1A_AccessClasses_t, AC13, 1, &hf_seg1a_rachctrl_acc[13]),
496 M_UINT (Seg1A_AccessClasses_t, AC12, 1, &hf_seg1a_rachctrl_acc[12]),
497 M_UINT (Seg1A_AccessClasses_t, AC11, 1, &hf_seg1a_rachctrl_acc[11]),
498 M_UINT (Seg1A_AccessClasses_t, EC10, 1, &hf_seg1a_rachctrl_acc[10]),
499 M_UINT (Seg1A_AccessClasses_t, AC9, 1, &hf_seg1a_rachctrl_acc[9]),
500 M_UINT (Seg1A_AccessClasses_t, AC8, 1, &hf_seg1a_rachctrl_acc[8]),
501 M_UINT (Seg1A_AccessClasses_t, AC7, 1, &hf_seg1a_rachctrl_acc[7]),
502 M_UINT (Seg1A_AccessClasses_t, AC6, 1, &hf_seg1a_rachctrl_acc[6]),
503 M_UINT (Seg1A_AccessClasses_t, AC5, 1, &hf_seg1a_rachctrl_acc[5]),
504 M_UINT (Seg1A_AccessClasses_t, AC4, 1, &hf_seg1a_rachctrl_acc[4]),
505 M_UINT (Seg1A_AccessClasses_t, AC3, 1, &hf_seg1a_rachctrl_acc[3]),
506 M_UINT (Seg1A_AccessClasses_t, AC2, 1, &hf_seg1a_rachctrl_acc[2]),
507 M_UINT (Seg1A_AccessClasses_t, AC1, 1, &hf_seg1a_rachctrl_acc[1]),
508 M_UINT (Seg1A_AccessClasses_t, AC0, 1, &hf_seg1a_rachctrl_acc[0]),
509 CSN_DESCR_END (Seg1A_AccessClasses_t)
511 static const
512 CSN_DESCR_BEGIN(Seg1A_RACHCtrlParams_t)
513 M_UINT (Seg1A_RACHCtrlParams_t, Max_Retrans, 2, &hf_seg1a_rachctrl_max_retrans),
514 M_TYPE_LABEL (Seg1A_RACHCtrlParams_t, AccessClasses, Seg1A_AccessClasses_t, "Access Classes"),
515 M_UINT (Seg1A_RACHCtrlParams_t, CELL_BAR_ACCESS, 1, &hf_seg1a_rachctrl_cell_bar_access),
516 CSN_DESCR_END (Seg1A_RACHCtrlParams_t)
518 static const
519 CSN_DESCR_BEGIN(Seg1A_MiscInfo_t)
520 M_UINT (Seg1A_MiscInfo_t, SB_RESELECTION_HYSTERESIS, 4, &hf_seg1a_miscinfo_sb_reselection_hysteresis),
521 M_UINT (Seg1A_MiscInfo_t, Spare, 1, &hf_seg1a_miscinfo_spare),
522 M_UINT (Seg1A_MiscInfo_t, PriorityAccessInd, 1, &hf_seg1a_miscinfo_priority_access_ind),
523 CSN_DESCR_END (Seg1A_MiscInfo_t)
525 static const
526 CSN_DESCR_BEGIN(Segment1A_t)
527 M_UINT (Segment1A_t, Class_2_version, 3, &hf_seg1a_class_2_version),
528 M_UINT (Segment1A_t, Class_3_version, 4, &hf_seg1a_class_3_version),
529 M_TYPE_LABEL (Segment1A_t, SyncInfo, Seg1A_SyncInfo_t, "Synchronization Info Class 1"),
530 M_TYPE_LABEL (Segment1A_t, RACHCtrlParams, Seg1A_RACHCtrlParams_t, "RACH Control Parameters"),
531 M_TYPE_LABEL (Segment1A_t, MiscInfo, Seg1A_MiscInfo_t, "Misc Info Class 1"),
532 M_UINT (Segment1A_t, GBCH_Present, 1, &hf_seg1a_gbch_present),
533 M_UINT (Segment1A_t, Test_GS, 1, &hf_seg1a_test_gs),
534 M_UINT (Segment1A_t, Test_GS2, 1, &hf_seg1a_test_gs2),
535 M_UINT (Segment1A_t, Spare1, 3, &hf_seg1a_spare1),
536 M_UINT (Segment1A_t, CELL_BAR_ACCESS_EXTENSION2, 1, &hf_seg1a_cell_bar_access_extension2),
537 M_UINT (Segment1A_t, Spare2, 5, &hf_seg1a_spare2),
538 M_UINT (Segment1A_t, CELL_BAR_ACCESS_EXTENSION, 1, &hf_seg1a_cell_bar_access_extension),
539 CSN_DESCR_END (Segment1A_t)
541 /* Segment 2A & 2Abis - [1] 11.5.2.67 / 11.5.2.68 */
542 static const
543 CSN_DESCR_BEGIN(Seg2A_SyncInfo_t)
544 M_UINT (Seg2A_SyncInfo_t, SA_SIRFN_DELAY, 4, &hf_seg2a_syncinfo_sa_sirfn_delay),
545 M_UINT (Seg2A_SyncInfo_t, SA_BCCH_STN, 5, &hf_seg2a_syncinfo_sa_bcch_stn),
546 M_UINT (Seg2A_SyncInfo_t, SuperframeNum, 13, &hf_seg2a_syncinfo_superframe_num),
547 M_UINT (Seg2A_SyncInfo_t, MultiframeNum, 2, &hf_seg2a_syncinfo_multiframe_num),
548 M_UINT (Seg2A_SyncInfo_t, MFFN_HighBit, 1, &hf_seg2a_syncinfo_mffn_high_bit),
549 CSN_DESCR_END (Seg2A_SyncInfo_t)
551 static const
552 CSN_DESCR_BEGIN(Seg2A_SelectionCriterion_t)
553 M_UINT (Seg2A_SelectionCriterion_t, RXLEV_SELECT_MIN, 5, &hf_seg2a_selcrit_rxlev_select_min),
554 CSN_DESCR_END (Seg2A_SelectionCriterion_t)
556 static const
557 CSN_DESCR_BEGIN(Seg2A_MiscInfo_t)
558 M_UINT (Seg2A_MiscInfo_t, SB_SELECTION_POWER, 4, &hf_seg2a_miscinfo_sb_selection_power),
559 CSN_DESCR_END (Seg2A_MiscInfo_t)
561 static const
562 CSN_DESCR_BEGIN(Seg2A_LAInfo_t)
563 M_UINT (Seg2A_LAInfo_t, SA_PCH_CONFIG, 2, &hf_seg2a_lainfo_sa_pch_config),
564 M_UINT (Seg2A_LAInfo_t, SA_BACH_CONFIG, 8, &hf_seg2a_lainfo_sa_bach_config),
565 M_UINT (Seg2A_LAInfo_t, RACH_TS_OFFSET, 5, &hf_seg2a_lainfo_rach_ts_offset),
566 M_UINT (Seg2A_LAInfo_t, N_Page_Occurrences, 2, &hf_seg2a_lainfo_n_page_occurrences),
567 M_UINT (Seg2A_LAInfo_t, IMSI_attach_detach_ind, 1, &hf_seg2a_lainfo_imsi_attach_detach_ind),
568 M_UINT (Seg2A_LAInfo_t, ECSC_ind, 1, &hf_seg2a_lainfo_ecsc_indication),
569 M_UINT (Seg2A_LAInfo_t, SI_update_ind, 1, &hf_seg2a_lainfo_si_update_ind),
570 CSN_DESCR_END (Seg2A_LAInfo_t)
572 static const
573 CSN_DESCR_BEGIN(Segment2A_t)
574 M_FIXED_LABEL(Segment2A_t, 2, 0x2, "= Class type: 2"),
575 M_FIXED_LABEL(Segment2A_t, 4, 0x0, "= Segment type: A"),
576 M_UINT (Segment2A_t, Class_4_version, 3, &hf_seg2a_class_4_version),
577 M_TYPE_LABEL (Segment2A_t, SyncInfo, Seg2A_SyncInfo_t, "Synchronization Info Class 2"),
578 M_TYPE_LABEL (Segment2A_t, SelectionCriterion, Seg2A_SelectionCriterion_t, "Selection Criterion"),
579 M_TYPE_LABEL (Segment2A_t, MiscInfo, Seg2A_MiscInfo_t, "Misc Info Class 2"),
580 M_TYPE_LABEL (Segment2A_t, LAInfo, Seg2A_LAInfo_t, "LA Info Class 2"),
581 CSN_DESCR_END (Segment2A_t)
583 static const
584 CSN_DESCR_BEGIN(Segment2Abis_t)
585 M_FIXED_LABEL(Segment2Abis_t, 2, 0x2, "= Class type: 2"),
586 M_FIXED_LABEL(Segment2Abis_t, 4, 0x0, "= Segment type: Abis"),
587 M_UINT (Segment2Abis_t, Class_4_version, 3, &hf_seg2a_class_4_version),
588 M_TYPE_LABEL (Segment2Abis_t, SyncInfo, Seg2A_SyncInfo_t, "Synchronization Info Class 2"),
589 M_TYPE_LABEL (Segment2Abis_t, SelectionCriterion, Seg2A_SelectionCriterion_t, "Selection Criterion"),
590 M_TYPE_LABEL (Segment2Abis_t, MiscInfo, Seg2A_MiscInfo_t, "Misc Info Class 2"),
591 M_TYPE_LABEL (Segment2Abis_t, LAInfo, Seg2A_LAInfo_t, "LA Info Class 2"),
592 CSN_DESCR_END (Segment2Abis_t)
594 static const
595 CSN_DESCR_BEGIN(Segment2B_t)
596 M_FIXED_LABEL(Segment2B_t, 2, 0x2, "= Class type: 2"),
597 M_FIXED_LABEL(Segment2B_t, 4, 0x1, "= Segment type: B"),
598 CSN_DESCR_END (Segment2B_t)
600 static const
601 CSN_DESCR_BEGIN(Segment2Bbis_t)
602 M_FIXED_LABEL(Segment2Bbis_t, 2, 0x2, "= Class type: 2"),
603 M_FIXED_LABEL(Segment2Bbis_t, 4, 0x1, "= Segment type: B bis"),
604 CSN_DESCR_END (Segment2Bbis_t)
606 /* Segment 3A - [1] 11.5.2.71 */
607 static gint16
608 Seg3A_LAI_Dissector(proto_tree *tree _U_, csnStream_t* ar, tvbuff_t *tvb, void* data, int ett_csn1)
610 Seg3A_LAI_t *LAI = (Seg3A_LAI_t *)data;
611 proto_item *lac_item;
612 proto_tree *lac_tree;
613 guint8 c[5];
614 int i;
616 if (ar->remaining_bits_len < 5*8)
617 return -1;
619 for (i=0; i<5; i++)
620 c[i] = tvb_get_bits8(tvb, ar->bit_offset + (i<<3), 8);
622 LAI->MCC = (c[0] & 0xf) * 100 + ((c[0] & 0xf0) >> 4) * 10 + (c[1] & 0xf);
623 LAI->MNC = (c[2] & 0xf) * 10 + ((c[2] & 0xf0) >> 4);
625 LAI->LAC = (c[3] << 8) | c[4];
626 LAI->MSC_ID = (LAI->LAC >> 10) & 0x3f;
627 LAI->Spot_Beam_ID = LAI->LAC & 0x03ff;
629 proto_tree_add_uint_bits_format_value(tree, hf_seg3a_lai_mcc, tvb, ar->bit_offset, 16, (guint32)LAI->MCC, "%d", LAI->MCC);
630 proto_tree_add_uint_bits_format_value(tree, hf_seg3a_lai_mnc, tvb, ar->bit_offset+16, 8, (guint32)LAI->MNC, "%d", LAI->MNC);
632 lac_item = proto_tree_add_uint_bits_format_value(tree, hf_seg3a_lai_lac, tvb, ar->bit_offset+24, 16, (guint32)LAI->LAC, "0x%04x", LAI->LAC);
633 lac_tree = proto_item_add_subtree(lac_item, ett_csn1);
635 proto_tree_add_uint_bits_format_value(lac_tree, hf_seg3a_lai_msc_id, tvb, ar->bit_offset+24, 6, (guint32)LAI->MSC_ID, "%d", LAI->MSC_ID);
636 proto_tree_add_uint_bits_format_value(lac_tree, hf_seg3a_lai_spot_beam_id, tvb, ar->bit_offset+30, 10, (guint32)LAI->Spot_Beam_ID, "%d", LAI->Spot_Beam_ID);
638 ar->remaining_bits_len -= 5*8;
639 ar->bit_offset += 5*8;
641 return 0;
644 static const
645 CSN_DESCR_BEGIN(Seg3A_System_t)
646 M_UINT (Seg3A_System_t, Satellite_ID, 2, &hf_seg3a_system_sat_id),
647 M_UINT (Seg3A_System_t, System_ID, 4, &hf_seg3a_system_sys_id),
648 CSN_DESCR_END (Seg3A_System_t)
650 static const
651 CSN_DESCR_BEGIN(Seg3A_SatellitePosition_t)
652 M_UINT (Seg3A_SatellitePosition_t, Latitude, 8, &hf_seg3a_satpos_latitude),
653 M_UINT (Seg3A_SatellitePosition_t, Longitude, 12, &hf_seg3a_satpos_longitude),
654 M_UINT (Seg3A_SatellitePosition_t, Radius, 16, &hf_seg3a_satpos_radius),
655 CSN_DESCR_END (Seg3A_SatellitePosition_t)
657 static const
658 CSN_DESCR_BEGIN(Seg3A_BeamPosition_t)
659 M_UINT (Seg3A_BeamPosition_t, Latitude, 11, &hf_seg3a_beam_latitude),
660 M_UINT (Seg3A_BeamPosition_t, Longitude, 12, &hf_seg3a_beam_longitude),
661 CSN_DESCR_END (Seg3A_BeamPosition_t)
663 static const
664 CSN_DESCR_BEGIN(Seg3A_MiscInfo_t)
665 M_UINT (Seg3A_MiscInfo_t, SB_RESELECTION_TIMER, 6, &hf_seg3a_miscinfo_sb_reselection_timer),
666 CSN_DESCR_END (Seg3A_MiscInfo_t)
668 static const
669 CSN_DESCR_BEGIN(Segment3A_t)
670 M_FIXED_LABEL(Segment3A_t, 1, 0x0, "= Class type: 3"),
671 M_FIXED_LABEL(Segment3A_t, 4, 0x0, "= Segment type: A"),
672 M_SERIALIZE (Segment3A_t, LAI, 0, Seg3A_LAI_Dissector),
673 M_TYPE_LABEL (Segment3A_t, System, Seg3A_System_t, "System"),
674 M_TYPE_LABEL (Segment3A_t, SatellitePosition, Seg3A_SatellitePosition_t, "Satellite Position"),
675 M_TYPE_LABEL (Segment3A_t, BeamPosition, Seg3A_BeamPosition_t, "Beam Center Position"),
676 M_TYPE_LABEL (Segment3A_t, MiscInfo, Seg3A_MiscInfo_t, "Misc Info Class 3"),
677 M_UINT (Segment3A_t, Spare, 4, &hf_seg3a_spare),
678 CSN_DESCR_END (Segment3A_t)
680 static const
681 CSN_DESCR_BEGIN(Segment3B_t)
682 M_FIXED_LABEL(Segment3B_t, 1, 0x0, "= Class type: 3"),
683 M_FIXED_LABEL(Segment3B_t, 4, 0x1, "= Segment type: B"),
684 CSN_DESCR_END (Segment3B_t)
686 static const
687 CSN_DESCR_BEGIN(Segment3Bbis_t)
688 M_FIXED_LABEL(Segment3Bbis_t, 1, 0x0, "= Class type: 3"),
689 M_FIXED_LABEL(Segment3Bbis_t, 4, 0x1, "= Segment type: B bis"),
690 CSN_DESCR_END (Segment3Bbis_t)
692 static const
693 CSN_DESCR_BEGIN(Segment3C_t)
694 M_FIXED_LABEL(Segment3C_t, 1, 0x0, "= Class type: 3"),
695 M_FIXED_LABEL(Segment3C_t, 4, 0x2, "= Segment type: C"),
696 CSN_DESCR_END (Segment3C_t)
698 static const
699 CSN_DESCR_BEGIN(Segment3D_t)
700 M_FIXED_LABEL(Segment3D_t, 1, 0x0, "= Class type: 3"),
701 M_FIXED_LABEL(Segment3D_t, 4, 0x3, "= Segment type: D"),
702 CSN_DESCR_END (Segment3D_t)
704 static const
705 CSN_DESCR_BEGIN(Segment3E_t)
706 M_FIXED_LABEL(Segment3E_t, 1, 0x0, "= Class type: 3"),
707 M_FIXED_LABEL(Segment3E_t, 4, 0x4, "= Segment type: E"),
708 CSN_DESCR_END (Segment3E_t)
710 static const
711 CSN_DESCR_BEGIN(Segment3Ebis_t)
712 M_FIXED_LABEL(Segment3Ebis_t, 1, 0x0, "= Class type: 3"),
713 M_FIXED_LABEL(Segment3Ebis_t, 4, 0x4, "= Segment type: E bis"),
714 CSN_DESCR_END (Segment3Ebis_t)
716 static const
717 CSN_DESCR_BEGIN(Segment3F_t)
718 M_FIXED_LABEL(Segment3F_t, 1, 0x0, "= Class type: 3"),
719 M_FIXED_LABEL(Segment3F_t, 4, 0x5, "= Segment type: F"),
720 CSN_DESCR_END (Segment3F_t)
722 static const
723 CSN_DESCR_BEGIN(Segment3G_t)
724 M_FIXED_LABEL(Segment3G_t, 1, 0x0, "= Class type: 3"),
725 M_FIXED_LABEL(Segment3G_t, 4, 0x6, "= Segment type: G"),
726 CSN_DESCR_END (Segment3G_t)
728 static const
729 CSN_DESCR_BEGIN(Segment3Gbis_t)
730 M_FIXED_LABEL(Segment3Gbis_t, 1, 0x0, "= Class type: 3"),
731 M_FIXED_LABEL(Segment3Gbis_t, 4, 0x6, "= Segment type: G bis"),
732 CSN_DESCR_END (Segment3Gbis_t)
734 static const
735 CSN_DESCR_BEGIN(Segment3H_t)
736 M_FIXED_LABEL(Segment3H_t, 1, 0x0, "= Class type: 3"),
737 M_FIXED_LABEL(Segment3H_t, 4, 0x7, "= Segment type: H"),
738 CSN_DESCR_END (Segment3H_t)
740 static const
741 CSN_DESCR_BEGIN(Segment3I_t)
742 M_FIXED_LABEL(Segment3I_t, 1, 0x0, "= Class type: 3"),
743 M_FIXED_LABEL(Segment3I_t, 4, 0x9, "= Segment type: I"),
744 CSN_DESCR_END (Segment3I_t)
746 static const
747 CSN_DESCR_BEGIN(Segment3J_t)
748 M_FIXED_LABEL(Segment3J_t, 1, 0x0, "= Class type: 3"),
749 M_FIXED_LABEL(Segment3J_t, 4, 0xa, "= Segment type: J"),
750 CSN_DESCR_END (Segment3J_t)
752 static const
753 CSN_DESCR_BEGIN(Segment3Jbis_t)
754 M_FIXED_LABEL(Segment3Jbis_t, 1, 0x0, "= Class type: 3"),
755 M_FIXED_LABEL(Segment3Jbis_t, 4, 0xa, "= Segment type: J bis"),
756 CSN_DESCR_END (Segment3Jbis_t)
758 static const
759 CSN_DESCR_BEGIN(Segment3Kbis_t)
760 M_FIXED_LABEL(Segment3Kbis_t, 1, 0x0, "= Class type: 3"),
761 M_FIXED_LABEL(Segment3Kbis_t, 4, 0xb, "= Segment type: K bis"),
762 CSN_DESCR_END (Segment3Kbis_t)
764 static const
765 CSN_DESCR_BEGIN(Segment3L_t)
766 M_FIXED_LABEL(Segment3L_t, 1, 0x0, "= Class type: 3"),
767 M_FIXED_LABEL(Segment3L_t, 4, 0xc, "= Segment type: L"),
768 CSN_DESCR_END (Segment3L_t)
770 static const
771 CSN_DESCR_BEGIN(Segment3M_t)
772 M_FIXED_LABEL(Segment3M_t, 1, 0x0, "= Class type: 3"),
773 M_FIXED_LABEL(Segment3M_t, 4, 0xd, "= Segment type: M"),
774 CSN_DESCR_END (Segment3M_t)
776 static const
777 CSN_DESCR_BEGIN(Segment4A_t)
778 M_FIXED_LABEL(Segment4A_t, 3, 0x6, "= Class type: 4"),
779 M_FIXED_LABEL(Segment4A_t, 4, 0x0, "= Segment type: A"),
780 CSN_DESCR_END (Segment4A_t)
782 static const
783 CSN_DESCR_BEGIN(Segment4B_t)
784 M_FIXED_LABEL(Segment4B_t, 3, 0x6, "= Class type: 4"),
785 M_FIXED_LABEL(Segment4B_t, 4, 0x1, "= Segment type: B"),
786 CSN_DESCR_END (Segment4B_t)
788 static const
789 CSN_DESCR_BEGIN(Segment4C_t)
790 M_FIXED_LABEL(Segment4C_t, 3, 0x6, "= Class type: 4"),
791 M_FIXED_LABEL(Segment4C_t, 4, 0x2, "= Segment type: C"),
792 CSN_DESCR_END (Segment4C_t)
794 static const
795 CSN_DESCR_BEGIN(Segment4D_t)
796 M_FIXED_LABEL(Segment4D_t, 3, 0x6, "= Class type: 4"),
797 M_FIXED_LABEL(Segment4D_t, 4, 0x3, "= Segment type: D"),
798 CSN_DESCR_END (Segment4D_t)
800 static const
801 CSN_DESCR_BEGIN(Segment4E_t)
802 M_FIXED_LABEL(Segment4E_t, 3, 0x6, "= Class type: 4"),
803 M_FIXED_LABEL(Segment4E_t, 4, 0x4, "= Segment type: E"),
804 CSN_DESCR_END (Segment4E_t)
806 static const
807 CSN_DESCR_BEGIN(Segment4F_t)
808 M_FIXED_LABEL(Segment4F_t, 3, 0x6, "= Class type: 4"),
809 M_FIXED_LABEL(Segment4F_t, 4, 0x5, "= Segment type: F"),
810 CSN_DESCR_END (Segment4F_t)
812 static const
813 CSN_DESCR_BEGIN(Segment4G_t)
814 M_FIXED_LABEL(Segment4G_t, 3, 0x6, "= Class type: 4"),
815 M_FIXED_LABEL(Segment4G_t, 4, 0x6, "= Segment type: G"),
816 CSN_DESCR_END (Segment4G_t)
818 static const
819 CSN_DESCR_BEGIN(Segment4H_t)
820 M_FIXED_LABEL(Segment4H_t, 3, 0x6, "= Class type: 4"),
821 M_FIXED_LABEL(Segment4H_t, 4, 0x7, "= Segment type: H"),
822 CSN_DESCR_END (Segment4H_t)
824 static const
825 CSN_DESCR_BEGIN(Segment4I_t)
826 M_FIXED_LABEL(Segment4I_t, 3, 0x6, "= Class type: 4"),
827 M_FIXED_LABEL(Segment4I_t, 4, 0x8, "= Segment type: I"),
828 CSN_DESCR_END (Segment4I_t)
830 static const
831 CSN_DESCR_BEGIN(Segment4J_t)
832 M_FIXED_LABEL(Segment4J_t, 3, 0x6, "= Class type: 4"),
833 M_FIXED_LABEL(Segment4J_t, 4, 0x9, "= Segment type: J"),
834 CSN_DESCR_END (Segment4J_t)
836 static const
837 CSN_DESCR_BEGIN(Segment4K_t)
838 M_FIXED_LABEL(Segment4K_t, 3, 0x6, "= Class type: 4"),
839 M_FIXED_LABEL(Segment4K_t, 4, 0xa, "= Segment type: K"),
840 CSN_DESCR_END (Segment4K_t)
843 /* System information */
845 /* System Information type 1 - [1] 10.1.31 */
847 static const
848 CSN_DESCR_BEGIN(SI1_Block_Header_t)
849 M_UINT (SI1_Block_Header_t, Protocol_Version, 4, &hf_si_protocol_version),
850 M_UINT (SI1_Block_Header_t, Block_Type, 1, &hf_si_block_type),
851 M_UINT (SI1_Block_Header_t, Randomization_Period, 2, &hf_si1_randomization_period),
852 M_UINT (SI1_Block_Header_t, Spare, 1, &hf_si_spare),
853 CSN_DESCR_END (SI1_Block_Header_t)
855 static const
856 CSN_ChoiceElement_t SI1_SegmentChoice[] =
858 {6, 0x20, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment2Abis, Segment2Abis_t, "Segment 2A bis")},
859 {6, 0x21, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment2Bbis, Segment2Bbis_t, "Segment 2B bis")},
860 {5, 0x00, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment3A, Segment3A_t, "Segment 3A")},
861 {5, 0x01, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment3Bbis, Segment3Bbis_t, "Segment 3B bis")},
862 {5, 0x02, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment3C, Segment3C_t, "Segment 3C")},
863 {5, 0x03, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment3D, Segment3D_t, "Segment 3D")},
864 {5, 0x04, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment3Ebis, Segment3Ebis_t, "Segment 3E bis")},
865 {5, 0x05, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment3F, Segment3F_t, "Segment 3F")},
866 {5, 0x06, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment3Gbis, Segment3Gbis_t, "Segment 3G bis")},
867 {5, 0x07, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment3H, Segment3H_t, "Segment 3H")},
868 {5, 0x09, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment3I, Segment3I_t, "Segment 3I")},
869 {5, 0x0a, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment3Jbis, Segment3Jbis_t, "Segment 3J bis")},
870 {5, 0x0b, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment3Kbis, Segment3Kbis_t, "Segment 3K bis")},
871 {7, 0x60, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment4A, Segment4A_t, "Segment 4A")},
872 {7, 0x61, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment4B, Segment4B_t, "Segment 4B")},
873 {7, 0x62, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment4C, Segment4C_t, "Segment 4C")},
874 {7, 0x63, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment4D, Segment4D_t, "Segment 4D")},
875 {7, 0x64, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment4E, Segment4E_t, "Segment 4E")},
876 {7, 0x65, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment4F, Segment4F_t, "Segment 4F")},
877 {7, 0x66, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment4G, Segment4G_t, "Segment 4G")},
878 {7, 0x67, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment4H, Segment4H_t, "Segment 4H")},
879 {7, 0x68, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment4I, Segment4I_t, "Segment 4I")},
880 {7, 0x69, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment4J, Segment4J_t, "Segment 4J")},
881 {7, 0x6a, 1, M_TYPE_LABEL(SystemInformation1_t, u.Segment4K, Segment4K_t, "Segment 4K")},
882 {0, 0x00, 1, CSN_ERROR(SystemInformation1_t, "Unknown segment !", -1)},
885 static const
886 CSN_DESCR_BEGIN(SystemInformation1_t)
887 M_TYPE_LABEL (SystemInformation1_t, Block_Header, SI1_Block_Header_t, "Block Header"),
888 M_TYPE_LABEL (SystemInformation1_t, Segment1A, Segment1A_t, "Segment 1A"),
889 M_CHOICE_IL (SystemInformation1_t, SegmentType, SI1_SegmentChoice, ElementsOf(SI1_SegmentChoice)),
890 CSN_DESCR_END (SystemInformation1_t)
892 /* System Information type 2 - [1] 10.1.32 */
894 CSN_DESCR_BEGIN(SI2_Block_Header_t)
895 M_UINT (SI2_Block_Header_t, Protocol_Version, 4, &hf_si_protocol_version),
896 M_UINT (SI2_Block_Header_t, Block_Type, 1, &hf_si_block_type),
897 M_UINT (SI2_Block_Header_t, Spare, 3, &hf_si_spare),
898 CSN_DESCR_END (SI2_Block_Header_t)
900 static const
901 CSN_ChoiceElement_t SI2_SegmentChoice[] =
903 {6, 0x20, 1, M_TYPE_LABEL(SystemInformation2_t, u.Segment2A, Segment2A_t, "Segment 2A")},
904 {6, 0x21, 1, M_TYPE_LABEL(SystemInformation2_t, u.Segment2B, Segment2B_t, "Segment 2B")},
905 {5, 0x01, 1, M_TYPE_LABEL(SystemInformation2_t, u.Segment3B, Segment3B_t, "Segment 3B")},
906 {5, 0x04, 1, M_TYPE_LABEL(SystemInformation2_t, u.Segment3E, Segment3E_t, "Segment 3E")},
907 {5, 0x06, 1, M_TYPE_LABEL(SystemInformation2_t, u.Segment3G, Segment3G_t, "Segment 3G")},
908 {5, 0x0a, 1, M_TYPE_LABEL(SystemInformation2_t, u.Segment3J, Segment3J_t, "Segment 3J")},
909 {0, 0x00, 1, CSN_ERROR(SystemInformation2_t, "Unknown segment !", -1)},
912 static const
913 CSN_DESCR_BEGIN(SystemInformation2_t)
914 M_TYPE_LABEL (SystemInformation2_t, Block_Header, SI2_Block_Header_t, "Block Header"),
915 M_CHOICE_IL (SystemInformation2_t, SegmentType, SI2_SegmentChoice, ElementsOf(SI2_SegmentChoice)),
916 CSN_DESCR_END (SystemInformation2_t)
919 /* ------------------------------------------------------------------------ */
920 /* Fields values */
921 /* ------------------------------------------------------------------------ */
923 /* Common stuff */
924 static void
925 segx_half_db_value_fmt(gchar *s, guint32 v)
927 g_snprintf(s, ITEM_LABEL_LENGTH, "%2.1f dB (%u)", v * 0.5f, v);
930 /* Segment 1A - [3] 11.5.2.66 */
931 static void
932 seg1a_syncinfo_sa_freq_offset_fmt(gchar *s, guint32 v)
934 gint32 sv = (gint32)v;
935 g_snprintf(s, ITEM_LABEL_LENGTH, "%d Hz (%d)", sv * 5, sv);
938 static const value_string seg1a_rachctrl_acc_vals[] = {
939 { 0, "not barred (allowed)"},
940 { 1, "barred (not allowed)"},
941 { 0, NULL }
944 static const value_string seg1a_rachctrl_cell_bar_access_vals[] = {
945 { 0, "The cell is not barred"},
946 { 1, "The cell is barred"},
947 { 0, NULL }
950 /* Segment 2A & 2Abis - [1] 11.5.2.67 & 11.5.2.68 */
951 static const value_string seg2a_lainfo_imsi_attach_detach_ind_vals[] = {
952 { 0, "MESs shall NOT apply IMSI attach and detach procedure for this LA"},
953 { 1, "MESs shall apply IMSI attach and detach procedure for this LA"},
954 { 0, NULL }
957 static const value_string seg2a_lainfo_ecsc_indication_vals[] = {
958 { 0, "Early sending is explicitly prohibited"},
959 { 1, "Early sending is explicitly accepted"},
960 { 0, NULL }
963 /* Segment 3A - [1] 11.5.2.71 */
964 static void
965 seg3a_latitude_fmt(gchar *s, guint32 v)
967 gint32 sv = (gint32)v;
968 char c;
970 if (sv < 0) {
971 c = 'S';
972 sv = -sv;
973 } else
974 c = 'N';
976 g_snprintf(s, ITEM_LABEL_LENGTH, "%.1f %c (%d)", sv / 10.0f, c, sv);
979 static void
980 seg3a_longitude_fmt(gchar *s, guint32 v)
982 gint32 sv;
983 char c;
985 if (v < 1800) {
986 c = 'W';
987 sv = v;
988 } else {
989 c = 'E';
990 sv = 3600 - v;
993 g_snprintf(s, ITEM_LABEL_LENGTH, "%.1f %c (%u)", sv / 10.0f, c, v);
996 static void
997 seg3a_satpos_radius_fmt(gchar *s, guint32 v)
999 gint32 sv = (gint32)v;
1000 gint32 a = (42162 * 1000) + (sv * 5);
1001 g_snprintf(s, ITEM_LABEL_LENGTH, "%.3lf km (%u)", a / 1000.0, sv);
1004 static void
1005 seg3a_miscinfo_sb_reselection_timer_fmt(gchar *s, guint32 v)
1007 g_snprintf(s, ITEM_LABEL_LENGTH, "%d minutes (%u)", v*4, v);
1010 /* System Information 1 - [1] 10.3.31 */
1011 static const value_string si1_randomization_period_vals[] = {
1012 { 0, "7 frames after this SI block" },
1013 { 1, "15 frames after this SI block" },
1014 { 2, "23 frames after this SI block" },
1015 { 3, "31 frames after this SI block" },
1016 { 0, NULL }
1020 /* ------------------------------------------------------------------------ */
1021 /* Dissector code */
1022 /* ------------------------------------------------------------------------ */
1024 static void
1025 dissect_gmr1_bcch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
1027 proto_item *bcch_item = NULL;
1028 proto_tree *bcch_tree = NULL;
1029 csnStream_t ar;
1030 gboolean is_si1;
1032 col_append_str(pinfo->cinfo, COL_INFO, "(BCCH) ");
1034 is_si1 = tvb_get_bits8(tvb, 0, 5) & 1;
1036 bcch_item = proto_tree_add_protocol_format(
1037 tree, proto_gmr1_bcch, tvb, 0, -1,
1038 "GMR-1 BCCH - System Information type %d", is_si1 ? 1 : 2
1040 bcch_tree = proto_item_add_subtree(bcch_item, ett_gmr1_bcch);
1042 csnStreamInit(&ar, 0, tvb_length(tvb)*8);
1044 /* SI1 or SI2 */
1045 if (is_si1) {
1046 SystemInformation1_t *data;
1047 data = wmem_new(wmem_packet_scope(), SystemInformation1_t);
1048 /* Initialize the type to the last element, which is an
1049 * "Unknown", in case the dissector bails before getting this
1050 * far. */
1051 data->SegmentType = array_length(SI1_SegmentChoice) - 1;
1052 csnStreamDissector(bcch_tree, &ar, CSNDESCR(SystemInformation1_t), tvb, data, ett_gmr1_bcch);
1053 col_append_fstr(
1054 pinfo->cinfo, COL_INFO,
1055 "System Information 1: Segment 1A, %s",
1056 SI1_SegmentChoice[data->SegmentType].descr.sz
1058 } else {
1059 SystemInformation2_t *data;
1060 data = wmem_new(wmem_packet_scope(), SystemInformation2_t);
1061 /* Initialize the type to the last element, which is an
1062 * "Unknown", in case the dissector bails before getting this
1063 * far. */
1064 data->SegmentType = array_length(SI2_SegmentChoice) - 1;
1065 csnStreamDissector(bcch_tree, &ar, CSNDESCR(SystemInformation2_t), tvb, data, ett_gmr1_bcch);
1066 col_append_fstr(
1067 pinfo->cinfo, COL_INFO,
1068 "System Information 2: %s",
1069 SI2_SegmentChoice[data->SegmentType].descr.sz
1074 void
1075 proto_register_gmr1_bcch(void)
1077 static hf_register_info hf[] = {
1078 /* Segment 1A - [3] 11.5.2.66 */
1079 { &hf_seg1a_class_2_version,
1080 { "Class 2 version", "gmr1.bcch.seg1a.class_2_version",
1081 FT_UINT8, BASE_DEC, NULL, 0x00,
1082 "Version number for current Class 2 information", HFILL }
1084 { &hf_seg1a_class_3_version,
1085 { "Class 3 version", "gmr1.bcch.seg1a.class_3_version",
1086 FT_UINT8, BASE_DEC, NULL, 0x00,
1087 "Version number for current Class 3 information", HFILL }
1089 { &hf_seg1a_syncinfo_sb_frame_ts_offset,
1090 { "SB_FRAME_TS_OFFSET", "gmr1.bcch.seg1a.syncinfo.sb_frame_ts_offset",
1091 FT_UINT8, BASE_DEC, NULL, 0x00,
1092 NULL, HFILL }
1094 { &hf_seg1a_syncinfo_sb_symbol_offset,
1095 { "SB_SYMBOL_OFFSET", "gmr1.bcch.seg1a.syncinfo.sb_symbol_offset",
1096 FT_INT8, BASE_DEC, NULL, 0x00,
1097 NULL, HFILL }
1099 { &hf_seg1a_syncinfo_sa_freq_offset,
1100 { "SA_FREQ_OFFSET", "gmr1.bcch.seg1a.syncinfo.sa_freq_offset",
1101 FT_UINT8, BASE_CUSTOM, seg1a_syncinfo_sa_freq_offset_fmt, 0x00,
1102 NULL, HFILL }
1104 { &hf_seg1a_rachctrl_max_retrans,
1105 { "Max Retrans", "gmr1.bcch.seg1a.rachctrl.max_retrans",
1106 FT_UINT8, BASE_DEC, NULL, 0x00,
1107 NULL, HFILL }
1109 { &hf_seg1a_rachctrl_acc[15],
1110 { "AC15", "gmr1.bcch.seg1a.rachctrl.ac15",
1111 FT_UINT8, BASE_DEC, VALS(seg1a_rachctrl_acc_vals), 0x00,
1112 "Access Class 15 barred", HFILL }
1114 { &hf_seg1a_rachctrl_acc[14],
1115 { "AC14", "gmr1.bcch.seg1a.rachctrl.ac14",
1116 FT_UINT8, BASE_DEC, VALS(seg1a_rachctrl_acc_vals), 0x00,
1117 "Access Class 14 barred", HFILL }
1119 { &hf_seg1a_rachctrl_acc[13],
1120 { "AC13", "gmr1.bcch.seg1a.rachctrl.ac13",
1121 FT_UINT8, BASE_DEC, VALS(seg1a_rachctrl_acc_vals), 0x00,
1122 "Access Class 13 barred", HFILL }
1124 { &hf_seg1a_rachctrl_acc[12],
1125 { "AC12", "gmr1.bcch.seg1a.rachctrl.ac12",
1126 FT_UINT8, BASE_DEC, VALS(seg1a_rachctrl_acc_vals), 0x00,
1127 "Access Class 12 barred", HFILL }
1129 { &hf_seg1a_rachctrl_acc[11],
1130 { "AC11", "gmr1.bcch.seg1a.rachctrl.ac11",
1131 FT_UINT8, BASE_DEC, VALS(seg1a_rachctrl_acc_vals), 0x00,
1132 "Access Class 11 barred", HFILL }
1134 { &hf_seg1a_rachctrl_acc[10],
1135 { "EC10", "gmr1.bcch.seg1a.rachctrl.ac10",
1136 FT_UINT8, BASE_DEC, VALS(seg1a_rachctrl_acc_vals), 0x00,
1137 "Emergency Class 10 barred", HFILL }
1139 { &hf_seg1a_rachctrl_acc[9],
1140 { "AC9", "gmr1.bcch.seg1a.rachctrl.ac9",
1141 FT_UINT8, BASE_DEC, VALS(seg1a_rachctrl_acc_vals), 0x00,
1142 "Access Class 9 barred", HFILL }
1144 { &hf_seg1a_rachctrl_acc[8],
1145 { "AC8", "gmr1.bcch.seg1a.rachctrl.ac8",
1146 FT_UINT8, BASE_DEC, VALS(seg1a_rachctrl_acc_vals), 0x00,
1147 "Access Class 8 barred", HFILL }
1149 { &hf_seg1a_rachctrl_acc[7],
1150 { "AC7", "gmr1.bcch.seg1a.rachctrl.ac7",
1151 FT_UINT8, BASE_DEC, VALS(seg1a_rachctrl_acc_vals), 0x00,
1152 "Access Class 7 barred", HFILL }
1154 { &hf_seg1a_rachctrl_acc[6],
1155 { "AC6", "gmr1.bcch.seg1a.rachctrl.ac6",
1156 FT_UINT8, BASE_DEC, VALS(seg1a_rachctrl_acc_vals), 0x00,
1157 "Access Class 6 barred", HFILL }
1159 { &hf_seg1a_rachctrl_acc[5],
1160 { "AC5", "gmr1.bcch.seg1a.rachctrl.ac5",
1161 FT_UINT8, BASE_DEC, VALS(seg1a_rachctrl_acc_vals), 0x00,
1162 "Access Class 5 barred", HFILL }
1164 { &hf_seg1a_rachctrl_acc[4],
1165 { "AC4", "gmr1.bcch.seg1a.rachctrl.ac4",
1166 FT_UINT8, BASE_DEC, VALS(seg1a_rachctrl_acc_vals), 0x00,
1167 "Access Class 4 barred", HFILL }
1169 { &hf_seg1a_rachctrl_acc[3],
1170 { "AC3", "gmr1.bcch.seg1a.rachctrl.ac3",
1171 FT_UINT8, BASE_DEC, VALS(seg1a_rachctrl_acc_vals), 0x00,
1172 "Access Class 3 barred", HFILL }
1174 { &hf_seg1a_rachctrl_acc[2],
1175 { "AC2", "gmr1.bcch.seg1a.rachctrl.ac2",
1176 FT_UINT8, BASE_DEC, VALS(seg1a_rachctrl_acc_vals), 0x00,
1177 "Access Class 2 barred", HFILL }
1179 { &hf_seg1a_rachctrl_acc[1],
1180 { "AC1", "gmr1.bcch.seg1a.rachctrl.ac1",
1181 FT_UINT8, BASE_DEC, VALS(seg1a_rachctrl_acc_vals), 0x00,
1182 "Access Class 1 barred", HFILL }
1184 { &hf_seg1a_rachctrl_acc[0],
1185 { "AC0", "gmr1.bcch.seg1a.rachctrl.ac0",
1186 FT_UINT8, BASE_DEC, VALS(seg1a_rachctrl_acc_vals), 0x00,
1187 "Access Class 0 barred", HFILL }
1189 { &hf_seg1a_rachctrl_cell_bar_access,
1190 { "CELL_BAR_ACCESS", "gmr1.bcch.seg1a.rachctrl.cell_bar_access",
1191 FT_UINT8, BASE_DEC, VALS(seg1a_rachctrl_cell_bar_access_vals), 0x00,
1192 NULL, HFILL }
1194 { &hf_seg1a_miscinfo_sb_reselection_hysteresis,
1195 { "SB_RESELECTION_HYSTERESIS", "gmr1.bcch.seg1a.miscinfo.sb_reselection_hysteresis",
1196 FT_UINT8, BASE_CUSTOM, segx_half_db_value_fmt, 0x00,
1197 NULL, HFILL }
1199 { &hf_seg1a_miscinfo_spare,
1200 { "Spare", "gmr1.bcch.seg1a.miscinfo.spare",
1201 FT_UINT8, BASE_DEC, NULL, 0x00,
1202 NULL, HFILL }
1204 { &hf_seg1a_miscinfo_priority_access_ind,
1205 { "Priority Access Ind", "gmr1.bcch.seg1a.miscinfo.priority_access_ind",
1206 FT_UINT8, BASE_DEC, NULL, 0x00,
1207 "Reserved for future use", HFILL }
1209 { &hf_seg1a_gbch_present,
1210 { "GBCH Present", "gmr1.bcch.seg1a.gbch_present",
1211 FT_UINT8, BASE_DEC, NULL, 0x00,
1212 NULL, HFILL }
1214 { &hf_seg1a_test_gs,
1215 { "Test GS", "gmr1.bcch.seg1a.test_gs",
1216 FT_UINT8, BASE_DEC, NULL, 0x00,
1217 NULL, HFILL }
1219 { &hf_seg1a_test_gs2,
1220 { "Test GS2", "gmr1.bcch.seg1a.test_gs2",
1221 FT_UINT8, BASE_DEC, NULL, 0x00,
1222 NULL, HFILL }
1224 { &hf_seg1a_spare1,
1225 { "Spare", "gmr1.bcch.seg1a.spare1",
1226 FT_UINT8, BASE_DEC, NULL, 0x00,
1227 NULL, HFILL }
1229 { &hf_seg1a_cell_bar_access_extension2,
1230 { "CELL_BAR_ACCESS_EXTENSION2", "gmr1.bcch.seg1a.cell_bar_access_extension2",
1231 FT_UINT8, BASE_DEC, NULL, 0x00,
1232 NULL, HFILL }
1234 { &hf_seg1a_spare2,
1235 { "Spare", "gmr1.bcch.seg1a.spare2",
1236 FT_UINT8, BASE_DEC, NULL, 0x00,
1237 NULL, HFILL }
1239 { &hf_seg1a_cell_bar_access_extension,
1240 { "CELL_BAR_ACCESS_EXTENSION", "gmr1.bcch.seg1a.cell_bar_access_extension",
1241 FT_UINT8, BASE_DEC, NULL, 0x00,
1242 NULL, HFILL }
1245 /* Segment 2A - [1] 11.5.2.67 */
1246 { &hf_seg2a_class_4_version,
1247 { "Class 4 version", "gmr1.bcch.seg2a.class_4_version",
1248 FT_UINT8, BASE_DEC, NULL, 0x00,
1249 "Version number for current Class 4 information", HFILL }
1251 { &hf_seg2a_syncinfo_sa_sirfn_delay,
1252 { "SA_SIRFN_DELAY", "gmr1.bcch.seg2a.syncinfo.sa_sirfn_delay",
1253 FT_UINT8, BASE_DEC, NULL, 0x00,
1254 "Delay of system information relative to superframe", HFILL }
1256 { &hf_seg2a_syncinfo_sa_bcch_stn,
1257 { "SA_BCCH_STN", "gmr1.bcch.seg2a.syncinfo.sa_bcch_stn",
1258 FT_UINT8, BASE_DEC, NULL, 0x00,
1259 "Starting timeslot number", HFILL }
1261 { &hf_seg2a_syncinfo_superframe_num,
1262 { "Superframe Number", "gmr1.bcch.seg2a.syncinfo.superframe_num",
1263 FT_UINT16, BASE_DEC, NULL, 0x00,
1264 NULL, HFILL }
1266 { &hf_seg2a_syncinfo_multiframe_num,
1267 { "Multiframe Number", "gmr1.bcch.seg2a.syncinfo.multiframe_num",
1268 FT_UINT8, BASE_DEC, NULL, 0x00,
1269 "Multiframe number in a superframe", HFILL }
1271 { &hf_seg2a_syncinfo_mffn_high_bit,
1272 { "MFFN high bit", "gmr1.bcch.seg2a.syncinfo.mffn_high_bit",
1273 FT_UINT8, BASE_DEC, NULL, 0x00,
1274 "High bit of the TDMA FN in a multiframe", HFILL }
1276 { &hf_seg2a_selcrit_rxlev_select_min,
1277 { "RXLEV_SELECT_MIN", "gmr1.bcch.seg2a.selcrit.rxlev_select_min",
1278 FT_UINT8, BASE_CUSTOM, segx_half_db_value_fmt, 0x00,
1279 "Adjustment to threshold to camp-on system", HFILL }
1281 { &hf_seg2a_miscinfo_sb_selection_power,
1282 { "SB_SELECTION_POWER", "gmr1.bcch.seg2a.miscinfo.sb_selection_power",
1283 FT_UINT8, BASE_CUSTOM, segx_half_db_value_fmt, 0x00,
1284 NULL, HFILL }
1286 { &hf_seg2a_lainfo_sa_pch_config,
1287 { "SA_PCH_CONFIG", "gmr1.bcch.seg2a.lainfo.sa_pch_config",
1288 FT_UINT8, BASE_DEC, NULL, 0x00,
1289 "Paging group configuration information", HFILL }
1291 { &hf_seg2a_lainfo_sa_bach_config,
1292 { "SA_BACH_CONFIG", "gmr1.bcch.seg2a.lainfo.sa_bach_config",
1293 FT_UINT8, BASE_DEC, NULL, 0x00,
1294 "Alerting group configuration information", HFILL }
1296 { &hf_seg2a_lainfo_rach_ts_offset,
1297 { "RACH_TS_OFFSET", "gmr1.bcch.seg2a.lainfo.rach_ts_offset",
1298 FT_UINT8, BASE_DEC, NULL, 0x00,
1299 "Start of RACH window with respect to BCCH", HFILL }
1301 { &hf_seg2a_lainfo_n_page_occurrences,
1302 { "N Page Occurrences", "gmr1.bcch.seg2a.lainfo.n_page_occurrences",
1303 FT_UINT8, BASE_DEC, NULL, 0x00,
1304 "Number of times a page shall be retransmitted after the initial transmission", HFILL }
1306 { &hf_seg2a_lainfo_imsi_attach_detach_ind,
1307 { "IMSI attach-detach ind", "gmr1.bcch.seg2a.lainfo.imsi_attach_detach_ind",
1308 FT_UINT8, BASE_DEC, VALS(seg2a_lainfo_imsi_attach_detach_ind_vals), 0x00,
1309 "Should MESs apply IMSI attach and detach procedure for this LA", HFILL }
1311 { &hf_seg2a_lainfo_ecsc_indication,
1312 { "ECSC indication", "gmr1.bcch.seg2a.lainfo.ecsc_indication",
1313 FT_UINT8, BASE_DEC, VALS(seg2a_lainfo_ecsc_indication_vals), 0x00,
1314 "Early Classmark Sending Control", HFILL }
1316 { &hf_seg2a_lainfo_si_update_ind,
1317 { "SI update ind", "gmr1.bcch.seg2a.lainfo.si_update_ind",
1318 FT_UINT8, BASE_DEC, NULL, 0x00,
1319 "Flag for BACH reorganization. Value changes after each reorganization", HFILL }
1322 /* Segment 3A - [1] 11.5.2.71 */
1323 { &hf_seg3a_lai_mcc,
1324 { "Mobile Country Code (MCC)", "gmr1.bcch.seg3a.lai.mcc",
1325 FT_UINT16, BASE_DEC, NULL, 0x00,
1326 NULL, HFILL }
1328 { &hf_seg3a_lai_mnc,
1329 { "Mobile Network Code (MNC)", "gmr1.bcch.seg3a.lai.mnc",
1330 FT_UINT16, BASE_DEC, NULL, 0x00,
1331 NULL, HFILL }
1333 { &hf_seg3a_lai_lac,
1334 { "Location Area Code (LAC)", "gmr1.bcch.seg3a.lai.lac",
1335 FT_UINT16, BASE_HEX, NULL, 0x00,
1336 NULL, HFILL }
1338 { &hf_seg3a_lai_msc_id,
1339 { "MSC ID", "gmr1.bcch.seg3a.lai.msc_id",
1340 FT_UINT8, BASE_DEC, NULL, 0x00,
1341 NULL, HFILL }
1343 { &hf_seg3a_lai_spot_beam_id,
1344 { "Spot Beam ID", "gmr1.bcch.seg3a.lai.spot_beam_id",
1345 FT_UINT16, BASE_DEC, NULL, 0x00,
1346 NULL, HFILL }
1348 { &hf_seg3a_system_sat_id,
1349 { "Satellite ID", "gmr1.bcch.seg3a.system.sat_id",
1350 FT_UINT8, BASE_DEC, NULL, 0x00,
1351 NULL, HFILL }
1353 { &hf_seg3a_system_sys_id,
1354 { "System ID", "gmr1.bcch.seg3a.system.sys_id",
1355 FT_UINT8, BASE_DEC, NULL, 0x00,
1356 NULL, HFILL }
1358 { &hf_seg3a_satpos_latitude,
1359 { "Latitude", "gmr1.bcch.seg3a.satpos.latitude",
1360 FT_INT8, BASE_CUSTOM, seg3a_latitude_fmt, 0x00,
1361 NULL, HFILL }
1363 { &hf_seg3a_satpos_longitude,
1364 { "Longitude", "gmr1.bcch.seg3a.satpos.longitude",
1365 FT_UINT16, BASE_CUSTOM, seg3a_longitude_fmt, 0x00,
1366 NULL, HFILL }
1368 { &hf_seg3a_satpos_radius,
1369 { "Radius", "gmr1.bcch.seg3a.satpos.radius",
1370 FT_INT16, BASE_CUSTOM, seg3a_satpos_radius_fmt, 0x00,
1371 NULL, HFILL }
1373 { &hf_seg3a_beam_latitude,
1374 { "Latitude", "gmr1.bcch.seg3a.beam.latitude",
1375 FT_INT16, BASE_CUSTOM, seg3a_latitude_fmt, 0x00,
1376 NULL, HFILL }
1378 { &hf_seg3a_beam_longitude,
1379 { "Longitude", "gmr1.bcch.seg3a.beam.longitude",
1380 FT_UINT16, BASE_CUSTOM, seg3a_longitude_fmt, 0x00,
1381 NULL, HFILL }
1383 { &hf_seg3a_miscinfo_sb_reselection_timer,
1384 { "SB_RESELECTION_TIMER", "gmr1.bcch.seg3a.sb_reselection_timer",
1385 FT_UINT8, BASE_CUSTOM, seg3a_miscinfo_sb_reselection_timer_fmt, 0x00,
1386 NULL, HFILL }
1388 { &hf_seg3a_spare,
1389 { "Spare", "gmr1.bcch.seg3a.spare",
1390 FT_UINT8, BASE_DEC, NULL, 0x00,
1391 NULL, HFILL }
1394 /* System Information fields - [1] 10.1.31 & 10.1.32 */
1395 { &hf_si_protocol_version,
1396 { "Protocol version", "gmr1.bcch.si.protocol_version",
1397 FT_UINT8, BASE_DEC, NULL, 0x00,
1398 NULL, HFILL }
1400 { &hf_si_block_type,
1401 { "Block Type", "gmr1.bcch.si.block_type",
1402 FT_UINT8, BASE_DEC, NULL, 0x00,
1403 NULL, HFILL }
1405 { &hf_si_spare,
1406 { "Spare", "gmr1.bcch.si.spare",
1407 FT_UINT8, BASE_DEC, NULL, 0x00,
1408 NULL, HFILL }
1410 { &hf_si1_randomization_period,
1411 { "Randomization Period", "gmr1.bcch.si.randomization_period",
1412 FT_UINT8, BASE_DEC, VALS(si1_randomization_period_vals), 0x00,
1413 NULL, HFILL }
1417 static gint *ett[] = {
1418 &ett_gmr1_bcch,
1421 proto_gmr1_bcch = proto_register_protocol("GEO-Mobile Radio (1) BCCH", "GMR-1 BCCH", "gmr1.bcch");
1423 proto_register_field_array(proto_gmr1_bcch, hf, array_length(hf));
1424 proto_register_subtree_array(ett, array_length(ett));
1426 register_dissector("gmr1_bcch", dissect_gmr1_bcch, proto_gmr1_bcch);
1430 * Editor modelines - http://www.wireshark.org/tools/modelines.html
1432 * Local variables:
1433 * c-basic-offset: 8
1434 * tab-width: 8
1435 * indent-tabs-mode: t
1436 * End:
1438 * vi: set shiftwidth=8 tabstop=8 noexpandtab:
1439 * :indentSize=8:tabSize=8:noTabs=false: