3 * Routines for GMR-1 Radio Resource dissection in wireshark.
4 * Copyright (c) 2011 Sylvain Munaut <tnt@246tNt.com>
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
10 * [4] ETSI TS 100 940 V7.21.0 - GSM 04.08
11 * [5] ETSI TS 101 376-4-12 V3.2.1 - GMR-1 3G 44.060
12 * [6] ETSI TS 101 376-5-6 V1.3.1 - GMR-1 05.008
16 * Wireshark - Network traffic analyzer
17 * By Gerald Combs <gerald@wireshark.org>
18 * Copyright 1998 Gerald Combs
20 * This program is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU General Public License
22 * as published by the Free Software Foundation; either version 2
23 * of the License, or (at your option) any later version.
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
30 * You should have received a copy of the GNU General Public License
31 * along with this program; if not, write to the Free Software
32 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
38 #include <epan/packet.h>
40 #include "packet-gmr1_common.h"
41 #include "packet-gsm_sms.h"
43 /* GMR-1 RR and CCCH proto */
44 static int proto_gmr1_rr
= -1;
45 static int proto_gmr1_ccch
= -1;
47 /* Fallback CCCH sub tree */
48 static gint ett_msg_ccch
= -1;
50 static gint ett_rr_pd
= -1;
53 static dissector_handle_t data_handle
;
57 /* ------------------------------------------------------------------------ */
58 /* RR Information Elements */
59 /* ------------------------------------------------------------------------ */
62 GMR1_IE_RR_CHAN_DESC
= 0, /* [1] 11.5.2.5 */
63 GMR1_IE_RR_CHAN_MODE
, /* [1] 11.5.2.6 */
64 GMR1_IE_RR_CIPH_MODE_SETTING
, /* [4] 10.5.2.9 */
65 GMR1_IE_RR_CIPH_RESP
, /* [4] 10.5.2.10 */
66 GMR1_IE_RR_L2_PSEUDO_LEN
, /* [1] 11.5.2.19 */
67 GMR1_IE_RR_PAGE_MODE
, /* [1] 11.5.2.26 */
68 GMR1_IE_RR_REQ_REF
, /* [1] 11.5.2.30 */
69 GMR1_IE_RR_CAUSE
, /* [1] 11.5.2.31 */
70 GMR1_IE_RR_TIMING_OFS
, /* [1] 11.5.2.40 */
71 GMR1_IE_RR_TMSI_PTMSI
, /* [4] 10.5.2.42 */
72 GMR1_IE_RR_WAIT_IND
, /* [4] 10.5.2.43 */
73 GMR1_IE_RR_MES_INFO_FLG
, /* [1] 11.5.2.44 */
74 GMR1_IE_RR_FREQ_OFS
, /* [1] 11.5.2.49 */
75 GMR1_IE_RR_PAGE_INFO
, /* [1] 11.5.2.51 */
76 GMR1_IE_RR_POS_DISPLAY
, /* [1] 11.5.2.52 */
77 GMR1_IE_RR_POS_UPD_INFO
, /* [1] 11.5.2.54 */
78 GMR1_IE_RR_BCCH_CARRIER
, /* [1] 11.5.2.55 */
79 GMR1_IE_RR_REJECT_CAUSE
, /* [1] 11.5.2.56 */
80 GMR1_IE_RR_GPS_TIMESTAMP
, /* [1] 11.5.2.57 */
81 GMR1_IE_RR_PWR_CTRL_PRM
, /* [1] 11.5.2.60 */
82 GMR1_IE_RR_TMSI_AVAIL_MSK
, /* [1] 11.5.2.62 */
83 GMR1_IE_RR_GPS_ALMANAC
, /* [1] 11.5.2.63 */
84 GMR1_IE_RR_MSC_ID
, /* [1] 11.5.2.100 */
85 GMR1_IE_RR_GPS_DISCR
, /* [1] 11.5.2.101 */
86 GMR1_IE_RR_PKT_IMM_ASS_3_PRM
, /* [3] 11.5.2.105 */
87 GMR1_IE_RR_PKT_FREQ_PRM
, /* [3] 11.5.2.106 */
88 GMR1_IE_RR_PKT_IMM_ASS_2_PRM
, /* [3] 11.5.2.107 */
89 GMR1_IE_RR_USF
, /* [3] 11.5.2.110 */
90 GMR1_IE_RR_TIMING_ADV_IDX
, /* [3] 10.1.18.3.4 */
91 GMR1_IE_RR_TLLI
, /* [5] 12.16 */
92 GMR1_IE_RR_PKT_PWR_CTRL_PRM
, /* [3] 10.1.18.3.3 */
93 GMR1_IE_RR_PERSISTENCE_LVL
, /* [3] 10.1.18.4.2 */
94 NUM_GMR1_IE_RR
/* Terminator */
97 static const value_string gmr1_ie_rr_strings
[] = {
98 { GMR1_IE_RR_CHAN_DESC
,
99 "Channel Description" }, /* [1] 11.5.2.5 */
100 { GMR1_IE_RR_CHAN_MODE
,
101 "Channel Mode" }, /* [1] 11.5.2.6 */
102 { GMR1_IE_RR_CIPH_MODE_SETTING
,
103 "Cipher Mode Setting" }, /* [4] 10.5.2.9 */
104 { GMR1_IE_RR_CIPH_RESP
,
105 "Cipher Response" }, /* [4] 10.5.2.10 */
106 { GMR1_IE_RR_L2_PSEUDO_LEN
,
107 "L2 Pseudo Length" }, /* [1] 11.5.2.19 */
108 { GMR1_IE_RR_PAGE_MODE
,
109 "Page Mode" }, /* [1] 11.5.2.26 */
110 { GMR1_IE_RR_REQ_REF
,
111 "Request Reference" }, /* [1] 11.5.2.30 */
113 "RR Cause" }, /* [1] 11.5.2.31 */
114 { GMR1_IE_RR_TIMING_OFS
,
115 "Timing Offset" }, /* [1] 11.5.2.40 */
116 { GMR1_IE_RR_TMSI_PTMSI
,
117 "TMSI/P-TMSI" }, /* [4] 10.5.2.42 */
118 { GMR1_IE_RR_WAIT_IND
,
119 "Wait Indication" }, /* [4] 10.5.2.43 */
120 { GMR1_IE_RR_MES_INFO_FLG
,
121 "MES Information Flag" }, /* [1] 11.5.2.44 */
122 { GMR1_IE_RR_FREQ_OFS
,
123 "Frequency Offset" }, /* [1] 11.5.2.49 */
124 { GMR1_IE_RR_PAGE_INFO
,
125 "Paging Information" }, /* [1] 11.5.2.51 */
126 { GMR1_IE_RR_POS_DISPLAY
,
127 "Position Display" }, /* [1] 11.5.2.52 */
128 { GMR1_IE_RR_POS_UPD_INFO
,
129 "Position Update Information" }, /* [1] 11.5.2.54 */
130 { GMR1_IE_RR_BCCH_CARRIER
,
131 "BCCH Carrier Specification"}, /* [1] 11.5.2.55 */
132 { GMR1_IE_RR_REJECT_CAUSE
,
133 "Reject Cause" }, /* [1] 11.5.2.56 */
134 { GMR1_IE_RR_GPS_TIMESTAMP
,
135 "GPS timestamp" }, /* [1] 11.5.2.57 */
136 { GMR1_IE_RR_PWR_CTRL_PRM
,
137 "Power Control Params" }, /* [1] 11.5.2.60 */
138 { GMR1_IE_RR_TMSI_AVAIL_MSK
,
139 "TMSI Availability Mask" }, /* [1] 11.5.2.62 */
140 { GMR1_IE_RR_GPS_ALMANAC
,
141 "GPS Almanac Data" }, /* [1] 11.5.2.63 */
143 "MSC ID" }, /* [1] 11.5.2.100 */
144 { GMR1_IE_RR_GPS_DISCR
,
145 "GPS Discriminator" }, /* [1] 11.5.2.101 */
146 { GMR1_IE_RR_PKT_IMM_ASS_3_PRM
,
147 "Packet Imm. Ass. Type 3 Params" }, /* [3] 11.5.2.105 */
148 { GMR1_IE_RR_PKT_FREQ_PRM
,
149 "Packet Frequency Parameters" }, /* [3] 11.5.2.106 */
150 { GMR1_IE_RR_PKT_IMM_ASS_2_PRM
,
151 "Packet Imm. Ass. Type 2 Params" }, /* [3] 11.5.2.107 */
153 "USF" }, /* [3] 11.5.2.110 */
154 { GMR1_IE_RR_TIMING_ADV_IDX
,
155 "Timing Advance Index" }, /* [3] 10.1.18.3.4 */
157 "TLLI" }, /* [5] 12.16 */
158 { GMR1_IE_RR_PKT_PWR_CTRL_PRM
,
159 "Packet Power Control Params" }, /* [3] 10.1.18.3.3 */
160 { GMR1_IE_RR_PERSISTENCE_LVL
,
161 "Persistence Level" }, /* [3] 10.1.18.4.2 */
164 value_string_ext gmr1_ie_rr_strings_ext
= VALUE_STRING_EXT_INIT(gmr1_ie_rr_strings
);
166 gint ett_gmr1_ie_rr
[NUM_GMR1_IE_RR
];
170 static int hf_rr_msg_type
= -1;
171 static int hf_rr_chan_desc_kab_loc
= -1;
172 static int hf_rr_chan_desc_rx_tn
= -1;
173 static int hf_rr_chan_desc_arfcn
= -1;
174 static int hf_rr_chan_desc_tx_tn
= -1;
175 static int hf_rr_chan_desc_chan_type
= -1;
176 static int hf_rr_chan_mode
= -1;
177 static int hf_rr_ciph_mode_setting_sc
= -1;
178 static int hf_rr_ciph_mode_setting_algo
= -1;
179 static int hf_rr_ciph_resp_cr
= -1;
180 static int hf_rr_ciph_resp_spare
= -1;
181 static int hf_rr_l2_pseudo_len
= -1;
182 static int hf_rr_page_mode
= -1;
183 static int hf_rr_page_mode_spare
= -1;
184 static int hf_rr_req_ref_est_cause
= -1;
185 static int hf_rr_req_ref_ra
= -1;
186 static int hf_rr_req_ref_fn
= -1;
187 static int hf_rr_cause
= -1;
188 static int hf_rr_timing_ofs_ti
= -1;
189 static int hf_rr_timing_ofs_value
= -1;
190 static int hf_rr_tmsi_ptmsi
= -1;
191 static int hf_rr_wait_ind_timeout
= -1;
192 static int hf_rr_mif_mes1_ab
= -1;
193 static int hf_rr_mif_mes1_i
= -1;
194 static int hf_rr_mif_mes1_d
= -1;
195 static int hf_rr_mif_mes2
= -1;
196 static int hf_rr_mif_mes3
= -1;
197 static int hf_rr_mif_mes4
= -1;
198 static int hf_rr_mif_pv
= -1;
199 static int hf_rr_freq_ofs_fi
= -1;
200 static int hf_rr_freq_ofs_value
= -1;
201 static int hf_rr_freq_ofs_spare
= -1;
202 static int hf_rr_page_info_msc_id
= -1;
203 static int hf_rr_page_info_chan_needed
= -1;
204 static int hf_rr_pos_display_flag
= -1;
205 static int hf_rr_pos_display_text
= -1;
206 static int hf_rr_pos_upd_info_v
= -1;
207 static int hf_rr_pos_upd_info_dist
= -1;
208 static int hf_rr_pos_upd_info_time
= -1;
209 static int hf_rr_bcch_carrier_arfcn
= -1;
210 static int hf_rr_bcch_carrier_si
= -1;
211 static int hf_rr_bcch_carrier_ri
= -1;
212 static int hf_rr_bcch_carrier_spare
= -1;
213 static int hf_rr_reject_cause
= -1;
214 static int hf_rr_reject_cause_b
= -1;
215 static int hf_rr_gps_timestamp
= -1;
216 static int hf_rr_tmsi_avail_msk_tmsi
[4] = { -1, -1, -1, -1 };
217 static int hf_rr_gps_almanac_pn
= -1;
218 static int hf_rr_gps_almanac_wn
= -1;
219 static int hf_rr_gps_almanac_word
= -1;
220 static int hf_rr_gps_almanac_sfn
= -1;
221 static int hf_rr_gps_almanac_co
= -1;
222 static int hf_rr_gps_almanac_spare
= -1;
223 static int hf_rr_msc_id
= -1;
224 static int hf_rr_msc_id_spare
= -1;
225 static int hf_rr_gps_discr
= -1;
226 static int hf_rr_pkt_imm_ass_3_prm_rlc_mode
= -1;
227 static int hf_rr_pkt_imm_ass_3_prm_spare
= -1;
228 static int hf_rr_pkt_imm_ass_3_prm_dl_tfi
= -1;
229 static int hf_rr_pkt_imm_ass_3_prm_start_fn
= -1;
230 static int hf_rr_pkt_imm_ass_3_prm_mac_slot_alloc
= -1;
231 static int hf_rr_pkt_freq_prm_arfcn
= -1;
232 static int hf_rr_pkt_freq_prm_dl_freq_plan_id
= -1;
233 static int hf_rr_pkt_freq_prm_dl_bw
= -1;
234 static int hf_rr_pkt_freq_prm_ul_freq_dist
= -1;
235 static int hf_rr_pkt_freq_prm_ul_bw
= -1;
236 static int hf_rr_pkt_freq_prm_spare
= -1;
237 static int hf_rr_pkt_imm_ass_2_prm_ac_spare1
= -1;
238 static int hf_rr_pkt_imm_ass_2_prm_ac_final_alloc
= -1;
239 static int hf_rr_pkt_imm_ass_2_prm_ac_usf_granularity
= -1;
240 static int hf_rr_pkt_imm_ass_2_prm_ac_dl_ctl_mac_slot
= -1;
241 static int hf_rr_pkt_imm_ass_2_prm_ac_mac_mode
= -1;
242 static int hf_rr_pkt_imm_ass_2_prm_ac_start_fn
= -1;
243 static int hf_rr_pkt_imm_ass_2_prm_ac_rlc_dblk_gnt
= -1;
244 static int hf_rr_pkt_imm_ass_2_prm_ac_mcs
= -1;
245 static int hf_rr_pkt_imm_ass_2_prm_ac_tfi
= -1;
246 static int hf_rr_pkt_imm_ass_2_prm_ac_spare2
= -1;
247 static int hf_rr_pkt_imm_ass_2_prm_ac_mac_slot_alloc
= -1;
248 static int hf_rr_pkt_imm_ass_2_prm_d_chan_mcs_cmd
= -1;
249 static int hf_rr_pkt_imm_ass_2_prm_d_chan_mcs_cmd_pnb512
= -1;
250 static int hf_rr_pkt_imm_ass_2_prm_d_spare1
= -1;
251 static int hf_rr_pkt_imm_ass_2_prm_d_rlc_dblk_gnt
= -1;
252 static int hf_rr_pkt_imm_ass_2_prm_d_spare2
= -1;
253 static int hf_rr_pkt_imm_ass_2_prm_d_tfi
= -1;
254 static int hf_rr_pkt_imm_ass_2_prm_d_usf_granularity
= -1;
255 static int hf_rr_pkt_imm_ass_2_prm_d_mac_slot_alloc
= -1;
256 static int hf_rr_usf_value
= -1;
257 static int hf_rr_usf_spare
= -1;
258 static int hf_rr_timing_adv_idx_value
= -1;
259 static int hf_rr_timing_adv_idx_spare
= -1;
260 static int hf_rr_tlli
= -1;
261 static int hf_rr_pkt_pwr_ctrl_prm_par
= -1;
262 static int hf_rr_pkt_pwr_ctrl_prm_spare
= -1;
263 static int hf_rr_persistence_lvl
[4] = { -1, -1, -1, -1 };
266 /* Generic display vals/func */
267 static const value_string rr_gen_ie_presence_vals
[] = {
268 { 0, "IE is absent" },
269 { 1, "IE is present" },
274 rr_gen_ie_seconds_fmt(gchar
*s
, guint32 v
)
276 g_snprintf(s
, ITEM_LABEL_LENGTH
, "%u seconds", v
);
281 /* [1] 11.5.2.5 - Channel Description */
282 static const value_string rr_chan_desc_chan_type_vals
[] = {
283 { 1, "TCH3 No offset" },
284 { 3, "TCH3 1/2 symbol offset" },
285 { 6, "TCH6 No offset" },
286 { 7, "TCH6 1/2 symbol offset" },
287 { 4, "TCH9 No offset" },
288 { 5, "TCH9 1/2 symbol offset" },
289 { 13, "Reserved for SDCCH frames xx00" },
290 { 14, "Reserved for SDCCH frames xx01" },
291 { 15, "Reserved for SDCCH frames xx10" },
292 { 16, "Reserved for SDCCH frames xx11" },
296 GMR1_IE_FUNC(gmr1_ie_rr_chan_desc
)
300 bit_offset
= offset
<< 3;
302 /* KAB Location (6 bits)*/
303 proto_tree_add_bits_item(tree
, hf_rr_chan_desc_kab_loc
, tvb
,
304 bit_offset
, 6, ENC_BIG_ENDIAN
);
307 /* RX Timeslot (5 bits) */
308 proto_tree_add_bits_item(tree
, hf_rr_chan_desc_rx_tn
, tvb
,
309 bit_offset
, 5, ENC_BIG_ENDIAN
);
312 /* ARFCN (11 bits) */
313 proto_tree_add_bits_item(tree
, hf_rr_chan_desc_arfcn
, tvb
,
314 bit_offset
, 11, ENC_BIG_ENDIAN
);
317 /* TX Timeslot (5 bits) */
318 proto_tree_add_bits_item(tree
, hf_rr_chan_desc_tx_tn
, tvb
,
319 bit_offset
, 5, ENC_BIG_ENDIAN
);
322 /* Channel Type (5 bits) */
323 proto_tree_add_bits_item(tree
, hf_rr_chan_desc_chan_type
, tvb
,
324 bit_offset
, 5, ENC_BIG_ENDIAN
);
330 /* [1] 11.5.2.6 - Channel Mode */
331 static const value_string rr_chan_mode_vals
[] = {
332 { 0x00, "Signalling only" },
334 { 0x03, "Data, 12,0 kbit/s radio I/F rate" },
335 { 0x0b, "Data, 6,0 kbit/s radio I/F rate" },
336 { 0x13, "Data, 3,6 kbit/s radio I/F rate" },
340 GMR1_IE_FUNC(gmr1_ie_rr_chan_mode
)
343 proto_tree_add_item(tree
, hf_rr_chan_mode
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
348 /* [4] 10.5.2.9 - Cipher Mode Setting */
349 static const value_string rr_ciph_mode_setting_sc_vals
[] = {
350 { 0, "No ciphering"},
351 { 1, "Start ciphering"},
355 static const value_string rr_ciph_mode_setting_algo_vals
[] = {
367 GMR1_IE_FUNC(gmr1_ie_rr_ciph_mode_setting
)
370 proto_tree_add_item(tree
, hf_rr_ciph_mode_setting_sc
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
373 proto_tree_add_item(tree
, hf_rr_ciph_mode_setting_algo
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
378 /* [4] 10.5.2.10 - Cipher Response */
379 static const value_string rr_ciph_resp_cr_vals
[] = {
380 { 0, "IMEISV shall not be included"},
381 { 1, "IMEISV shall be included"},
385 GMR1_IE_FUNC(gmr1_ie_rr_ciph_resp
)
388 proto_tree_add_item(tree
, hf_rr_ciph_resp_cr
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
391 proto_tree_add_item(tree
, hf_rr_ciph_resp_spare
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
396 /* [1] 11.5.2.19 - L2 Pseudo Length */
397 GMR1_IE_FUNC(gmr1_ie_rr_l2_pseudo_len
)
399 /* L2 Pseudo Length value */
400 proto_tree_add_item(tree
, hf_rr_l2_pseudo_len
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
405 /* [1] 11.5.2.26 - Page Mode */
406 static const value_string rr_page_mode_vals
[] = {
407 { 0, "Normal Paging" },
408 { 1, "Reserved (Changed from Extended Paging in GSM)" },
409 { 2, "Paging Reorganization" },
410 { 3, "Same as before" },
414 GMR1_IE_FUNC(gmr1_ie_rr_page_mode
)
417 proto_tree_add_item(tree
, hf_rr_page_mode
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
420 proto_tree_add_item(tree
, hf_rr_page_mode_spare
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
425 /* [1] 11.5.2.30 - Request Reference */
426 static const value_string rr_req_ref_est_cause_vals
[] = {
428 { 1, "In response to paging/alerting" },
429 { 2, "Location update/IMSI detach" },
430 { 3, "Emergency call" },
431 { 4, "Supplementary/short message service" },
432 { 5, "Position verification" },
433 { 6, "Any other valid cause" },
438 GMR1_IE_FUNC(gmr1_ie_rr_req_ref
)
440 /* Establishement Cause + RA */
441 proto_tree_add_item(tree
, hf_rr_req_ref_est_cause
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
442 proto_tree_add_item(tree
, hf_rr_req_ref_ra
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
445 /* Frame number % 256 */
446 proto_tree_add_item(tree
, hf_rr_req_ref_fn
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
451 /* [1] 11.5.2.31 - RR Cause */
452 static const value_string rr_cause_vals
[] = {
453 { 0x00, "Normal event" },
454 { 0x01, "Abnormal release, unspecified" },
455 { 0x02, "Abnormal release, channel unacceptable" },
456 { 0x03, "Abnormal release, timer expired" },
457 { 0x04, "Abnormal release, no activity on the radio path" },
458 { 0x05, "Preemptive release" },
459 { 0x09, "Channel mode unacceptable" },
460 { 0x0a, "Frequency not implemented" },
461 { 0x0b, "Position unacceptable" },
462 { 0x41, "Call already cleared" },
463 { 0x5f, "Semantically incorrect message" },
464 { 0x60, "Invalid mandatory information" },
465 { 0x61, "Message type nonexistent or not implemented" },
466 { 0x62, "Message type not compatible with protocol state" },
467 { 0x6f, "Protocol error unspecified" },
471 GMR1_IE_FUNC(gmr1_ie_rr_cause
)
474 proto_tree_add_item(tree
, hf_rr_cause
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
479 /* [1] 11.5.2.40 - Timing Offset */
480 static const value_string rr_timing_ofs_ti_vals
[] = {
481 { 0, "The timing offset parameter in this IE to be ignored" },
482 { 1, "The timing offset parameter has a valid value" },
487 rr_timing_ofs_value_fmt(gchar
*s
, guint32 v
)
489 gint32 sv
= (signed)v
;
491 g_snprintf(s
, ITEM_LABEL_LENGTH
, "%.3f symbols ( ~ %.3f ms )",
492 sv
/ 40.0f
, (sv
/ 40.0f
) * (10.0f
/ 234.0f
));
495 GMR1_IE_FUNC(gmr1_ie_rr_timing_ofs
)
499 bit_offset
= offset
<< 3;
502 proto_tree_add_bits_item(tree
, hf_rr_timing_ofs_ti
, tvb
,
503 bit_offset
, 1, ENC_BIG_ENDIAN
);
507 proto_tree_add_bits_item(tree
, hf_rr_timing_ofs_value
, tvb
,
508 bit_offset
, 15, ENC_BIG_ENDIAN
);
509 /*bit_offset += 15;*/
514 /* [4] 10.5.2.42 - TMSI/P-TMSI */
515 GMR1_IE_FUNC(gmr1_ie_rr_tmsi_ptmsi
)
517 /* TMSI/P-TMSI value as hex */
518 proto_tree_add_item(tree
, hf_rr_tmsi_ptmsi
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
523 /* [4] 10.5.2.43 - Wait Indication */
524 GMR1_IE_FUNC(gmr1_ie_rr_wait_ind
)
527 proto_tree_add_item(tree
, hf_rr_wait_ind_timeout
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
532 /* [1] 11.5.2.44 - MES Information Flag */
533 static const value_string rr_mif_mes1_ab_vals
[] = {
534 { 0, "Chan. Assigned: MES1 registered at selected GS" },
535 { 1, "Chan. Assigned: MES1 requires registration at selected GS" },
536 { 2, "Chan. Assigned; MES 1 Extended Channel Req. Reqd" },
537 { 3, "Pause Timer Indication" },
541 static const value_string rr_mif_mes234_vals
[] = {
542 { 0, "MES doesn't exists" },
543 { 1, "Pause Timer Ind for this MES" },
547 static const value_string rr_mif_pv_vals
[] = {
548 { 0, "Position Verification not requested" },
549 { 1, "MES1 shall send a Channel Request for Position Verification following the completion of the upcoming call" },
553 GMR1_IE_FUNC(gmr1_ie_rr_mes_info_flg
)
555 proto_tree_add_item(tree
, hf_rr_mif_mes1_ab
,
556 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
558 proto_tree_add_item(tree
, hf_rr_mif_mes1_i
,
559 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
561 proto_tree_add_item(tree
, hf_rr_mif_mes1_d
,
562 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
564 proto_tree_add_item(tree
, hf_rr_mif_mes2
,
565 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
567 proto_tree_add_item(tree
, hf_rr_mif_mes3
,
568 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
570 proto_tree_add_item(tree
, hf_rr_mif_mes4
,
571 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
573 proto_tree_add_item(tree
, hf_rr_mif_pv
,
574 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
579 /* [1] 11.5.2.49 - Frequency Offset */
580 static const value_string rr_freq_ofs_fi_vals
[] = {
581 { 0, "The frequency offset parameter in this IE to be ignored" },
582 { 1, "The frequency offset parameter has a valid value" },
587 rr_freq_ofs_value_fmt(gchar
*s
, guint32 v
)
589 gint32 sv
= (signed)v
;
591 g_snprintf(s
, ITEM_LABEL_LENGTH
, "%d Hz", sv
);
594 GMR1_IE_FUNC(gmr1_ie_rr_freq_ofs
)
598 bit_offset
= offset
<< 3;
601 proto_tree_add_bits_item(tree
, hf_rr_freq_ofs_fi
, tvb
,
602 bit_offset
, 1, ENC_BIG_ENDIAN
);
606 proto_tree_add_bits_item(tree
, hf_rr_freq_ofs_value
, tvb
,
607 bit_offset
, 12, ENC_BIG_ENDIAN
);
611 proto_tree_add_bits_item(tree
, hf_rr_freq_ofs_spare
, tvb
,
612 bit_offset
, 3, ENC_BIG_ENDIAN
);
618 /* [1] 11.5.2.51 - Paging Information */
619 static const value_string rr_page_info_chan_needed_vals
[] = {
627 GMR1_IE_FUNC(gmr1_ie_rr_page_info
)
629 /* MSC ID & Channe needed */
630 proto_tree_add_item(tree
, hf_rr_page_info_msc_id
,
631 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
632 proto_tree_add_item(tree
, hf_rr_page_info_chan_needed
,
633 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
638 /* [1] 11.5.2.52 - Position Display */
639 static const value_string rr_pos_display_flag_vals
[] = {
640 { 0, "Position not available" },
641 { 1, "No position display service" },
642 { 2, "Use default 7-bit alphabet (GSM 03.38)" },
646 GMR1_IE_FUNC(gmr1_ie_rr_pos_display
)
648 const unsigned char *txt_raw
;
649 unsigned char txt_packed
[11], txt_unpacked
[12];
653 proto_tree_add_item(tree
, hf_rr_pos_display_flag
,
654 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
657 txt_raw
= tvb_get_ptr(tvb
, offset
, 11);
660 txt_packed
[i
] = (txt_raw
[i
] << 4) | (txt_raw
[i
+1] >> 4);
661 txt_packed
[10] = txt_raw
[10];
663 out_len
= gsm_sms_char_7bit_unpack(0, 11, 12, txt_packed
, txt_unpacked
);
666 proto_tree_add_unicode_string(tree
, hf_rr_pos_display_text
,
667 tvb
, offset
, 11, gsm_sms_chars_to_utf8(txt_unpacked
, out_len
));
672 /* [1] 11.5.2.54 - Position Update Information */
673 static const value_string rr_pos_upd_info_v_vals
[] = {
674 { 0, "Information in this IE is Invalid and should be ignored" },
675 { 1, "Information in this IE is Valid" },
680 rr_pos_upd_info_dist_fmt(gchar
*s
, guint32 v
)
682 g_snprintf(s
, ITEM_LABEL_LENGTH
, "%d km", v
);
686 rr_pos_upd_info_time_fmt(gchar
*s
, guint32 v
)
688 g_snprintf(s
, ITEM_LABEL_LENGTH
, "%d minutes", v
);
691 GMR1_IE_FUNC(gmr1_ie_rr_pos_upd_info
)
693 gint curr_offset
= offset
;
695 /* Valid & GPS Update Distance */
696 proto_tree_add_item(tree
, hf_rr_pos_upd_info_v
,
697 tvb
, curr_offset
, 1, ENC_BIG_ENDIAN
);
698 proto_tree_add_item(tree
, hf_rr_pos_upd_info_dist
,
699 tvb
, curr_offset
, 1, ENC_BIG_ENDIAN
);
702 /* GPS Update Timer */
703 proto_tree_add_item(tree
, hf_rr_pos_upd_info_time
,
704 tvb
, curr_offset
, 1, ENC_BIG_ENDIAN
);
710 /* [1] 11.5.2.55 - BCCH Carrier */
711 static const value_string rr_bcch_carrier_si_vals
[] = {
712 { 0, "BCCH carrier is on the same satellite" },
713 { 1, "BCCH carrier is on a different satellite" },
717 static const value_string rr_bcch_carrier_ri_vals
[] = {
718 { 0, "Spot beam reselection not needed; use the spot beam with given BCCH" },
719 { 1, "Spot beam reselection needed; use the BCCH for spot beam reselection" },
723 GMR1_IE_FUNC(gmr1_ie_rr_bcch_carrier
)
727 bit_offset
= offset
<< 3;
730 proto_tree_add_bits_item(tree
, hf_rr_bcch_carrier_arfcn
,
731 tvb
, bit_offset
, 11, ENC_BIG_ENDIAN
);
735 proto_tree_add_bits_item(tree
, hf_rr_bcch_carrier_si
,
736 tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
740 proto_tree_add_bits_item(tree
, hf_rr_bcch_carrier_ri
,
741 tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
745 proto_tree_add_bits_item(tree
, hf_rr_bcch_carrier_spare
,
746 tvb
, bit_offset
, 3, ENC_BIG_ENDIAN
);
752 /* [1] 11.5.2.56 - Reject Cause */
753 static const value_string rr_reject_cause_vals
[] = {
754 { 0x00, "Lack of resources (default)" },
755 { 0x11, "Invalid position for selected LAI" },
756 { 0x12, "Invalid position for selected spot beam" },
757 { 0x13, "Invalid position" },
758 { 0x15, "Position too old" },
759 { 0x16, "Invalid position for service provider" },
760 { 0x17, "Redirect to new satellite" },
761 { 0x3f, "Reported position acceptable" },
765 GMR1_IE_FUNC(gmr1_ie_rr_reject_cause
)
768 proto_tree_add_item(tree
, hf_rr_reject_cause
,
769 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
772 proto_tree_add_item(tree
, hf_rr_reject_cause_b
,
773 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
778 /* [1] 11.5.2.57 - GPS timestamp */
780 rr_gps_timestamp_fmt(gchar
*s
, guint32 v
)
783 g_snprintf(s
, ITEM_LABEL_LENGTH
, "> 65535 minutes or N/A");
785 g_snprintf(s
, ITEM_LABEL_LENGTH
, "%d minutes", v
);
788 GMR1_IE_FUNC(gmr1_ie_rr_gps_timestamp
)
791 proto_tree_add_item(tree
, hf_rr_gps_timestamp
,
792 tvb
, offset
, 2, ENC_BIG_ENDIAN
);
797 /* [1] 11.5.2.60 - Power Control Params */
798 GMR1_IE_FUNC(gmr1_ie_rr_pwr_ctrl_prm
)
800 /* It's CSN1 encoded and we have no real world sample. Until we do,
801 * we don't pollute the code with a bunch of untested stuff ... */
803 proto_tree_add_text(tree
, tvb
, offset
, 5, "Power Control Parameters");
808 /* [1] 11.5.2.62 - Availability Mask */
809 GMR1_IE_FUNC(gmr1_ie_rr_tmsi_avail_msk
)
814 proto_tree_add_item(tree
, hf_rr_tmsi_avail_msk_tmsi
[i
],
815 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
820 /* [1] 11.5.2.63 - GPS Almanac Data */
822 rr_gps_almanac_pn_fmt(gchar
*s
, guint32 v
)
824 g_snprintf(s
, ITEM_LABEL_LENGTH
, "%d", v
+1);
827 static const value_string rr_gps_almanac_sfn_vals
[] = {
834 GMR1_IE_FUNC(gmr1_ie_rr_gps_almanac
)
836 gint curr_offset
= offset
;
838 /* Page Number & Word Number */
839 proto_tree_add_item(tree
, hf_rr_gps_almanac_pn
,
840 tvb
, curr_offset
, 1, ENC_BIG_ENDIAN
);
841 proto_tree_add_item(tree
, hf_rr_gps_almanac_wn
,
842 tvb
, curr_offset
, 1, ENC_BIG_ENDIAN
);
846 proto_tree_add_item(tree
, hf_rr_gps_almanac_word
,
847 tvb
, curr_offset
, 3, ENC_BIG_ENDIAN
);
850 /* SubFrame Number & CO & Spare */
851 proto_tree_add_item(tree
, hf_rr_gps_almanac_sfn
,
852 tvb
, curr_offset
, 1, ENC_BIG_ENDIAN
);
853 proto_tree_add_item(tree
, hf_rr_gps_almanac_co
,
854 tvb
, curr_offset
, 1, ENC_BIG_ENDIAN
);
855 proto_tree_add_item(tree
, hf_rr_gps_almanac_spare
,
856 tvb
, curr_offset
, 1, ENC_BIG_ENDIAN
);
862 /* [1] 11.5.2.100 - MSC ID */
863 GMR1_IE_FUNC(gmr1_ie_rr_msc_id
)
866 proto_tree_add_item(tree
, hf_rr_msc_id
,
867 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
870 proto_tree_add_item(tree
, hf_rr_msc_id_spare
,
871 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
876 /* [1] 11.5.2.101 - GPS Discriminator */
877 GMR1_IE_FUNC(gmr1_ie_rr_gps_discr
)
879 /* GPS Position CRC value */
880 proto_tree_add_item(tree
, hf_rr_gps_discr
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
885 /* [3] 11.5.2.105 - Packet Imm. Ass. Type 3 Params */
886 static const value_string rr_pkt_imm_ass_3_prm_rlc_mode_vals
[] = {
887 { 0, "RLC acknowledged mode" },
888 { 1, "RLC unacknowledged mode" },
892 static const crumb_spec_t rr_pkt_imm_ass_3_prm_dl_tfi_crumbs
[] = {
898 GMR1_IE_FUNC(gmr1_ie_rr_pkt_imm_ass_3_prm
)
901 proto_tree_add_item(tree
, hf_rr_pkt_imm_ass_3_prm_rlc_mode
,
902 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
905 proto_tree_add_item(tree
, hf_rr_pkt_imm_ass_3_prm_spare
,
906 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
908 /* Downlink Tempory Flow Identifier (TFI) */
909 proto_tree_add_split_bits_item_ret_val(
910 tree
, hf_rr_pkt_imm_ass_3_prm_dl_tfi
,
912 rr_pkt_imm_ass_3_prm_dl_tfi_crumbs
,
915 /* Starting Frame Number */
916 proto_tree_add_item(tree
, hf_rr_pkt_imm_ass_3_prm_start_fn
,
917 tvb
, offset
+1, 1, ENC_BIG_ENDIAN
);
919 /* MAC Slot allocation */
920 proto_tree_add_item(tree
, hf_rr_pkt_imm_ass_3_prm_mac_slot_alloc
,
921 tvb
, offset
+2, 1, ENC_BIG_ENDIAN
);
926 /* [3] 11.5.2.106 - Packet Frequency Parameters */
927 static const value_string rr_pkt_freq_prm_dl_freq_plan_id_vals
[] = {
928 { 0, "S-Band" }, /* Pretty much a guess ... */
929 { 1, "L-Band" }, /* didn't find exact value in specs */
933 static const crumb_spec_t rr_pkt_freq_prm_arfcn_crumbs
[] = {
939 static const crumb_spec_t rr_pkt_freq_prm_ul_freq_dist_crumbs
[] = {
946 rr_pkt_freq_prm_xx_bw_fmt(gchar
*s
, guint32 v
)
948 g_snprintf(s
, ITEM_LABEL_LENGTH
, "%d * 31.25 kHz = %.2f kHz (%d)", v
, 31.25f
*v
, v
);
951 GMR1_IE_FUNC(gmr1_ie_rr_pkt_freq_prm
)
954 proto_tree_add_split_bits_item_ret_val(
955 tree
, hf_rr_pkt_freq_prm_arfcn
,
957 rr_pkt_freq_prm_arfcn_crumbs
,
960 /* DL Freq plan ID */
961 proto_tree_add_item(tree
, hf_rr_pkt_freq_prm_dl_freq_plan_id
,
962 tvb
, offset
+1, 1, ENC_BIG_ENDIAN
);
965 proto_tree_add_item(tree
, hf_rr_pkt_freq_prm_dl_bw
,
966 tvb
, offset
+1, 1, ENC_BIG_ENDIAN
);
968 /* UL Freq distance */
969 proto_tree_add_split_bits_item_ret_val(
970 tree
, hf_rr_pkt_freq_prm_ul_freq_dist
,
971 tvb
, (offset
+1) << 3,
972 rr_pkt_freq_prm_ul_freq_dist_crumbs
,
976 proto_tree_add_item(tree
, hf_rr_pkt_freq_prm_ul_bw
,
977 tvb
, offset
+2, 1, ENC_BIG_ENDIAN
);
980 proto_tree_add_item(tree
, hf_rr_pkt_freq_prm_spare
,
981 tvb
, offset
+2, 1, ENC_BIG_ENDIAN
);
986 /* [3] 11.5.2.107 - Packet Imm. Ass. Type 2 Params */
987 static const value_string rr_pkt_imm_ass_2_prm_ac_mac_mode_vals
[] = {
988 { 0, "Dynamic allocation" },
995 static const crumb_spec_t rr_pkt_imm_ass_2_prm_ac_rlc_dblk_gnt_crumbs
[] = {
1001 GMR1_IE_FUNC(gmr1_ie_rr_pkt_imm_ass_2_prm
)
1003 proto_tree
*subtree_ac
, *subtree_d
;
1004 proto_item
*item_ac
, *item_d
;
1010 item_ac
= proto_tree_add_text(tree
, tvb
, offset
, 5, "GMPRS Terminal type A or C");
1011 subtree_ac
= proto_item_add_subtree(item_ac
, ett_gmr1_ie_rr
[GMR1_IE_RR_PKT_IMM_ASS_2_PRM
]);
1014 proto_tree_add_item(subtree_ac
, hf_rr_pkt_imm_ass_2_prm_ac_spare1
,
1015 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
1017 /* Final Allocation */
1018 proto_tree_add_item(subtree_ac
, hf_rr_pkt_imm_ass_2_prm_ac_final_alloc
,
1019 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
1021 /* USF Granularity */
1022 proto_tree_add_item(subtree_ac
, hf_rr_pkt_imm_ass_2_prm_ac_usf_granularity
,
1023 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
1025 /* Downlink Control MAC slot */
1026 proto_tree_add_item(subtree_ac
, hf_rr_pkt_imm_ass_2_prm_ac_dl_ctl_mac_slot
,
1027 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
1030 proto_tree_add_item(subtree_ac
, hf_rr_pkt_imm_ass_2_prm_ac_mac_mode
,
1031 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
1033 /* Starting Frame Number */
1034 proto_tree_add_item(subtree_ac
, hf_rr_pkt_imm_ass_2_prm_ac_start_fn
,
1035 tvb
, offset
+1, 1, ENC_BIG_ENDIAN
);
1037 /* RLC Data Blocks Granted */
1038 proto_tree_add_split_bits_item_ret_val(
1039 tree
, hf_rr_pkt_imm_ass_2_prm_ac_rlc_dblk_gnt
,
1040 tvb
, (offset
+1) << 3,
1041 rr_pkt_imm_ass_2_prm_ac_rlc_dblk_gnt_crumbs
,
1045 proto_tree_add_item(subtree_ac
, hf_rr_pkt_imm_ass_2_prm_ac_mcs
,
1046 tvb
, offset
+2, 1, ENC_BIG_ENDIAN
);
1049 proto_tree_add_item(subtree_ac
, hf_rr_pkt_imm_ass_2_prm_ac_tfi
,
1050 tvb
, offset
+3, 1, ENC_BIG_ENDIAN
);
1053 proto_tree_add_item(subtree_ac
, hf_rr_pkt_imm_ass_2_prm_ac_spare2
,
1054 tvb
, offset
+3, 1, ENC_BIG_ENDIAN
);
1056 /* MAC Slot allocation */
1057 proto_tree_add_item(subtree_ac
, hf_rr_pkt_imm_ass_2_prm_ac_mac_slot_alloc
,
1058 tvb
, offset
+4, 1, ENC_BIG_ENDIAN
);
1063 item_d
= proto_tree_add_text(tree
, tvb
, offset
, 5, "GMPRS Terminal type D");
1064 subtree_d
= proto_item_add_subtree(item_d
, ett_gmr1_ie_rr
[GMR1_IE_RR_PKT_IMM_ASS_2_PRM
]);
1066 /* Channel MCS command */
1067 proto_tree_add_item(subtree_d
, hf_rr_pkt_imm_ass_2_prm_d_chan_mcs_cmd
,
1068 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
1070 /* Channel MCS command PNB(5,12) */
1071 proto_tree_add_item(subtree_d
, hf_rr_pkt_imm_ass_2_prm_d_chan_mcs_cmd_pnb512
,
1072 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
1075 proto_tree_add_item(subtree_d
, hf_rr_pkt_imm_ass_2_prm_d_spare1
,
1076 tvb
, offset
+1, 1, ENC_BIG_ENDIAN
);
1078 /* RLC Data Blocks Granted */
1079 proto_tree_add_item(subtree_d
, hf_rr_pkt_imm_ass_2_prm_d_rlc_dblk_gnt
,
1080 tvb
, offset
+2, 1, ENC_BIG_ENDIAN
);
1083 proto_tree_add_item(subtree_d
, hf_rr_pkt_imm_ass_2_prm_d_spare2
,
1084 tvb
, offset
+2, 1, ENC_BIG_ENDIAN
);
1087 proto_tree_add_item(subtree_d
, hf_rr_pkt_imm_ass_2_prm_d_tfi
,
1088 tvb
, offset
+3, 1, ENC_BIG_ENDIAN
);
1090 /* USF Granularity */
1091 proto_tree_add_item(subtree_d
, hf_rr_pkt_imm_ass_2_prm_d_usf_granularity
,
1092 tvb
, offset
+3, 1, ENC_BIG_ENDIAN
);
1094 /* MAC Slot allocation */
1095 proto_tree_add_item(subtree_d
, hf_rr_pkt_imm_ass_2_prm_d_mac_slot_alloc
,
1096 tvb
, offset
+4, 1, ENC_BIG_ENDIAN
);
1102 /* [3] 11.5.2.110 - USF */
1103 GMR1_IE_FUNC(gmr1_ie_rr_usf
)
1106 proto_tree_add_item(tree
, hf_rr_usf_spare
,
1107 tvb
, offset
, 3, ENC_BIG_ENDIAN
);
1110 proto_tree_add_item(tree
, hf_rr_usf_value
,
1111 tvb
, offset
+2, 1, ENC_BIG_ENDIAN
);
1116 /* [3] 10.1.18.3.4 & [5] 12.29 - Timing Advance Index */
1117 GMR1_IE_FUNC(gmr1_ie_rr_timing_adv_idx
)
1120 proto_tree_add_item(tree
, hf_rr_timing_adv_idx_value
,
1121 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
1124 proto_tree_add_item(tree
, hf_rr_timing_adv_idx_spare
,
1125 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
1130 /* [5] 12.16 - TLLI */
1131 GMR1_IE_FUNC(gmr1_ie_rr_tlli
)
1133 /* TLLI value as hex */
1134 proto_tree_add_item(tree
, hf_rr_tlli
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1139 /* [3] 10.1.18.3.3 & [5] 10.4.10a & [6] 5.3.3 - Packet Power Control Params */
1141 rr_pkt_pwr_ctrl_prm_par_fmt(gchar
*s
, guint32 v
)
1144 g_snprintf(s
, ITEM_LABEL_LENGTH
, "Escape %d (%d)", v
-60, v
);
1148 g_snprintf(s
, ITEM_LABEL_LENGTH
, "%.1f dB (%d)", v
*0.4f
, v
);
1151 GMR1_IE_FUNC(gmr1_ie_rr_pkt_pwr_ctrl_prm
)
1153 /* Power Attenuation Request (PAR) */
1154 proto_tree_add_item(tree
, hf_rr_pkt_pwr_ctrl_prm_par
,
1155 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
1158 proto_tree_add_item(tree
, hf_rr_pkt_pwr_ctrl_prm_spare
,
1159 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
1164 /* [3] 10.1.18.4.2 & [5] 12.14 - Persistence Level */
1165 GMR1_IE_FUNC(gmr1_ie_rr_persistence_lvl
)
1170 proto_tree_add_item(tree
, hf_rr_persistence_lvl
[i
],
1171 tvb
, offset
+ (i
>>1), 1, ENC_BIG_ENDIAN
);
1177 elem_fcn gmr1_ie_rr_func
[NUM_GMR1_IE_RR
] = {
1178 gmr1_ie_rr_chan_desc
, /* Channel Description */
1179 gmr1_ie_rr_chan_mode
, /* Channel Mode */
1180 gmr1_ie_rr_ciph_mode_setting
, /* Cipher Mode Setting */
1181 gmr1_ie_rr_ciph_resp
, /* Cipher Response */
1182 gmr1_ie_rr_l2_pseudo_len
, /* L2 Pseudo Length */
1183 gmr1_ie_rr_page_mode
, /* Page Mode */
1184 gmr1_ie_rr_req_ref
, /* Request Reference */
1185 gmr1_ie_rr_cause
, /* RR Cause */
1186 gmr1_ie_rr_timing_ofs
, /* Timing Offset */
1187 gmr1_ie_rr_tmsi_ptmsi
, /* TMSI/P-TMSI */
1188 gmr1_ie_rr_wait_ind
, /* Wait Indication */
1189 gmr1_ie_rr_mes_info_flg
, /* MES Information Flag */
1190 gmr1_ie_rr_freq_ofs
, /* Frequency Offset */
1191 gmr1_ie_rr_page_info
, /* Paging Information */
1192 gmr1_ie_rr_pos_display
, /* Position Display */
1193 gmr1_ie_rr_pos_upd_info
, /* Position Update Information */
1194 gmr1_ie_rr_bcch_carrier
, /* BCCH Carrier */
1195 gmr1_ie_rr_reject_cause
, /* Reject Cause */
1196 gmr1_ie_rr_gps_timestamp
, /* GPS timestamp */
1197 gmr1_ie_rr_pwr_ctrl_prm
, /* Power Control Params */
1198 gmr1_ie_rr_tmsi_avail_msk
, /* TMSI Availability Mask */
1199 gmr1_ie_rr_gps_almanac
, /* GPS Almanac Data */
1200 gmr1_ie_rr_msc_id
, /* MSC ID */
1201 gmr1_ie_rr_gps_discr
, /* GPS Discriminator */
1202 gmr1_ie_rr_pkt_imm_ass_3_prm
, /* Packet Imm. Ass. Type 3 Params */
1203 gmr1_ie_rr_pkt_freq_prm
, /* Packet Frequency Parameters */
1204 gmr1_ie_rr_pkt_imm_ass_2_prm
, /* Packet Imm. Ass. Type 2 Params */
1205 gmr1_ie_rr_usf
, /* USF */
1206 gmr1_ie_rr_timing_adv_idx
, /* Timing Advance Index */
1207 gmr1_ie_rr_tlli
, /* TLLI */
1208 gmr1_ie_rr_pkt_pwr_ctrl_prm
, /* Packet Power Control Params */
1209 gmr1_ie_rr_persistence_lvl
, /* Persistence Level */
1213 /* ------------------------------------------------------------------------ */
1215 /* ------------------------------------------------------------------------ */
1217 /* [1] 10.1.18 - Immediate Assignment */
1218 GMR1_MSG_FUNC(gmr1_rr_msg_imm_ass
)
1224 /* MES Information Flag [1] 11.5.2.44 - M V 1 */
1225 mif
= tvb_get_guint8(tvb
, curr_offset
);
1227 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_MES_INFO_FLG
, NULL
);
1229 /* Request Reference 1 (MES1) [1] 11.5.2.30 - M V 2 */
1230 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_REQ_REF
, " - MES1");
1232 /* GPS Discriminator [1] 11.5.2.101 - C V 2 */
1233 if ((mif
& 0x03) != 0x02) {
1234 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_GPS_DISCR
, " - MES1");
1237 /* Channel Description [1] 11.5.2.5 - C V 4 */
1238 if ((mif
& 0x03) != 0x03) {
1239 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_CHAN_DESC
, " - MES1");
1242 /* Timing Offset [1] 11.5.2.40 - C V 2 */
1243 if ((mif
& 0x03) != 0x03) {
1244 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_TIMING_OFS
, " - MES1");
1247 /* Frequency Offset [1] 11.5.2.49 - C V 2 */
1248 if ((mif
& 0x03) != 0x03) {
1249 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_FREQ_OFS
, " - MES1");
1252 /* Idle Mode Pos. Upd. Info. [1] 11.5.2.54 - C V 2 */
1254 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_POS_UPD_INFO
, " - Idle Mode");
1257 /* Ded. Mode Pos. Upd. Info. [1] 11.5.2.54 - C V 2 */
1259 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_POS_UPD_INFO
, " - Dedicated Mode");
1262 /* Request Reference 2 (MES2) [1] 11.5.2.30 - C V 2 */
1264 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_REQ_REF
, " - MES2");
1267 /* Request Reference 3 (MES3) [1] 11.5.2.30 - C V 2 */
1269 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_REQ_REF
, " - MES3");
1272 /* Request Reference 4 (MES4) [1] 11.5.2.30 - C V 2 */
1274 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_REQ_REF
, " - MES4");
1277 /* IA Rest Octets [1] 11.5.2.16 - M V 0..18 */
1283 /* [1] 10.1.20.1 - Immediate Assignment Reject Type 1 */
1284 GMR1_MSG_FUNC(gmr1_rr_msg_imm_ass_rej_1
)
1290 /* Request Reference 1 (MES1) [1] 11.5.2.30 - M V 2 */
1291 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_REQ_REF
, " - MES1");
1293 /* GPS Discriminator [1] 11.5.2.101 - M V 2 */
1294 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_GPS_DISCR
, NULL
);
1296 /* Reject Cause [1] 11.5.2.56 - M V 1 */
1297 rej_cause
= tvb_get_guint8(tvb
, curr_offset
);
1299 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_REJECT_CAUSE
, NULL
);
1301 /* Wait Indication 1 (MES1) [4] 10.5.2.43 - C V 1 */
1302 if ((rej_cause
& 0xfc) == 0x00) {
1303 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_WAIT_IND
, " - MES1");
1306 /* Request Reference 2 (MES2) [1] 11.5.2.30 - M V 2 */
1307 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_REQ_REF
, " - MES2");
1309 /* Wait Indication 2 (MES2) [4] 10.5.2.43 - M V 1 */
1310 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_WAIT_IND
, " - MES2");
1312 /* Request Reference 3 (MES3) [1] 11.5.2.30 - M V 2 */
1313 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_REQ_REF
, " - MES3");
1315 /* Wait Indication 3 (MES3) [4] 10.5.2.43 - M V 1 */
1316 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_WAIT_IND
, " - MES3");
1318 /* Request Reference 4 (MES4) [1] 11.5.2.30 - M V 2 */
1319 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_REQ_REF
, " - MES4");
1321 /* Wait Indication 4 (MES4) [4] 10.5.2.43 - M V 1 */
1322 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_WAIT_IND
, " - MES4");
1324 /* Idle Mode Position Update Info. [1] 11.5.2.54 - M V 2 */
1325 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_POS_UPD_INFO
, " - Idle Mode");
1327 /* BCCH Carrier Specification [1] 11.5.2.55 - C V 2 */
1328 if (rej_cause
& 1) {
1329 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_BCCH_CARRIER
, NULL
);
1332 /* MSC ID [1] 11.5.2.100 - C V 1 */
1333 if ((rej_cause
& 0xfc) == 0x5c) {
1334 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_MSC_ID
, NULL
);
1337 /* IAR Rest Octets [1] 11.5.2.17 - M V 1..4 */
1343 /* [1] 10.1.20.4 - Position Verification Notify */
1344 GMR1_MSG_FUNC(gmr1_rr_msg_pos_verif_notify
)
1348 /* Request Reference [1] 11.5.2.30 - M V 2 */
1349 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_REQ_REF
, NULL
);
1351 /* GPS Discriminator [1] 11.5.2.101 - M V 2 */
1352 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_GPS_DISCR
, NULL
);
1354 /* Position Display [1] 11.5.2.52 - M V 11 */
1355 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_POS_DISPLAY
, NULL
);
1357 /* 78 Idle Mode Position Update Info. [1] 11.5.2.54 - O TV 3 */
1358 ELEM_OPT_TV(0x78, GMR1_IE_RR
, GMR1_IE_RR_POS_UPD_INFO
, NULL
);
1360 /* IAR Rest Octets [1] 11.5.2.17 - M V 3..6 */
1366 /* [3] 10.1.18.3 - Immediate Assignment Type 2 */
1367 GMR1_MSG_FUNC(gmr1_rr_msg_imm_ass_2
)
1371 /* USF [3] 11.5.2.110 - M V 3 */
1372 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_USF
, NULL
);
1374 /* Timing Advance Index [3] 10.1.18.3.4 - M V 1 */
1375 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_TIMING_ADV_IDX
, NULL
);
1377 /* TLLI [5] 12.16 - M V 4 */
1378 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_TLLI
, NULL
);
1380 /* Timing Offset [1] 11.5.2.40 - M V 2 */
1381 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_TIMING_OFS
, NULL
);
1383 /* Frequency Offset [1] 11.5.2.49 - M V 2 */
1384 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_FREQ_OFS
, NULL
);
1386 /* Packet Imm. Ass. Type 2 Params. [3] 11.5.2.107 - M V 5 */
1387 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_PKT_IMM_ASS_2_PRM
, NULL
);
1389 /* Packet Frequency Parameters [3] 11.5.2.106 - M V 3 */
1390 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_PKT_FREQ_PRM
, NULL
);
1392 /* Packet Power Control Parameters [3] 10.1.18.3.3 - M V 1 */
1393 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_PKT_PWR_CTRL_PRM
, NULL
);
1398 /* [3] 10.1.18.4 - Immediate Assignment Type 3 */
1399 GMR1_MSG_FUNC(gmr1_rr_msg_imm_ass_3
)
1403 /* Page Mode [1] 11.5.2.26 - M V 1/2 */
1404 /* Spare Half Octet [1] 11.5.1.8 - M V 1/2 */
1405 ELEM_MAND_VV_SHORT(GMR1_IE_RR
, GMR1_IE_RR_PAGE_MODE
,
1406 GMR1_IE_COMMON
, GMR1_IE_COM_SPARE_NIBBLE
);
1408 /* Persistence Level [3] 10.1.18.4.2 - M V 2 */
1409 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_PERSISTENCE_LVL
, NULL
);
1411 /* Timing Advance Index [3] 10.1.18.3.4 - M V 1 */
1412 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_TIMING_ADV_IDX
, NULL
);
1414 /* TLLI [5] 12.16 - M V 4 */
1415 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_TLLI
, NULL
);
1417 /* Packet Imm. Ass. Type 3 Params [3] 11.5.2.105 - M V 3 */
1418 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_PKT_IMM_ASS_3_PRM
, NULL
);
1420 /* Packet Frequency Parameters [3] 11.5.2.106 - M V 3 */
1421 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_PKT_FREQ_PRM
, NULL
);
1423 /* Packet Power Control Parameters [3] 10.1.18.3.3 - M V 1 */
1424 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_PKT_PWR_CTRL_PRM
, NULL
);
1426 /* P1 Rest Octets [1] 11.5.2.23 - M V 6 */
1432 /* [3] 10.1.9 - Ciphering Mode Command */
1433 GMR1_MSG_FUNC(gmr1_rr_msg_ciph_mode_cmd
)
1437 /* Cipher Mode Setting [4] 10.5.2.9 - M V 1/2 */
1438 /* Cipher Response [4] 10.5.2.10 - M V 1/2 */
1439 ELEM_MAND_VV_SHORT(GMR1_IE_RR
, GMR1_IE_RR_CIPH_MODE_SETTING
,
1440 GMR1_IE_RR
, GMR1_IE_RR_CIPH_RESP
);
1442 /* 75 Position Display [1] 11.5.2.52 - O TV 12 */
1443 ELEM_OPT_TV(0x75, GMR1_IE_RR
, GMR1_IE_RR_POS_DISPLAY
, NULL
);
1448 /* [1] 10.1.10 - Ciphering Mode Complete */
1449 GMR1_MSG_FUNC(gmr1_rr_msg_ciph_mode_complete
)
1453 /* 17 Mobile Identity [1] 11.5.1.4 - O TLV 3-11 */
1454 ELEM_OPT_TLV(0x17, GSM_A_PDU_TYPE_COMMON
, DE_MID
, NULL
);
1456 /* 76 GPS Timestamp [1] 11.5.2.57 - O TV 3 */
1457 ELEM_OPT_TV(0x76, GMR1_IE_RR
, GMR1_IE_RR_GPS_TIMESTAMP
, NULL
);
1462 /* [1] 10.1.2.1 - Assignment Command 1 */
1463 GMR1_MSG_FUNC(gmr1_rr_msg_ass_cmd_1
)
1467 /* Channel Description [1] 11.5.2.5 - M V 4 */
1468 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_CHAN_DESC
, NULL
);
1470 /* 7D Timing Offset [1] 11.5.2.40 - O TV 3 */
1471 ELEM_OPT_TV(0x7D, GMR1_IE_RR
, GMR1_IE_RR_TIMING_OFS
, NULL
);
1473 /* 7F Frequency Offset [1] 11.5.2.49 - O TV 3 */
1474 ELEM_OPT_TV(0x7F, GMR1_IE_RR
, GMR1_IE_RR_FREQ_OFS
, NULL
);
1476 /* 63 Channel Mode [1] 11.5.2.6 - O TV 2 */
1477 ELEM_OPT_TV(0x63, GMR1_IE_RR
, GMR1_IE_RR_CHAN_MODE
, NULL
);
1479 /* 71 Power Control Parameters [1] 11.5.2.60 - O TV 6 */
1480 ELEM_OPT_TV(0x71, GMR1_IE_RR
, GMR1_IE_RR_PWR_CTRL_PRM
, NULL
);
1482 /* 9- Cipher Mode Setting [4] 10.5.2.9 - O TV 1 */
1483 ELEM_OPT_TV_SHORT(0x90, GMR1_IE_RR
, GMR1_IE_RR_CIPH_MODE_SETTING
, NULL
);
1488 /* [1] 10.1.7 - Channel Release */
1489 GMR1_MSG_FUNC(gmr1_rr_msg_chan_release
)
1493 /* RR Cause [1] 11.5.2.31 - M V 1 */
1494 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_CAUSE
, NULL
);
1499 /* [1] 10.1.24 - Paging Request Type 3 */
1500 GMR1_MSG_FUNC(gmr1_rr_msg_pag_req_3
)
1506 /* Page Mode [1] 11.5.2.26 - M V 1/2 */
1507 /* TMSI Availability Mask [1] 11.5.2.62 - M V 1/2 */
1508 tam
= (tvb_get_guint8(tvb
, curr_offset
) & 0xf0) >> 4;
1510 ELEM_MAND_VV_SHORT(GMR1_IE_RR
, GMR1_IE_RR_PAGE_MODE
,
1511 GMR1_IE_RR
, GMR1_IE_RR_TMSI_AVAIL_MSK
);
1513 /* Mobile Identity 1 (TMSI) [4] 10.5.2.42 - C V 4 */
1515 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_TMSI_PTMSI
, " - 1");
1518 /* GPS Almanac Data 1 [1] 11.5.2.63 - C V 5 */
1519 if (!(tam
& 0x01)) {
1520 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_GPS_ALMANAC
, " - 1");
1523 /* Mobile Identity 2 (TMSI) [4] 10.5.2.42 - C V 4 */
1525 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_TMSI_PTMSI
, " - 2");
1528 /* GPS Almanac Data 2 [1] 11.5.2.63 - C V 5 */
1529 if (!(tam
& 0x02)) {
1530 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_GPS_ALMANAC
, " - 2");
1533 /* Mobile Identity 3 (TMSI) [4] 10.5.2.42 - C V 4 */
1535 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_TMSI_PTMSI
, " - 3");
1538 /* GPS Almanac Data 3 [1] 11.5.2.63 - C V 5 */
1539 if (!(tam
& 0x04)) {
1540 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_GPS_ALMANAC
, " - 3");
1543 /* Mobile Identity 4 (TMSI) [4] 10.5.2.42 - C V 4 */
1545 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_TMSI_PTMSI
, " - 4");
1548 /* GPS Almanac Data 4 [1] 11.5.2.63 - C V 5 */
1549 if (!(tam
& 0x08)) {
1550 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_GPS_ALMANAC
, " - 4");
1553 /* Paging Information 1 [1] 11.5.2.51 - C V 1 */
1555 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_PAGE_INFO
, " - 1");
1558 /* Paging Information 2 [1] 11.5.2.51 - C V 1 */
1560 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_PAGE_INFO
, " - 2");
1563 /* Paging Information 3 [1] 11.5.2.51 - C V 1 */
1565 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_PAGE_INFO
, " - 3");
1568 /* Paging Information 4 [1] 11.5.2.51 - C V 1 */
1570 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_PAGE_INFO
, " - 4");
1576 /* [1] 10.1.25 - Paging Response */
1577 GMR1_MSG_FUNC(gmr1_rr_msg_pag_resp
)
1581 /* Ciphering Key Sequence Number [4] 10.5.1.2 - M V 1/2 */
1582 /* Spare Half Octet [1] 11.5.1.8 - M V 1/2 */
1583 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_COMMON
, DE_CIPH_KEY_SEQ_NUM
,
1584 GMR1_IE_COMMON
, GMR1_IE_COM_SPARE_NIBBLE
);
1586 /* Mobile Earth Station Classmark 2 [1] 11.5.1.6 - M L V 4 */
1587 ELEM_MAND_LV(GMR1_IE_COMMON
, GMR1_IE_COM_CM2
, NULL
);
1589 /* Mobile Identity [4] 10.5.1.4 - M L V 2-9 */
1590 ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON
, DE_MID
, NULL
);
1595 /* [1] 10.1.5 - Channel Mode Modify */
1596 GMR1_MSG_FUNC(gmr1_rr_msg_chan_mode_modify
)
1600 /* Channel Description [1] 11.5.2.5 - M V 4 */
1601 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_CHAN_DESC
, NULL
);
1603 /* Channel Mode [1] 11.5.2.6 - M V 1 */
1604 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_CHAN_MODE
, NULL
);
1609 /* [1] 10.1.6 - Channel Mode Modify Acknowledge */
1610 GMR1_MSG_FUNC(gmr1_rr_msg_chan_mode_mod_ack
)
1614 /* Channel Description [1] 11.5.2.5 - M V 4 */
1615 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_CHAN_DESC
, NULL
);
1617 /* Channel Mode [1] 11.5.2.6 - M V 1 */
1618 ELEM_MAND_V(GMR1_IE_RR
, GMR1_IE_RR_CHAN_MODE
, NULL
);
1624 /* See [3] 11.4.1 - Table 11.1 */
1625 static const value_string gmr1_msg_rr_strings
[] = {
1626 /* Channel establishment messages */
1627 { 0x3f, "Immediate Assignment" },
1628 { 0x3a, "Immediate Assignment Reject Type 1" },
1629 { 0x3b, "Immediate Assignment Reject Type 2" },
1630 { 0x13e, "Extended Immediate Assignment" }, /* Conflict ... add 0x100 */
1631 { 0x13b, "Extended Imm. Assignment Reject" }, /* Conflict ... add 0x100 */
1632 { 0x39, "Position Verification Notify" },
1633 { 0x3c, "Immediate Assignment Reject Type 3" },
1634 { 0x3e, "Immediate Assignment Type 2" },
1635 { 0x3d, "Immediate Assignment Type 3" },
1637 /* Ciphering messages */
1638 { 0x35, "Ciphering Mode Command" },
1639 { 0x32, "Ciphering Mode Complete" },
1641 /* Channel assignment/handover messages */
1642 { 0x2e, "Assignment Command 1" },
1643 { 0x2a, "Assignment Command 2" },
1644 { 0x29, "Assignment Complete" },
1645 { 0x2f, "Assignment Failure" },
1646 { 0x2b, "Handover Command" },
1647 { 0x2c, "Handover Complete" },
1649 /* Channel release messages */
1650 { 0x0d, "Channel Release" },
1651 { 0x0e, "TtT Signalling Link Failure" },
1653 /* Paging messages */
1654 { 0x21, "Paging Request Type 1" },
1655 { 0x22, "Paging Request Type 2" },
1656 { 0x24, "Paging Request Type 3" },
1657 { 0x27, "Paging Response" },
1659 /* Miscellaneous messages */
1660 { 0x10, "Channel Mode Modify" },
1661 { 0x12, "RR Status" },
1662 { 0x17, "Channel Mode Modify Acknowledge" },
1663 { 0x16, "Classmark Change" },
1664 { 0x13, "Classmark Enquiry" },
1665 { 0x14, "Position Update Request" },
1666 { 0x15, "Position Update Accept" },
1667 { 0x11, "Link Correction Message" },
1669 { 0x01, "Power Control Parameters Update" },
1670 { 0x02, "Guard Time Violation" },
1671 { 0x04, "Extended Channel Request" },
1673 /* Status and Diagnostic Messages */
1674 { 0x40, "Information Request" },
1675 { 0x41, "Information Response Position" },
1676 { 0x42, "Information Response Version" },
1677 { 0x43, "Information Response Spot Beam Selection" },
1678 { 0x44, "Information Response Power Control" },
1679 { 0x45, "Information Response Vendor Specific" },
1680 { 0x46, "Information Response Current Beam" },
1681 { 0x4f, "Information Response Error" },
1688 #define NUM_GMR1_MSG_RR (sizeof(gmr1_msg_rr_strings) / sizeof(value_string))
1689 static gint ett_msg_rr
[NUM_GMR1_MSG_RR
];
1691 /* same order as gmr1_msg_rr_strings */
1692 static const gmr1_msg_func_t gmr1_msg_rr_func
[NUM_GMR1_MSG_RR
] = {
1693 /* Channel establishment messages */
1694 gmr1_rr_msg_imm_ass
, /* Imm. Ass.*/
1695 gmr1_rr_msg_imm_ass_rej_1
, /* Imm. Ass. Reject Type 1 */
1696 NULL
, /* Imm. Ass. Reject Type 2 */
1697 NULL
, /* Extended Imm. Ass. */
1698 NULL
, /* Extended Imm. Ass. Reject */
1699 gmr1_rr_msg_pos_verif_notify
, /* Position Verification Notify */
1700 NULL
, /* Imm. Ass. Reject Type 3 */
1701 gmr1_rr_msg_imm_ass_2
, /* Imm. Ass. Type 2 */
1702 gmr1_rr_msg_imm_ass_3
, /* Imm. Ass. Type 3 */
1704 /* Ciphering messages */
1705 gmr1_rr_msg_ciph_mode_cmd
, /* Ciphering Mode Command */
1706 gmr1_rr_msg_ciph_mode_complete
, /* Ciphering Mode Complete */
1708 /* Channel assignment/handover messages */
1709 gmr1_rr_msg_ass_cmd_1
, /* Assignment Command 1 */
1710 NULL
, /* Assignment Command 2 */
1711 NULL
, /* Assignment Complete */
1712 NULL
, /* Assignment Failure */
1713 NULL
, /* Handover Command */
1714 NULL
, /* Handover Complete */
1716 /* Channel release messages */
1717 gmr1_rr_msg_chan_release
, /* Channel Release */
1718 NULL
, /* TtT Signalling Link Failure */
1720 /* Paging messages */
1721 NULL
, /* Paging Request Type 1 */
1722 NULL
, /* Paging Request Type 2 */
1723 gmr1_rr_msg_pag_req_3
, /* Paging Request Type 3 */
1724 gmr1_rr_msg_pag_resp
, /* Paging Response */
1726 /* Miscellaneous messages */
1727 gmr1_rr_msg_chan_mode_modify
, /* Channel Mode Modify */
1728 NULL
, /* RR Status */
1729 gmr1_rr_msg_chan_mode_mod_ack
, /* Channel Mode Modify Acknowledge */
1730 NULL
, /* Classmark Change */
1731 NULL
, /* Classmark Enquiry */
1732 NULL
, /* Position Update Request */
1733 NULL
, /* Position Update Accept */
1734 NULL
, /* Link Correction Message */
1736 NULL
, /* Power Control Parameters Update */
1737 NULL
, /* Guard Time Violation */
1738 NULL
, /* Extended Channel Request */
1740 /* Status and Diagnostic Messages */
1741 NULL
, /* Info. Req. */
1742 NULL
, /* Info. Resp. Position */
1743 NULL
, /* Info. Resp. Version */
1744 NULL
, /* Info. Resp. Spot Beam Selection */
1745 NULL
, /* Info. Resp. Power Control */
1746 NULL
, /* Info. Resp. Vendor Specific */
1747 NULL
, /* Info. Resp. Current Beam */
1748 NULL
, /* Info. Resp. Error */
1755 gmr1_get_msg_rr_params(guint8 oct
, int dcch
, const gchar
**msg_str
,
1756 int *ett_tree
, int *hf_idx
, gmr1_msg_func_t
*msg_func_p
)
1758 const gchar
*m
= NULL
;
1762 m
= try_val_to_str_idx((guint32
)oct
| 0x100, gmr1_msg_rr_strings
, &idx
);
1765 m
= try_val_to_str_idx((guint32
)oct
, gmr1_msg_rr_strings
, &idx
);
1768 *hf_idx
= hf_rr_msg_type
;
1770 *ett_tree
= ett_msg_rr
[idx
];
1771 *msg_func_p
= gmr1_msg_rr_func
[idx
];
1779 /* ------------------------------------------------------------------------ */
1780 /* Dissector code */
1781 /* ------------------------------------------------------------------------ */
1784 dissect_gmr1_ccch(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
)
1786 guint32 len
, offset
;
1787 gmr1_msg_func_t msg_func
;
1788 const gchar
*msg_str
;
1791 proto_item
*ccch_item
= NULL
, *pd_item
= NULL
;
1792 proto_tree
*ccch_tree
= NULL
, *pd_tree
= NULL
;
1798 len
= tvb_length(tvb
);
1803 /* Can't be a CCCH */
1807 col_append_str(pinfo
->cinfo
, COL_INFO
, "(CCCH) ");
1809 /* First octed with pseudo len */
1810 oct
[0] = tvb_get_guint8(tvb
, offset
++);
1812 /* Check protocol descriptor */
1813 oct
[1] = tvb_get_guint8(tvb
, offset
++);
1815 if ((oct
[1] & GMR1_PD_EXT_MSK
) == GMR1_PD_EXT_VAL
)
1820 col_append_fstr(pinfo
->cinfo
, COL_INFO
, "(%s) ",
1821 val_to_str(pd
, gmr1_pd_short_vals
, "Unknown (%u)"));
1823 if (pd
!= GMR1_PD_RR
)
1824 goto err
; /* CCCH is only RR */
1826 /* Get message parameters */
1827 oct
[2] = tvb_get_guint8(tvb
, offset
);
1829 gmr1_get_msg_rr_params(oct
[2], 0, &msg_str
, &ett_tree
, &hf_idx
, &msg_func
);
1831 /* Create protocol tree */
1832 if (msg_str
== NULL
)
1834 ccch_item
= proto_tree_add_protocol_format(
1835 tree
, proto_gmr1_ccch
, tvb
, 0, len
,
1836 "GMR-1 CCCH - Message Type (0x%02x)", oct
[2]);
1837 ccch_tree
= proto_item_add_subtree(ccch_item
, ett_msg_ccch
);
1839 col_append_fstr(pinfo
->cinfo
, COL_INFO
, "Message Type (0x%02x) ", oct
[2]);
1843 ccch_item
= proto_tree_add_protocol_format(
1844 tree
, proto_gmr1_ccch
, tvb
, 0, -1,
1845 "GMR-1 CCCH - %s", msg_str
);
1846 ccch_tree
= proto_item_add_subtree(ccch_item
, ett_tree
);
1848 col_append_fstr(pinfo
->cinfo
, COL_INFO
, "%s ", msg_str
);
1854 /* L2 Pseudo Length - [1] 11.5.2.19 */
1855 offset
+= elem_v(tvb
, ccch_tree
, pinfo
, GMR1_IE_RR
, GMR1_IE_RR_L2_PSEUDO_LEN
, offset
, NULL
);
1857 /* Protocol discriminator item */
1858 pd_item
= proto_tree_add_text(
1859 ccch_tree
, tvb
, 1, 1,
1860 "Protocol Discriminator: %s",
1861 val_to_str(pd
, gmr1_pd_vals
, "Unknown (%u)")
1864 pd_tree
= proto_item_add_subtree(pd_item
, ett_rr_pd
);
1866 /* Skip indicator / Transaction indicator */
1868 proto_tree_add_item(pd_tree
, hf_gmr1_skip_ind
, tvb
, 1, 1, ENC_BIG_ENDIAN
);
1873 /* Protocol discriminator value */
1874 proto_tree_add_item(pd_tree
, hf_gmr1_l3_pd
, tvb
, 1, 1, ENC_BIG_ENDIAN
);
1880 /* Message type - [1] 11.4 */
1881 proto_tree_add_uint_format(
1882 ccch_tree
, hf_idx
, tvb
, offset
, 1, oct
[2],
1883 "Message Type: %s", msg_str
? msg_str
: "(Unknown)"
1888 /* Decode elements */
1890 (*msg_func
)(tvb
, ccch_tree
, pinfo
, offset
, len
- offset
);
1892 proto_tree_add_text(ccch_tree
, tvb
, offset
, len
- offset
,
1893 "Message Elements");
1899 /* Error handling */
1901 call_dissector(data_handle
, tvb
, pinfo
, tree
);
1905 proto_register_gmr1_rr(void)
1907 static hf_register_info hf
[] = {
1909 { "Radio Resources Management Message Type", "gmr1.rr.msg_type",
1910 FT_UINT8
, BASE_HEX
, VALS(gmr1_msg_rr_strings
), 0x00,
1911 NULL
, HFILL
} /* FIXME handle CCCH/DCCH conflicts */
1913 { &hf_rr_chan_desc_kab_loc
,
1914 { "KAB Location", "gmr1.rr.chan_desc.kab_loc",
1915 FT_UINT8
, BASE_DEC
, NULL
, 0x00,
1918 { &hf_rr_chan_desc_rx_tn
,
1919 { "RX Timeslot", "gmr1.rr.chan_desc.rx_tn",
1920 FT_UINT8
, BASE_DEC
, NULL
, 0x00,
1923 { &hf_rr_chan_desc_arfcn
,
1924 { "ARFCN", "gmr1.rr.chan_desc.arfcn",
1925 FT_UINT16
, BASE_DEC
, NULL
, 0x00,
1928 { &hf_rr_chan_desc_tx_tn
,
1929 { "TX Timeslot", "gmr1.rr.chan_desc.tx_tn",
1930 FT_UINT8
, BASE_DEC
, NULL
, 0x00,
1933 { &hf_rr_chan_desc_chan_type
,
1934 { "Channel Type", "gmr1.rr.chan_desc.chan_type",
1935 FT_UINT8
, BASE_DEC
, VALS(rr_chan_desc_chan_type_vals
), 0x00,
1939 { "Channel Mode", "gmr1.rr.chan_mode",
1940 FT_UINT8
, BASE_DEC
, VALS(rr_chan_mode_vals
), 0x00,
1943 { &hf_rr_ciph_mode_setting_sc
,
1944 { "SC", "gmr1.rr.ciph_mode_setting.sc",
1945 FT_UINT8
, BASE_DEC
, VALS(rr_ciph_mode_setting_sc_vals
), 0x01,
1948 { &hf_rr_ciph_mode_setting_algo
,
1949 { "Algorithm", "gmr1.rr.ciph_mode_setting.algo",
1950 FT_UINT8
, BASE_DEC
, VALS(rr_ciph_mode_setting_algo_vals
), 0x0e,
1953 { &hf_rr_ciph_resp_cr
,
1954 { "CR", "gmr1.rr.ciph_resp.cr",
1955 FT_UINT8
, BASE_DEC
, VALS(rr_ciph_resp_cr_vals
), 0x10,
1958 { &hf_rr_ciph_resp_spare
,
1959 { "Spare", "gmr1.rr.ciph_resp.spare",
1960 FT_UINT8
, BASE_DEC
, NULL
, 0xe0,
1963 { &hf_rr_l2_pseudo_len
,
1964 { "L2 Pseudo Length value", "gmr1.rr.l2_pseudo_len",
1965 FT_UINT8
, BASE_DEC
, NULL
, 0xfc,
1969 { "Page Mode", "gmr1.rr.page_mode.mode",
1970 FT_UINT8
, BASE_DEC
, VALS(rr_page_mode_vals
), 0x03,
1973 { &hf_rr_page_mode_spare
,
1974 { "Spare", "gmr1.rr.page_mode.spare",
1975 FT_UINT8
, BASE_DEC
, NULL
, 0x0c,
1978 { &hf_rr_req_ref_est_cause
,
1979 { "Establishment cause group ID", "gmr1.rr.req_ref.est_cause",
1980 FT_UINT8
, BASE_DEC
, VALS(rr_req_ref_est_cause_vals
), 0xe0,
1983 { &hf_rr_req_ref_ra
,
1984 { "Random Access Information", "gmr1.rr.req_ref.ra",
1985 FT_UINT8
, BASE_HEX
, NULL
, 0x1f,
1988 { &hf_rr_req_ref_fn
,
1989 { "Frame Number mod 256", "gmr1.rr.req_ref.fn",
1990 FT_UINT8
, BASE_DEC
, NULL
, 0x00,
1994 { "RR Cause", "gmr1.rr.cause",
1995 FT_UINT8
, BASE_DEC
, VALS(rr_cause_vals
), 0x00,
1998 { &hf_rr_timing_ofs_ti
,
1999 { "TI", "gmr1.rr.timing_offset.ti",
2000 FT_UINT8
, BASE_DEC
, VALS(rr_timing_ofs_ti_vals
), 0x00,
2003 { &hf_rr_timing_ofs_value
,
2004 { "Timing Offset value", "gmr1.rr.timing_offset.value",
2005 FT_INT16
, BASE_CUSTOM
, rr_timing_ofs_value_fmt
, 0x00,
2008 { &hf_rr_tmsi_ptmsi
,
2009 { "TMSI/P-TMSI Value","gmr1.rr.tmsi_ptmsi",
2010 FT_UINT32
,BASE_HEX
, NULL
, 0x00,
2013 { &hf_rr_wait_ind_timeout
,
2014 { "T3122/T3142 timeout", "gmr1.rr.wait_ind.timeout",
2015 FT_UINT8
, BASE_CUSTOM
, rr_gen_ie_seconds_fmt
, 0x00,
2018 { &hf_rr_mif_mes1_ab
,
2019 { "MES1 - Assignment Type", "gmr1.rr.mes_info_flag.1.ab",
2020 FT_UINT8
, BASE_DEC
, VALS(rr_mif_mes1_ab_vals
), 0x03,
2023 { &hf_rr_mif_mes1_i
,
2024 { "MES1 - Idle mode position update", "gmr1.rr.mes_info_flag.1.i",
2025 FT_UINT8
, BASE_DEC
, VALS(rr_gen_ie_presence_vals
), 0x04,
2028 { &hf_rr_mif_mes1_d
,
2029 { "MES1 - Dedicated mode position update", "gmr1.rr.mes_info_flag.1.d",
2030 FT_UINT8
, BASE_DEC
, VALS(rr_gen_ie_presence_vals
), 0x08,
2034 { "MES2", "gmr1.rr.mes_info_flag.2",
2035 FT_UINT8
, BASE_DEC
, VALS(rr_mif_mes234_vals
), 0x10,
2039 { "MES3", "gmr1.rr.mes_info_flag.3",
2040 FT_UINT8
, BASE_DEC
, VALS(rr_mif_mes234_vals
), 0x20,
2044 { "MES4", "gmr1.rr.mes_info_flag.4",
2045 FT_UINT8
, BASE_DEC
, VALS(rr_mif_mes234_vals
), 0x40,
2049 { "Position Verification indicator", "gmr1.rr.mes_info_flag.pv",
2050 FT_UINT8
, BASE_DEC
, VALS(rr_mif_pv_vals
), 0x80,
2053 { &hf_rr_freq_ofs_fi
,
2054 { "FI", "gmr1.rr.frequency_offset.fi",
2055 FT_UINT8
, BASE_DEC
, VALS(rr_freq_ofs_fi_vals
), 0x00,
2058 { &hf_rr_freq_ofs_value
,
2059 { "Frequency Offset value", "gmr1.rr.frequency_offset.value",
2060 FT_INT16
, BASE_CUSTOM
, rr_freq_ofs_value_fmt
, 0x00,
2063 { &hf_rr_freq_ofs_spare
,
2064 { "Spare", "gmr1.rr.frequency_offset.spare",
2065 FT_UINT8
, BASE_DEC
, NULL
, 0x00,
2068 { &hf_rr_page_info_msc_id
,
2069 { "MSC ID", "gmr1.rr.paging_info.msc_id",
2070 FT_UINT8
, BASE_DEC
, NULL
, 0xfc,
2073 { &hf_rr_page_info_chan_needed
,
2074 { "Channel Needed", "gmr1.rr.paging_info.chan_needed",
2075 FT_UINT8
, BASE_DEC
, VALS(rr_page_info_chan_needed_vals
), 0x03,
2078 { &hf_rr_pos_display_flag
,
2079 { "Display Information Flag", "gmr1.rr.pos_display.flag",
2080 FT_UINT8
, BASE_DEC
, VALS(rr_pos_display_flag_vals
), 0xf0,
2083 { &hf_rr_pos_display_text
,
2084 { "Country and Region name", "gmr1.rr.pos_display.text",
2085 FT_STRING
, BASE_NONE
, NULL
, 0x00,
2088 { &hf_rr_pos_upd_info_v
,
2089 { "Valid", "gmr1.rr.pos_upd_info.valid",
2090 FT_UINT8
, BASE_DEC
, VALS(rr_pos_upd_info_v_vals
), 0x01,
2093 { &hf_rr_pos_upd_info_dist
,
2094 { "GPS Update Distance", "gmr1.rr.pos_upd_info.distance",
2095 FT_UINT8
, BASE_CUSTOM
, rr_pos_upd_info_dist_fmt
, 0xfe,
2098 { &hf_rr_pos_upd_info_time
,
2099 { "GPS Update Timer", "gmr1.rr.pos_upd_info.time",
2100 FT_UINT8
, BASE_CUSTOM
, rr_pos_upd_info_time_fmt
, 0xff,
2103 { &hf_rr_bcch_carrier_arfcn
,
2104 { "ARFCN", "gmr1.rr.bcch_carrier.arfcn",
2105 FT_UINT16
, BASE_DEC
, NULL
, 0x00,
2108 { &hf_rr_bcch_carrier_si
,
2109 { "Satellite Indication", "gmr1.rr.bcch_carrier.si",
2110 FT_UINT8
, BASE_DEC
, VALS(rr_bcch_carrier_si_vals
), 0x00,
2113 { &hf_rr_bcch_carrier_ri
,
2114 { "Reselection Indication", "gmr1.rr.bcch_carrier.ri",
2115 FT_UINT8
, BASE_DEC
, VALS(rr_bcch_carrier_ri_vals
), 0x00,
2118 { &hf_rr_bcch_carrier_spare
,
2119 { "Spare", "gmr1.rr.bcch_carrier.spare",
2120 FT_UINT8
, BASE_DEC
, NULL
, 0x00,
2123 { &hf_rr_reject_cause
,
2124 { "Cause", "gmr1.rr.reject_cause.cause",
2125 FT_UINT8
, BASE_DEC
, VALS(rr_reject_cause_vals
), 0xfc,
2128 { &hf_rr_reject_cause_b
,
2129 { "BCCH Carrier IE presence", "gmr1.rr.reject_cause.b",
2130 FT_UINT8
, BASE_DEC
, VALS(rr_gen_ie_presence_vals
), 0x01,
2133 { &hf_rr_gps_timestamp
,
2134 { "GPS timestamp", "gmr1.rr.gps_timestamp",
2135 FT_UINT16
, BASE_CUSTOM
, rr_gps_timestamp_fmt
, 0xffff,
2138 { &hf_rr_tmsi_avail_msk_tmsi
[0],
2139 { "TMSI 1 Presence", "gmr1.rr.tmsi_avail_msk.tmsi1",
2140 FT_UINT8
, BASE_DEC
, VALS(rr_gen_ie_presence_vals
), 0x10,
2143 { &hf_rr_tmsi_avail_msk_tmsi
[1],
2144 { "TMSI 2 Presence", "gmr1.rr.tmsi_avail_msk.tmsi2",
2145 FT_UINT8
, BASE_DEC
, VALS(rr_gen_ie_presence_vals
), 0x20,
2148 { &hf_rr_tmsi_avail_msk_tmsi
[2],
2149 { "TMSI 3 Presence", "gmr1.rr.tmsi_avail_msk.tmsi3",
2150 FT_UINT8
, BASE_DEC
, VALS(rr_gen_ie_presence_vals
), 0x40,
2153 { &hf_rr_tmsi_avail_msk_tmsi
[3],
2154 { "TMSI 4 Presence", "gmr1.rr.tmsi_avail_msk.tmsi4",
2155 FT_UINT8
, BASE_DEC
, VALS(rr_gen_ie_presence_vals
), 0x80,
2158 { &hf_rr_gps_almanac_pn
,
2159 { "Page Number", "gmr1.rr.gps_almanac.pn",
2160 FT_UINT8
, BASE_CUSTOM
, rr_gps_almanac_pn_fmt
, 0xf8,
2161 "See ICD-GPS-200", HFILL
}
2163 { &hf_rr_gps_almanac_wn
,
2164 { "Word Number", "gmr1.rr.gps_almanac.wn",
2165 FT_UINT8
, BASE_DEC
, NULL
, 0x07,
2166 "See ICD-GPS-200", HFILL
}
2168 { &hf_rr_gps_almanac_word
,
2169 { "GPS Almanac Word", "gmr1.rr.gps_almanac.word",
2170 FT_UINT24
, BASE_HEX
, NULL
, 0x00,
2171 "See ICD-GPS-200", HFILL
}
2173 { &hf_rr_gps_almanac_sfn
,
2174 { "Sub Frame Number", "gmr1.rr.gps_almanac.sfn",
2175 FT_UINT8
, BASE_DEC
, VALS(rr_gps_almanac_sfn_vals
), 0x80,
2176 "See ICD-GPS-200", HFILL
}
2178 { &hf_rr_gps_almanac_co
,
2179 { "CO", "gmr1.rr.gps_almanac.co",
2180 FT_UINT8
, BASE_DEC
, NULL
, 0x40,
2183 { &hf_rr_gps_almanac_spare
,
2184 { "Spare", "gmr1.rr.gps_almanac.spare",
2185 FT_UINT8
, BASE_DEC
, NULL
, 0x3f,
2189 { "MSC ID", "gmr1.rr.msc_id",
2190 FT_UINT8
, BASE_DEC
, NULL
, 0xfc,
2193 { &hf_rr_msc_id_spare
,
2194 { "Spare", "gmr1.rr.msc_id.spare",
2195 FT_UINT8
, BASE_DEC
, NULL
, 0x03,
2199 { "GPS Position field CRC-16", "gmr1.rr.gps_discriminator",
2200 FT_UINT16
, BASE_HEX
, NULL
, 0x00,
2203 { &hf_rr_pkt_imm_ass_3_prm_rlc_mode
,
2204 { "RLC Mode", "gmr1.rr.pkt_imm_ass_3_prm",
2205 FT_UINT8
, BASE_DEC
, VALS(rr_pkt_imm_ass_3_prm_rlc_mode_vals
), 0x01,
2208 { &hf_rr_pkt_imm_ass_3_prm_spare
,
2209 { "Spare", "gmr1.rr.pkt_imm_ass_3_prm.spare",
2210 FT_UINT8
, BASE_DEC
, NULL
, 0x1e,
2213 { &hf_rr_pkt_imm_ass_3_prm_dl_tfi
,
2214 { "Downlink TFI", "gmr1.rr.pkt_imm_ass_3_prm.tfi",
2215 FT_UINT8
, BASE_HEX
, NULL
, 0x00,
2216 "Temporary Flow Identifier", HFILL
}
2218 { &hf_rr_pkt_imm_ass_3_prm_start_fn
,
2219 { "Start Framenumber", "gmr1.rr.pkt_imm_ass_3_prm.start_fn",
2220 FT_UINT8
, BASE_DEC
, NULL
, 0xf0,
2223 { &hf_rr_pkt_imm_ass_3_prm_mac_slot_alloc
,
2224 { "MAC-slot Allocation", "gmr1.rr.pkt_imm_ass_3_prm.mac_slot_alloc",
2225 FT_UINT8
, BASE_HEX
, NULL
, 0xff,
2226 "LSB=slot 0, MSB=slot 7", HFILL
}
2228 { &hf_rr_pkt_freq_prm_arfcn
,
2229 { "ARFCN", "gmr1.rr.pkt_freq_prm.arfcn",
2230 FT_UINT16
, BASE_DEC
, NULL
, 0x00,
2233 { &hf_rr_pkt_freq_prm_dl_freq_plan_id
,
2234 { "Downlink Freq. Plan ID", "gmr1.rr.pkt_freq_prm.dl_freq_plan_id",
2235 FT_UINT8
, BASE_DEC
, VALS(rr_pkt_freq_prm_dl_freq_plan_id_vals
), 0x08,
2238 { &hf_rr_pkt_freq_prm_dl_bw
,
2239 { "Downlink Bandwidth", "gmr1.rr.pkt_freq_prm.dl_bw",
2240 FT_UINT8
, BASE_CUSTOM
, rr_pkt_freq_prm_xx_bw_fmt
, 0x70,
2243 { &hf_rr_pkt_freq_prm_ul_freq_dist
,
2244 { "Uplink Freq. Distance", "gmr1.rr.pkt_freq_prm.ul_freq_dist",
2245 FT_INT8
, BASE_DEC
, NULL
, 0x00,
2248 { &hf_rr_pkt_freq_prm_ul_bw
,
2249 { "Uplink Bandwidth", "gmr1.rr.pkt_freq_prm.ul_bw",
2250 FT_UINT8
, BASE_CUSTOM
, rr_pkt_freq_prm_xx_bw_fmt
, 0x70,
2253 { &hf_rr_pkt_freq_prm_spare
,
2254 { "Spare", "gmr1.rr.pkt_freq_prm.spare",
2255 FT_UINT8
, BASE_DEC
, NULL
, 0x80,
2258 { &hf_rr_pkt_imm_ass_2_prm_ac_spare1
,
2259 { "Spare", "gmr1.rr.pkt_imm_ass_2_prm.ac.spare1",
2260 FT_UINT8
, BASE_DEC
, NULL
, 0x01,
2263 { &hf_rr_pkt_imm_ass_2_prm_ac_final_alloc
,
2264 { "Final Allocation", "gmr1.rr.pkt_imm_ass_2_prm.ac.final_alloc",
2265 FT_UINT8
, BASE_DEC
, NULL
, 0x02,
2268 { &hf_rr_pkt_imm_ass_2_prm_ac_usf_granularity
,
2269 { "USF Granularity", "gmr1.rr.pkt_imm_ass_2_prm.ac.usf_granularity",
2270 FT_UINT8
, BASE_DEC
, NULL
, 0x04,
2273 { &hf_rr_pkt_imm_ass_2_prm_ac_dl_ctl_mac_slot
,
2274 { "Downlink Control MAC-slot", "gmr1.rr.pkt_imm_ass_2_prm.ac.dl_ctl_mac_slot",
2275 FT_UINT8
, BASE_DEC
, NULL
, 0x38,
2278 { &hf_rr_pkt_imm_ass_2_prm_ac_mac_mode
,
2279 { "MAC mode", "gmr1.rr.pkt_imm_ass_2_prm.ac.mac_mode",
2280 FT_UINT8
, BASE_DEC
, VALS(rr_pkt_imm_ass_2_prm_ac_mac_mode_vals
), 0xc0,
2283 { &hf_rr_pkt_imm_ass_2_prm_ac_start_fn
,
2284 { "Starting Frame Number", "gmr1.rr.pkt_imm_ass_2_prm.ac.start_fn",
2285 FT_UINT8
, BASE_DEC
, NULL
, 0x0f,
2288 { &hf_rr_pkt_imm_ass_2_prm_ac_rlc_dblk_gnt
,
2289 { "RLC Data Blocks Granted", "gmr1.rr.pkt_imm_ass_2_prm.ac.rlc_dblk_gnt",
2290 FT_UINT8
, BASE_DEC
, NULL
, 0x00,
2293 { &hf_rr_pkt_imm_ass_2_prm_ac_mcs
,
2294 { "MCS", "gmr1.rr.pkt_imm_ass_2_prm.ac.mcs",
2295 FT_UINT8
, BASE_DEC
, NULL
, 0xf8,
2298 { &hf_rr_pkt_imm_ass_2_prm_ac_tfi
,
2299 { "TFI", "gmr1.rr.pkt_imm_ass_2_prm.ac.tfi",
2300 FT_UINT8
, BASE_HEX
, NULL
, 0x7f,
2303 { &hf_rr_pkt_imm_ass_2_prm_ac_spare2
,
2304 { "Spare", "gmr1.rr.pkt_imm_ass_2_prm.ac.spare2",
2305 FT_UINT8
, BASE_HEX
, NULL
, 0x80,
2308 { &hf_rr_pkt_imm_ass_2_prm_ac_mac_slot_alloc
,
2309 { "MAC-slot Allocation", "gmr1.rr.pkt_imm_ass_2_prm.ac.mac_slot_alloc",
2310 FT_UINT8
, BASE_HEX
, NULL
, 0xff,
2311 "LSB=slot 0, MSB=slot 7", HFILL
}
2313 { &hf_rr_pkt_imm_ass_2_prm_d_chan_mcs_cmd
,
2314 { "Channel MCS Command", "gmr1.rr.pkt_imm_ass_2_prm.d.chan_mcs_cmd",
2315 FT_UINT8
, BASE_HEX
, NULL
, 0x0f,
2318 { &hf_rr_pkt_imm_ass_2_prm_d_chan_mcs_cmd_pnb512
,
2319 { "Channel MCS Command PNB 5,12", "gmr1.rr.pkt_imm_ass_2_prm.d.chan_mcs_cmd_pnb512",
2320 FT_UINT8
, BASE_HEX
, NULL
, 0xf0,
2323 { &hf_rr_pkt_imm_ass_2_prm_d_spare1
,
2324 { "Spare", "gmr1.rr.pkt_imm_ass_2_prm.d.spare1",
2325 FT_UINT8
, BASE_HEX
, NULL
, 0xff,
2328 { &hf_rr_pkt_imm_ass_2_prm_d_rlc_dblk_gnt
,
2329 { "RLC Data Blocks Granted", "gmr1.rr.pkt_imm_ass_2_prm.d.rlc_dblk_gnt",
2330 FT_UINT8
, BASE_DEC
, NULL
, 0x7f,
2333 { &hf_rr_pkt_imm_ass_2_prm_d_spare2
,
2334 { "Spare", "gmr1.rr.pkt_imm_ass_2_prm.d.spare2",
2335 FT_UINT8
, BASE_HEX
, NULL
, 0x80,
2338 { &hf_rr_pkt_imm_ass_2_prm_d_tfi
,
2339 { "TFI", "gmr1.rr.pkt_imm_ass_2_prm.d.tfi",
2340 FT_UINT8
, BASE_HEX
, NULL
, 0x7f,
2343 { &hf_rr_pkt_imm_ass_2_prm_d_usf_granularity
,
2344 { "USF Granularity", "gmr1.rr.pkt_imm_ass_2_prm.ac.usf_granularity",
2345 FT_UINT8
, BASE_DEC
, NULL
, 0x80,
2348 { &hf_rr_pkt_imm_ass_2_prm_d_mac_slot_alloc
,
2349 { "MAC-slot Allocation", "gmr1.rr.pkt_imm_ass_2_prm.d.mac_slot_alloc",
2350 FT_UINT8
, BASE_HEX
, NULL
, 0xff,
2351 "LSB=slot 0, MSB=slot 7", HFILL
}
2354 { "Uplink state flag (USF)", "gmr1.rr.usf.value",
2355 FT_UINT8
, BASE_HEX
, NULL
, 0x3f,
2359 { "Spare", "gmr1.rr.usf.spare",
2360 FT_UINT24
, BASE_DEC
, NULL
, 0xffffc0,
2363 { &hf_rr_timing_adv_idx_value
,
2364 { "TAI Value", "gmr1.rr.timing_adv_idx.tai",
2365 FT_UINT8
, BASE_DEC
, NULL
, 0x7f,
2368 { &hf_rr_timing_adv_idx_spare
,
2369 { "Spare", "gmr1.rr.timing_adv_idx.spare",
2370 FT_UINT8
, BASE_DEC
, NULL
, 0x80,
2374 { "TLLI", "gmr1.rr.tlli",
2375 FT_UINT32
, BASE_HEX
, NULL
, 0x00,
2378 { &hf_rr_pkt_pwr_ctrl_prm_par
,
2379 { "Power Attenuation Request (PAR)", "gmr1.rr.pkt_pwr_ctrl_prm.par",
2380 FT_UINT8
, BASE_CUSTOM
, rr_pkt_pwr_ctrl_prm_par_fmt
, 0x3f,
2383 { &hf_rr_pkt_pwr_ctrl_prm_spare
,
2384 { "Spare", "gmr1.rr.pkt_pwr_ctrl_prm.spare",
2385 FT_UINT8
, BASE_DEC
, NULL
, 0xc0,
2388 { &hf_rr_persistence_lvl
[0],
2389 { "for Radio priority 1", "gmr1.rr.persistence_lvl.p1",
2390 FT_UINT8
, BASE_DEC
, NULL
, 0xf0,
2393 { &hf_rr_persistence_lvl
[1],
2394 { "for Radio priority 2", "gmr1.rr.persistence_lvl.p2",
2395 FT_UINT8
, BASE_DEC
, NULL
, 0x0f,
2398 { &hf_rr_persistence_lvl
[2],
2399 { "for Radio priority 3", "gmr1.rr.persistence_lvl.p3",
2400 FT_UINT8
, BASE_DEC
, NULL
, 0xf0,
2403 { &hf_rr_persistence_lvl
[3],
2404 { "for Radio priority 4", "gmr1.rr.persistence_lvl.p4",
2405 FT_UINT8
, BASE_DEC
, NULL
, 0x0f,
2410 #define NUM_INDIVIDUAL_ELEMS 2
2411 static gint
*ett
[NUM_INDIVIDUAL_ELEMS
+
2415 unsigned int last_offset
, i
;
2417 /* Setup protocol subtree array */
2418 ett
[0] = &ett_msg_ccch
;
2419 ett
[1] = &ett_rr_pd
;
2421 last_offset
= NUM_INDIVIDUAL_ELEMS
;
2423 for (i
=0; i
<NUM_GMR1_IE_RR
; i
++,last_offset
++) {
2424 ett_gmr1_ie_rr
[i
] = -1;
2425 ett
[last_offset
] = &ett_gmr1_ie_rr
[i
];
2428 for (i
=0; i
<NUM_GMR1_MSG_RR
; i
++,last_offset
++) {
2430 ett
[last_offset
] = &ett_msg_rr
[i
];
2433 proto_register_subtree_array(ett
, array_length(ett
));
2435 /* Register the protocol name and field description */
2436 proto_gmr1_rr
= proto_register_protocol("GEO-Mobile Radio (1) RR", "GMR-1 RR", "gmr1.rr");
2438 proto_register_field_array(proto_gmr1_rr
, hf
, array_length(hf
));
2440 /* Register the protocol name and field description */
2441 proto_gmr1_ccch
= proto_register_protocol("GEO-Mobile Radio (1) CCCH", "GMR-1 CCCH", "gmr1.ccch");
2443 /* Register dissector */
2444 register_dissector("gmr1_ccch", dissect_gmr1_ccch
, proto_gmr1_ccch
);
2448 proto_reg_handoff_gmr1_rr(void)
2450 data_handle
= find_dissector("data");