1 /* mac_hd_generic_decoder.c
2 * WiMax Generic MAC Header decoder
4 * Copyright (c) 2007 by Intel Corporation.
6 * Author: Lu Pan <lu.pan@intel.com>
10 * Wireshark - Network traffic analyzer
11 * By Gerald Combs <gerald@wireshark.org>
12 * Copyright 1999 Gerald Combs
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
29 /* TODO: Add FT_UINT24 and FT_INT24 cases to gtk_widget_get_toplevel()
30 * to prevent having to make all the changes from BASE_DEC to BASE_HEX
31 * made to this file today: 10/20/06.
44 #include <epan/packet.h>
45 #include <epan/expert.h>
46 #include <epan/address.h>
47 #include <epan/reassemble.h>
49 #include "wimax_utils.h"
51 extern gint proto_wimax
;
53 extern gint seen_a_service_type
;
54 extern gboolean first_gmh
; /* defined in wimax_pdu_decoder.c */
56 extern gint8 arq_enabled
; /* declared in packet-wmx.c */
57 extern gint scheduling_service_type
; /* declared in packet-wmx.c */
59 extern address bs_address
; /* declared in packet-wmx.c */
60 extern guint max_logical_bands
; /* declared in wimax_compact_dlmap_ie_decoder.c */
61 extern gboolean
is_down_link(packet_info
*pinfo
);/* declared in packet-wmx.c */
62 extern void init_wimax_globals(void); /* defined in msg_ulmap.c */
64 static dissector_handle_t mac_mgmt_msg_decoder_handle
= NULL
;
65 static dissector_handle_t mac_ip_handle
= NULL
;
67 /* global variables */
68 gboolean include_cor2_changes
= FALSE
;
71 guint cid_initial_ranging
= 0x0000;
72 guint global_cid_max_basic
= 320;
73 guint cid_max_primary
= 640;
74 guint cid_aas_ranging
= 0xFeFF;
75 guint cid_normal_multicast
= 0xFFFa;
76 guint cid_sleep_multicast
= 0xFFFb;
77 guint cid_idle_multicast
= 0xFFFc;
78 guint cid_frag_broadcast
= 0xFFFd;
79 guint cid_padding
= 0xFFFe;
80 guint cid_broadcast
= 0xFFFF;
82 /* Maximum number of CID's */
85 /* forward reference */
86 static gint
extended_subheader_decoder(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
);
87 static gint
arq_feedback_payload_decoder(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, proto_item
*parent_item
);
89 /* Static variables */
90 static reassembly_table payload_reassembly_table
;
92 gint proto_mac_header_generic_decoder
= -1;
93 static gint ett_mac_header_generic_decoder
= -1;
94 /* static gint ett_mac_subheader_decoder = -1; */
95 static gint ett_mac_mesh_subheader_decoder
= -1;
96 static gint ett_mac_frag_subheader_decoder
= -1;
97 static gint ett_mac_grant_mgmt_subheader_decoder
= -1;
98 static gint ett_mac_pkt_subheader_decoder
= -1;
99 static gint ett_mac_fast_fb_subheader_decoder
= -1;
100 static gint ett_mac_ext_subheader_decoder
= -1;
101 static gint ett_mac_ext_subheader_dl_decoder
= -1;
102 static gint ett_mac_ext_subheader_ul_decoder
= -1;
103 static gint ett_mac_arq_fb_payload_decoder
= -1;
104 static gint ett_mac_data_pdu_decoder
= -1;
105 static gint hf_mac_header_generic_value_bytes
= -1;
107 static guint frag_type
, frag_len
;
108 static guint extended_type
, arq_fb_payload
, seq_number
;
110 static guint cid_adjust
[MAX_CID
]; /* Must not start with 0 */
111 static guint cid_vernier
[MAX_CID
];
112 static guint cid_adj_array_size
= 0;
113 static guint
*cid_adj_array
= NULL
;
114 static guint8
*frag_num_array
= NULL
;
116 static address save_src
;
117 static address save_dst
;
119 #define WIMAX_MAC_HEADER_SIZE 6
120 #define IP_HEADER_BYTE 0x45
122 #define EXTENDED_SUB_HEADER_RSV_MASK 0x80
123 #define EXTENDED_SUB_HEADER_TYPE_MASK 0x7F
125 /* WIMAX GENERIC MAC HEADER FIELDS (figure 19) */
126 /* 1st to 3rd bytes */
127 #define WIMAX_MAC_HEADER_GENERIC_HT 0x800000
128 #define WIMAX_MAC_HEADER_GENERIC_EC 0x400000
129 #define WIMAX_MAC_HEADER_GENERIC_TYPE_5 0x200000
130 #define WIMAX_MAC_HEADER_GENERIC_TYPE_4 0x100000
131 #define WIMAX_MAC_HEADER_GENERIC_TYPE_3 0x080000
132 #define WIMAX_MAC_HEADER_GENERIC_TYPE_2 0x040000
133 #define WIMAX_MAC_HEADER_GENERIC_TYPE_1 0x020000
134 #define WIMAX_MAC_HEADER_GENERIC_TYPE_0 0x010000
135 #define WIMAX_MAC_HEADER_GENERIC_ESF 0x008000
136 #define WIMAX_MAC_HEADER_GENERIC_CI 0x004000
137 #define WIMAX_MAC_HEADER_GENERIC_EKS 0x003000
138 #define WIMAX_MAC_HEADER_GENERIC_RSV 0x000800
139 #define WIMAX_MAC_HEADER_GENERIC_LEN 0x0007FF
141 /* WIMAX GENERIC MAC HEADER 1st byte masks */
142 #define WIMAX_MAC_HEADER_GENERIC_HT_MASK 0x80
143 #define WIMAX_MAC_HEADER_GENERIC_EC_MASK 0x40
144 #define WIMAX_MAC_HEADER_GENERIC_TYPE_MASK 0x3F
145 /* WiMax Generic MAC Header Sub Type Masks */
146 #define GENERIC_SUB_TYPE_0 0x01
147 #define GENERIC_SUB_TYPE_1 0x02
148 #define GENERIC_SUB_TYPE_2 0x04
149 #define GENERIC_SUB_TYPE_3 0x08
150 #define GENERIC_SUB_TYPE_4 0x10
151 #define GENERIC_SUB_TYPE_5 0x20
153 /* WIMAX GENERIC MAC HEADER 2nd byte masks */
154 #define WIMAX_MAC_HEADER_GENERIC_ESF_MASK 0x80
155 #define WIMAX_MAC_HEADER_GENERIC_CI_MASK 0x40
156 #define WIMAX_MAC_HEADER_GENERIC_EKS_MASK 0x30
157 #define WIMAX_MAC_HEADER_GENERIC_LEN_MASK 0x07
159 static int hf_mac_header_generic_ht
= -1;
160 static int hf_mac_header_generic_ec
= -1;
161 static int hf_mac_header_generic_type_0
= -1;
162 static int hf_mac_header_generic_type_1
= -1;
163 static int hf_mac_header_generic_type_2
= -1;
164 static int hf_mac_header_generic_type_3
= -1;
165 static int hf_mac_header_generic_type_4
= -1;
166 static int hf_mac_header_generic_type_5
= -1;
167 static int hf_mac_header_generic_esf
= -1;
168 static int hf_mac_header_generic_ci
= -1;
169 static int hf_mac_header_generic_eks
= -1;
170 static int hf_mac_header_generic_rsv
= -1;
171 static int hf_mac_header_generic_len
= -1;
172 static int hf_mac_header_generic_cid
= -1;
173 static int hf_mac_header_generic_hcs
= -1;
174 static int hf_mac_header_generic_crc
= -1;
176 /* MAC Header types */
177 static const value_string ht_msgs
[] =
184 /* Encryption Controls */
185 static const value_string ec_msgs
[] =
187 { 0, "Not encrypted" },
193 static const value_string esf_msgs
[] =
195 { 0, "Extended subheader is absent" },
196 { 1, "Extended subheader is present" },
200 /* CRC Indicator messages */
201 static const value_string ci_msgs
[] =
203 { 0, "No CRC is included" },
204 { 1, "CRC is included" },
208 /* Sub-Type message 0 */
209 static const value_string type_msg0
[] =
211 { 0, "Fast-feedback allocation subheader(DL)/Grant management subheader(UL) is absent" },
212 { 1, "Fast-feedback allocation subheader(DL)/Grant management subheader(UL) is present" },
216 /* Sub-Type message 1 */
217 static const value_string type_msg1
[] =
219 { 0, "Packing subheader is absent" },
220 { 1, "Packing Subheader is present" },
224 /* Sub-Type message 2 */
225 static const value_string type_msg2
[] =
227 { 0, "Fragmentation subheader is absent" },
228 { 1, "Fragmentation subheader is present" },
232 /* Sub-Type message 3 */
233 static const value_string type_msg3
[] =
235 { 0, "The subheader is not extended" },
236 { 1, "The subheader is extended" },
240 /* Sub-Type message 4 */
241 static const value_string type_msg4
[] =
243 { 0, "ARQ feedback payload is absent" },
244 { 1, "ARQ feedback payload is present" },
248 /* Sub-Type message 5 */
249 static const value_string type_msg5
[] =
251 { 0, "Mesh subheader is absent" },
252 { 1, "Mesh subheader is present" },
256 /* Fast-Feedback Feedback Types */
257 static const value_string fast_fb_types
[] =
259 { 0, "Fast DL measurement" },
260 { 1, "Fast MIMO Feedback, Antenna #0" },
261 { 2, "Fast MIMO Feedback, Antenna #1" },
262 { 3, "MIMO Mode and Permutation Mode Feedback" },
266 /* Extended sub-headers */
267 /* DL sub-header types */
276 } DL_EXT_SUBHEADER_e
;
278 static const value_string dl_ext_sub_header_type
[] =
281 {1, "DL Sleep Control"},
282 {2, "Feedback Request"},
284 {4, "PDU SN (short)"},
285 {5, "PDU SN (long)"},
289 /* DL Sleep Control Extended Subheader field masks (table 13e) */
290 #define DL_SLEEP_CONTROL_POWER_SAVING_CLASS_ID_MASK 0xFC0000 /*0x00003F*/
291 #define DL_SLEEP_CONTROL_OPERATION_MASK 0x020000 /*0x000040*/
292 #define DL_SLEEP_CONTROL_FINAL_SLEEP_WINDOW_EXPONENT_MASK 0x01C000 /*0x000380*/
293 #define DL_SLEEP_CONTROL_FINAL_SLEEP_WINDOW_BASE_MASK 0x003FF0 /*0x0FFC00*/
294 #define DL_SLEEP_CONTROL_RESERVED_MASK 0x00000F /*0xF00000*/
296 /* Feedback Request Extended Subheader field masks (table 13f) */
297 #define FEEDBACK_REQUEST_UIUC_MASK 0xF00000 /*0x00000F*/
298 #define FEEDBACK_REQUEST_FEEDBACK_TYPE_MASK 0x0F0000 /*0x0000F0*/
299 #define FEEDBACK_REQUEST_OFDMA_SYMBOL_OFFSET_MASK 0x00FC00 /*0x003F00*/
300 #define FEEDBACK_REQUEST_SUBCHANNEL_OFFSET_MASK 0x0003F0 /*0x0FC000*/
301 #define FEEDBACK_REQUEST_NUMBER_OF_SLOTS_MASK 0x00000E /*0x700000*/
302 #define FEEDBACK_REQUEST_FRAME_OFFSET_MASK 0x000001 /*0x800000*/
304 /* OFDMA UIUC Values ??? */
305 static const value_string uiuc_values
[] =
307 { 0, "Fast-Feedback Channel" },
308 { 1, "Burst Profile 1" },
309 { 2, "Burst Profile 2" },
310 { 3, "Burst Profile 3" },
311 { 4, "Burst Profile 4" },
312 { 5, "Burst Profile 5" },
313 { 6, "Burst Profile 6" },
314 { 7, "Burst Profile 7" },
315 { 8, "Burst Profile 8" },
316 { 9, "Burst Profile 9" },
317 { 10, "Burst Profile 10" },
318 { 11, "Extended UIUC 2 IE" },
319 { 12, "CDMA Bandwidth Request, CDMA Ranging" },
320 { 13, "PAPR Reduction Allocation, Safety Zone" },
321 { 14, "CDMA Allocation IE" },
322 { 15, "Extended UIUC" },
326 /* UL sub-header types */
334 } UL_EXT_SUBHEADER_e
;
336 static const value_string ul_ext_sub_header_type
[] =
338 {0, "MIMO Mode Feedback"},
339 {1, "UL TX Power Report"},
340 {2, "Mini-feedback"},
341 {3, "PDU SN (short)"},
342 {4, "PDU SN (long)"},
346 /* MIMO Mode Feedback Extended Subheader field masks (table 13g) */
347 #define MIMO_FEEDBACK_TYPE_MASK 0xC0 /*0x03*/
348 #define MIMO_FEEDBACK_CONTENT_MASK 0x3F /*0xFC*/
349 /* Mimo Feedback Types ??? */
350 static const value_string mimo_fb_types
[] =
352 { 0, "Fast DL measurement" },
353 { 1, "Default Feedback with Antenna Grouping" },
354 { 2, "Antenna Selection and Reduced Codebook" },
355 { 3, "Quantized Precoding Weight Feedback" },
359 /* MNI-Feedback Extended Subheader field masks (table 13i) */
360 #define MINI_FEEDBACK_TYPE_MASK 0xF000 /*0x000F*/
361 #define MINI_FEEDBACK_CONTENT_MASK 0x0FFF /*0xFFF0*/
363 static const value_string fb_types
[] =
365 { 0, "CQI and MIMO Feedback" },
366 { 1, "DL average CINR" },
367 { 2, "MIMO Coefficients Feedback" },
368 { 3, "Preferred DL Channel DIUC Feedback" },
369 { 4, "UL Transmission Power" },
370 { 5, "PHY Channel Feedback" },
371 { 6, "AMC Band Indication Bitmap" },
372 { 7, "Life Span of Short-term Precoding Feedback" },
373 { 8, "Multiple Types of Feedback" },
374 { 9, "Long-term Precoding Feedback" },
375 { 10, "Combined DL Average CINR of Active BSs" },
376 { 11, "MIMO Channel Feedback" },
377 { 12, "CINR Feedback" },
378 { 13, "Close-loop MIMO Feedback" },
385 static gint hf_mac_header_generic_ext_subheader_rsv
= -1;
387 static gint hf_mac_header_generic_ext_subheader_type_dl
= -1;
388 static gint hf_mac_header_generic_ext_subheader_sdu_sn
= -1;
389 static gint hf_mac_header_generic_ext_subheader_dl_sleep_control_pscid
= -1;
390 static gint hf_mac_header_generic_ext_subheader_dl_sleep_control_op
= -1;
391 static gint hf_mac_header_generic_ext_subheader_dl_sleep_control_fswe
= -1;
392 static gint hf_mac_header_generic_ext_subheader_dl_sleep_control_fswb
= -1;
393 static gint hf_mac_header_generic_ext_subheader_dl_sleep_control_rsv
= -1;
394 static gint hf_mac_header_generic_ext_subheader_fb_req_uiuc
= -1;
395 static gint hf_mac_header_generic_ext_subheader_fb_req_fb_type
= -1;
396 static gint hf_mac_header_generic_ext_subheader_fb_req_ofdma_symbol_offset
= -1;
397 static gint hf_mac_header_generic_ext_subheader_fb_req_subchannel_offset
= -1;
398 static gint hf_mac_header_generic_ext_subheader_fb_req_slots
= -1;
399 static gint hf_mac_header_generic_ext_subheader_fb_req_frame_offset
= -1;
401 /* DL Sleep Control Operations */
402 static const value_string dl_sleep_control_ops
[] =
404 { 0, "De-activate Power Saving Class" },
405 { 1, "Activate Power Saving Class" },
410 static gint hf_mac_header_generic_ext_subheader_type_ul
= -1;
411 static gint hf_mac_header_generic_ext_subheader_mimo_mode_fb_type
= -1;
412 static gint hf_mac_header_generic_ext_subheader_mimo_fb_content
= -1;
413 static gint hf_mac_header_generic_ext_subheader_ul_tx_pwr_rep
= -1;
414 static gint hf_mac_header_generic_ext_subheader_mini_fb_type
= -1;
415 static gint hf_mac_header_generic_ext_subheader_mini_fb_content
= -1;
417 static gint hf_mac_header_generic_ext_subheader_pdu_sn_short
= -1;
418 static gint hf_mac_header_generic_ext_subheader_pdu_sn_long
= -1;
420 /* SN Request subheader */
421 #define SN_REQUEST_SUBHEADER_SN_REPORT_INDICATION_1_MASK 0x01
422 #define SN_REQUEST_SUBHEADER_SN_REPORT_INDICATION_2_MASK 0x02
423 #define SN_REQUEST_SUBHEADER_RESERVED_MASK 0xFC
425 static gint hf_mac_header_generic_ext_subheader_sn_req_rep_ind_1
= -1;
426 static gint hf_mac_header_generic_ext_subheader_sn_req_rep_ind_2
= -1;
427 static gint hf_mac_header_generic_ext_subheader_sn_req_rsv
= -1;
428 /* SN Report Indication message */
429 static const value_string sn_rep_msg
[] =
432 { 1, "request transmission" },
437 static gint hf_mac_header_generic_mesh_subheader
= -1;
439 /* Fragmentation Subheader (table 8) */
440 #define FRAGMENTATION_SUBHEADER_FC_MASK 0xC000 /*0x0003*/
441 #define FRAGMENTATION_SUBHEADER_BSN_MASK 0x3FF8 /*0x1FFC*/
442 #define FRAGMENTATION_SUBHEADER_RSV_EXT_MASK 0x0007 /*0xE000*/
443 #define FRAGMENTATION_SUBHEADER_FSN_MASK 0x38 /*0x1C*/
444 #define FRAGMENTATION_SUBHEADER_RSV_MASK 0x07 /*0xE0*/
445 #define FRAGMENT_TYPE_MASK 0xC0
446 #define SEQ_NUMBER_MASK 0x38
447 #define SEQ_NUMBER_MASK_11 0x3FF8
452 #define MIDDLE_FRAG 3
454 static gint hf_mac_header_generic_frag_subhd_fc
= -1;
455 static gint hf_mac_header_generic_frag_subhd_fc_ext
= -1;
456 static gint hf_mac_header_generic_frag_subhd_bsn
= -1;
457 static gint hf_mac_header_generic_frag_subhd_fsn
= -1;
458 static gint hf_mac_header_generic_frag_subhd_fsn_ext
= -1;
459 static gint hf_mac_header_generic_frag_subhd_rsv
= -1;
460 static gint hf_mac_header_generic_frag_subhd_rsv_ext
= -1;
463 static const value_string frag_types
[] =
465 { 0, "No fragmentation" },
466 { 1, "Last fragment" },
467 { 2, "First fragment" },
468 { 3, "Continuing (middle) fragment" },
472 /* Packing Subheader (table 11) */
473 #define PACKING_SUBHEADER_FC_MASK 0xC00000
474 #define PACKING_SUBHEADER_BSN_MASK 0x3FF800
475 #define PACKING_SUBHEADER_FSN_MASK 0x38
476 #define PACKING_SUBHEADER_LENGTH_MASK 0x07FF
477 #define PACKING_SUBHEADER_LENGTH_EXT_MASK 0x0007FF
479 #define FRAG_LENGTH_MASK 0x0007FF00
481 static gint hf_mac_header_generic_packing_subhd_fc
= -1;
482 static gint hf_mac_header_generic_packing_subhd_fc_ext
= -1;
483 static gint hf_mac_header_generic_packing_subhd_bsn
= -1;
484 static gint hf_mac_header_generic_packing_subhd_fsn
= -1;
485 static gint hf_mac_header_generic_packing_subhd_fsn_ext
= -1;
486 static gint hf_mac_header_generic_packing_subhd_len
= -1;
487 static gint hf_mac_header_generic_packing_subhd_len_ext
= -1;
489 /* Fast-feedback Allocation Subheader (table 13) */
490 #define FAST_FEEDBACK_ALLOCATION_OFFSET_MASK 0xFC /*0x3F*/
491 #define FAST_FEEDBACK_FEEDBACK_TYPE_MASK 0x03 /*0xC0*/
493 static gint hf_mac_header_generic_fast_fb_subhd_alloc_offset
= -1;
494 static gint hf_mac_header_generic_fast_fb_subhd_fb_type
= -1;
496 /* Grant Management Subheader (table 9 & 10) */
497 #define GRANT_MGMT_SUBHEADER_UGS_SI_MASK 0x8000 /*0x0001*/
498 #define GRANT_MGMT_SUBHEADER_UGS_PM_MASK 0x4000 /*0x0002*/
499 #define GRANT_MGMT_SUBHEADER_UGS_FLI_MASK 0x2000 /*0x0004*/
500 #define GRANT_MGMT_SUBHEADER_UGS_FL_MASK 0x1E00 /*0x0078*/
501 #define GRANT_MGMT_SUBHEADER_UGS_RSV_MASK 0x01FF /*0xFF80*/
502 #define GRANT_MGMT_SUBHEADER_EXT_PBR_MASK 0xFFE0 /*0x07FF*/
503 #define GRANT_MGMT_SUBHEADER_EXT_FLI_MASK 0x0010 /*0x0800*/
504 #define GRANT_MGMT_SUBHEADER_EXT_FL_MASK 0x000F /*0xF000*/
508 SCHEDULE_SERVICE_TYPE_RSVD
,
509 SCHEDULE_SERVICE_TYPE_UNDEFINED
,
510 SCHEDULE_SERVICE_TYPE_BE
,
511 SCHEDULE_SERVICE_TYPE_NRTPS
,
512 SCHEDULE_SERVICE_TYPE_RTPS
,
513 SCHEDULE_SERVICE_TYPE_EXT_RTPS
,
514 SCHEDULE_SERVICE_TYPE_UGS
515 } SCHEDULE_SERVICE_TYPE_e
;
517 static gint hf_mac_header_generic_grant_mgmt_ugs_tree
= -1;
518 static gint hf_mac_header_generic_grant_mgmt_subhd_ugs_si
= -1;
519 static gint hf_mac_header_generic_grant_mgmt_subhd_ugs_pm
= -1;
520 static gint hf_mac_header_generic_grant_mgmt_subhd_ugs_fli
= -1;
521 static gint hf_mac_header_generic_grant_mgmt_subhd_ugs_fl
= -1;
522 static gint hf_mac_header_generic_grant_mgmt_subhd_ugs_rsv
= -1;
523 static gint hf_mac_header_generic_grant_mgmt_ext_rtps_tree
= -1;
524 static gint hf_mac_header_generic_grant_mgmt_subhd_ext_pbr
= -1;
525 static gint hf_mac_header_generic_grant_mgmt_subhd_ext_fli
= -1;
526 static gint hf_mac_header_generic_grant_mgmt_subhd_ext_fl
= -1;
527 static gint hf_mac_header_generic_grant_mgmt_ext_pbr_tree
= -1;
528 static gint hf_mac_header_generic_grant_mgmt_subhd_pbr
= -1;
530 /* Slip Indicators */
531 static const value_string si_msgs
[] =
534 { 1, "A slip of UL grants relative to the UL queue depth" },
538 /* Poll-Me Messages */
539 static const value_string pm_msgs
[] =
542 { 1, "Request a bandwidth poll" },
546 /* Frame Latency Indications */
547 static const value_string fli_msgs
[] =
549 { 0, "Frame latency field disabled" },
550 { 1, "Frame latency field enabled" },
554 /* ARQ Feedback Payload */
556 /* ARQ Feedback IE bit masks (table 111) */
557 #define ARQ_FB_IE_LAST_BIT_MASK 0x8000 /*0x0001*/
558 #define ARQ_FB_IE_ACK_TYPE_MASK 0x6000 /*0x0006*/
559 #define ARQ_FB_IE_BSN_MASK 0x1FFC /*0x3FF8*/
560 #define ARQ_FB_IE_NUM_MAPS_MASK 0x0003 /*0xC000*/
561 #define ARQ_FB_IE_SEQ_FORMAT_MASK 0x8000 /*0x0001*/
562 #define ARQ_FB_IE_SEQ_ACK_MAP_MASK 0x7000 /*0x000E*/
563 #define ARQ_FB_IE_SEQ1_LENGTH_MASK 0x0F00 /*0x00F0*/
564 #define ARQ_FB_IE_SEQ2_LENGTH_MASK 0x00F0 /*0x0F00*/
565 #define ARQ_FB_IE_SEQ3_LENGTH_MASK 0x000F /*0xF000*/
566 #define ARQ_FB_IE_SEQ_ACK_MAP_2_MASK 0x6000 /*0x0006*/
567 #define ARQ_FB_IE_SEQ1_LENGTH_6_MASK 0x1F80 /*0x01F8*/
568 #define ARQ_FB_IE_SEQ2_LENGTH_6_MASK 0x007E /*0x7E00*/
569 #define ARQ_FB_IE_RSV_MASK 0x0001 /*0x8000*/
571 static gint hf_mac_header_generic_arq_fb_ie_cid
= -1;
572 static gint hf_mac_header_generic_arq_fb_ie_last
= -1;
573 static gint hf_mac_header_generic_arq_fb_ie_ack_type
= -1;
574 static gint hf_mac_header_generic_arq_fb_ie_bsn
= -1;
575 static gint hf_mac_header_generic_arq_fb_ie_num_maps
= -1;
576 static gint hf_ack_type_reserved
= -1;
577 static gint hf_mac_header_generic_arq_fb_ie_sel_ack_map
= -1;
578 static gint hf_mac_header_generic_arq_fb_ie_seq_format
= -1;
579 static gint hf_mac_header_generic_arq_fb_ie_seq_ack_map
= -1;
580 static gint hf_mac_header_generic_arq_fb_ie_seq1_length
= -1;
581 static gint hf_mac_header_generic_arq_fb_ie_seq2_length
= -1;
582 static gint hf_mac_header_generic_arq_fb_ie_seq3_length
= -1;
583 static gint hf_mac_header_generic_arq_fb_ie_seq_ack_map_2
= -1;
584 static gint hf_mac_header_generic_arq_fb_ie_seq1_length_6
= -1;
585 static gint hf_mac_header_generic_arq_fb_ie_seq2_length_6
= -1;
586 static gint hf_mac_header_generic_arq_fb_ie_rsv
= -1;
588 static expert_field ei_mac_crc_malformed
= EI_INIT
;
589 static expert_field ei_mac_crc_missing
= EI_INIT
;
591 /* Last IE Indicators */
592 static const value_string last_ie_msgs
[] =
599 /* Register Wimax defrag table init routine. */
600 void wimax_defragment_init(void)
604 reassembly_table_init(&payload_reassembly_table
,
605 &addresses_reassembly_table_functions
);
607 /* Init fragmentation variables. */
608 for (i
= 0; i
< MAX_CID
; i
++)
610 cid_adjust
[i
] = 1; /* Must not start with 0 */
613 cid_adj_array_size
= 0;
614 /* Free the array memory. */
616 g_free(cid_adj_array
);
618 cid_adj_array
= NULL
;
619 if (frag_num_array
) {
620 g_free(frag_num_array
);
622 frag_num_array
= NULL
;
624 /* Initialize to make sure bs_address gets set in FCH decoder. */
627 /* Initialize the Scheduling Service Type flag */
628 seen_a_service_type
= 0;
630 max_logical_bands
= 12;
632 /* Initialize UL_MAP globals. */
633 init_wimax_globals();
636 static guint
decode_packing_subheader(tvbuff_t
*payload_tvb
, packet_info
*pinfo
, proto_tree
*tree
, guint payload_length _U_
, guint payload_offset
, proto_item
*parent_item
)
638 proto_item
*generic_item
= NULL
;
639 proto_tree
*generic_tree
= NULL
;
640 guint starting_offset
= payload_offset
;
642 /* update the info column */
643 col_append_sep_str(pinfo
->cinfo
, COL_INFO
, NULL
, "Packing subhdr");
644 /* add the Packing subheader info */
645 proto_item_append_text(parent_item
, ", Packing Subheader");
646 /* display Packing subheader type */
647 generic_item
= proto_tree_add_protocol_format(tree
, proto_mac_header_generic_decoder
, payload_tvb
, payload_offset
, ((arq_enabled
|extended_type
)?3:2), "Packing subheader (%u bytes)", ((arq_enabled
|extended_type
)?3:2));
648 /* add Packing subheader subtree */
649 generic_tree
= proto_item_add_subtree(generic_item
, ett_mac_pkt_subheader_decoder
);
650 /* decode and display the Packing subheader */
651 /* Get the fragment type */
652 frag_type
= (tvb_get_guint8(payload_tvb
, payload_offset
) & FRAGMENT_TYPE_MASK
) >> 6;
653 /* if ARQ Feedback payload is present */
655 { /* get the frag length */
656 frag_len
= ((tvb_get_ntohl(payload_tvb
, payload_offset
) & FRAG_LENGTH_MASK
) >> 8);
657 /* get the sequence number */
658 seq_number
= (tvb_get_ntohs(payload_tvb
, payload_offset
) & SEQ_NUMBER_MASK_11
) >> 3;
659 proto_tree_add_item(generic_tree
, hf_mac_header_generic_packing_subhd_fc_ext
, payload_tvb
, payload_offset
, 3, ENC_BIG_ENDIAN
);
660 proto_tree_add_item(generic_tree
, hf_mac_header_generic_packing_subhd_bsn
, payload_tvb
, payload_offset
, 3, ENC_BIG_ENDIAN
);
661 proto_tree_add_item(generic_tree
, hf_mac_header_generic_packing_subhd_len_ext
, payload_tvb
, payload_offset
, 3, ENC_BIG_ENDIAN
);
662 /* update the length and offset */
669 { /* get the frag length */
670 frag_len
= ((tvb_get_ntohl(payload_tvb
, payload_offset
) & FRAG_LENGTH_MASK
) >> 8);
671 /* get the sequence number */
672 seq_number
= (tvb_get_ntohs(payload_tvb
, payload_offset
) & SEQ_NUMBER_MASK_11
) >> 3;
673 proto_tree_add_item(generic_tree
, hf_mac_header_generic_packing_subhd_fc_ext
, payload_tvb
, payload_offset
, 3, ENC_BIG_ENDIAN
);
674 proto_tree_add_item(generic_tree
, hf_mac_header_generic_packing_subhd_fsn_ext
, payload_tvb
, payload_offset
, 3, ENC_BIG_ENDIAN
);
675 proto_tree_add_item(generic_tree
, hf_mac_header_generic_packing_subhd_len_ext
, payload_tvb
, payload_offset
, 3, ENC_BIG_ENDIAN
);
676 /* update the length and offset */
681 { /* get the frag length */
682 frag_len
= (tvb_get_ntohs(payload_tvb
, payload_offset
) & PACKING_SUBHEADER_LENGTH_MASK
);
683 /* get the sequence number */
684 seq_number
= (tvb_get_guint8(payload_tvb
, payload_offset
) & SEQ_NUMBER_MASK
) >> 3;
685 proto_tree_add_item(generic_tree
, hf_mac_header_generic_packing_subhd_fc
, payload_tvb
, payload_offset
, 2, ENC_BIG_ENDIAN
);
686 proto_tree_add_item(generic_tree
, hf_mac_header_generic_packing_subhd_fsn
, payload_tvb
, payload_offset
, 2, ENC_BIG_ENDIAN
);
687 proto_tree_add_item(generic_tree
, hf_mac_header_generic_packing_subhd_len
, payload_tvb
, payload_offset
, 2, ENC_BIG_ENDIAN
);
688 /* update the length and offset */
693 /* Prevent a crash! */
694 if ((gint
)frag_len
< 0)
696 /* Return the number of bytes decoded. */
697 return payload_offset
- starting_offset
;
701 static void dissect_mac_header_generic_decoder(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
)
704 guint payload_offset
;
705 guint payload_length
= 0;
707 static guint8 frag_number
[MAX_CID
];
708 static guint cid_list
[MAX_CID
];
709 static guint cid_base
;
710 static const char reassem_str
[] = "Reassembled Data transport PDU (%u bytes)";
711 static const char data_str
[] = "Data transport PDU (%u bytes)";
713 gint length
, i
, cid_index
;
714 guint tvb_len
, ret_length
, ubyte
, new_tvb_len
;
715 guint new_payload_len
= 0;
716 guint
/*mac_ht,*/ mac_ec
, mac_esf
, mac_ci
, /*mac_eks,*/ mac_len
, mac_cid
, cid
;
717 guint ffb_grant_mgmt_subheader
, packing_subheader
, fragment_subheader
;
718 guint mesh_subheader
;
719 guint packing_length
;
720 guint32 mac_crc
, calculated_crc
;
721 proto_item
*parent_item
= NULL
;
722 proto_item
*generic_item
= NULL
;
723 proto_tree
*generic_tree
= NULL
;
724 proto_item
*child_item
= NULL
;
725 proto_tree
*child_tree
= NULL
;
726 tvbuff_t
*payload_tvb
;
727 tvbuff_t
*data_pdu_tvb
;
728 fragment_head
*payload_frag
;
729 gboolean first_arq_fb_payload
= TRUE
;
731 proto_mac_header_generic_decoder
= proto_wimax
;
734 /* update the info column */
735 col_append_sep_str(pinfo
->cinfo
, COL_INFO
, NULL
, "GMH");
738 /* Get the frame length */
739 tvb_len
= tvb_reported_length(tvb
);
740 if (tvb_len
< WIMAX_MAC_HEADER_SIZE
)
742 /* display the error message */
743 generic_item
= proto_tree_add_protocol_format(tree
, proto_mac_header_generic_decoder
, tvb
, offset
, tvb_len
, "Error: the size of Generic MAC Header tvb is too small! (%u bytes)", tvb_len
);
745 generic_tree
= proto_item_add_subtree(generic_item
, ett_mac_header_generic_decoder
);
746 /* display the Generic MAC Header in Hex */
747 proto_tree_add_item(generic_tree
, hf_mac_header_generic_value_bytes
, tvb
, offset
, tvb_len
, ENC_NA
);
751 parent_item
= proto_tree_get_parent(tree
);
752 /* add the MAC header info */
753 proto_item_append_text(parent_item
, " - Generic MAC Header");
754 /* display MAC header message */
755 generic_item
= proto_tree_add_protocol_format(tree
, proto_mac_header_generic_decoder
, tvb
, offset
, WIMAX_MAC_HEADER_SIZE
, "Generic MAC Header (%u bytes)", WIMAX_MAC_HEADER_SIZE
);
756 /* add MAC header subtree */
757 generic_tree
= proto_item_add_subtree(generic_item
, ett_mac_header_generic_decoder
);
758 /* Decode and display the MAC header */
759 /* Get the first byte */
760 ubyte
= tvb_get_guint8(tvb
, offset
);
761 /* get the Header Type (HT) */
762 /*mac_ht = ((ubyte & WIMAX_MAC_HEADER_GENERIC_HT_MASK)?1:0); XX: not used ?? */
763 /* get the Encryption Control (EC) */
764 mac_ec
= ((ubyte
& WIMAX_MAC_HEADER_GENERIC_EC_MASK
)?1:0);
765 /* get the sub types */
766 ffb_grant_mgmt_subheader
= ((ubyte
& GENERIC_SUB_TYPE_0
)?1:0);
767 packing_subheader
= ((ubyte
& GENERIC_SUB_TYPE_1
)?1:0);
768 fragment_subheader
= ((ubyte
& GENERIC_SUB_TYPE_2
)?1:0);
769 extended_type
= ((ubyte
& GENERIC_SUB_TYPE_3
)?1:0);
770 arq_fb_payload
= ((ubyte
& GENERIC_SUB_TYPE_4
)?1:0);
771 mesh_subheader
= ((ubyte
& GENERIC_SUB_TYPE_5
)?1:0);
772 /* Get the 2nd byte */
773 ubyte
= tvb_get_guint8(tvb
, (offset
+1));
774 /* get the Extended subheader field (ESF) */
775 mac_esf
= ((ubyte
& WIMAX_MAC_HEADER_GENERIC_ESF_MASK
)?1:0);
776 /* get the CRC indicator (CI) */
777 mac_ci
= ((ubyte
& WIMAX_MAC_HEADER_GENERIC_CI_MASK
)?1:0);
778 /* get the Encryption key sequence (EKS) */
779 /*mac_eks = ((ubyte & WIMAX_MAC_HEADER_GENERIC_EKS_MASK)>>4); XX: not used ?? */
780 /* get the MAC length; this is used even if tree is null */
781 mac_len
= (tvb_get_ntohs(tvb
, (offset
+1)) & WIMAX_MAC_HEADER_GENERIC_LEN
);
783 mac_cid
= tvb_get_ntohs(tvb
, (offset
+3));
784 /* display the Header Type (HT) */
785 proto_tree_add_item(generic_tree
, hf_mac_header_generic_ht
, tvb
, offset
, 3, ENC_BIG_ENDIAN
);
786 /* display the Encryption Control (EC) */
787 proto_tree_add_item(generic_tree
, hf_mac_header_generic_ec
, tvb
, offset
, 3, ENC_BIG_ENDIAN
);
788 /* display the sub-types (Type) */
789 proto_tree_add_item(generic_tree
, hf_mac_header_generic_type_5
, tvb
, offset
, 3, ENC_BIG_ENDIAN
);
790 proto_tree_add_item(generic_tree
, hf_mac_header_generic_type_4
, tvb
, offset
, 3, ENC_BIG_ENDIAN
);
791 proto_tree_add_item(generic_tree
, hf_mac_header_generic_type_3
, tvb
, offset
, 3, ENC_BIG_ENDIAN
);
792 proto_tree_add_item(generic_tree
, hf_mac_header_generic_type_2
, tvb
, offset
, 3, ENC_BIG_ENDIAN
);
793 proto_tree_add_item(generic_tree
, hf_mac_header_generic_type_1
, tvb
, offset
, 3, ENC_BIG_ENDIAN
);
794 proto_tree_add_item(generic_tree
, hf_mac_header_generic_type_0
, tvb
, offset
, 3, ENC_BIG_ENDIAN
);
795 /* display the Extended sub-header Field (ESF) */
796 proto_tree_add_item(generic_tree
, hf_mac_header_generic_esf
, tvb
, offset
, 3, ENC_BIG_ENDIAN
);
797 /* display the CRC Indicator (CI) */
798 proto_tree_add_item(generic_tree
, hf_mac_header_generic_ci
, tvb
, offset
, 3, ENC_BIG_ENDIAN
);
799 /* display the Encryption Key Sequence (EKS) */
800 proto_tree_add_item(generic_tree
, hf_mac_header_generic_eks
, tvb
, offset
, 3, ENC_BIG_ENDIAN
);
801 /* display the reserved field */
802 proto_tree_add_item(generic_tree
, hf_mac_header_generic_rsv
, tvb
, offset
, 3, ENC_BIG_ENDIAN
);
803 /* display the length */
804 proto_tree_add_item(generic_tree
, hf_mac_header_generic_len
, tvb
, offset
, 3, ENC_BIG_ENDIAN
);
805 /* Decode and display the CID */
806 proto_tree_add_item(generic_tree
, hf_mac_header_generic_cid
, tvb
, (offset
+3), 2, ENC_BIG_ENDIAN
);
807 /* Decode and display the HCS */
808 proto_tree_add_item(generic_tree
, hf_mac_header_generic_hcs
, tvb
, (offset
+5), 1, ENC_BIG_ENDIAN
);
809 /* get the frame length without MAC header */
810 length
= mac_len
- WIMAX_MAC_HEADER_SIZE
;
812 proto_item_append_text(parent_item
, "tvb length=%u, mac length=%u, frame length=%u,", tvb_len
, mac_len
, length
);
814 /* set the offset for the frame */
815 offset
+= WIMAX_MAC_HEADER_SIZE
;
816 /* the processing of the subheaders is order sensitive */
817 /* do not change the order */
823 if (length
>= (gint
)sizeof(mac_crc
))
825 length
-= (int)sizeof(mac_crc
);
828 generic_item
= proto_tree_add_protocol_format(tree
, proto_mac_header_generic_decoder
, tvb
, offset
, length
, "Encrypted PDU (%u bytes)", length
);
829 /* add payload subtree */
830 generic_tree
= proto_item_add_subtree(generic_item
, ett_mac_data_pdu_decoder
);
831 proto_tree_add_item(generic_tree
, hf_mac_header_generic_value_bytes
, tvb
, offset
, length
, ENC_NA
);
835 /* if Extended subheader is present */
837 { /* add the Extended subheader info */
838 proto_item_append_text(parent_item
, ", Extended Subheader(s)");
839 ret_length
= extended_subheader_decoder(tvb_new_subset_length(tvb
, offset
, length
), pinfo
, tree
);
840 /* update the length and offset */
841 length
-= ret_length
;
842 offset
+= ret_length
;
844 /* if Mesh subheader is present */
846 { /* update the info column */
847 col_append_sep_str(pinfo
->cinfo
, COL_INFO
, NULL
, "Mesh subhdr");
848 /* add the Mesh subheader info */
849 proto_item_append_text(parent_item
, ", Mesh Subheader");
850 /* display Mesh subheader type */
851 generic_item
= proto_tree_add_protocol_format(tree
, proto_mac_header_generic_decoder
, tvb
, offset
, length
, "Mesh subheader (2 bytes)");
852 /* add Mesh subheader subtree */
853 generic_tree
= proto_item_add_subtree(generic_item
, ett_mac_mesh_subheader_decoder
);
854 /* decode and display the Mesh subheader */
855 proto_tree_add_item(generic_tree
, hf_mac_header_generic_mesh_subheader
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
856 /* update the length and offset */
860 /* if Fast-feedback allocation (DL) subheader or Grant management (UL) subheader is present */
861 if (ffb_grant_mgmt_subheader
)
862 { /* check if it is downlink packet */
863 if (is_down_link(pinfo
))
864 { /* Fast-feedback allocation (DL) subheader is present */
865 /* update the info column */
866 col_append_sep_str(pinfo
->cinfo
, COL_INFO
, NULL
, "Fast-fb subhdr");
867 /* add the Fast-feedback subheader info */
868 proto_item_append_text(parent_item
, ", Fast-feedback Subheader");
869 /* display Fast-feedback allocation subheader type */
870 generic_item
= proto_tree_add_protocol_format(tree
, proto_mac_header_generic_decoder
, tvb
, offset
, length
, "Fast-feedback allocation (DL) subheader (%u bytes)", length
);
871 /* add Fast-feedback allocation subheader subtree */
872 generic_tree
= proto_item_add_subtree(generic_item
, ett_mac_fast_fb_subheader_decoder
);
873 proto_tree_add_item(generic_tree
, hf_mac_header_generic_fast_fb_subhd_alloc_offset
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
874 proto_tree_add_item(generic_tree
, hf_mac_header_generic_fast_fb_subhd_fb_type
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
875 /* update the length and offset */
879 else /* Grant management (UL) subheader is present */
880 { /* update the info column */
881 col_append_sep_str(pinfo
->cinfo
, COL_INFO
, NULL
, "Grant mgmt subhdr");
882 /* add the Grant management subheader info */
883 proto_item_append_text(parent_item
, ", Grant Management Subheader");
884 /* display Grant management subheader type */
885 generic_item
= proto_tree_add_protocol_format(tree
, proto_mac_header_generic_decoder
, tvb
, offset
, 2, "Grant management (UL) subheader (2 bytes)");
886 /* add Grant management subheader subtree */
887 generic_tree
= proto_item_add_subtree(generic_item
, ett_mac_grant_mgmt_subheader_decoder
);
888 scheduling_service_type
= get_service_type();
889 switch (scheduling_service_type
)
891 case SCHEDULE_SERVICE_TYPE_UGS
:
892 proto_item_append_text(generic_item
, ": It looks like UGS is the correct Scheduling Service Type");
894 case SCHEDULE_SERVICE_TYPE_EXT_RTPS
:
895 proto_item_append_text(generic_item
, ": It looks like Extended rtPS is the correct Scheduling Service Type");
898 proto_item_append_text(generic_item
, ": Cannot determine the correct Scheduling Service Type");
901 proto_item_append_text(generic_item
, ": It looks like Piggyback Request is the correct Scheduling Service Type");
904 /* Create tree for Scheduling Service Type (UGS) */
905 child_item
= proto_tree_add_item(generic_tree
, hf_mac_header_generic_grant_mgmt_ugs_tree
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
906 child_tree
= proto_item_add_subtree(child_item
, ett_mac_grant_mgmt_subheader_decoder
);
907 proto_tree_add_item(child_tree
, hf_mac_header_generic_grant_mgmt_subhd_ugs_si
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
908 proto_tree_add_item(child_tree
, hf_mac_header_generic_grant_mgmt_subhd_ugs_pm
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
909 proto_tree_add_item(child_tree
, hf_mac_header_generic_grant_mgmt_subhd_ugs_fli
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
910 proto_tree_add_item(child_tree
, hf_mac_header_generic_grant_mgmt_subhd_ugs_fl
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
911 proto_tree_add_item(child_tree
, hf_mac_header_generic_grant_mgmt_subhd_ugs_rsv
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
913 /* Create tree for Scheduling Service Type (Extended RTPS) */
914 child_item
= proto_tree_add_item(generic_tree
, hf_mac_header_generic_grant_mgmt_ext_rtps_tree
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
915 child_tree
= proto_item_add_subtree(child_item
, ett_mac_grant_mgmt_subheader_decoder
);
916 proto_tree_add_item(child_tree
, hf_mac_header_generic_grant_mgmt_subhd_ext_pbr
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
917 proto_tree_add_item(child_tree
, hf_mac_header_generic_grant_mgmt_subhd_ext_fli
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
918 proto_tree_add_item(child_tree
, hf_mac_header_generic_grant_mgmt_subhd_ext_fl
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
920 /* Create tree for Scheduling Service Type (Piggyback Request) */
921 child_item
= proto_tree_add_item(generic_tree
, hf_mac_header_generic_grant_mgmt_ext_pbr_tree
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
922 child_tree
= proto_item_add_subtree(child_item
, ett_mac_grant_mgmt_subheader_decoder
);
923 proto_tree_add_item(child_tree
, hf_mac_header_generic_grant_mgmt_subhd_pbr
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
925 /* update the length and offset */
930 /* if Fragmentation subheader is present */
931 if (fragment_subheader
)
932 { /* update the info column */
933 col_append_sep_str(pinfo
->cinfo
, COL_INFO
, NULL
, "Frag subhdr");
934 /* add the Fragmentation subheader info */
935 proto_item_append_text(parent_item
, ", Frag Subheader");
936 /* display Fragmentation subheader type */
937 generic_item
= proto_tree_add_protocol_format(tree
, proto_mac_header_generic_decoder
, tvb
, offset
, ((arq_enabled
|extended_type
)?2:1), "Fragmentation subheader (%u bytes)", ((arq_enabled
|extended_type
)?2:1));
938 /* add Fragmentation subheader subtree */
939 generic_tree
= proto_item_add_subtree(generic_item
, ett_mac_frag_subheader_decoder
);
940 /* Get the fragment type */
941 frag_type
= (tvb_get_guint8(tvb
, offset
) & FRAGMENT_TYPE_MASK
) >> 6;
943 { /* get the sequence number */
944 seq_number
= (tvb_get_ntohs(tvb
, offset
) & SEQ_NUMBER_MASK_11
) >> 3;
945 /* decode and display the header */
946 proto_tree_add_item(generic_tree
, hf_mac_header_generic_frag_subhd_fc_ext
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
947 proto_tree_add_item(generic_tree
, hf_mac_header_generic_frag_subhd_bsn
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
948 proto_tree_add_item(generic_tree
, hf_mac_header_generic_frag_subhd_rsv_ext
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
949 /* update the length and offset */
956 { /* get the sequence number */
957 seq_number
= (tvb_get_ntohs(tvb
, offset
) & SEQ_NUMBER_MASK_11
) >> 3;
958 /* decode and display the header */
959 proto_tree_add_item(generic_tree
, hf_mac_header_generic_frag_subhd_fc_ext
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
960 proto_tree_add_item(generic_tree
, hf_mac_header_generic_frag_subhd_fsn_ext
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
961 proto_tree_add_item(generic_tree
, hf_mac_header_generic_frag_subhd_rsv_ext
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
962 /* update the length and offset */
967 { /* get the sequence number */
968 seq_number
= (tvb_get_guint8(tvb
, offset
) & SEQ_NUMBER_MASK
) >> 3;
969 /* decode and display the header */
970 proto_tree_add_item(generic_tree
, hf_mac_header_generic_frag_subhd_fc
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
971 proto_tree_add_item(generic_tree
, hf_mac_header_generic_frag_subhd_fsn
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
972 proto_tree_add_item(generic_tree
, hf_mac_header_generic_frag_subhd_rsv
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
973 /* update the length and offset */
980 else /* ??? default fragment type: no fragment */
984 /* Decode the MAC payload if there is any */
987 if (length
< (gint
)sizeof(mac_crc
))
988 { /* display error message */
989 proto_tree_add_protocol_format(tree
, proto_mac_header_generic_decoder
, tvb
, offset
, length
, "Error - the frame is too short (%u bytes)", length
);
992 length
-= (int)sizeof(mac_crc
);
996 frag_len
= length
; /* Can be changed by Packing subhdr */
997 if (packing_subheader
)
999 packing_length
= decode_packing_subheader(tvb
, pinfo
, tree
, length
, offset
, parent_item
);
1000 length
-= packing_length
;
1001 offset
+= packing_length
;
1002 generic_item
= proto_tree_add_protocol_format(tree
, proto_mac_header_generic_decoder
, tvb
, offset
, frag_len
, "Data transport PDU (%u bytes)", frag_len
);
1003 /* add payload subtree */
1004 generic_tree
= proto_item_add_subtree(generic_item
, ett_mac_data_pdu_decoder
);
1005 proto_tree_add_item(generic_tree
, hf_mac_header_generic_value_bytes
, tvb
, offset
, frag_len
, ENC_NA
);
1007 /* defragment first if it is fragmented */
1008 if (frag_type
== NO_FRAG
)
1009 { /* not fragmented payload */
1010 payload_tvb
= tvb_new_subset_length(tvb
, offset
, frag_len
);
1011 payload_length
= frag_len
;
1012 new_payload_len
= frag_len
;
1014 else /* fragmented payload */
1015 { /* add the fragment */
1016 /* Make sure cid will not match a previous packet with different data */
1017 for (i
= 0; i
< MAX_CID
; i
++)
1019 if (cid_list
[i
] == mac_cid
)
1021 cid_base
= i
* (0xFFFFFFFF / MAX_CID
);
1024 if (cid_list
[i
] == 0)
1026 cid_list
[i
] = mac_cid
;
1027 cid_base
= i
* (0xFFFFFFFF / MAX_CID
);
1032 while (pinfo
->fd
->num
> cid_adj_array_size
)
1034 cid_adj_array_size
+= 1024;
1035 cid_adj_array
= (guint
*)g_realloc(cid_adj_array
, (int)sizeof(guint
) * cid_adj_array_size
);
1036 frag_num_array
= (guint8
*)g_realloc(frag_num_array
, (int)sizeof(guint8
) * cid_adj_array_size
);
1037 /* Clear the added memory */
1038 memset(&cid_adj_array
[cid_adj_array_size
- 1024], 0, (int)sizeof(guint
) * 1024);
1042 /* New cid_adjust for each packet with fragment(s) */
1043 cid_adjust
[cid_index
] += cid_vernier
[cid_index
];
1044 /* cid_vernier must always be 0 at start of packet. */
1045 cid_vernier
[cid_index
] = 0;
1047 /* Create artificial sequence numbers. */
1048 frag_number
[cid_index
]++;
1049 if (frag_type
== FIRST_FRAG
)
1051 frag_number
[cid_index
] = 0;
1053 if (cid_adj_array
[pinfo
->fd
->num
])
1055 /* We apparently just clicked on the packet again. */
1056 cid_adjust
[cid_index
] = cid_adj_array
[pinfo
->fd
->num
];
1057 /* Set the frag_number at start of packet. */
1060 frag_number
[cid_index
] = frag_num_array
[pinfo
->fd
->num
];
1063 /* Save for next time we click on this packet. */
1064 cid_adj_array
[pinfo
->fd
->num
] = cid_adjust
[cid_index
];
1067 frag_num_array
[pinfo
->fd
->num
] = frag_number
[cid_index
];
1070 /* Reset in case we stay in this while() loop to finish the packet. */
1072 cid
= cid_base
+ cid_adjust
[cid_index
] + cid_vernier
[cid_index
];
1073 /* Save address pointers. */
1074 save_src
= pinfo
->src
;
1075 save_dst
= pinfo
->dst
;
1076 /* Use dl_src and dl_dst in defragmentation. */
1077 pinfo
->src
= pinfo
->dl_src
;
1078 pinfo
->dst
= pinfo
->dl_dst
;
1079 payload_frag
= fragment_add_seq(&payload_reassembly_table
, tvb
, offset
, pinfo
, cid
, NULL
, frag_number
[cid_index
], frag_len
, ((frag_type
==LAST_FRAG
)?0:1), 0);
1080 /* Restore address pointers. */
1081 pinfo
->src
= save_src
;
1082 pinfo
->dst
= save_dst
;
1083 if (frag_type
== LAST_FRAG
)
1085 /* Make sure fragment_add_seq() sees next one as a new frame. */
1086 cid_vernier
[cid_index
]++;
1088 /* Don't show reassembled packet until last fragment. */
1089 proto_tree_add_text(tree
, tvb
, offset
, frag_len
, "Payload Fragment (%d bytes)", frag_len
);
1091 if (payload_frag
&& frag_type
== LAST_FRAG
)
1092 { /* defragmented completely */
1093 payload_length
= payload_frag
->len
;
1094 /* create the new tvb for defragmented frame */
1095 payload_tvb
= tvb_new_chain(tvb
, payload_frag
->tvb_data
);
1096 /* add the defragmented data to the data source list */
1097 add_new_data_source(pinfo
, payload_tvb
, "Reassembled WiMax MAC payload");
1098 /* save the tvb langth */
1099 new_payload_len
= payload_length
;
1101 else /* error or defragment is not complete */
1104 #ifdef DEBUG /* for debug only */
1105 /* if (frag_type == LAST_FRAG)*/
1107 /* update the info column */
1108 col_append_sep_str(pinfo
->cinfo
, COL_INFO
, NULL
, "Dropped the incomplete frame");
1112 if (frag_type
== FIRST_FRAG
)
1113 { /* Set up to decode the first fragment (even though next fragment not read yet) */
1114 payload_tvb
= tvb_new_subset_length(tvb
, offset
, length
);
1115 payload_length
= length
;
1121 /* process the defragmented payload */
1123 { /* reset the payload_offset */
1125 /* process the payload */
1126 if (payload_length
> 0)
1128 if (!new_payload_len
)
1130 /* if ARQ Feedback payload is present, it should be the first SDU */
1131 if (first_arq_fb_payload
&& arq_fb_payload
)
1132 { /* decode and display the ARQ feedback payload */
1133 first_arq_fb_payload
= FALSE
;
1135 arq_feedback_payload_decoder(tvb_new_subset_length(payload_tvb
, payload_offset
, new_payload_len
), pinfo
, generic_tree
, parent_item
);
1137 ret_length
= arq_feedback_payload_decoder(tvb_new_subset_length(payload_tvb
, payload_offset
, new_payload_len
), pinfo
, generic_tree
, parent_item
);
1138 if (ret_length
!= new_payload_len
)
1140 /* update the info column */
1141 col_append_sep_str(pinfo
->cinfo
, COL_INFO
, NULL
, "incorrect ARQ fb payload size");
1145 else /* decode SDUs */
1146 { /* check the payload type */
1147 if (mac_cid
== cid_padding
)
1148 { /* update the info column */
1149 col_append_sep_str(pinfo
->cinfo
, COL_INFO
, NULL
, "Padding CID");
1150 /* get the parent */
1151 generic_item
= proto_tree_get_parent(tree
);
1152 /* add the MAC header info */
1153 proto_item_append_text(generic_item
, ", Padding CID");
1154 /* display padding CID */
1155 generic_item
= proto_tree_add_protocol_format(tree
, proto_mac_header_generic_decoder
, payload_tvb
, payload_offset
, new_payload_len
, "Padding CID (%u bytes)", new_payload_len
);
1156 /* add payload subtree */
1157 generic_tree
= proto_item_add_subtree(generic_item
, ett_mac_header_generic_decoder
);
1158 /* display the Padding CID payload in Hex */
1159 proto_tree_add_item(generic_tree
, hf_mac_header_generic_value_bytes
, payload_tvb
, payload_offset
, new_payload_len
, ENC_NA
);
1161 else if ((mac_cid
<= (2 * global_cid_max_basic
)) || (mac_cid
== cid_aas_ranging
)
1162 || (mac_cid
>= cid_normal_multicast
))
1163 { /* MAC management message */
1164 call_dissector(mac_mgmt_msg_decoder_handle
, tvb_new_subset_length(payload_tvb
, payload_offset
, new_payload_len
), pinfo
, tree
);
1166 else /* data transport PDU */
1167 { /* update the info column */
1168 col_append_sep_str(pinfo
->cinfo
, COL_INFO
, NULL
, "Data");
1169 /* add the MAC payload info */
1170 proto_item_append_text(parent_item
, ", Data");
1171 /* display payload info */
1172 if ((new_payload_len
+ payload_offset
) > payload_length
)
1174 new_tvb_len
= new_payload_len
- payload_offset
;
1178 new_tvb_len
= new_payload_len
;
1180 if (frag_type
== LAST_FRAG
|| frag_type
== NO_FRAG
)
1182 if (frag_type
== NO_FRAG
)
1185 new_payload_len
= frag_len
;
1189 str_ptr
= reassem_str
;
1191 data_pdu_tvb
= tvb_new_subset_length(payload_tvb
, payload_offset
, new_tvb_len
);
1192 generic_item
= proto_tree_add_protocol_format(tree
, proto_mac_header_generic_decoder
, data_pdu_tvb
, payload_offset
, new_payload_len
, str_ptr
, new_payload_len
);
1193 /* add payload subtree */
1194 generic_tree
= proto_item_add_subtree(generic_item
, ett_mac_data_pdu_decoder
);
1195 /* check the data type */
1196 if (tvb_get_guint8(payload_tvb
, payload_offset
) == IP_HEADER_BYTE
)
1199 call_dissector(mac_ip_handle
, tvb_new_subset_length(payload_tvb
, payload_offset
, new_tvb_len
), pinfo
, generic_tree
);
1200 else /* display the Generic MAC Header in Hex */
1201 proto_tree_add_item(generic_tree
, hf_mac_header_generic_value_bytes
, payload_tvb
, payload_offset
, new_tvb_len
, ENC_NA
);
1203 else /* display the Generic MAC Header in Hex */
1204 proto_tree_add_item(generic_tree
, hf_mac_header_generic_value_bytes
, payload_tvb
, payload_offset
, new_tvb_len
, ENC_NA
);
1208 payload_length
-= new_payload_len
;
1209 } /* end of while loop */
1210 } /* end of payload processing */
1213 } /* end of payload decoding */
1216 /* Decode and display the CRC if it is present */
1219 /* add the CRC info */
1220 proto_item_append_text(parent_item
, ", CRC");
1221 /* check the length */
1222 if (MIN(tvb_len
, tvb_reported_length(tvb
)) >= mac_len
)
1224 mac_crc
= tvb_get_ntohl(tvb
, mac_len
- (int)sizeof(mac_crc
));
1225 /* calculate the CRC */
1226 calculated_crc
= wimax_mac_calc_crc32(tvb_get_ptr(tvb
, 0, mac_len
- (int)sizeof(mac_crc
)), mac_len
- (int)sizeof(mac_crc
));
1227 /* display the CRC */
1228 generic_item
= proto_tree_add_item(tree
, hf_mac_header_generic_crc
, tvb
, mac_len
- (int)sizeof(mac_crc
), (int)sizeof(mac_crc
), ENC_BIG_ENDIAN
);
1229 if (mac_crc
!= calculated_crc
)
1231 proto_item_append_text(generic_item
, " - incorrect! (should be: 0x%x)", calculated_crc
);
1235 { /* display error message */
1236 expert_add_info_format(pinfo
, tree
, &ei_mac_crc_malformed
, "CRC missing - the frame is too short (%u bytes)", tvb_len
);
1239 else /* CRC is not included */
1240 { /* add the CRC info */
1241 proto_item_append_text(parent_item
, ", No CRC");
1242 /* display message */
1243 expert_add_info(pinfo
, tree
, &ei_mac_crc_missing
);
1247 static gint
extended_subheader_decoder(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
)
1250 gint length
, ext_length
, ubyte
, i
;
1251 proto_item
*ti
= NULL
;
1252 proto_tree
*sub_tree
= NULL
;
1253 proto_tree
*ti_tree
= NULL
;
1255 /* update the info column */
1256 col_append_sep_str(pinfo
->cinfo
, COL_INFO
, NULL
, "Ext subhdrs");
1258 /* Get the tvb reported length */
1259 length
= tvb_reported_length(tvb
);
1261 { /* display the error message */
1262 proto_tree_add_protocol_format(tree
, proto_mac_header_generic_decoder
, tvb
, offset
, length
, "Error: extended subheader tvb is empty ! (%u bytes)", length
);
1266 /* Get the length of the extended subheader group */
1267 ext_length
= tvb_get_guint8(tvb
, offset
);
1268 /* display subheader type */
1269 ti
= proto_tree_add_protocol_format(tree
, proto_mac_header_generic_decoder
, tvb
, offset
, length
, "Extended subheader group (%u bytes)", ext_length
);
1270 /* add extended subheader subtree */
1271 sub_tree
= proto_item_add_subtree(ti
, ett_mac_ext_subheader_decoder
);
1272 /* decode and display the extended subheaders */
1273 for (i
=1; i
<ext_length
;)
1274 { /* Get the extended subheader type */
1275 ubyte
= (tvb_get_guint8(tvb
, (offset
+i
)) & EXTENDED_SUB_HEADER_TYPE_MASK
);
1276 /* decode and display the extended subheader type (MSB) */
1277 proto_tree_add_item(sub_tree
, hf_mac_header_generic_ext_subheader_rsv
, tvb
, (offset
+i
), 1, ENC_BIG_ENDIAN
);
1279 if (is_down_link(pinfo
)) /* for downlink */
1280 { /* decode and display the extended subheader type */
1281 ti
= proto_tree_add_item(sub_tree
, hf_mac_header_generic_ext_subheader_type_dl
, tvb
, (offset
+i
), 1, ENC_BIG_ENDIAN
);
1283 ti_tree
= proto_item_add_subtree(ti
, ett_mac_ext_subheader_dl_decoder
);
1288 /* decode and display the extended sdu sn subheader */
1289 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_sdu_sn
, tvb
, (offset
+i
), 1, ENC_BIG_ENDIAN
);
1292 case DL_SLEEP_CONTROL
:
1293 /* decode and display the extended dl sleep control subheader */
1294 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_dl_sleep_control_pscid
, tvb
, (offset
+i
), 3, ENC_BIG_ENDIAN
);
1295 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_dl_sleep_control_op
, tvb
, (offset
+i
), 3, ENC_BIG_ENDIAN
);
1296 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_dl_sleep_control_fswe
, tvb
, (offset
+i
), 3, ENC_BIG_ENDIAN
);
1297 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_dl_sleep_control_fswb
, tvb
, (offset
+i
), 3, ENC_BIG_ENDIAN
);
1298 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_dl_sleep_control_rsv
, tvb
, (offset
+i
), 3, ENC_BIG_ENDIAN
);
1302 /* decode and display the extended feedback request subheader */
1303 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_fb_req_uiuc
, tvb
, (offset
+i
), 3, ENC_BIG_ENDIAN
);
1304 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_fb_req_fb_type
, tvb
, (offset
+i
), 3, ENC_BIG_ENDIAN
);
1305 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_fb_req_ofdma_symbol_offset
, tvb
, (offset
+i
), 3, ENC_BIG_ENDIAN
);
1306 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_fb_req_subchannel_offset
, tvb
, (offset
+i
), 3, ENC_BIG_ENDIAN
);
1307 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_fb_req_slots
, tvb
, (offset
+i
), 3, ENC_BIG_ENDIAN
);
1308 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_fb_req_frame_offset
, tvb
, (offset
+i
), 3, ENC_BIG_ENDIAN
);
1312 /* decode and display the extended SN request subheader */
1313 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_sn_req_rep_ind_1
, tvb
, (offset
+i
), 1, ENC_BIG_ENDIAN
);
1314 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_sn_req_rep_ind_2
, tvb
, (offset
+i
), 1, ENC_BIG_ENDIAN
);
1315 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_sn_req_rsv
, tvb
, (offset
+i
), 1, ENC_BIG_ENDIAN
);
1318 case PDU_SN_SHORT_DL
:
1319 /* decode and display the extended pdu sn (short) subheader */
1320 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_pdu_sn_short
, tvb
, (offset
+i
), 1, ENC_BIG_ENDIAN
);
1323 case PDU_SN_LONG_DL
:
1324 /* decode and display the extended pdu sn (long) subheader */
1325 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_pdu_sn_long
, tvb
, (offset
+i
), 2, ENC_BIG_ENDIAN
);
1328 default: /* reserved */
1332 else /* for uplink */
1333 { /* decode and display the extended subheader type */
1334 ti
= proto_tree_add_item(sub_tree
, hf_mac_header_generic_ext_subheader_type_ul
, tvb
, (offset
+i
), 1, ENC_BIG_ENDIAN
);
1336 ti_tree
= proto_item_add_subtree(ti
, ett_mac_ext_subheader_ul_decoder
);
1340 case MIMO_MODE_FEEDBACK
:
1341 /* decode and display the extended MIMO Mode Feedback subheader */
1342 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_mimo_mode_fb_type
, tvb
, (offset
+i
), 1, ENC_BIG_ENDIAN
);
1343 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_mimo_fb_content
, tvb
, (offset
+i
), 1, ENC_BIG_ENDIAN
);
1346 case UL_TX_POWER_REPORT
:
1347 /* decode and display the extended ul tx power report subheader */
1348 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_ul_tx_pwr_rep
, tvb
, (offset
+i
), 1, ENC_BIG_ENDIAN
);
1352 /* decode and display the extended MINI Feedback subheader */
1353 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_mini_fb_type
, tvb
, (offset
+i
), 2, ENC_BIG_ENDIAN
);
1354 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_mini_fb_content
, tvb
, (offset
+i
), 2, ENC_BIG_ENDIAN
);
1357 case PDU_SN_SHORT_UL
:
1358 /* decode and display the extended pdu sn (short) subheader */
1359 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_pdu_sn_short
, tvb
, (offset
+i
), 1, ENC_BIG_ENDIAN
);
1362 case PDU_SN_LONG_UL
:
1363 /* decode and display the extended pdu sn (long) subheader */
1364 proto_tree_add_item(ti_tree
, hf_mac_header_generic_ext_subheader_pdu_sn_long
, tvb
, (offset
+i
), 2, ENC_BIG_ENDIAN
);
1367 default: /* reserved */
1372 /* return the extended subheader length */
1376 static gint
arq_feedback_payload_decoder(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, proto_item
*parent_item
)
1381 gint ack_type
, num_maps
, seq_format
;
1383 proto_item
*ti
= NULL
;
1384 proto_item
*sub_ti
= NULL
;
1385 proto_tree
*sub_tree
= NULL
;
1387 /* update the info column */
1388 col_append_sep_str(pinfo
->cinfo
, COL_INFO
, NULL
, "ARQ feedback payld");
1390 /* add the MAC header info */
1391 proto_item_append_text(parent_item
, ", ARQ feedback payload");
1393 /* reset the offset */
1396 /* Get the tvb reported length */
1397 length
= tvb_reported_length(tvb
);
1399 { /* display the error message */
1400 proto_tree_add_protocol_format(tree
, proto_mac_header_generic_decoder
, tvb
, offset
, length
, "Error: ARQ feedback payload tvb is empty ! (%u bytes)", length
);
1404 /* display subheader type */
1405 ti
= proto_tree_add_protocol_format(tree
, proto_mac_header_generic_decoder
, tvb
, offset
, length
, "ARQ feedback payload ");
1406 /* add extended subheader subtree */
1407 sub_tree
= proto_item_add_subtree(ti
, ett_mac_arq_fb_payload_decoder
);
1408 /* decode and display the ARQ Feedback IEs */
1410 { /* decode and display CID */
1411 proto_tree_add_item(sub_tree
, hf_mac_header_generic_arq_fb_ie_cid
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1412 /* move to next 16-bit word */
1414 /* Get the 2nd 16-bit */
1415 word2
= tvb_get_ntohs(tvb
, offset
);
1416 /* get the last bit */
1417 last_ie
= (word2
& ARQ_FB_IE_LAST_BIT_MASK
);
1418 /* get the ACK type */
1419 ack_type
= ((word2
& ARQ_FB_IE_ACK_TYPE_MASK
) >> 13);
1420 /* get the number of ACK maps */
1421 num_maps
= (word2
& ARQ_FB_IE_NUM_MAPS_MASK
) + 1;
1422 /* decode and display the 2nd word */
1423 proto_tree_add_item(sub_tree
, hf_mac_header_generic_arq_fb_ie_last
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1424 proto_tree_add_item(sub_tree
, hf_mac_header_generic_arq_fb_ie_ack_type
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1425 proto_tree_add_item(sub_tree
, hf_mac_header_generic_arq_fb_ie_bsn
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1426 /* decode and display the 3rd word */
1429 sub_ti
= proto_tree_add_item(sub_tree
, hf_mac_header_generic_arq_fb_ie_num_maps
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1430 /* move to next 16-bit word */
1432 proto_item_append_text(sub_ti
, " (%d map(s))", num_maps
);
1433 for (i
= 0; i
< num_maps
; i
++)
1437 proto_tree_add_item(sub_tree
, hf_mac_header_generic_arq_fb_ie_sel_ack_map
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1440 { /* Get the next 16-bit */
1441 word3
= tvb_get_ntohs(tvb
, offset
);
1442 /* get the sequence format */
1443 seq_format
= (word3
& ARQ_FB_IE_SEQ_FORMAT_MASK
);
1444 /* decode and display the sequence format */
1445 proto_tree_add_item(sub_tree
, hf_mac_header_generic_arq_fb_ie_seq_format
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1448 proto_tree_add_item(sub_tree
, hf_mac_header_generic_arq_fb_ie_seq_ack_map_2
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1449 proto_tree_add_item(sub_tree
, hf_mac_header_generic_arq_fb_ie_seq1_length_6
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1450 proto_tree_add_item(sub_tree
, hf_mac_header_generic_arq_fb_ie_seq2_length_6
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1451 proto_tree_add_item(sub_tree
, hf_mac_header_generic_arq_fb_ie_rsv
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1455 proto_tree_add_item(sub_tree
, hf_mac_header_generic_arq_fb_ie_seq_ack_map
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1456 proto_tree_add_item(sub_tree
, hf_mac_header_generic_arq_fb_ie_seq1_length
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1457 proto_tree_add_item(sub_tree
, hf_mac_header_generic_arq_fb_ie_seq2_length
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1458 proto_tree_add_item(sub_tree
, hf_mac_header_generic_arq_fb_ie_seq3_length
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1461 /* move to next 16-bit word */
1467 /* Number of ACK Maps bits are reserved when ACK TYPE == 1 */
1468 proto_tree_add_item(sub_tree
, hf_ack_type_reserved
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1469 /* move to next 16-bit word */
1474 proto_item_append_text(ti
,"(%u bytes)", offset
);
1475 /* return the offset */
1479 /* Register Wimax Generic Mac Header Protocol and Dissector */
1480 void proto_register_mac_header_generic(void)
1482 /* Generic MAC header display */
1483 static hf_register_info hf
[] =
1486 &hf_mac_header_generic_value_bytes
,
1488 "Values", "wmx.genericValueBytes",
1489 FT_BYTES
, BASE_NONE
, NULL
, 0x0,
1494 &hf_mac_header_generic_ht
,
1496 "MAC Header Type", "wmx.genericHt",
1497 FT_UINT24
, BASE_HEX
, VALS(ht_msgs
), WIMAX_MAC_HEADER_GENERIC_HT
,
1502 &hf_mac_header_generic_ec
,
1504 "MAC Encryption Control", "wmx.genericEc",
1505 FT_UINT24
, BASE_HEX
, VALS(ec_msgs
), WIMAX_MAC_HEADER_GENERIC_EC
,
1510 &hf_mac_header_generic_type_0
,
1512 "MAC Sub-type Bit 0", "wmx.genericType0",
1513 FT_UINT24
, BASE_HEX
, VALS(type_msg0
), WIMAX_MAC_HEADER_GENERIC_TYPE_0
,
1518 &hf_mac_header_generic_type_1
,
1520 "MAC Sub-type Bit 1", "wmx.genericType1",
1521 FT_UINT24
, BASE_HEX
, VALS(type_msg1
), WIMAX_MAC_HEADER_GENERIC_TYPE_1
,
1526 &hf_mac_header_generic_type_2
,
1528 "MAC Sub-type Bit 2", "wmx.genericType2",
1529 FT_UINT24
, BASE_HEX
, VALS(type_msg2
), WIMAX_MAC_HEADER_GENERIC_TYPE_2
,
1534 &hf_mac_header_generic_type_3
,
1536 "MAC Sub-type Bit 3", "wmx.genericType3",
1537 FT_UINT24
, BASE_HEX
, VALS(type_msg3
), WIMAX_MAC_HEADER_GENERIC_TYPE_3
,
1542 &hf_mac_header_generic_type_4
,
1544 "MAC Sub-type Bit 4", "wmx.genericType4",
1545 FT_UINT24
, BASE_HEX
, VALS(type_msg4
), WIMAX_MAC_HEADER_GENERIC_TYPE_4
,
1550 &hf_mac_header_generic_type_5
,
1552 "MAC Sub-type Bit 5", "wmx.genericType5",
1553 FT_UINT24
, BASE_HEX
, VALS(type_msg5
), WIMAX_MAC_HEADER_GENERIC_TYPE_5
,
1558 &hf_mac_header_generic_esf
,
1560 "Extended Sub-header Field", "wmx.genericEsf",
1561 FT_UINT24
, BASE_HEX
, VALS(esf_msgs
), WIMAX_MAC_HEADER_GENERIC_ESF
,
1566 &hf_mac_header_generic_ci
,
1568 "CRC Indicator", "wmx.genericCi",
1569 FT_UINT24
, BASE_HEX
, VALS(ci_msgs
), WIMAX_MAC_HEADER_GENERIC_CI
,
1574 &hf_mac_header_generic_eks
,
1576 "Encryption Key Sequence", "wmx.genericEks",
1577 FT_UINT24
, BASE_HEX
, NULL
, WIMAX_MAC_HEADER_GENERIC_EKS
,
1582 &hf_mac_header_generic_rsv
,
1584 "Reserved", "wmx.genericRsv",
1585 FT_UINT24
, BASE_DEC
, NULL
, WIMAX_MAC_HEADER_GENERIC_RSV
,
1590 &hf_mac_header_generic_len
,
1592 "Length", "wmx.genericLen",
1593 FT_UINT24
, BASE_DEC
, NULL
, WIMAX_MAC_HEADER_GENERIC_LEN
,
1598 &hf_mac_header_generic_cid
,
1600 "Connection ID", "wmx.genericCid",
1601 FT_UINT16
, BASE_DEC
, NULL
, 0x0,
1606 &hf_mac_header_generic_hcs
,
1608 "Header Check Sequence", "wmx.genericHcs",
1609 FT_UINT8
, BASE_HEX
, NULL
, 0x0,
1614 &hf_mac_header_generic_crc
,
1616 "CRC", "wmx.genericCrc",
1617 FT_UINT32
, BASE_HEX
, NULL
, 0x0,
1623 /* Extended Subheader display */
1624 static hf_register_info hf_ext
[] =
1627 &hf_mac_header_generic_ext_subheader_rsv
,
1629 "Reserved", "wmx.genericExtSubhd.Rsv",
1630 FT_UINT8
, BASE_DEC
, NULL
, EXTENDED_SUB_HEADER_RSV_MASK
,
1635 &hf_mac_header_generic_ext_subheader_type_dl
,
1637 "DL Extended Subheader Type", "wmx.genericExtSubhd.Dl",
1638 FT_UINT8
, BASE_DEC
, VALS(dl_ext_sub_header_type
), EXTENDED_SUB_HEADER_TYPE_MASK
,
1643 &hf_mac_header_generic_ext_subheader_type_ul
,
1645 "UL Extended Subheader Type", "wmx.genericExtSubhd.Ul",
1646 FT_UINT8
, BASE_DEC
, VALS(ul_ext_sub_header_type
), EXTENDED_SUB_HEADER_TYPE_MASK
,
1651 &hf_mac_header_generic_ext_subheader_sdu_sn
,
1653 "SDU Sequence Number", "wmx.genericExtSubhd.SduSn",
1654 FT_UINT8
, BASE_DEC
, NULL
, 0x0,
1659 &hf_mac_header_generic_ext_subheader_dl_sleep_control_pscid
,
1661 "Power Saving Class ID", "wmx.genericExtSubhd.DlSleepCtrlPSCID",
1662 FT_UINT24
, BASE_DEC
, NULL
, DL_SLEEP_CONTROL_POWER_SAVING_CLASS_ID_MASK
,
1667 &hf_mac_header_generic_ext_subheader_dl_sleep_control_op
,
1669 "Operation", "wmx.genericExtSubhd.DlSleepCtrlOP",
1670 FT_UINT24
, BASE_HEX
, VALS(dl_sleep_control_ops
), DL_SLEEP_CONTROL_OPERATION_MASK
,
1675 &hf_mac_header_generic_ext_subheader_dl_sleep_control_fswe
,
1677 "Final Sleep Window Exponent", "wmx.genericExtSubhd.DlSleepCtrlFSWE",
1678 FT_UINT24
, BASE_DEC
, NULL
, DL_SLEEP_CONTROL_FINAL_SLEEP_WINDOW_EXPONENT_MASK
,
1683 &hf_mac_header_generic_ext_subheader_dl_sleep_control_fswb
,
1685 "Final Sleep Window Base", "wmx.genericExtSubhd.DlSleepCtrlFSWB",
1686 FT_UINT24
, BASE_DEC
, NULL
, DL_SLEEP_CONTROL_FINAL_SLEEP_WINDOW_BASE_MASK
,
1691 &hf_mac_header_generic_ext_subheader_dl_sleep_control_rsv
,
1693 "Reserved", "wmx.genericExtSubhd.DlSleepCtrlRsv",
1694 FT_UINT24
, BASE_DEC
, NULL
, DL_SLEEP_CONTROL_RESERVED_MASK
,
1699 &hf_mac_header_generic_ext_subheader_fb_req_uiuc
,
1701 "UIUC", "wmx.genericExtSubhd.FbReqUIUC",
1702 FT_UINT24
, BASE_HEX
, VALS(uiuc_values
), FEEDBACK_REQUEST_UIUC_MASK
,
1707 &hf_mac_header_generic_ext_subheader_fb_req_fb_type
,
1709 "Feedback Type", "wmx.genericExtSubhd.FbReqFbType",
1710 FT_UINT24
, BASE_HEX
, VALS(fb_types
), FEEDBACK_REQUEST_FEEDBACK_TYPE_MASK
,
1715 &hf_mac_header_generic_ext_subheader_fb_req_ofdma_symbol_offset
,
1717 "OFDMA Symbol Offset", "wmx.genericExtSubhd.FbReqOfdmaSymbolOffset",
1718 FT_UINT24
, BASE_HEX
, NULL
, FEEDBACK_REQUEST_OFDMA_SYMBOL_OFFSET_MASK
,
1723 &hf_mac_header_generic_ext_subheader_fb_req_subchannel_offset
,
1725 "Subchannel Offset", "wmx.genericExtSubhd.FbReqSubchannelOffset",
1726 FT_UINT24
, BASE_HEX
, NULL
, FEEDBACK_REQUEST_SUBCHANNEL_OFFSET_MASK
,
1731 &hf_mac_header_generic_ext_subheader_fb_req_slots
,
1733 "Number of Slots", "wmx.genericExtSubhd.FbReqSlots",
1734 FT_UINT24
, BASE_HEX
, NULL
, FEEDBACK_REQUEST_NUMBER_OF_SLOTS_MASK
,
1739 &hf_mac_header_generic_ext_subheader_fb_req_frame_offset
,
1741 "Frame Offset", "wmx.genericExtSubhd.FbReqFrameOffset",
1742 FT_UINT24
, BASE_HEX
, NULL
, FEEDBACK_REQUEST_FRAME_OFFSET_MASK
,
1747 &hf_mac_header_generic_ext_subheader_sn_req_rep_ind_1
,
1749 "First SN Report Indication", "wmx.genericExtSubhd.SnReqRepInd1",
1750 FT_UINT8
, BASE_DEC
, VALS(sn_rep_msg
), SN_REQUEST_SUBHEADER_SN_REPORT_INDICATION_1_MASK
,
1755 &hf_mac_header_generic_ext_subheader_sn_req_rep_ind_2
,
1757 "Second SN Report Indication", "wmx.genericExtSubhd.SnReqRepInd2",
1758 FT_UINT8
, BASE_DEC
, VALS(sn_rep_msg
), SN_REQUEST_SUBHEADER_SN_REPORT_INDICATION_2_MASK
,
1763 &hf_mac_header_generic_ext_subheader_sn_req_rsv
,
1765 "Reserved", "wmx.genericExtSubhd.SnReqRsv",
1766 FT_UINT8
, BASE_DEC
, NULL
, SN_REQUEST_SUBHEADER_RESERVED_MASK
,
1771 &hf_mac_header_generic_ext_subheader_mimo_mode_fb_type
,
1773 "Feedback Type", "wmx.genericExtSubhd.MimoFbType",
1774 FT_UINT8
, BASE_DEC
, VALS(mimo_fb_types
), MIMO_FEEDBACK_TYPE_MASK
,
1779 &hf_mac_header_generic_ext_subheader_mimo_fb_content
,
1781 "Feedback Content", "wmx.genericExtSubhd.MimoFbContent",
1782 FT_UINT8
, BASE_DEC
, NULL
, MIMO_FEEDBACK_CONTENT_MASK
,
1787 &hf_mac_header_generic_ext_subheader_ul_tx_pwr_rep
,
1789 "UL TX Power", "wmx.genericExtSubhd.UlTxPwr",
1790 FT_UINT8
, BASE_DEC
, NULL
, 0x0,
1795 &hf_mac_header_generic_ext_subheader_mini_fb_type
,
1797 "Feedback Type", "wmx.genericExtSubhd.MiniFbType",
1798 FT_UINT16
, BASE_DEC
, VALS(fb_types
), MINI_FEEDBACK_TYPE_MASK
,
1803 &hf_mac_header_generic_ext_subheader_mini_fb_content
,
1805 "Feedback Content", "wmx.genericExtSubhd.MiniFbContent",
1806 FT_UINT16
, BASE_DEC
, NULL
, MINI_FEEDBACK_CONTENT_MASK
,
1811 &hf_mac_header_generic_ext_subheader_pdu_sn_short
,
1813 "PDU Sequence Number", "wmx.genericExtSubhd.PduSnShort",
1814 FT_UINT8
, BASE_DEC
, NULL
, 0x0,
1819 &hf_mac_header_generic_ext_subheader_pdu_sn_long
,
1821 "PDU Sequence Number", "wmx.genericExtSubhd.PduSnLong",
1822 FT_UINT16
, BASE_DEC
, NULL
, 0x0,
1828 /* Mesh Subheader display */
1829 static hf_register_info hf_mesh
[] =
1832 &hf_mac_header_generic_mesh_subheader
,
1834 "Xmt Node Id", "wmx.genericMeshSubhd",
1835 FT_UINT16
, BASE_DEC
, NULL
, 0x0,
1841 /* Fragmentation Subheader display */
1842 static hf_register_info hf_frag
[] =
1845 &hf_mac_header_generic_frag_subhd_fc
,
1847 "Fragment Type", "wmx.genericFragSubhd.Fc",
1848 FT_UINT8
, BASE_DEC
, VALS(frag_types
), FRAGMENTATION_SUBHEADER_FC_MASK
,
1853 &hf_mac_header_generic_frag_subhd_fc_ext
,
1855 "Fragment Type", "wmx.genericFragSubhd.FcExt",
1856 FT_UINT16
, BASE_DEC
, VALS(frag_types
), FRAGMENTATION_SUBHEADER_FC_MASK
,
1861 &hf_mac_header_generic_frag_subhd_bsn
,
1863 "Block Sequence Number (BSN)", "wmx.genericFragSubhd.Bsn",
1864 FT_UINT16
, BASE_DEC
, NULL
, FRAGMENTATION_SUBHEADER_BSN_MASK
,
1869 &hf_mac_header_generic_frag_subhd_fsn
,
1871 "Fragment Sequence Number (FSN)", "wmx.genericFragSubhd.Fsn",
1872 FT_UINT8
, BASE_DEC
, NULL
, FRAGMENTATION_SUBHEADER_FSN_MASK
,
1877 &hf_mac_header_generic_frag_subhd_fsn_ext
,
1879 "Fragment Sequence Number (FSN)", "wmx.genericFragSubhd.FsnExt",
1880 FT_UINT16
, BASE_DEC
, NULL
, FRAGMENTATION_SUBHEADER_BSN_MASK
,
1885 &hf_mac_header_generic_frag_subhd_rsv
,
1887 "Reserved", "wmx.genericFragSubhd.Rsv",
1888 FT_UINT8
, BASE_DEC
, NULL
, FRAGMENTATION_SUBHEADER_RSV_MASK
,
1893 &hf_mac_header_generic_frag_subhd_rsv_ext
,
1895 "Reserved", "wmx.genericFragSubhd.RsvExt",
1896 FT_UINT16
, BASE_DEC
, NULL
, FRAGMENTATION_SUBHEADER_RSV_EXT_MASK
,
1902 /* Packing Subheader display */
1903 static hf_register_info hf_pack
[] =
1906 &hf_mac_header_generic_packing_subhd_fc
,
1908 "Fragment Type", "wmx.genericPackSubhd.Fc",
1909 FT_UINT16
, BASE_DEC
, VALS(frag_types
), PACKING_SUBHEADER_FC_MASK
,
1914 &hf_mac_header_generic_packing_subhd_fc_ext
,
1916 "Fragment Type", "wmx.genericPackSubhd.FcExt",
1917 FT_UINT24
, BASE_HEX
, VALS(frag_types
), PACKING_SUBHEADER_FC_MASK
,
1922 &hf_mac_header_generic_packing_subhd_bsn
,
1924 "First Block Sequence Number", "wmx.genericPackSubhd.Bsn",
1925 FT_UINT24
, BASE_DEC
, NULL
, PACKING_SUBHEADER_BSN_MASK
,
1930 &hf_mac_header_generic_packing_subhd_fsn
,
1932 "Fragment Number", "wmx.genericPackSubhd.Fsn",
1933 FT_UINT16
, BASE_DEC
, NULL
, PACKING_SUBHEADER_FSN_MASK
,
1938 &hf_mac_header_generic_packing_subhd_fsn_ext
,
1940 "Fragment Number", "wmx.genericPackSubhd.FsnExt",
1941 FT_UINT24
, BASE_DEC
, NULL
, PACKING_SUBHEADER_BSN_MASK
,
1946 &hf_mac_header_generic_packing_subhd_len
,
1948 "Length", "wmx.genericPackSubhd.Len",
1949 FT_UINT16
, BASE_DEC
, NULL
, PACKING_SUBHEADER_LENGTH_MASK
,
1954 &hf_mac_header_generic_packing_subhd_len_ext
,
1956 "Length", "wmx.genericPackSubhd.LenExt",
1957 FT_UINT24
, BASE_DEC
, NULL
, PACKING_SUBHEADER_LENGTH_EXT_MASK
,
1963 /* Fast-feedback Allocation Subheader display */
1964 static hf_register_info hf_fast
[] =
1967 &hf_mac_header_generic_fast_fb_subhd_alloc_offset
,
1969 "Allocation Offset", "wmx.genericFastFbSubhd.AllocOffset",
1970 FT_UINT8
, BASE_DEC
, NULL
, FAST_FEEDBACK_ALLOCATION_OFFSET_MASK
,
1975 &hf_mac_header_generic_fast_fb_subhd_fb_type
,
1977 "Feedback Type", "wmx.genericFastFbSubhd.FbType",
1978 FT_UINT8
, BASE_DEC
, VALS(fast_fb_types
), FAST_FEEDBACK_FEEDBACK_TYPE_MASK
,
1984 /* Grant Management Subheader display */
1985 static hf_register_info hf_grant
[] =
1988 &hf_mac_header_generic_grant_mgmt_ext_pbr_tree
,
1990 "Scheduling Service Type (Default)",
1991 "wimax.genericGrantSubhd.Default",
1992 FT_UINT16
, BASE_DEC
, NULL
, 0x0,
1997 &hf_mac_header_generic_grant_mgmt_subhd_pbr
,
1999 "PiggyBack Request", "wmx.genericGrantSubhd.Pbr",
2000 FT_UINT16
, BASE_DEC
, NULL
, 0x0,
2005 &hf_mac_header_generic_grant_mgmt_ugs_tree
,
2007 "Scheduling Service Type (UGS)", "wmx.genericGrantSubhd.UGS",
2008 FT_UINT16
, BASE_DEC
, NULL
, 0x0,
2013 &hf_mac_header_generic_grant_mgmt_subhd_ugs_si
,
2015 "Slip Indicator", "wmx.genericGrantSubhd.Si",
2016 FT_UINT16
, BASE_DEC
, VALS(si_msgs
), GRANT_MGMT_SUBHEADER_UGS_SI_MASK
,
2021 &hf_mac_header_generic_grant_mgmt_subhd_ugs_pm
,
2023 "Poll-Me", "wmx.genericGrantSubhd.Pm",
2024 FT_UINT16
, BASE_DEC
, VALS(pm_msgs
), GRANT_MGMT_SUBHEADER_UGS_PM_MASK
,
2029 &hf_mac_header_generic_grant_mgmt_subhd_ugs_fli
,
2031 "Frame Latency Indication", "wmx.genericGrantSubhd.Fli",
2032 FT_UINT16
, BASE_DEC
, VALS(fli_msgs
), GRANT_MGMT_SUBHEADER_UGS_FLI_MASK
,
2037 &hf_mac_header_generic_grant_mgmt_subhd_ugs_fl
,
2039 "Frame Latency", "wmx.genericGrantSubhd.Fl",
2040 FT_UINT16
, BASE_DEC
, NULL
, GRANT_MGMT_SUBHEADER_UGS_FL_MASK
,
2045 &hf_mac_header_generic_grant_mgmt_subhd_ugs_rsv
,
2047 "Reserved", "wmx.genericGrantSubhd.Rsv",
2048 FT_UINT16
, BASE_DEC
, NULL
, GRANT_MGMT_SUBHEADER_UGS_RSV_MASK
,
2053 &hf_mac_header_generic_grant_mgmt_ext_rtps_tree
,
2055 "Scheduling Service Type (Extended rtPS)",
2056 "wimax.genericGrantSubhd.ExtendedRTPS",
2057 FT_UINT16
, BASE_DEC
, NULL
, 0x0,
2062 &hf_mac_header_generic_grant_mgmt_subhd_ext_pbr
,
2064 "Extended PiggyBack Request", "wmx.genericGrantSubhd.ExtPbr",
2065 FT_UINT16
, BASE_DEC
, NULL
, GRANT_MGMT_SUBHEADER_EXT_PBR_MASK
,
2070 &hf_mac_header_generic_grant_mgmt_subhd_ext_fli
,
2072 "Frame Latency Indication", "wmx.genericGrantSubhd.ExtFli",
2073 FT_UINT16
, BASE_DEC
, VALS(fli_msgs
), GRANT_MGMT_SUBHEADER_EXT_FLI_MASK
,
2078 &hf_mac_header_generic_grant_mgmt_subhd_ext_fl
,
2080 "Frame Latency", "wmx.genericGrantSubhd.ExtFl",
2081 FT_UINT16
, BASE_DEC
, NULL
, GRANT_MGMT_SUBHEADER_EXT_FL_MASK
,
2087 /* ARQ Feedback Payload display */
2088 static hf_register_info hf_arq
[] =
2091 &hf_mac_header_generic_arq_fb_ie_cid
,
2093 "CID", "wmx.genericArq.FbIeCid",
2094 FT_UINT16
, BASE_DEC
, NULL
, 0x0,
2099 &hf_mac_header_generic_arq_fb_ie_last
,
2101 "Last IE", "wmx.genericArq.FbIeLast",
2102 FT_UINT16
, BASE_DEC
, VALS(last_ie_msgs
), ARQ_FB_IE_LAST_BIT_MASK
,
2107 &hf_mac_header_generic_arq_fb_ie_ack_type
,
2109 "ACK Type", "wmx.genericArq.FbIeAckType",
2110 FT_UINT16
, BASE_DEC
, NULL
, ARQ_FB_IE_ACK_TYPE_MASK
,
2115 &hf_mac_header_generic_arq_fb_ie_bsn
,
2117 "BSN", "wmx.genericArq.FbIeBsn",
2118 FT_UINT16
, BASE_DEC
, NULL
, ARQ_FB_IE_BSN_MASK
,
2123 &hf_mac_header_generic_arq_fb_ie_num_maps
,
2125 "Number of ACK Maps", "wmx.genericArq.FbIeMaps",
2126 FT_UINT16
, BASE_DEC
, NULL
, ARQ_FB_IE_NUM_MAPS_MASK
,
2131 &hf_ack_type_reserved
,
2133 "Reserved", "wmx.genericArq.FbIeRsvd", FT_UINT16
, BASE_DEC
, NULL
, 0x03, NULL
, HFILL
2137 &hf_mac_header_generic_arq_fb_ie_sel_ack_map
,
2139 "Selective ACK Map", "wmx.genericArq.FbIeSelAckMap",
2140 FT_UINT16
, BASE_HEX
, NULL
, 0x0,
2145 &hf_mac_header_generic_arq_fb_ie_seq_format
,
2147 "Sequence Format", "wmx.genericArq.FbIeSeqFmt",
2148 FT_UINT16
, BASE_DEC
, NULL
, ARQ_FB_IE_SEQ_FORMAT_MASK
,
2153 &hf_mac_header_generic_arq_fb_ie_seq_ack_map
,
2155 "Sequence ACK Map", "wmx.genericArq.FbIeSeqAckMap",
2156 FT_UINT16
, BASE_HEX
, NULL
, ARQ_FB_IE_SEQ_ACK_MAP_MASK
,
2161 &hf_mac_header_generic_arq_fb_ie_seq1_length
,
2163 "Sequence 1 Length", "wmx.genericArq.FbIeSeq1Len",
2164 FT_UINT16
, BASE_DEC
, NULL
, ARQ_FB_IE_SEQ1_LENGTH_MASK
,
2169 &hf_mac_header_generic_arq_fb_ie_seq2_length
,
2171 "Sequence 2 Length", "wmx.genericArq.FbIeSeq2Len",
2172 FT_UINT16
, BASE_DEC
, NULL
, ARQ_FB_IE_SEQ2_LENGTH_MASK
,
2177 &hf_mac_header_generic_arq_fb_ie_seq3_length
,
2179 "Sequence 3 Length", "wmx.genericArq.FbIeSeq3Len",
2180 FT_UINT16
, BASE_DEC
, NULL
, ARQ_FB_IE_SEQ3_LENGTH_MASK
,
2185 &hf_mac_header_generic_arq_fb_ie_seq_ack_map_2
,
2187 "Sequence ACK Map", "wmx.genericArq.FbIeSeqAckMap2",
2188 FT_UINT16
, BASE_HEX
, NULL
, ARQ_FB_IE_SEQ_ACK_MAP_2_MASK
,
2193 &hf_mac_header_generic_arq_fb_ie_seq1_length_6
,
2195 "Sequence 1 Length", "wmx.genericArq.FbIeSeq1Len",
2196 FT_UINT16
, BASE_DEC
, NULL
, ARQ_FB_IE_SEQ1_LENGTH_6_MASK
,
2201 &hf_mac_header_generic_arq_fb_ie_seq2_length_6
,
2203 "Sequence 2 Length", "wmx.genericArq.FbIeSeq2Len",
2204 FT_UINT16
, BASE_DEC
, NULL
, ARQ_FB_IE_SEQ2_LENGTH_6_MASK
,
2209 &hf_mac_header_generic_arq_fb_ie_rsv
,
2211 "Reserved", "wmx.genericArq.FbIeRsv",
2212 FT_UINT16
, BASE_DEC
, NULL
, ARQ_FB_IE_RSV_MASK
,
2218 /* Setup protocol subtree array */
2219 static gint
*ett
[] =
2221 &ett_mac_header_generic_decoder
,
2222 /* &ett_mac_subheader_decoder, */
2223 &ett_mac_mesh_subheader_decoder
,
2224 &ett_mac_frag_subheader_decoder
,
2225 &ett_mac_grant_mgmt_subheader_decoder
,
2226 &ett_mac_pkt_subheader_decoder
,
2227 &ett_mac_fast_fb_subheader_decoder
,
2228 &ett_mac_ext_subheader_decoder
,
2229 &ett_mac_ext_subheader_dl_decoder
,
2230 &ett_mac_ext_subheader_ul_decoder
,
2231 &ett_mac_arq_fb_payload_decoder
,
2232 &ett_mac_data_pdu_decoder
,
2235 static ei_register_info ei
[] = {
2236 { &ei_mac_crc_malformed
, { "wmx.genericCrc.missing", PI_MALFORMED
, PI_ERROR
, "CRC missing - the frame is too short", EXPFILL
}},
2237 { &ei_mac_crc_missing
, { "wmx.genericCrc.missing", PI_PROTOCOL
, PI_NOTE
, "CRC is not included in this frame!", EXPFILL
}},
2240 expert_module_t
* expert_mac_header_generic
;
2242 proto_mac_header_generic_decoder
= proto_register_protocol (
2243 "WiMax Generic/Type1/Type2 MAC Header Messages", /* name */
2244 "WiMax Generic/Type1/Type2 MAC Header (hdr)", /* short name */
2245 "wmx.hdr" /* abbrev */
2248 /* register the field display messages */
2249 proto_register_field_array(proto_mac_header_generic_decoder
, hf
, array_length(hf
));
2250 proto_register_field_array(proto_mac_header_generic_decoder
, hf_ext
, array_length(hf_ext
));
2251 proto_register_field_array(proto_mac_header_generic_decoder
, hf_mesh
, array_length(hf_mesh
));
2252 proto_register_field_array(proto_mac_header_generic_decoder
, hf_frag
, array_length(hf_frag
));
2253 proto_register_field_array(proto_mac_header_generic_decoder
, hf_pack
, array_length(hf_pack
));
2254 proto_register_field_array(proto_mac_header_generic_decoder
, hf_fast
, array_length(hf_fast
));
2255 proto_register_field_array(proto_mac_header_generic_decoder
, hf_grant
, array_length(hf_grant
));
2256 proto_register_field_array(proto_mac_header_generic_decoder
, hf_arq
, array_length(hf_arq
));
2257 proto_register_subtree_array(ett
, array_length(ett
));
2259 expert_mac_header_generic
= expert_register_protocol(proto_mac_header_generic_decoder
);
2260 expert_register_field_array(expert_mac_header_generic
, ei
, array_length(ei
));
2262 /* register the generic mac header dissector */
2263 register_dissector("mac_header_generic_handler", dissect_mac_header_generic_decoder
, proto_mac_header_generic_decoder
);
2265 /* Register the payload fragment table init routine */
2266 register_init_routine(wimax_defragment_init
);
2270 proto_reg_handoff_mac_header_generic(void)
2272 mac_mgmt_msg_decoder_handle
= find_dissector("wmx_mac_mgmt_msg_decoder");
2273 mac_ip_handle
= find_dissector("ip");