From e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 10 Apr 2024 22:34:10 +0200 Subject: Adding upstream version 4.2.2. Signed-off-by: Daniel Baumann --- .../epan/wimax/wimax_compact_dlmap_ie_decoder.c | 2111 ++++++++++++++++++++ 1 file changed, 2111 insertions(+) create mode 100644 plugins/epan/wimax/wimax_compact_dlmap_ie_decoder.c (limited to 'plugins/epan/wimax/wimax_compact_dlmap_ie_decoder.c') diff --git a/plugins/epan/wimax/wimax_compact_dlmap_ie_decoder.c b/plugins/epan/wimax/wimax_compact_dlmap_ie_decoder.c new file mode 100644 index 0000000..c69bd68 --- /dev/null +++ b/plugins/epan/wimax/wimax_compact_dlmap_ie_decoder.c @@ -0,0 +1,2111 @@ +/* wimax_compact_dlmap_ie_decoder.c + * WiMax HARQ Map Message decoder + * + * Copyright (c) 2007 by Intel Corporation. + * + * Author: Lu Pan + * + * Wireshark - Network traffic analyzer + * By Gerald Combs + * Copyright 1999 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/* Include files */ + +#include "config.h" + +#include +#include "wimax-int.h" +#include "wimax_compact_dlmap_ie_decoder.h" + +extern gint proto_wimax; + +/* MASKs */ +#define MSB_NIBBLE_MASK 0xF0 +#define LSB_NIBBLE_MASK 0x0F + +#define CID_TYPE_NORMAL 0 +#define CID_TYPE_RCID11 1 +#define CID_TYPE_RCID7 2 +#define CID_TYPE_RCID3 3 + +/* Global Variables */ +guint cid_type = 0; +guint band_amc_subchannel_type = 0; +guint max_logical_bands = 12; +guint num_of_broadcast_symbols = 0; +guint num_of_dl_band_amc_symbols = 0; +guint num_of_ul_band_amc_symbols = 0; +/* from switch HARQ mode extension IE */ +guint harq_mode = 0; + +/* forward reference */ +static guint wimax_compact_dlmap_format_configuration_ie_decoder(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, guint offset, guint nibble_offset); +static guint wimax_compact_dlmap_rcid_ie_decoder(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, guint offset, guint nibble_offset); +static guint wimax_compact_dlmap_harq_control_ie_decoder(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, guint offset, guint nibble_offset); +static guint wimax_compact_dlmap_cqich_control_ie_decoder(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, guint offset, guint nibble_offset); +static guint wimax_cdlmap_extension_ie_decoder(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, guint offset, guint nibble_offset); +guint wimax_extended_diuc_dependent_ie_decoder(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, guint offset, guint nibble_offset); + +static gint proto_wimax_compact_dlmap_ie_decoder = -1; + +#if 0 /* not used ?? */ +static gint ett_wimax_compact_dlmap_ie_decoder = -1; +static gint ett_wimax_format_configuration_ie_decoder = -1; +static gint ett_wimax_rcid_ie_decoder = -1; +static gint ett_wimax_harq_control_ie_decoder = -1; +static gint ett_wimax_extended_diuc_dependent_ie_decoder = -1; +static gint ett_wimax_cqich_control_ie_decoder = -1; +static gint ett_wimax_extension_type_ie_decoder = -1; +#endif + +/* New Format Indications */ +static const true_false_string tfs_indication = +{ + "New format", + "No new format" +}; + +/* Prefixes */ +static const true_false_string tfs_prefix = +{ + "Enable HARQ", + "Temporary Disable HARQ" +}; + +/* CQICH Indicator */ +static const true_false_string tfs_cqich_ind = +{ + "With CQICH Control IE", + "No CQICH Control IE" +}; + +/* CID types */ +static const value_string vals_cid_types[] = +{ + { 0, "Normal CID" }, + { 1, "RCID11 (default)" }, + { 2, "RCID7" }, + { 3, "RCID3" }, + { 0, NULL } +}; + +/* Subchannel Types */ +static const value_string vals_subchannel_types[] = +{ + { 0, "Default Type" }, + { 1, "1 bin x 6 symbols Type" }, + { 2, "2 bin x 3 symbols Type" }, + { 3, "3 bin x 2 symbols Type" }, + { 0, NULL } +}; + +/* Max Logical Bands */ +static const value_string vals_max_logical_bands[] = +{ + { 0, "3 Bands" }, + { 1, "6 Bands" }, + { 2, "12 Bands (default)" }, + { 3, "24 Bands" }, + { 0, NULL } +}; + +/* Repetition Coding Indications */ +static const value_string rep_msgs[] = +{ + { 0, "No Repetition Coding" }, + { 1, "Repetition Coding of 2 Used" }, + { 2, "Repetition Coding of 4 Used" }, + { 3, "Repetition Coding of 6 Used" }, + { 0, NULL } +}; + +/* Repetition Coding Indications */ +static const value_string vals_allocation_modes[] = +{ + { 0, "Same Number Of Subchannels For The Selected Bands" }, + { 1, "Different Same Number Of Subchannels For The Selected Bands" }, + { 2, "Total Number Of Subchannels For The Selected Bands Determined by Nsch Code and Nep Code" }, + { 3, "Reserved" }, + { 0, NULL } +}; + +/* Masks */ +#define DL_MAP_TYPE_MASK 0xE0 +#define UL_MAP_APPEND_MASK 0x10 +#define SHORTENED_DIUC_MASK 0xE0 +#define COMPANDED_SC_MASK 0x1F +#define DL_MAP_TYPE_MASK_1 0x0E +#define UL_MAP_APPEND_MASK_1 0x01 +#define SHORTENED_DIUC_MASK_1 0x0E00 +#define COMPANDED_SC_MASK_1 0x01F0 + +/* display indexies */ +static gint hf_cdlmap_dl_map_type = -1; +static gint hf_cdlmap_ul_map_append = -1; +static gint hf_cdlmap_reserved = -1; +static gint hf_cdlmap_nep_code = -1; +static gint hf_cdlmap_nsch_code = -1; +static gint hf_cdlmap_num_bands = -1; +static gint hf_cdlmap_band_index = -1; +static gint hf_cdlmap_nb_bitmap = -1; +static gint hf_cdlmap_dl_map_type_1 = -1; +static gint hf_cdlmap_ul_map_append_1 = -1; +static gint hf_cdlmap_reserved_1 = -1; +static gint hf_cdlmap_nep_code_1 = -1; +static gint hf_cdlmap_nsch_code_1 = -1; +static gint hf_cdlmap_num_bands_1 = -1; +/*static gint hf_cdlmap_band_index_1 = -1;*/ +static gint hf_cdlmap_nb_bitmap_1 = -1; + +static gint hf_cdlmap_shortened_diuc = -1; +static gint hf_cdlmap_companded_sc = -1; +static gint hf_cdlmap_shortened_uiuc = -1; +static gint hf_cdlmap_shortened_diuc_1 = -1; +static gint hf_cdlmap_companded_sc_1 = -1; +static gint hf_cdlmap_shortened_uiuc_1 = -1; + +static gint hf_cdlmap_bin_offset = -1; +static gint hf_cdlmap_bin_offset_1 = -1; + +static gint hf_cdlmap_diuc_num_of_subchannels = -1; +static gint hf_cdlmap_diuc_num_of_subchannels_1 = -1; +static gint hf_cdlmap_diuc_repetition_coding_indication = -1; +static gint hf_cdlmap_diuc_repetition_coding_indication_1 = -1; +static gint hf_cdlmap_diuc_reserved = -1; +static gint hf_cdlmap_diuc_reserved_1 = -1; + +static gint hf_cdlmap_bit_map_length = -1; +static gint hf_cdlmap_bit_map_length_1 = -1; +static gint hf_cdlmap_bit_map = -1; + +static gint hf_cdlmap_diuc = -1; +static gint hf_cdlmap_diuc_1 = -1; + +static gint hf_cdlmap_allocation_mode = -1; +static gint hf_cdlmap_allocation_mode_rsvd = -1; +static gint hf_cdlmap_num_subchannels = -1; +static gint hf_cdlmap_allocation_mode_1 = -1; +static gint hf_cdlmap_allocation_mode_rsvd_1 = -1; +static gint hf_cdlmap_num_subchannels_1 = -1; + +/* static gint hf_cdlmap_reserved_type = -1; */ +static gint hf_cdlmap_reserved_type_1 = -1; + +/* display indexies */ +static gint hf_format_config_ie_dl_map_type = -1; +static gint hf_format_config_ie_dl_map_type_1 = -1; +static gint hf_format_config_ie_dl_map_type_32 = -1; +static gint hf_format_config_ie_new_format_indication = -1; +static gint hf_format_config_ie_new_format_indication_1 = -1; +static gint hf_format_config_ie_new_format_indication_32 = -1; +static gint hf_format_config_ie_cid_type = -1; +static gint hf_format_config_ie_cid_type_1 = -1; +static gint hf_format_config_ie_safety_pattern = -1; +static gint hf_format_config_ie_safety_pattern_1 = -1; +static gint hf_format_config_ie_subchannel_type = -1; +static gint hf_format_config_ie_subchannel_type_1 = -1; +static gint hf_format_config_ie_max_logical_bands = -1; +static gint hf_format_config_ie_max_logical_bands_1 = -1; +static gint hf_format_config_ie_num_of_broadcast_symbol = -1; +static gint hf_format_config_ie_num_of_broadcast_symbol_1 = -1; +static gint hf_format_config_ie_num_of_dl_band_amc_symbol = -1; +static gint hf_format_config_ie_num_of_dl_band_amc_symbol_1 = -1; +static gint hf_format_config_ie_num_of_ul_band_amc_symbol = -1; +static gint hf_format_config_ie_num_of_ul_band_amc_symbol_1 = -1; + +/* Format Configuration IE Masks */ +#define FORMAT_CONFIG_IE_DL_MAP_TYPE_MASK 0xE0000000 +#define FORMAT_CONFIG_IE_NEW_FORMAT_IND_MASK 0x10000000 +#define CID_TYPE_MASK_1 0x0C000000 +#define SAFETY_PATTERN_MASK_1 0x03E00000 +#define BAND_AMC_SUBCHANNEL_TYPE_MASK_1 0x00180000 +#define MAX_LOGICAL_BANDS_MASK_1 0x00060000 +#define NUM_BROADCAST_SYMBOLS_MASK_1 0x0001F000 +#define NUM_DL_AMC_SYMBOLS_MASK_1 0x00000FC0 +#define NUM_UL_AMC_SYMBOLS_MASK_1 0x0000003F +#define CID_TYPE_MASK 0xC0000000 +#define SAFETY_PATTERN_MASK 0x3E000000 +#define BAND_AMC_SUBCHANNEL_TYPE_MASK 0x01800000 +#define MAX_LOGICAL_BANDS_MASK 0x00600000 +#define NUM_BROADCAST_SYMBOLS_MASK 0x001F0000 +#define NUM_DL_AMC_SYMBOLS_MASK 0x0000FC00 +#define NUM_UL_AMC_SYMBOLS_MASK 0x000003F0 + +/* display indexies */ +static gint hf_harq_rcid_ie_prefix = -1; +static gint hf_harq_rcid_ie_prefix_1 = -1; +static gint hf_harq_rcid_ie_normal_cid = -1; +static gint hf_harq_rcid_ie_normal_cid_1 = -1; +static gint hf_harq_rcid_ie_cid3 = -1; +static gint hf_harq_rcid_ie_cid3_1 = -1; +static gint hf_harq_rcid_ie_cid7 = -1; +static gint hf_harq_rcid_ie_cid7_1 = -1; +static gint hf_harq_rcid_ie_cid11 = -1; +static gint hf_harq_rcid_ie_cid11_1 = -1; +static gint hf_harq_rcid_ie_cid11_2 = -1; +static gint hf_harq_rcid_ie_cid11_3 = -1; + +/* Masks */ +#define WIMAX_RCID_IE_NORMAL_CID_MASK_1 0x0FFFF0 +#define WIMAX_RCID_IE_PREFIX_MASK 0x8000 +#define WIMAX_RCID_IE_PREFIX_MASK_1 0x0800 +#define WIMAX_RCID_IE_CID3_MASK 0x7000 +#define WIMAX_RCID_IE_CID3_MASK_1 0x0700 +#define WIMAX_RCID_IE_CID7_MASK 0x7F00 +#define WIMAX_RCID_IE_CID7_MASK_1 0x07F0 +#define WIMAX_RCID_IE_CID11_MASK 0x7FF0 +#define WIMAX_RCID_IE_CID11_MASK_1 0x07FF + +/* HARQ MAP HARQ Control IE display indexies */ +static gint hf_harq_control_ie_prefix = -1; +static gint hf_harq_control_ie_ai_sn = -1; +static gint hf_harq_control_ie_spid = -1; +static gint hf_harq_control_ie_acid = -1; +static gint hf_harq_control_ie_reserved = -1; +static gint hf_harq_control_ie_prefix_1 = -1; +static gint hf_harq_control_ie_ai_sn_1 = -1; +static gint hf_harq_control_ie_spid_1 = -1; +static gint hf_harq_control_ie_acid_1 = -1; +static gint hf_harq_control_ie_reserved_1 = -1; + +/* Masks */ +#define WIMAX_HARQ_CONTROL_IE_PREFIX_MASK 0x80 +#define WIMAX_HARQ_CONTROL_IE_AI_SN_MASK 0x40 +#define WIMAX_HARQ_CONTROL_IE_SPID_MASK 0x30 +#define WIMAX_HARQ_CONTROL_IE_ACID_MASK 0x0F +#define WIMAX_HARQ_CONTROL_IE_RESERVED_MASK 0x70 +#define WIMAX_HARQ_CONTROL_IE_PREFIX_MASK_1 0x0800 +#define WIMAX_HARQ_CONTROL_IE_AI_SN_MASK_1 0x0400 +#define WIMAX_HARQ_CONTROL_IE_SPID_MASK_1 0x0300 +#define WIMAX_HARQ_CONTROL_IE_ACID_MASK_1 0x00F0 +#define WIMAX_HARQ_CONTROL_IE_RESERVED_MASK_1 0x0700 + +/* HARQ MAP CQICH Control IE display indexies */ +static gint hf_cqich_control_ie_indicator = -1; +static gint hf_cqich_control_ie_alloc_id = -1; +static gint hf_cqich_control_ie_period = -1; +static gint hf_cqich_control_ie_frame_offset = -1; +static gint hf_cqich_control_ie_duration = -1; +static gint hf_cqich_control_ie_cqi_rep_threshold = -1; +static gint hf_cqich_control_ie_indicator_1 = -1; +static gint hf_cqich_control_ie_alloc_id_1 = -1; +static gint hf_cqich_control_ie_period_1 = -1; +static gint hf_cqich_control_ie_frame_offset_1 = -1; +static gint hf_cqich_control_ie_duration_1 = -1; +static gint hf_cqich_control_ie_cqi_rep_threshold_1 = -1; + +/* Masks */ +#define WIMAX_CQICH_CONTROL_IE_INDICATOR_MASK 0x8000 +#define WIMAX_CQICH_CONTROL_IE_ALLOCATION_INDEX_MASK 0x7E00 +#define WIMAX_CQICH_CONTROL_IE_PERIOD_MASK 0x0180 +#define WIMAX_CQICH_CONTROL_IE_FRAME_OFFSET_MASK 0x0070 +#define WIMAX_CQICH_CONTROL_IE_DURATION_MASK 0x000F +#define WIMAX_CQICH_CONTROL_IE_CQI_REP_THRESHOLD_MASK 0x7000 +#define WIMAX_CQICH_CONTROL_IE_INDICATOR_MASK_1 0x080000 +#define WIMAX_CQICH_CONTROL_IE_ALLOCATION_INDEX_MASK_1 0x07E000 +#define WIMAX_CQICH_CONTROL_IE_PERIOD_MASK_1 0x001800 +#define WIMAX_CQICH_CONTROL_IE_FRAME_OFFSET_MASK_1 0x000700 +#define WIMAX_CQICH_CONTROL_IE_DURATION_MASK_1 0x0000F0 +#define WIMAX_CQICH_CONTROL_IE_CQI_REP_THRESHOLD_MASK_1 0x070000 + +/* Extension Type */ +#define EXTENSION_TYPE_MASK 0xE000 +#define EXTENSION_TYPE_MASK_1 0x0E00 +#define EXTENSION_SUBTYPE_MASK 0x1F00 +#define EXTENSION_SUBTYPE_MASK_1 0x01F0 +#define EXTENSION_LENGTH_MASK 0x00F0 +#define EXTENSION_LENGTH_MASK_1 0x000F + +static gint hf_cdlmap_extension_type = -1; +static gint hf_cdlmap_extension_subtype = -1; +static gint hf_cdlmap_extension_length = -1; +static gint hf_cdlmap_extension_type_1 = -1; +static gint hf_cdlmap_extension_subtype_1 = -1; +static gint hf_cdlmap_extension_length_1 = -1; + +static gint hf_cdlmap_extension_time_diversity_mbs = -1; +static gint hf_cdlmap_extension_harq_mode = -1; +static gint hf_cdlmap_extension_unknown_sub_type = -1; +static gint hf_cdlmap_extension_time_diversity_mbs_1 = -1; +static gint hf_cdlmap_extension_harq_mode_1 = -1; +static gint hf_cdlmap_extension_unknown_sub_type_1 = -1; + +/* Extended DIUC dependent IE display indexies */ +static gint hf_extended_diuc_dependent_ie_diuc = -1; +static gint hf_extended_diuc_dependent_ie_diuc_1 = -1; +static gint hf_extended_diuc_dependent_ie_length = -1; +static gint hf_extended_diuc_dependent_ie_length_1 = -1; +static gint hf_extended_diuc_dependent_ie_channel_measurement = -1; +static gint hf_extended_diuc_dependent_ie_stc_zone = -1; +static gint hf_extended_diuc_dependent_ie_aas_dl = -1; +static gint hf_extended_diuc_dependent_ie_data_location = -1; +static gint hf_extended_diuc_dependent_ie_cid_switch = -1; +static gint hf_extended_diuc_dependent_ie_mimo_dl_basic = -1; +static gint hf_extended_diuc_dependent_ie_mimo_dl_enhanced = -1; +static gint hf_extended_diuc_dependent_ie_harq_map_pointer = -1; +static gint hf_extended_diuc_dependent_ie_phymod_dl = -1; +static gint hf_extended_diuc_dependent_ie_dl_pusc_burst_allocation = -1; +static gint hf_extended_diuc_dependent_ie_ul_interference_and_noise_level = -1; +static gint hf_extended_diuc_dependent_ie_unknown_diuc = -1; + + +/* Compact DL-MAP IE Types (table 89) */ +#define COMPACT_DL_MAP_TYPE_NORMAL_SUBCHANNEL 0 +#define COMPACT_DL_MAP_TYPE_BAND_AMC 1 +#define COMPACT_DL_MAP_TYPE_SAFETY 2 +#define COMPACT_DL_MAP_TYPE_UIUC 3 +#define COMPACT_DL_MAP_TYPE_FORMAT_CONF_IE 4 +#define COMPACT_DL_MAP_TYPE_HARQ_ACK_BITMAP_IE 5 +#define COMPACT_DL_MAP_TYPE_RESERVED 6 +#define COMPACT_DL_MAP_TYPE_EXTENSION 7 + +/* Compact DL-MAP IE decoder */ +guint wimax_compact_dlmap_ie_decoder(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, guint offset, guint nibble_offset) +{ + guint diuc, byte, length = 0; + guint dl_map_type, ul_map_append; + guint dl_map_offset, nibble_length, bit_map_length; + guint nband, band_count, i, allocation_mode; + +#ifdef DEBUG + /* update the info column */ + col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, "Compact DL-MAP IEs"); +#endif + /* set the local offset */ + dl_map_offset = offset; + /* Get the first byte */ + byte = tvb_get_guint8(tvb, dl_map_offset); + if(nibble_offset & 1) + { + dl_map_type = ((byte & DL_MAP_TYPE_MASK_1) >> 1); + ul_map_append = (byte & UL_MAP_APPEND_MASK_1); + } + else + { + dl_map_type = ((byte & DL_MAP_TYPE_MASK) >> 5); + ul_map_append = (byte & UL_MAP_APPEND_MASK); + } + switch (dl_map_type) + { + case COMPACT_DL_MAP_TYPE_NORMAL_SUBCHANNEL:/* 6.3.2.3.43.6.1 */ + if(nibble_offset & 1) + { /* display the DL-MAP type */ + proto_tree_add_item(tree, hf_cdlmap_dl_map_type_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* display the UL-MAP append */ + proto_tree_add_item(tree, hf_cdlmap_ul_map_append_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + nibble_offset = 0; + } + else + { /* display the DL-MAP type */ + proto_tree_add_item(tree, hf_cdlmap_dl_map_type, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* display the UL-MAP append */ + proto_tree_add_item(tree, hf_cdlmap_ul_map_append, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + nibble_offset = 1; + } + length = 1; + /* decode RCID IE */ + nibble_length = wimax_compact_dlmap_rcid_ie_decoder(tree, pinfo, tvb, dl_map_offset, nibble_offset); + length += nibble_length; + dl_map_offset += (nibble_length >> 1); + nibble_offset = (nibble_length & 1); + /* check harq mode */ + if(!harq_mode) + { /* display the Nep and Nsch Code */ + if(nibble_offset & 1) + { + proto_tree_add_item(tree, hf_cdlmap_nep_code_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + proto_tree_add_item(tree, hf_cdlmap_nsch_code, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + } + else + { + proto_tree_add_item(tree, hf_cdlmap_nep_code, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_nsch_code_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + } + length += 2; + } + else if(harq_mode == 1) + { /* display the Shortened DIUC and Companded SC */ + if(nibble_offset & 1) + { + proto_tree_add_item(tree, hf_cdlmap_shortened_diuc_1, tvb, dl_map_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_companded_sc_1, tvb, dl_map_offset, 2, ENC_BIG_ENDIAN); + } + else + { + proto_tree_add_item(tree, hf_cdlmap_shortened_diuc, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_companded_sc, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + } + /* move to next byte */ + dl_map_offset++; + length += 2; + } + /* decode HARQ Control IE */ + nibble_length = wimax_compact_dlmap_harq_control_ie_decoder(tree, pinfo, tvb, dl_map_offset, nibble_offset); + length += nibble_length; + dl_map_offset += ((nibble_offset + nibble_length) >> 1); + nibble_offset = ((nibble_offset + nibble_length) & 1); + /* decode CQICH Control IE */ + nibble_length = wimax_compact_dlmap_cqich_control_ie_decoder(tree, pinfo, tvb, dl_map_offset, nibble_offset); + length += nibble_length; + dl_map_offset += ((nibble_offset + nibble_length) >> 1); + nibble_offset = ((nibble_offset + nibble_length) & 1); + if(ul_map_append) + { /* check harq mode */ + if(harq_mode == 1) + { /* display the Shortened UIUC and Companded SC */ + if(nibble_offset & 1) + { + proto_tree_add_item(tree, hf_cdlmap_shortened_uiuc_1, tvb, dl_map_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_companded_sc_1, tvb, dl_map_offset, 2, ENC_BIG_ENDIAN); + } + else + { + proto_tree_add_item(tree, hf_cdlmap_shortened_uiuc, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_companded_sc, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + } + /* move to next byte */ + dl_map_offset++; + length += 2; + } + else if(!harq_mode) + { /* display the Nep and Nsch Code */ + if(nibble_offset & 1) + { + proto_tree_add_item(tree, hf_cdlmap_nep_code_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + proto_tree_add_item(tree, hf_cdlmap_nsch_code, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + } + else + { + proto_tree_add_item(tree, hf_cdlmap_nep_code, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_nsch_code_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + } + length += 2; + } + /* decode HARQ Control IE */ + nibble_length = wimax_compact_dlmap_harq_control_ie_decoder(tree, pinfo, tvb, dl_map_offset, nibble_offset); + length += nibble_length; + } + break; + case COMPACT_DL_MAP_TYPE_BAND_AMC:/* 6.3.2.3.43.6.2 */ + if(nibble_offset & 1) + { /* display the DL-MAP type */ + proto_tree_add_item(tree, hf_cdlmap_dl_map_type_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* display the reserved */ + proto_tree_add_item(tree, hf_cdlmap_reserved_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + nibble_offset = 0; + } + else + { /* display the DL-MAP type */ + proto_tree_add_item(tree, hf_cdlmap_dl_map_type, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* display the reserved */ + proto_tree_add_item(tree, hf_cdlmap_reserved, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + nibble_offset = 1; + } + length = 1; + /* decode RCID IE */ + nibble_length = wimax_compact_dlmap_rcid_ie_decoder(tree, pinfo, tvb, dl_map_offset, nibble_offset); + length += nibble_length; + dl_map_offset += (nibble_length >> 1); + nibble_offset = (nibble_length & 1); + /* check harq mode */ + if(!harq_mode) + { /* display the Nep and Nsch Code */ + if(nibble_offset & 1) + { + proto_tree_add_item(tree, hf_cdlmap_nep_code_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + proto_tree_add_item(tree, hf_cdlmap_nsch_code, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + } + else + { + proto_tree_add_item(tree, hf_cdlmap_nep_code, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_nsch_code_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + } + length += 2; + } + else if(harq_mode == 1) + { /* display the Shortened DIUC and Companded SC */ + if(nibble_offset & 1) + { + proto_tree_add_item(tree, hf_cdlmap_shortened_diuc_1, tvb, dl_map_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_companded_sc_1, tvb, dl_map_offset, 2, ENC_BIG_ENDIAN); + } + else + { + proto_tree_add_item(tree, hf_cdlmap_shortened_diuc, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_companded_sc, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + } + /* move to next byte */ + dl_map_offset++; + length += 2; + } + /* get the Nband */ + if(max_logical_bands) + { /* get and display the Nband */ + nband = tvb_get_guint8(tvb, dl_map_offset); + if(nibble_offset & 1) + { + nband = (nband & LSB_NIBBLE_MASK); + /* display the Nband */ + proto_tree_add_item(tree, hf_cdlmap_num_bands_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + nibble_offset = 0; + if(max_logical_bands == 3) + { + proto_tree_add_item(tree, hf_cdlmap_band_index, tvb, dl_map_offset, nband, ENC_NA); + length += (nband * 2); + /* update offset */ + dl_map_offset += nband; + } + else + { + nibble_offset = (nband & 1); + proto_tree_add_item(tree, hf_cdlmap_band_index, tvb, dl_map_offset, ((nband >> 1) + nibble_offset), ENC_NA); + length += nband; + /* update offset */ + dl_map_offset += (nband >> 1); + } + } + else + { + nband = ((nband & MSB_NIBBLE_MASK) >> 4); + /* display the Nband */ + proto_tree_add_item(tree, hf_cdlmap_num_bands, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + nibble_offset = 1; + if(max_logical_bands == 3) + { + proto_tree_add_item(tree, hf_cdlmap_band_index, tvb, dl_map_offset, (nband + nibble_offset), ENC_NA); + length += (nband * 2); + /* update offset */ + dl_map_offset += nband; + } + else + { + proto_tree_add_item(tree, hf_cdlmap_band_index, tvb, dl_map_offset, ((nband >> 1) + nibble_offset), ENC_NA); + length += nband; + /* update offset */ + dl_map_offset += ((nband + nibble_offset) >> 1); + if(nband & 1) + nibble_offset = 0; + } + } + length++; + band_count = nband; + } + else + { + band_count = 1; + /* display the Nb-BITMAP */ + if(nibble_offset & 1) + { + proto_tree_add_item(tree, hf_cdlmap_nb_bitmap_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + nibble_offset = 0; + } + else + { + proto_tree_add_item(tree, hf_cdlmap_nb_bitmap, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + nibble_offset = 1; + } + length++; + } + /* Get the Allocation Mode */ + byte = tvb_get_guint8(tvb, dl_map_offset); + if(nibble_offset & 1) + { + allocation_mode = ((byte & 0x0C) >> 2); + proto_tree_add_item(tree, hf_cdlmap_allocation_mode_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_allocation_mode_rsvd_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + nibble_offset = 0; + dl_map_offset++; + } + else + { + allocation_mode = ((byte & 0xC0) >> 6); + proto_tree_add_item(tree, hf_cdlmap_allocation_mode, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_allocation_mode_rsvd, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + nibble_offset = 1; + } + /* Decode Allocation Mode - need to be done */ + if(!allocation_mode) + { + if(nibble_offset & 1) + { + proto_tree_add_item(tree, hf_cdlmap_num_subchannels_1, tvb, dl_map_offset, 2, ENC_BIG_ENDIAN); + } + else + { + proto_tree_add_item(tree, hf_cdlmap_num_subchannels, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + } + dl_map_offset++; + } + else if(allocation_mode == 1) + { + for(i=0; i> 1); + nibble_offset = ((nibble_offset + nibble_length) & 1); + /* decode CQICH Control IE */ + nibble_length = wimax_compact_dlmap_cqich_control_ie_decoder(tree, pinfo, tvb, dl_map_offset, nibble_offset); + length += nibble_length; + break; + case COMPACT_DL_MAP_TYPE_SAFETY:/* 6.3.2.3.43.6.3 */ + if(nibble_offset & 1) + { /* display the DL-MAP type */ + proto_tree_add_item(tree, hf_cdlmap_dl_map_type_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* display the UL-MAP append */ + proto_tree_add_item(tree, hf_cdlmap_ul_map_append_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + nibble_offset = 0; + } + else + { /* display the DL-MAP type */ + proto_tree_add_item(tree, hf_cdlmap_dl_map_type, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* display the UL-MAP append */ + proto_tree_add_item(tree, hf_cdlmap_ul_map_append, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + nibble_offset = 1; + } + length = 1; + /* decode RCID IE */ + nibble_length = wimax_compact_dlmap_rcid_ie_decoder(tree, pinfo, tvb, dl_map_offset, nibble_offset); + length += nibble_length; + dl_map_offset += (nibble_length >> 1); + nibble_offset = (nibble_length & 1); + /* check harq mode */ + if(!harq_mode) + { /* display the Nep and Nsch Code */ + if(nibble_offset & 1) + { + proto_tree_add_item(tree, hf_cdlmap_nep_code_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + proto_tree_add_item(tree, hf_cdlmap_nsch_code, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + } + else + { + proto_tree_add_item(tree, hf_cdlmap_nep_code, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_nsch_code_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + } + length += 2; + } + else if(harq_mode == 1) + { /* display the Shortened DIUC and Companded SC */ + if(nibble_offset & 1) + { + proto_tree_add_item(tree, hf_cdlmap_shortened_diuc_1, tvb, dl_map_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_companded_sc_1, tvb, dl_map_offset, 2, ENC_BIG_ENDIAN); + } + else + { + proto_tree_add_item(tree, hf_cdlmap_shortened_diuc, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_companded_sc, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + } + /* move to next byte */ + dl_map_offset++; + length += 2; + } + /* display BIN offset */ + if(nibble_offset & 1) + { + proto_tree_add_item(tree, hf_cdlmap_bin_offset_1, tvb, dl_map_offset, 2, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + } + else + { + proto_tree_add_item(tree, hf_cdlmap_bin_offset, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + } + length += 2; + /* decode HARQ Control IE */ + nibble_length = wimax_compact_dlmap_harq_control_ie_decoder(tree, pinfo, tvb, dl_map_offset, nibble_offset); + length += nibble_length; + dl_map_offset += ((nibble_offset + nibble_length) >> 1); + nibble_offset = ((nibble_offset + nibble_length) & 1); + /* decode CQICH Control IE */ + nibble_length = wimax_compact_dlmap_cqich_control_ie_decoder(tree, pinfo, tvb, dl_map_offset, nibble_offset); + length += nibble_length; + dl_map_offset += ((nibble_offset + nibble_length) >> 1); + nibble_offset = ((nibble_offset + nibble_length) & 1); + if(ul_map_append) + { /* check harq mode */ + if(harq_mode == 1) + { /* display the Shortened DIUC and Companded SC */ + if(nibble_offset & 1) + { + proto_tree_add_item(tree, hf_cdlmap_shortened_diuc_1, tvb, dl_map_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_companded_sc_1, tvb, dl_map_offset, 2, ENC_BIG_ENDIAN); + } + else + { + proto_tree_add_item(tree, hf_cdlmap_shortened_diuc, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_companded_sc, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + } + /* move to next byte */ + dl_map_offset++; + length += 2; + } + else if(!harq_mode) + { /* display the Nep and Nsch Code */ + if(nibble_offset & 1) + { + proto_tree_add_item(tree, hf_cdlmap_nep_code_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + proto_tree_add_item(tree, hf_cdlmap_nsch_code, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + } + else + { + proto_tree_add_item(tree, hf_cdlmap_nep_code, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_nsch_code_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + } + length += 2; + } + /* display BIN offset */ + if(nibble_offset & 1) + { + proto_tree_add_item(tree, hf_cdlmap_bin_offset_1, tvb, dl_map_offset, 2, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + } + else + { + proto_tree_add_item(tree, hf_cdlmap_bin_offset, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + } + length += 2; + /* decode HARQ Control IE */ + nibble_length = wimax_compact_dlmap_harq_control_ie_decoder(tree, pinfo, tvb, dl_map_offset, nibble_offset); + length += nibble_length; + } + break; + case COMPACT_DL_MAP_TYPE_UIUC:/* 6.3.2.3.43.6.4 */ + if(nibble_offset & 1) + { /* display the DL-MAP type */ + proto_tree_add_item(tree, hf_cdlmap_dl_map_type_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* display the reserved */ + proto_tree_add_item(tree, hf_cdlmap_reserved_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + /* get the new byte */ + byte = tvb_get_guint8(tvb, dl_map_offset); + /* get the DIUC */ + diuc = ((byte & MSB_NIBBLE_MASK) >> 4); + /* display the DIUC */ + proto_tree_add_item(tree, hf_cdlmap_diuc, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + } + else + { + /* display the DL-MAP type */ + proto_tree_add_item(tree, hf_cdlmap_dl_map_type, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* display the reserved */ + proto_tree_add_item(tree, hf_cdlmap_reserved, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* get the DIUC */ + diuc = (tvb_get_guint8(tvb, dl_map_offset) & LSB_NIBBLE_MASK); + /* display the DIUC */ + proto_tree_add_item(tree, hf_cdlmap_diuc_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + dl_map_offset++; + } + length = 2; + if(diuc == 15) + { /* Extended DIUC dependent IE */ + nibble_length = wimax_extended_diuc_dependent_ie_decoder(tree, pinfo, tvb, dl_map_offset, nibble_offset); + length += nibble_length; + dl_map_offset += (nibble_length >> 1); + nibble_offset = (nibble_length & 1); + } + else + { /* decode RCID IE */ + nibble_length = wimax_compact_dlmap_rcid_ie_decoder(tree, pinfo, tvb, dl_map_offset, nibble_offset); + length += nibble_length; + dl_map_offset += (nibble_length >> 1); + nibble_offset = (nibble_length & 1); + /* display Number of subchannels */ + if(nibble_offset & 1) + proto_tree_add_item(tree, hf_cdlmap_diuc_num_of_subchannels_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + else + proto_tree_add_item(tree, hf_cdlmap_diuc_num_of_subchannels, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + length += 2; + /* display the repetition coding indication and reserved bits */ + if(nibble_offset & 1) + { + proto_tree_add_item(tree, hf_cdlmap_diuc_repetition_coding_indication_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_diuc_reserved_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + } + else + { + proto_tree_add_item(tree, hf_cdlmap_diuc_repetition_coding_indication, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_cdlmap_diuc_reserved, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + } + length += 1; + } + /* decode HARQ Control IE */ + nibble_length = wimax_compact_dlmap_harq_control_ie_decoder(tree, pinfo, tvb, dl_map_offset, nibble_offset); + length += nibble_length; + dl_map_offset += ((nibble_offset + nibble_length) >> 1); + nibble_offset = ((nibble_offset + nibble_length) & 1); + /* decode CQICH Control IE */ + nibble_length = wimax_compact_dlmap_cqich_control_ie_decoder(tree, pinfo, tvb, dl_map_offset, nibble_offset); + length += nibble_length; + break; + case COMPACT_DL_MAP_TYPE_FORMAT_CONF_IE:/* 6.3.2.3.43.2 */ + /* decode the format configuration IE */ + nibble_length = wimax_compact_dlmap_format_configuration_ie_decoder(tree, pinfo, tvb, dl_map_offset, nibble_offset); + length = nibble_length; + break; + case COMPACT_DL_MAP_TYPE_HARQ_ACK_BITMAP_IE:/* 6.3.2.3.43.6.5 */ + if(nibble_offset & 1) + { /* display the DL-MAP type */ + proto_tree_add_item(tree, hf_cdlmap_dl_map_type_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* display the reserved */ + proto_tree_add_item(tree, hf_cdlmap_reserved_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + length = 1; + /* move to next byte */ + dl_map_offset++; + /* get the bit map length */ + byte = tvb_get_guint8(tvb, dl_map_offset); + bit_map_length = ((byte & MSB_NIBBLE_MASK) >> 4); + /* display BITMAP Length */ + proto_tree_add_item(tree, hf_cdlmap_bit_map_length, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* display BITMAP */ + proto_tree_add_item(tree, hf_cdlmap_bit_map, tvb, dl_map_offset, bit_map_length + 1, ENC_NA); + length += (1 + bit_map_length * 2); + } + else + { + /* display the DL-MAP type */ + proto_tree_add_item(tree, hf_cdlmap_dl_map_type, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* display the reserved */ + proto_tree_add_item(tree, hf_cdlmap_reserved, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* display BITMAP Length */ + proto_tree_add_item(tree, hf_cdlmap_bit_map_length_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + length = 2; + /* get the bit map length */ + bit_map_length = (byte & LSB_NIBBLE_MASK); + /* move to next byte */ + dl_map_offset++; + /* display BITMAP */ + proto_tree_add_item(tree, hf_cdlmap_bit_map, tvb, dl_map_offset, bit_map_length, ENC_NA); + length += (bit_map_length * 2); + } + break; + case COMPACT_DL_MAP_TYPE_EXTENSION:/* 6.3.2.3.43.6.6 */ + /* decode the Compact DL-MAP externsion IE */ + nibble_length = wimax_cdlmap_extension_ie_decoder(tree, pinfo, tvb, dl_map_offset, nibble_offset);/*, cqich_indicator);*/ + length = nibble_length; + break; + default:/* Reserved Type */ + /* display the reserved type */ + proto_tree_add_item(tree, hf_cdlmap_reserved_type_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + length = 1; + break; + } + /* Update the nibble_offset and length */ + return length; +} + +/* Format Configuration IE shifts */ +#define CID_TYPE_SHIFT 30 +#define SAFETY_PATTERN_SHIFT 25 +#define BAND_AMC_SUBCHANNEL_TYPE_SHIFT 23 +#define MAX_LOGICAL_BANDS_SHIFT 21 +#define NUM_BROADCAST_SYMBOLS_SHIFT 16 +#define NUM_DL_AMC_SYMBOLS_SHIFT 10 +#define NUM_UL_AMC_SYMBOLS_SHIFT 4 +#define CID_TYPE_SHIFT_1 (CID_TYPE_SHIFT-NUM_UL_AMC_SYMBOLS_SHIFT) +#define SAFETY_PATTERN_SHIFT_1 (SAFETY_PATTERN_SHIFT-NUM_UL_AMC_SYMBOLS_SHIFT) +#define BAND_AMC_SUBCHANNEL_TYPE_SHIFT_1 (BAND_AMC_SUBCHANNEL_TYPE_SHIFT-NUM_UL_AMC_SYMBOLS_SHIFT) +#define MAX_LOGICAL_BANDS_SHIFT_1 (MAX_LOGICAL_BANDS_SHIFT-NUM_UL_AMC_SYMBOLS_SHIFT) +#define NUM_BROADCAST_SYMBOLS_SHIFT_1 (NUM_BROADCAST_SYMBOLS_SHIFT-NUM_UL_AMC_SYMBOLS_SHIFT) +#define NUM_DL_AMC_SYMBOLS_SHIFT_1 (NUM_DL_AMC_SYMBOLS_SHIFT-NUM_UL_AMC_SYMBOLS_SHIFT) +/*#define NUM_UL_AMC_SYMBOLS_SHIFT_1 0*/ + +/* Compact DL-MAP Format Configuration IE (6.3.2.3.43.2) decoder */ +static guint wimax_compact_dlmap_format_configuration_ie_decoder(proto_tree *tree, packet_info *pinfo _U_, tvbuff_t *tvb, guint offset, guint nibble_offset) +{ + guint length = 0; + guint dl_map_type, new_format_ind; + guint dl_map_offset; + guint32 tvb_value; + +#ifdef DEBUG + /* update the info column */ + col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, "Format Configuration IE"); +#endif + /* set the local offset */ + dl_map_offset = offset; + /* Get the first byte */ + tvb_value = tvb_get_guint8(tvb, dl_map_offset); + if(nibble_offset & 1) + { /* get the DL-MAP type */ + dl_map_type = ((tvb_value & DL_MAP_TYPE_MASK_1) >> 1); + /* ensure the dl-map type is Format Configuration IE */ + if(dl_map_type != COMPACT_DL_MAP_TYPE_FORMAT_CONF_IE) + return 0; + new_format_ind = (tvb_value & 0x01); + /* display the DL-MAP type */ + proto_tree_add_item(tree, hf_format_config_ie_dl_map_type_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* display the New format Indication */ + proto_tree_add_item(tree, hf_format_config_ie_new_format_indication_1, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* update the length in nibble */ + length = 1; + /* move to next byte */ + dl_map_offset++; + if(new_format_ind) + { /* display the CID Type */ + proto_tree_add_item(tree, hf_format_config_ie_cid_type, tvb, dl_map_offset, 4, ENC_BIG_ENDIAN); + /* display the Safety Pattern */ + proto_tree_add_item(tree, hf_format_config_ie_safety_pattern, tvb, dl_map_offset, 4, ENC_BIG_ENDIAN); + /* display the Subchannel pattern */ + proto_tree_add_item(tree, hf_format_config_ie_subchannel_type, tvb, dl_map_offset, 4, ENC_BIG_ENDIAN); + /* display the max logical bands */ + proto_tree_add_item(tree, hf_format_config_ie_max_logical_bands, tvb, dl_map_offset, 4, ENC_BIG_ENDIAN); + /* display the number of broadcast symbols */ + proto_tree_add_item(tree, hf_format_config_ie_num_of_broadcast_symbol, tvb, dl_map_offset, 4, ENC_BIG_ENDIAN); + /* display the number of dl band AMC symbols */ + proto_tree_add_item(tree, hf_format_config_ie_num_of_dl_band_amc_symbol, tvb, dl_map_offset, 4, ENC_BIG_ENDIAN); + /* display the number of ul band AMC symbols */ + proto_tree_add_item(tree, hf_format_config_ie_num_of_ul_band_amc_symbol, tvb, dl_map_offset, 4, ENC_BIG_ENDIAN); + /* update the length in nibble */ + length += 7; + /* Get the next 32-bit word */ + tvb_value = tvb_get_ntohl(tvb, dl_map_offset); + /* get the CID type */ + cid_type = ((tvb_value & CID_TYPE_MASK) >> CID_TYPE_SHIFT); + /* get the subchannel type for band AMC */ + band_amc_subchannel_type = ((tvb_value & BAND_AMC_SUBCHANNEL_TYPE_MASK) >> BAND_AMC_SUBCHANNEL_TYPE_SHIFT); + /* get the max logical bands */ + max_logical_bands = ((tvb_value & MAX_LOGICAL_BANDS_MASK) >> MAX_LOGICAL_BANDS_SHIFT); + /* get the number of symbols for broadcast */ + num_of_broadcast_symbols = ((tvb_value & NUM_BROADCAST_SYMBOLS_MASK) >> NUM_BROADCAST_SYMBOLS_SHIFT); + /* get the number of symbols for DL band AMC */ + num_of_dl_band_amc_symbols = ((tvb_value & NUM_DL_AMC_SYMBOLS_MASK) >> NUM_DL_AMC_SYMBOLS_SHIFT); + /* get the number of symbols for UL band AMC */ + num_of_ul_band_amc_symbols = ((tvb_value & NUM_UL_AMC_SYMBOLS_MASK) >> NUM_UL_AMC_SYMBOLS_SHIFT); + } + } + else + { + dl_map_type = ((tvb_value & DL_MAP_TYPE_MASK) >> 5); + /* ensure the dl-map type is Format Configuration IE */ + if(dl_map_type != COMPACT_DL_MAP_TYPE_FORMAT_CONF_IE) + return 0; + new_format_ind = (tvb_value & 0x10); + if(new_format_ind) + { /* display the DL-MAP type */ + proto_tree_add_item(tree, hf_format_config_ie_dl_map_type_32, tvb, dl_map_offset, 4, ENC_BIG_ENDIAN); + /* display the New format Indication */ + proto_tree_add_item(tree, hf_format_config_ie_new_format_indication_32, tvb, dl_map_offset, 4, ENC_BIG_ENDIAN); + /* display the CID Type */ + proto_tree_add_item(tree, hf_format_config_ie_cid_type_1, tvb, dl_map_offset, 4, ENC_BIG_ENDIAN); + /* display the Safety Pattern */ + proto_tree_add_item(tree, hf_format_config_ie_safety_pattern_1, tvb, dl_map_offset, 4, ENC_BIG_ENDIAN); + /* display the Subchannel pattern */ + proto_tree_add_item(tree, hf_format_config_ie_subchannel_type_1, tvb, dl_map_offset, 4, ENC_BIG_ENDIAN); + /* display the max logical bands */ + proto_tree_add_item(tree, hf_format_config_ie_max_logical_bands_1, tvb, dl_map_offset, 4, ENC_BIG_ENDIAN); + /* display the number of broadcast symbols */ + proto_tree_add_item(tree, hf_format_config_ie_num_of_broadcast_symbol_1, tvb, dl_map_offset, 4, ENC_BIG_ENDIAN); + /* display the number of dl band AMC symbols */ + proto_tree_add_item(tree, hf_format_config_ie_num_of_dl_band_amc_symbol_1, tvb, dl_map_offset, 4, ENC_BIG_ENDIAN); + /* display the number of ul band AMC symbols */ + proto_tree_add_item(tree, hf_format_config_ie_num_of_ul_band_amc_symbol_1, tvb, dl_map_offset, 4, ENC_BIG_ENDIAN); + /* update the length in nibble */ + length = 8; + /* Get the next 32-bit word */ + tvb_value = tvb_get_ntohl(tvb, dl_map_offset); + /* get the CID type */ + cid_type = ((tvb_value & CID_TYPE_MASK_1) >> CID_TYPE_SHIFT_1); + /* get the subchannel type for band AMC */ + band_amc_subchannel_type = ((tvb_value & BAND_AMC_SUBCHANNEL_TYPE_MASK_1) >> BAND_AMC_SUBCHANNEL_TYPE_SHIFT_1); + /* get the max logical bands */ + max_logical_bands = ((tvb_value & MAX_LOGICAL_BANDS_MASK_1) >> MAX_LOGICAL_BANDS_SHIFT_1); + /* get the number of symbols for broadcast */ + num_of_broadcast_symbols = ((tvb_value & NUM_BROADCAST_SYMBOLS_MASK_1) >> NUM_BROADCAST_SYMBOLS_SHIFT_1); + /* get the number of symbols for DL band AMC */ + num_of_dl_band_amc_symbols = ((tvb_value & NUM_DL_AMC_SYMBOLS_MASK_1) >> NUM_DL_AMC_SYMBOLS_SHIFT_1); + /* get the number of symbols for UL band AMC */ + num_of_ul_band_amc_symbols = (tvb_value & NUM_UL_AMC_SYMBOLS_MASK_1); + } + else + { /* display the DL-MAP type */ + proto_tree_add_item(tree, hf_format_config_ie_dl_map_type, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* display the New format Indication */ + proto_tree_add_item(tree, hf_format_config_ie_new_format_indication, tvb, dl_map_offset, 1, ENC_BIG_ENDIAN); + /* update the length in nibble */ + length = 1; + } + } + /* return the IE length in nibbles */ + return length; +} + +/* Compact DL-MAP Reduced CID IE (6.3.2.3.43.3) decoder */ +static guint wimax_compact_dlmap_rcid_ie_decoder(proto_tree *tree, packet_info *pinfo _U_, tvbuff_t *tvb, guint offset, guint nibble_offset) +{ + guint length = 0; + guint prefix; + +#ifdef DEBUG + /* update the info column */ + col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, "RCID IE"); +#endif + if(nibble_offset & 1) + { + if(cid_type == CID_TYPE_NORMAL) + { /* display the normal CID */ + proto_tree_add_item(tree, hf_harq_rcid_ie_normal_cid_1, tvb, offset, 3, ENC_BIG_ENDIAN); + length = 4; + } + else + { /* Get the prefix bit */ + prefix = (tvb_get_guint8(tvb, offset) & 0x08); + /* display the prefix */ + proto_tree_add_item(tree, hf_harq_rcid_ie_prefix_1, tvb, offset, 2, ENC_BIG_ENDIAN); + if(prefix) + { /* display the CID11 */ + proto_tree_add_item(tree, hf_harq_rcid_ie_cid11_3, tvb, offset, 2, ENC_BIG_ENDIAN); + length = 3; + } + else + { + if(cid_type == CID_TYPE_RCID11) + { /* display the CID11 */ + proto_tree_add_item(tree, hf_harq_rcid_ie_cid11_1, tvb, offset, 2, ENC_BIG_ENDIAN); + length = 3; + } + else if(cid_type == CID_TYPE_RCID7) + { /* display the normal CID7 */ + proto_tree_add_item(tree, hf_harq_rcid_ie_cid7_1, tvb, offset, 2, ENC_BIG_ENDIAN); + length = 2; + } + else if(cid_type == CID_TYPE_RCID3) + { /* display the CID3 */ + proto_tree_add_item(tree, hf_harq_rcid_ie_cid3_1, tvb, offset, 2, ENC_BIG_ENDIAN); + length = 1; + } + } + } + } + else + { + if(cid_type == CID_TYPE_NORMAL) + { /* display the normal CID */ + proto_tree_add_item(tree, hf_harq_rcid_ie_normal_cid, tvb, offset, 2, ENC_BIG_ENDIAN); + length = 4; + } + else + { /* Get the prefix bit */ + prefix = (tvb_get_guint8(tvb, offset) & 0x08); + /* display the prefix */ + proto_tree_add_item(tree, hf_harq_rcid_ie_prefix, tvb, offset, 2, ENC_BIG_ENDIAN); + if(prefix || (cid_type == CID_TYPE_RCID11)) + { /* display the CID11 */ + proto_tree_add_item(tree, hf_harq_rcid_ie_cid11_2, tvb, offset, 2, ENC_BIG_ENDIAN); + length = 3; + } + else + { + if(cid_type == CID_TYPE_RCID11) + { /* display the CID11 */ + proto_tree_add_item(tree, hf_harq_rcid_ie_cid11, tvb, offset, 2, ENC_BIG_ENDIAN); + length = 3; + } + else if(cid_type == CID_TYPE_RCID7) + { /* display the CID7 */ + proto_tree_add_item(tree, hf_harq_rcid_ie_cid7, tvb, offset, 2, ENC_BIG_ENDIAN); + length = 2; + } + else if(cid_type == CID_TYPE_RCID3) + { /* display the CID3 */ + proto_tree_add_item(tree, hf_harq_rcid_ie_cid3, tvb, offset, 2, ENC_BIG_ENDIAN); + length = 1; + } + } + } + } + /* return the IE length in nibbles */ + return length; +} + +/* Compact DL-MAP HARQ Control IE (6.3.2.3.43.4) decoder */ +static guint wimax_compact_dlmap_harq_control_ie_decoder(proto_tree *tree, packet_info *pinfo _U_, tvbuff_t *tvb, guint offset, guint nibble_offset) +{ + guint byte, prefix, length = 0; + +#ifdef DEBUG + /* update the info column */ + col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, "HARQ Control IE"); +#endif + /* Get the first byte */ + byte = tvb_get_guint8(tvb, offset); + if(nibble_offset & 1) + { /* Get the prefix bit */ + prefix = (byte & 0x08); + /* display the prefix */ + proto_tree_add_item(tree, hf_harq_control_ie_prefix_1, tvb, offset, 2, ENC_BIG_ENDIAN); + if(prefix) + { /* display the ai_sn */ + proto_tree_add_item(tree, hf_harq_control_ie_ai_sn_1, tvb, offset, 2, ENC_BIG_ENDIAN); + /* display the spid */ + proto_tree_add_item(tree, hf_harq_control_ie_spid_1, tvb, offset, 2, ENC_BIG_ENDIAN); + /* display the acid */ + proto_tree_add_item(tree, hf_harq_control_ie_acid_1, tvb, offset, 2, ENC_BIG_ENDIAN); + length = 2; + } + else + { /* display the reserved bits */ + proto_tree_add_item(tree, hf_harq_control_ie_reserved_1, tvb, offset, 2, ENC_BIG_ENDIAN); + length = 1; + } + } + else + { /* Get the prefix bit */ + prefix = (byte & 0x80); + /* display the prefix */ + proto_tree_add_item(tree, hf_harq_control_ie_prefix, tvb, offset, 1, ENC_BIG_ENDIAN); + if(prefix) + { /* display the ai_sn */ + proto_tree_add_item(tree, hf_harq_control_ie_ai_sn, tvb, offset, 1, ENC_BIG_ENDIAN); + /* display the spid */ + proto_tree_add_item(tree, hf_harq_control_ie_spid, tvb, offset, 1, ENC_BIG_ENDIAN); + /* display the acid */ + proto_tree_add_item(tree, hf_harq_control_ie_acid, tvb, offset, 1, ENC_BIG_ENDIAN); + length = 2; + } + else + { /* display the reserved bits */ + proto_tree_add_item(tree, hf_harq_control_ie_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); + length = 1; + } + } + /* return the IE length in nibbles */ + return length; +} + +/* Compact DL-MAP CQICH Control IE (6.3.2.3.43.5) decoder */ +static guint wimax_compact_dlmap_cqich_control_ie_decoder(proto_tree *tree, packet_info *pinfo _U_, tvbuff_t *tvb, guint offset, guint nibble_offset) +{ + guint byte, cqich_indicator, length = 0; + +#ifdef DEBUG + /* update the info column */ + col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, "CQICH Control IE"); +#endif + /* Get the first byte */ + byte = tvb_get_guint8(tvb, offset); + if(nibble_offset & 1) + { /* Get the CQICH indicator */ + cqich_indicator = (byte & 0x08); + if(cqich_indicator) + { /* display the CQICH indicator */ + proto_tree_add_item(tree, hf_cqich_control_ie_indicator_1, tvb, offset, 3, ENC_BIG_ENDIAN); + /* display the allocation index */ + proto_tree_add_item(tree, hf_cqich_control_ie_alloc_id_1, tvb, offset, 3, ENC_BIG_ENDIAN); + /* display the period */ + proto_tree_add_item(tree, hf_cqich_control_ie_period_1, tvb, offset, 3, ENC_BIG_ENDIAN); + /* display the frame offset */ + proto_tree_add_item(tree, hf_cqich_control_ie_frame_offset_1, tvb, offset, 3, ENC_BIG_ENDIAN); + /* display the duration */ + proto_tree_add_item(tree, hf_cqich_control_ie_duration_1, tvb, offset, 3, ENC_BIG_ENDIAN); + length = 4; + } + else + { /* display the CQICH indicator */ + proto_tree_add_item(tree, hf_cqich_control_ie_indicator_1, tvb, offset, 1, ENC_BIG_ENDIAN); + /* display the CQI reporting threshold */ + proto_tree_add_item(tree, hf_cqich_control_ie_cqi_rep_threshold_1, tvb, offset, 1, ENC_BIG_ENDIAN); + length = 1; + } + } + else + { /* Get the CQICH indicator */ + cqich_indicator = (byte & 0x80); + if(cqich_indicator) + { /* display the CQICH indicator */ + proto_tree_add_item(tree, hf_cqich_control_ie_indicator, tvb, offset, 2, ENC_BIG_ENDIAN); + /* display the allocation index */ + proto_tree_add_item(tree, hf_cqich_control_ie_alloc_id, tvb, offset, 2, ENC_BIG_ENDIAN); + /* display the period */ + proto_tree_add_item(tree, hf_cqich_control_ie_period, tvb, offset, 2, ENC_BIG_ENDIAN); + /* display the frame offset */ + proto_tree_add_item(tree, hf_cqich_control_ie_frame_offset, tvb, offset, 2, ENC_BIG_ENDIAN); + /* display the duration */ + proto_tree_add_item(tree, hf_cqich_control_ie_duration, tvb, offset, 2, ENC_BIG_ENDIAN); + length = 4; + } + else + { /* display the CQICH indicator */ + proto_tree_add_item(tree, hf_cqich_control_ie_indicator, tvb, offset, 1, ENC_BIG_ENDIAN); + /* display the CQI reporting threshold */ + proto_tree_add_item(tree, hf_cqich_control_ie_cqi_rep_threshold, tvb, offset, 1, ENC_BIG_ENDIAN); + length = 1; + } + } + /* return the IE length in nibbles */ + return length; +} + +/* DL-MAP Extension IE sub-types */ +#define TIME_DIVERSITY_MBS 0 +#define HARQ_MODE_SWITCH 1 + +/* Compact DL-MAP Extension IE (6.3.2.3.43.6.6) decoder */ +static guint wimax_cdlmap_extension_ie_decoder(proto_tree *tree, packet_info *pinfo _U_, tvbuff_t *tvb, guint offset, guint nibble_offset) +{ + guint tvb_value, dl_map_type, sub_type, length; + +#ifdef DEBUG + /* update the info column */ + col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, "DL-MAP Extension IE"); +#endif + /* Get the first 16-bit word */ + tvb_value = tvb_get_ntohs(tvb, offset); + if(nibble_offset & 1) + { /* Get the dl-map type */ + dl_map_type = ((tvb_value & 0x0E00) >> 9); + if(dl_map_type != COMPACT_DL_MAP_TYPE_EXTENSION) + return 0; + /* Get the sub-type */ + sub_type = ((tvb_value & 0x01F0) >> 4); + /* Get the IE length */ + length = (tvb_value & 0x000F); + /* display the DL-MAP type */ + proto_tree_add_item(tree, hf_cdlmap_extension_type_1, tvb, offset, 2, ENC_BIG_ENDIAN); + /* display the DL-MAP extension subtype */ + proto_tree_add_item(tree, hf_cdlmap_extension_subtype_1, tvb, offset, 2, ENC_BIG_ENDIAN); + /* display the IE length */ + proto_tree_add_item(tree, hf_cdlmap_extension_length_1, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + switch (sub_type) + { + case TIME_DIVERSITY_MBS: + /* display the time-diversity MBS in HEX */ + proto_tree_add_item(tree, hf_cdlmap_extension_time_diversity_mbs_1, tvb, offset, (length - 2), ENC_NA); + break; + case HARQ_MODE_SWITCH: + /* display the HARQ mode */ + proto_tree_add_item(tree, hf_cdlmap_extension_harq_mode, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Get the next byte */ + tvb_value = tvb_get_guint8(tvb, offset); + /* get the HARQ mode */ + harq_mode = ((tvb_value & MSB_NIBBLE_MASK) >> 4); + break; + default: + /* display the unknown sub-type in HEX */ + proto_tree_add_item(tree, hf_cdlmap_extension_unknown_sub_type_1, tvb, offset, (length - 2), ENC_NA); + break; + } + } + else + { /* Get the dl-map type */ + dl_map_type = ((tvb_value & 0xE000) >> 13); + if(dl_map_type != COMPACT_DL_MAP_TYPE_EXTENSION) + return 0; + /* Get the sub-type */ + sub_type = ((tvb_value & 0x1F00) >> 8); + /* Get the IE length */ + length = ((tvb_value & 0x00F0) >> 4); + /* display the DL-MAP type */ + proto_tree_add_item(tree, hf_cdlmap_extension_type, tvb, offset, 2, ENC_BIG_ENDIAN); + /* display the DL-MAP extension subtype */ + proto_tree_add_item(tree, hf_cdlmap_extension_subtype, tvb, offset, 2, ENC_BIG_ENDIAN); + /* display the IE length */ + proto_tree_add_item(tree, hf_cdlmap_extension_length, tvb, offset, 2, ENC_BIG_ENDIAN); + switch (sub_type) + { + case TIME_DIVERSITY_MBS: + /* display the time-diversity MBS in HEX */ + proto_tree_add_item(tree, hf_cdlmap_extension_time_diversity_mbs, tvb, (offset + 1), (length - 1), ENC_NA); + break; + case HARQ_MODE_SWITCH: + /* display the HARQ mode */ + proto_tree_add_item(tree, hf_cdlmap_extension_harq_mode_1, tvb, offset, 2, ENC_BIG_ENDIAN); + /* get the HARQ mode */ + harq_mode = (tvb_value & 0x000F); + break; + default: + /* display the unknown sub-type in HEX */ + proto_tree_add_item(tree, hf_cdlmap_extension_unknown_sub_type, tvb, (offset + 1), (length - 1), ENC_NA); + break; + } + } + /* return the IE length in nibbles */ + return (length * 2); +} + +/* Extended DIUCs (table 277a) */ +#define CHANNEL_MEASUREMENT_IE 0 +#define STC_ZONE_IE 1 +#define AAS_DL_IE 2 +#define DATA_LOCATION_IN_ANOTHER_BS_IE 3 +#define CID_SWITCH_IE 4 +#define MIMO_DL_BASIC_IE 5 +#define MIMO_DL_ENHANCED_IE 6 +#define HARQ_MAP_POINTER_IE 7 +#define PHYMOD_DL_IE 8 +#define DL_PUSC_BURST_ALLOCATION_IN_OTHER_SEGMENT_IE 11 +#define UL_INTERFERENCE_AND_NOISE_LEVEL_IE 15 + +/* Extended DIUC IE (8.4.5.3.2) */ +guint wimax_extended_diuc_dependent_ie_decoder(proto_tree *tree, packet_info *pinfo _U_, tvbuff_t *tvb, guint offset, guint nibble_offset) +{ + guint ext_diuc, length; + guint8 byte; + + /* get the first byte */ + byte = tvb_get_guint8(tvb, offset); + if(nibble_offset & 1) + { /* get the extended DIUC */ + ext_diuc = (byte & LSB_NIBBLE_MASK); + /* display extended DIUC */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_diuc_1, tvb, offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + offset++; + /* get the 2nd byte */ + byte = tvb_get_guint8(tvb, offset); + /* get the length */ + length = ((byte & MSB_NIBBLE_MASK) >> 4); + /* display extended DIUC length */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN); + /* 8.4.5.3.2.1 (table 277a) */ + switch (ext_diuc) + { + case CHANNEL_MEASUREMENT_IE: + /* 8.4.5.3.? Channel_Measurement_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_channel_measurement, tvb, offset, (length + 1), ENC_NA); + break; + case STC_ZONE_IE: + /* 8.4.5.3.4 STC_Zone_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_stc_zone, tvb, offset, (length + 1), ENC_NA); + break; + case AAS_DL_IE: + /* 8.4.5.3.3 AAS_DL_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_aas_dl, tvb, offset, (length + 1), ENC_NA); + break; + case DATA_LOCATION_IN_ANOTHER_BS_IE: + /* 8.4.5.3.6 Data_location_in_another_BS_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_data_location, tvb, offset, (length + 1), ENC_NA); + break; + case CID_SWITCH_IE: + /* 8.4.5.3.7 CID_Switch_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_cid_switch, tvb, offset, (length + 1), ENC_NA); + break; + case MIMO_DL_BASIC_IE: + /* 8.4.5.3.8 MIMO_DL_Basic_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_mimo_dl_basic, tvb, offset, (length + 1), ENC_NA); + break; + case MIMO_DL_ENHANCED_IE: + /* 8.4.5.3.9 MIMO_DL_Enhanced_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_mimo_dl_enhanced, tvb, offset, (length + 1), ENC_NA); + break; + case HARQ_MAP_POINTER_IE: + /* 8.4.5.3.10 HARQ_Map_Pointer_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_harq_map_pointer, tvb, offset, (length + 1), ENC_NA); + break; + case PHYMOD_DL_IE: + /* 8.4.5.3.11 PHYMOD_DL_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_phymod_dl, tvb, offset, (length + 1), ENC_NA); + break; + case DL_PUSC_BURST_ALLOCATION_IN_OTHER_SEGMENT_IE: + /* 8.4.5.3.13 DL PUSC Burst Allocation in Other Segment IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_dl_pusc_burst_allocation, tvb, offset, (length + 1), ENC_NA); + break; + case UL_INTERFERENCE_AND_NOISE_LEVEL_IE: + /* 8.4.5.3.19 UL_interference_and_noise_level_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_ul_interference_and_noise_level, tvb, offset, (length + 1), ENC_NA); + break; + default: + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_unknown_diuc, tvb, offset, (length + 1), ENC_NA); + break; + } + } + else + { /* get the extended DIUC */ + ext_diuc = ((byte & MSB_NIBBLE_MASK) >> 4); + /* get the length */ + length = (byte & LSB_NIBBLE_MASK); + /* display extended DIUC */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_diuc, tvb, offset, 1, ENC_BIG_ENDIAN); + /* display extended DIUC length */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_length_1, tvb, offset, 1, ENC_BIG_ENDIAN); + /* move to next byte */ + offset++; + /* 8.4.5.3.2.1 (table 277a) */ + switch (ext_diuc) + { + case CHANNEL_MEASUREMENT_IE: + /* 8.4.5.3.? Channel_Measurement_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_channel_measurement, tvb, offset, length, ENC_NA); + break; + case STC_ZONE_IE: + /* 8.4.5.3.4 STC_Zone_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_stc_zone, tvb, offset, length, ENC_NA); + break; + case AAS_DL_IE: + /* 8.4.5.3.3 AAS_DL_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_aas_dl, tvb, offset, length, ENC_NA); + break; + case DATA_LOCATION_IN_ANOTHER_BS_IE: + /* 8.4.5.3.6 Data_location_in_another_BS_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_data_location, tvb, offset, length, ENC_NA); + break; + case CID_SWITCH_IE: + /* 8.4.5.3.7 CID_Switch_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_cid_switch, tvb, offset, length, ENC_NA); + break; + case MIMO_DL_BASIC_IE: + /* 8.4.5.3.8 MIMO_DL_Basic_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_mimo_dl_basic, tvb, offset, length, ENC_NA); + break; + case MIMO_DL_ENHANCED_IE: + /* 8.4.5.3.9 MIMO_DL_Enhanced_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_mimo_dl_enhanced, tvb, offset, length, ENC_NA); + break; + case HARQ_MAP_POINTER_IE: + /* 8.4.5.3.10 HARQ_Map_Pointer_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_harq_map_pointer, tvb, offset, length, ENC_NA); + break; + case PHYMOD_DL_IE: + /* 8.4.5.3.11 PHYMOD_DL_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_phymod_dl, tvb, offset, length, ENC_NA); + break; + case DL_PUSC_BURST_ALLOCATION_IN_OTHER_SEGMENT_IE: + /* 8.4.5.3.13 DL PUSC Burst Allocation in Other Segment IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_dl_pusc_burst_allocation, tvb, offset, length, ENC_NA); + break; + case UL_INTERFERENCE_AND_NOISE_LEVEL_IE: + /* 8.4.5.3.19 UL_interference_and_noise_level_IE */ + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_ul_interference_and_noise_level, tvb, offset, length, ENC_NA); + break; + default: + proto_tree_add_item(tree, hf_extended_diuc_dependent_ie_unknown_diuc, tvb, offset, length, ENC_NA); + break; + } + } + return ((length + 1) * 2 ); /* length in nibbles */ + +} + +/* Register Wimax Compact DL-MAP IE Protocol */ +void wimax_proto_register_wimax_compact_dlmap_ie(void) +{ + /* Compact DL-MAP IE display */ + static hf_register_info hf_compact_dlmap[] = + { + { + &hf_cdlmap_dl_map_type, + {"DL-MAP Type", "wmx.compact_dlmap.dl_map_type", FT_UINT8, BASE_DEC, NULL, DL_MAP_TYPE_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_dl_map_type_1, + {"DL-MAP Type", "wmx.compact_dlmap.dl_map_type", FT_UINT8, BASE_DEC, NULL, DL_MAP_TYPE_MASK_1, NULL, HFILL} + }, + { + &hf_cdlmap_ul_map_append, + {"UL-MAP Append", "wmx.compact_dlmap.ul_map_append", FT_UINT8, BASE_HEX, NULL, UL_MAP_APPEND_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_ul_map_append_1, + {"UL-MAP Append", "wmx.compact_dlmap.ul_map_append", FT_UINT8, BASE_HEX, NULL, UL_MAP_APPEND_MASK_1, NULL, HFILL} + }, + { + &hf_cdlmap_reserved, + {"Reserved", "wmx.compact_dlmap.reserved", FT_UINT8, BASE_HEX, NULL, UL_MAP_APPEND_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_reserved_1, + {"Reserved", "wmx.compact_dlmap.reserved", FT_UINT8, BASE_HEX, NULL, UL_MAP_APPEND_MASK_1, NULL, HFILL} + }, + { + &hf_cdlmap_nep_code, + {"Nep Code", "wmx.compact_dlmap.nep_code", FT_UINT8, BASE_HEX, NULL, MSB_NIBBLE_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_nep_code_1, + {"Nep Code", "wmx.compact_dlmap.nep_code", FT_UINT8, BASE_HEX, NULL, LSB_NIBBLE_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_nsch_code, + {"Nsch Code", "wmx.compact_dlmap.nsch_code", FT_UINT8, BASE_HEX, NULL, MSB_NIBBLE_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_nsch_code_1, + {"Nsch Code", "wmx.compact_dlmap.nsch_code", FT_UINT8, BASE_HEX, NULL, LSB_NIBBLE_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_num_bands, + {"Number Of Bands", "wmx.compact_dlmap.num_bands", FT_UINT8, BASE_HEX, NULL, MSB_NIBBLE_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_num_bands_1, + {"Number Of Bands", "wmx.compact_dlmap.num_bands", FT_UINT8, BASE_HEX, NULL, LSB_NIBBLE_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_band_index, + {"Band Index", "wmx.compact_dlmap.band_index", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} + }, +#if 0 + { + &hf_cdlmap_band_index_1, + {"Band Index", "wmx.compact_dlmap.band_index", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL} + }, +#endif + { + &hf_cdlmap_nb_bitmap, + {"Number Of Bits For Band BITMAP", "wmx.compact_dlmap.nb_bitmap", FT_UINT8, BASE_HEX, NULL, MSB_NIBBLE_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_nb_bitmap_1, + {"Number Of Bits For Band BITMAP", "wmx.compact_dlmap.nb_bitmap", FT_UINT8, BASE_HEX, NULL, LSB_NIBBLE_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_shortened_uiuc, + {"Shortened UIUC", "wmx.compact_dlmap.shortened_uiuc", FT_UINT8, BASE_HEX, NULL, SHORTENED_DIUC_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_shortened_uiuc_1, + {"Shortened UIUC", "wmx.compact_dlmap.shortened_uiuc", FT_UINT16, BASE_HEX, NULL, SHORTENED_DIUC_MASK_1, NULL, HFILL} + }, + { + &hf_cdlmap_shortened_diuc, + {"Shortened DIUC", "wmx.compact_dlmap.shortened_diuc", FT_UINT8, BASE_HEX, NULL, SHORTENED_DIUC_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_shortened_diuc_1, + {"Shortened DIUC", "wmx.compact_dlmap.shortened_diuc", FT_UINT16, BASE_HEX, NULL, SHORTENED_DIUC_MASK_1, NULL, HFILL} + }, + { + &hf_cdlmap_companded_sc, + {"Companded SC", "wmx.compact_dlmap.companded_sc", FT_UINT8, BASE_HEX, NULL, COMPANDED_SC_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_companded_sc_1, + {"Companded SC", "wmx.compact_dlmap.companded_sc", FT_UINT16, BASE_HEX, NULL, COMPANDED_SC_MASK_1, NULL, HFILL} + }, + { + &hf_cdlmap_bin_offset, + {"BIN Offset", "wmx.compact_dlmap.bin_offset", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} + }, + { + &hf_cdlmap_bin_offset_1, + {"BIN Offset", "wmx.compact_dlmap.bin_offset", FT_UINT16, BASE_HEX, NULL, 0x0FF0, NULL, HFILL} + }, + { + &hf_cdlmap_diuc_num_of_subchannels, + {"Number Of Subchannels", "wmx.compact_dlmap.diuc_num_of_subchannels", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} + }, + { + &hf_cdlmap_diuc_num_of_subchannels_1, + {"Number Of Subchannels", "wmx.compact_dlmap.diuc_num_of_subchannels", FT_UINT16, BASE_DEC, NULL, 0x0FF0, NULL, HFILL} + }, + { + &hf_cdlmap_diuc_repetition_coding_indication, + {"Repetition Coding Indication", "wmx.compact_dlmap.diuc_repetition_coding_indication", FT_UINT8, BASE_DEC, VALS(rep_msgs), 0xC0, NULL, HFILL} + }, + { + &hf_cdlmap_diuc_repetition_coding_indication_1, + {"Repetition Coding Indication", "wmx.compact_dlmap.diuc_repetition_coding_indication", FT_UINT8, BASE_DEC, VALS(rep_msgs), 0x0C, NULL, HFILL} + }, + { + &hf_cdlmap_diuc_reserved, + {"Reserved", "wmx.compact_dlmap.diuc_reserved", FT_UINT8, BASE_HEX, NULL, 0x30, NULL, HFILL} + }, + { + &hf_cdlmap_diuc_reserved_1, + {"Reserved", "wmx.compact_dlmap.diuc_reserved", FT_UINT8, BASE_HEX, NULL, 0x03, NULL, HFILL} + }, + { + &hf_cdlmap_bit_map_length, + {"BIT MAP Length", "wmx.compact_dlmap.bit_map_length", FT_UINT8, BASE_DEC, NULL, MSB_NIBBLE_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_bit_map_length_1, + {"BIT MAP Length", "wmx.compact_dlmap.bit_map_length", FT_UINT8, BASE_DEC, NULL, LSB_NIBBLE_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_bit_map, + {"BIT MAP", "wmx.compact_dlmap.bit_map", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} + }, + { + &hf_cdlmap_diuc, + {"DIUC", "wmx.compact_dlmap.diuc", FT_UINT8, BASE_HEX, NULL, MSB_NIBBLE_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_diuc_1, + {"DIUC", "wmx.compact_dlmap.diuc", FT_UINT8, BASE_HEX, NULL, LSB_NIBBLE_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_allocation_mode, + {"Allocation Mode", "wmx.compact_dlmap.allocation_mode", FT_UINT8, BASE_DEC, VALS(vals_allocation_modes), 0xC0, NULL, HFILL} + }, + { + &hf_cdlmap_allocation_mode_1, + {"Allocation Mode", "wmx.compact_dlmap.allocation_mode", FT_UINT8, BASE_DEC, VALS(vals_allocation_modes), 0x0C, NULL, HFILL} + }, + { + &hf_cdlmap_allocation_mode_rsvd, + {"Reserved", "wmx.compact_dlmap.allocation_mode_rsvd", FT_UINT8, BASE_DEC, NULL, 0x30, NULL, HFILL} + }, + { + &hf_cdlmap_allocation_mode_rsvd_1, + {"Reserved", "wmx.compact_dlmap.allocation_mode_rsvd", FT_UINT8, BASE_DEC, NULL, 0x03, NULL, HFILL} + }, + { + &hf_cdlmap_num_subchannels, + {"Number Of Subchannels", "wmx.compact_dlmap.num_subchannels", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} + }, + { + &hf_cdlmap_num_subchannels_1, + {"Number Of Subchannels", "wmx.compact_dlmap.num_subchannels", FT_UINT16, BASE_DEC, NULL, 0x0FF0, NULL, HFILL} + }, +#if 0 + { + &hf_cdlmap_reserved_type, + {"DL-MAP Reserved Type", "wmx.compact_dlmap.reserved_type", FT_UINT8, BASE_DEC, NULL, DL_MAP_TYPE_MASK, NULL, HFILL} + }, +#endif + { + &hf_cdlmap_reserved_type_1, + {"DL-MAP Reserved Type", "wmx.compact_dlmap.reserved_type", FT_UINT8, BASE_DEC, NULL, DL_MAP_TYPE_MASK_1, NULL, HFILL} + } + }; + + /* HARQ MAP Format Configuration IE display */ + static hf_register_info hf_format_config[] = + { + { + &hf_format_config_ie_dl_map_type, + {"DL-MAP Type", "wmx.format_config_ie.dl_map_type", FT_UINT8, BASE_DEC, NULL, DL_MAP_TYPE_MASK, NULL, HFILL} + }, + { + &hf_format_config_ie_dl_map_type_1, + {"DL-MAP Type", "wmx.format_config_ie.dl_map_type", FT_UINT8, BASE_DEC, NULL, DL_MAP_TYPE_MASK_1, NULL, HFILL} + }, + { + &hf_format_config_ie_dl_map_type_32, + {"DL-MAP Type", "wmx.format_config_ie.dl_map_type", FT_UINT32, BASE_DEC, NULL, FORMAT_CONFIG_IE_DL_MAP_TYPE_MASK, NULL, HFILL} + }, + { + &hf_format_config_ie_new_format_indication, + {"New Format Indication", "wmx.format_config_ie.new_format_indication", FT_BOOLEAN, 8, TFS(&tfs_indication), UL_MAP_APPEND_MASK, NULL, HFILL} + }, + { + &hf_format_config_ie_new_format_indication_1, + {"New Format Indication", "wmx.format_config_ie.new_format_indication", FT_BOOLEAN, 8, TFS(&tfs_indication), UL_MAP_APPEND_MASK_1, NULL, HFILL} + }, + { + &hf_format_config_ie_new_format_indication_32, + {"New Format Indication", "wmx.format_config_ie.new_format_indication", FT_BOOLEAN, 32, TFS(&tfs_indication), FORMAT_CONFIG_IE_NEW_FORMAT_IND_MASK, NULL, HFILL} + }, + { + &hf_format_config_ie_cid_type, + {"HARQ MAP Indicator", "wmx.harq_map.format_config_ie.indicator", FT_UINT32, BASE_HEX, VALS(vals_cid_types), CID_TYPE_MASK, NULL, HFILL} + }, + { + &hf_format_config_ie_cid_type_1, + {"CID Type", "wmx.harq_map.format_config_ie.cid_type", FT_UINT32, BASE_HEX, VALS(vals_cid_types), CID_TYPE_MASK_1, NULL, HFILL} + }, + { + &hf_format_config_ie_safety_pattern, + {"Safety Pattern", "wmx.harq_map.format_config_ie.safety_pattern", FT_UINT32, BASE_HEX, NULL, SAFETY_PATTERN_MASK, NULL, HFILL} + }, + { + &hf_format_config_ie_safety_pattern_1, + {"Safety Pattern", "wmx.harq_map.format_config_ie.safety_pattern", FT_UINT32, BASE_HEX, NULL, SAFETY_PATTERN_MASK_1, NULL, HFILL} + }, + { + &hf_format_config_ie_subchannel_type, + {"Subchannel Type For Band AMC", "wmx.harq_map.format_config_ie.subchannel_type", FT_UINT32, BASE_HEX, VALS(vals_subchannel_types), BAND_AMC_SUBCHANNEL_TYPE_MASK, NULL, HFILL} + }, + { + &hf_format_config_ie_subchannel_type_1, + {"Subchannel Type For Band AMC", "wmx.harq_map.format_config_ie.subchannel_type", FT_UINT32, BASE_HEX, VALS(vals_subchannel_types), BAND_AMC_SUBCHANNEL_TYPE_MASK_1, NULL, HFILL} + }, + { + &hf_format_config_ie_max_logical_bands, + {"Max Logical Bands", "wmx.harq_map.format_config_ie.max_logical_bands", FT_UINT32, BASE_HEX, VALS(vals_max_logical_bands), MAX_LOGICAL_BANDS_MASK, NULL, HFILL} + }, + { + &hf_format_config_ie_max_logical_bands_1, + {"Max Logical Bands", "wmx.harq_map.format_config_ie.max_logical_bands", FT_UINT32, BASE_HEX, VALS(vals_max_logical_bands), MAX_LOGICAL_BANDS_MASK_1, NULL, HFILL} + }, + { + &hf_format_config_ie_num_of_broadcast_symbol, + {"Number Of Symbols for Broadcast", "wmx.harq_map.format_config_ie.num_of_broadcast_symbol", FT_UINT32, BASE_HEX, NULL, NUM_BROADCAST_SYMBOLS_MASK_1, NULL, HFILL} + }, + { + &hf_format_config_ie_num_of_broadcast_symbol_1, + {"Number Of Symbols for Broadcast", "wmx.harq_map.num_of_broadcast_symbol", FT_UINT32, BASE_HEX, NULL, NUM_BROADCAST_SYMBOLS_MASK_1, NULL, HFILL} + }, + { + &hf_format_config_ie_num_of_dl_band_amc_symbol, + {"Number Of Symbols for Broadcast", "wmx.harq_map.format_config_ie.num_of_dl_band_amc_symbol", FT_UINT32, BASE_HEX, NULL, NUM_DL_AMC_SYMBOLS_MASK, NULL, HFILL} + }, + { + &hf_format_config_ie_num_of_dl_band_amc_symbol_1, + {"Number Of Symbols for Broadcast", "wmx.harq_map.num_of_dl_band_amc_symbol", FT_UINT32, BASE_HEX, NULL, NUM_DL_AMC_SYMBOLS_MASK_1, NULL, HFILL} + }, + { + &hf_format_config_ie_num_of_ul_band_amc_symbol, + {"Number Of Symbols for Broadcast", "wmx.harq_map.format_config_ie.num_of_ul_band_amc_symbol", FT_UINT32, BASE_HEX, NULL, NUM_UL_AMC_SYMBOLS_MASK, NULL, HFILL} + }, + { + &hf_format_config_ie_num_of_ul_band_amc_symbol_1, + {"Number Of Symbols for Broadcast", "wmx.harq_map.num_of_ul_band_amc_symbol", FT_UINT32, BASE_HEX, NULL, NUM_UL_AMC_SYMBOLS_MASK_1, NULL, HFILL} + } + }; + + /* HARQ MAP Reduced CID IE display */ + static hf_register_info hf_rcid[] = + { + { + &hf_harq_rcid_ie_normal_cid, + {"Normal CID", "wmx.harq_map.rcid_ie.normal_cid", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} + }, + { + &hf_harq_rcid_ie_normal_cid_1, + {"Normal CID", "wmx.harq_map.rcid_ie.normal_cid", FT_UINT24, BASE_HEX, NULL, WIMAX_RCID_IE_NORMAL_CID_MASK_1, NULL, HFILL} + }, + { + &hf_harq_rcid_ie_prefix, + {"Prefix", "wmx.harq_map.rcid_ie.prefix", FT_UINT16, BASE_HEX, NULL, WIMAX_RCID_IE_PREFIX_MASK, NULL, HFILL} + }, + { + &hf_harq_rcid_ie_prefix_1, + {"Prefix", "wmx.harq_map.rcid_ie.prefix", FT_UINT16, BASE_HEX, NULL, WIMAX_RCID_IE_PREFIX_MASK_1, NULL, HFILL} + }, + { + &hf_harq_rcid_ie_cid3, + {"3 LSB Of Basic CID", "wmx.harq_map.rcid_ie.cid3", FT_UINT16, BASE_HEX, NULL, WIMAX_RCID_IE_CID3_MASK, NULL, HFILL} + }, + { + &hf_harq_rcid_ie_cid3_1, + {"3 LSB Of Basic CID", "wmx.harq_map.rcid_ie.cid3", FT_UINT16, BASE_HEX, NULL, WIMAX_RCID_IE_CID3_MASK_1, NULL, HFILL} + }, + { + &hf_harq_rcid_ie_cid7, + {"7 LSB Of Basic CID", "wmx.harq_map.rcid_ie.cid7", FT_UINT16, BASE_HEX, NULL, WIMAX_RCID_IE_CID7_MASK, NULL, HFILL} + }, + { + &hf_harq_rcid_ie_cid7_1, + {"7 LSB Of Basic CID", "wmx.harq_map.rcid_ie.cid7", FT_UINT16, BASE_HEX, NULL, WIMAX_RCID_IE_CID7_MASK_1, NULL, HFILL} + }, + { + &hf_harq_rcid_ie_cid11, + {"11 LSB Of Basic CID", "wmx.harq_map.rcid_ie.cid11", FT_UINT16, BASE_HEX, NULL, WIMAX_RCID_IE_CID11_MASK, NULL, HFILL} + }, + { + &hf_harq_rcid_ie_cid11_1, + {"11 LSB Of Basic CID", "wmx.harq_map.rcid_ie.cid11", FT_UINT16, BASE_HEX, NULL, WIMAX_RCID_IE_CID11_MASK_1, NULL, HFILL} + }, + { + &hf_harq_rcid_ie_cid11_2, + {"11 LSB Of Multicast, AAS or Broadcast CID", "wmx.harq_map.rcid_ie.cid11", FT_UINT16, BASE_HEX, NULL, WIMAX_RCID_IE_CID11_MASK, NULL, HFILL} + }, + { + &hf_harq_rcid_ie_cid11_3, + {"11 LSB Of Multicast, AAS or Broadcast CID", "wmx.harq_map.rcid_ie.cid11", FT_UINT16, BASE_HEX, NULL, WIMAX_RCID_IE_CID11_MASK_1, NULL, HFILL} + } + }; + + /* HARQ MAP HARQ Control IE display */ + static hf_register_info hf_harq_control[] = + { + { + &hf_harq_control_ie_prefix, + {"Prefix", "wmx.harq_map.harq_control_ie.prefix", FT_BOOLEAN, 8, TFS(&tfs_prefix), WIMAX_HARQ_CONTROL_IE_PREFIX_MASK, NULL, HFILL} + }, + { + &hf_harq_control_ie_ai_sn, + {"HARQ ID Sequence Number(AI_SN)", "wmx.harq_map.harq_control_ie.ai_sn", FT_UINT8, BASE_HEX, NULL, WIMAX_HARQ_CONTROL_IE_AI_SN_MASK, NULL, HFILL} + }, + { + &hf_harq_control_ie_spid, + {"Subpacket ID (SPID)", "wmx.harq_map.harq_control_ie.spid", FT_UINT8, BASE_HEX, NULL, WIMAX_HARQ_CONTROL_IE_SPID_MASK, NULL, HFILL} + }, + { + &hf_harq_control_ie_acid, + {"HARQ CH ID (ACID)", "wmx.harq_map.harq_control_ie.acid", FT_UINT8, BASE_HEX, NULL, WIMAX_HARQ_CONTROL_IE_ACID_MASK, NULL, HFILL} + }, + { + &hf_harq_control_ie_reserved, + {"Reserved", "wmx.harq_map.harq_control_ie.reserved", FT_UINT8, BASE_HEX, NULL, WIMAX_HARQ_CONTROL_IE_RESERVED_MASK, NULL, HFILL} + }, + { + &hf_harq_control_ie_prefix_1, + {"Prefix", "wmx.harq_map.harq_control_ie.prefix", FT_BOOLEAN, 16, TFS(&tfs_prefix), WIMAX_HARQ_CONTROL_IE_PREFIX_MASK_1, NULL, HFILL} + }, + { + &hf_harq_control_ie_ai_sn_1, + {"HARQ ID Sequence Number(AI_SN)", "wmx.harq_map.harq_control_ie.ai_sn", FT_UINT16, BASE_HEX, NULL, WIMAX_HARQ_CONTROL_IE_AI_SN_MASK_1, NULL, HFILL} + }, + { + &hf_harq_control_ie_spid_1, + {"Subpacket ID (SPID)", "wmx.harq_map.harq_control_ie.spid", FT_UINT16, BASE_HEX, NULL, WIMAX_HARQ_CONTROL_IE_SPID_MASK_1, NULL, HFILL} + }, + { + &hf_harq_control_ie_acid_1, + {"HARQ CH ID (ACID)", "wmx.harq_map.harq_control_ie.acid", FT_UINT16, BASE_HEX, NULL, WIMAX_HARQ_CONTROL_IE_ACID_MASK_1, NULL, HFILL} + }, + { + &hf_harq_control_ie_reserved_1, + {"Reserved", "wmx.harq_map.harq_control_ie.reserved", FT_UINT16, BASE_HEX, NULL, WIMAX_HARQ_CONTROL_IE_RESERVED_MASK_1, NULL, HFILL} + } + }; + + /* HARQ MAP CQICH Control IE display */ + static hf_register_info hf_cqich_control[] = + { + { + &hf_cqich_control_ie_indicator, + {"CQICH Indicator", "wmx.harq_map.cqich_control_ie.cqich_indicator", FT_BOOLEAN, 16, TFS(&tfs_cqich_ind), WIMAX_CQICH_CONTROL_IE_INDICATOR_MASK, NULL, HFILL} + }, + { + &hf_cqich_control_ie_alloc_id, + {"Allocation Index", "wmx.harq_map.cqich_control_ie.alloc_id", FT_UINT16, BASE_HEX, NULL, WIMAX_CQICH_CONTROL_IE_ALLOCATION_INDEX_MASK, NULL, HFILL} + }, + { + &hf_cqich_control_ie_period, + {"PERIOD", "wmx.harq_map.cqich_control_ie.period", FT_UINT16, BASE_HEX, NULL, WIMAX_CQICH_CONTROL_IE_PERIOD_MASK, NULL, HFILL} + }, + { + &hf_cqich_control_ie_frame_offset, + {"Frame Offset", "wmx.harq_map.cqich_control_ie.frame_offset", FT_UINT16, BASE_HEX, NULL, WIMAX_CQICH_CONTROL_IE_FRAME_OFFSET_MASK, NULL, HFILL} + }, + { + &hf_cqich_control_ie_duration, + {"Duration", "wmx.harq_map.cqich_control_ie.duration", FT_UINT16, BASE_HEX, NULL, WIMAX_CQICH_CONTROL_IE_DURATION_MASK, NULL, HFILL} + }, + { + &hf_cqich_control_ie_cqi_rep_threshold, + {"CQI Reporting Threshold", "wmx.harq_map.cqich_control_ie.cqi_rep_threshold", FT_UINT16, BASE_HEX, NULL, WIMAX_CQICH_CONTROL_IE_CQI_REP_THRESHOLD_MASK, NULL, HFILL} + }, + { + &hf_cqich_control_ie_indicator_1, + {"CQICH Indicator", "wmx.harq_map.cqich_control_ie.cqich_indicator", FT_BOOLEAN, 24, TFS(&tfs_cqich_ind), WIMAX_CQICH_CONTROL_IE_INDICATOR_MASK_1, NULL, HFILL} + }, + { + &hf_cqich_control_ie_alloc_id_1, + {"Allocation Index", "wmx.harq_map.cqich_control_ie.alloc_id", FT_UINT24, BASE_HEX, NULL, WIMAX_CQICH_CONTROL_IE_ALLOCATION_INDEX_MASK_1, NULL, HFILL} + }, + { + &hf_cqich_control_ie_period_1, + {"PERIOD", "wmx.harq_map.cqich_control_ie.period", FT_UINT24, BASE_HEX, NULL, WIMAX_CQICH_CONTROL_IE_PERIOD_MASK_1, NULL, HFILL} + }, + { + &hf_cqich_control_ie_frame_offset_1, + {"Frame Offset", "wmx.harq_map.cqich_control_ie.frame_offset", FT_UINT24, BASE_HEX, NULL, WIMAX_CQICH_CONTROL_IE_FRAME_OFFSET_MASK_1, NULL, HFILL} + }, + { + &hf_cqich_control_ie_duration_1, + {"Duration", "wmx.harq_map.cqich_control_ie.duration", FT_UINT24, BASE_HEX, NULL, WIMAX_CQICH_CONTROL_IE_DURATION_MASK_1, NULL, HFILL} + }, + { + &hf_cqich_control_ie_cqi_rep_threshold_1, + {"CQI Reporting Threshold", "wmx.harq_map.cqich_control_ie.cqi_rep_threshold", FT_UINT24, BASE_HEX, NULL, WIMAX_CQICH_CONTROL_IE_CQI_REP_THRESHOLD_MASK_1, NULL, HFILL} + } + }; + + static hf_register_info hf_extension_type[] = + { + { + &hf_cdlmap_extension_type, + {"DL-MAP Type", "wmx.extension_type.dl_map_type", FT_UINT16, BASE_DEC, NULL, EXTENSION_TYPE_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_extension_type_1, + {"DL-MAP Type", "wmx.extension_type.dl_map_type", FT_UINT16, BASE_DEC, NULL, EXTENSION_TYPE_MASK_1, NULL, HFILL} + }, + { + &hf_cdlmap_extension_subtype, + {"Extension Subtype", "wmx.extension_type.subtype", FT_UINT16, BASE_DEC, NULL, EXTENSION_SUBTYPE_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_extension_subtype_1, + {"Extension Subtype", "wmx.extension_type.subtype", FT_UINT16, BASE_DEC, NULL, EXTENSION_SUBTYPE_MASK_1, NULL, HFILL} + }, + { + &hf_cdlmap_extension_length, + {"Extension Length", "wmx.extension_type.length", FT_UINT16, BASE_DEC, NULL, EXTENSION_LENGTH_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_extension_length_1, + {"Extension Length", "wmx.extension_type.length", FT_UINT16, BASE_DEC, NULL, EXTENSION_LENGTH_MASK_1, NULL, HFILL} + }, + { + &hf_cdlmap_extension_time_diversity_mbs, + {"Time Diversity MBS", "wmx.extension_type.time_diversity_mbs", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} + }, + { + &hf_cdlmap_extension_time_diversity_mbs_1, + {"Time Diversity MBS", "wmx.extension_type.time_diversity_mbs", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} + }, + { + &hf_cdlmap_extension_harq_mode_1, + {"HARQ Mode Switch", "wmx.extension_type.harq_mode", FT_UINT16, BASE_HEX, NULL, 0x000F, NULL, HFILL} + }, + { + &hf_cdlmap_extension_harq_mode, + {"HARQ Mode Switch", "wmx.extension_type.harq_mode", FT_UINT8, BASE_HEX, NULL, MSB_NIBBLE_MASK, NULL, HFILL} + }, + { + &hf_cdlmap_extension_unknown_sub_type, + {"Unknown Extension Subtype", "wmx.extension_type.unknown_sub_type", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} + }, + { + &hf_cdlmap_extension_unknown_sub_type_1, + {"Unknown Extension Subtype", "wmx.extension_type.unknown_sub_type", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} + } + }; + + /* Extended DIUC dependent IE */ + static hf_register_info hf_extended_diuc[] = + { + { + &hf_extended_diuc_dependent_ie_diuc, + {"Extended DIUC", "wmx.extended_diuc_dependent_ie.diuc", FT_UINT8, BASE_HEX, NULL, MSB_NIBBLE_MASK, NULL, HFILL } + }, + { + &hf_extended_diuc_dependent_ie_diuc_1, + {"Extended DIUC", "wmx.extended_diuc_dependent_ie.diuc", FT_UINT8, BASE_HEX, NULL, LSB_NIBBLE_MASK, NULL, HFILL } + }, + { + &hf_extended_diuc_dependent_ie_length, + {"Length", "wmx.extended_diuc_dependent_ie.length", FT_UINT8, BASE_DEC, NULL, MSB_NIBBLE_MASK, NULL, HFILL } + }, + { + &hf_extended_diuc_dependent_ie_length_1, + {"Length", "wmx.extended_diuc_dependent_ie.length", FT_UINT8, BASE_DEC, NULL, LSB_NIBBLE_MASK, NULL, HFILL } + }, + { /* 8.4.5.3.? Channel_Measurement_IE */ + &hf_extended_diuc_dependent_ie_channel_measurement, + {"Channel_Measurement_IE (not implemented)", "wmx.extended_diuc_dependent_ie.channel_measurement", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { /* 8.4.5.3.4 STC_Zone_IE */ + &hf_extended_diuc_dependent_ie_stc_zone, + {"STC_Zone_IE (not implemented)", "wmx.extended_diuc_dependent_ie.stc_zone", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { /* 8.4.5.3.3 AAS_DL_IE */ + &hf_extended_diuc_dependent_ie_aas_dl, + {"AAS_DL_IE (not implemented)", "wmx.extended_diuc_dependent_ie.aas_dl", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { /* 8.4.5.3.6 Data_location_in_another_BS_IE */ + &hf_extended_diuc_dependent_ie_data_location, + {"Data_location_in_another_BS_IE (not implemented)", "wmx.extended_diuc_dependent_ie.data_location", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { /* 8.4.5.3.7 CID_Switch_IE */ + &hf_extended_diuc_dependent_ie_cid_switch, + {"CID_Switch_IE (not implemented)", "wmx.extended_diuc_dependent_ie.cid_switch", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + + { /* 8.4.5.3.8 MIMO_DL_Basic_IE */ + &hf_extended_diuc_dependent_ie_mimo_dl_basic, + {"MIMO_DL_Basic_IE (not implemented)", "wmx.extended_diuc_dependent_ie.mimo_dl_basic", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { /* 8.4.5.3.9 MIMO_DL_Enhanced_IE */ + &hf_extended_diuc_dependent_ie_mimo_dl_enhanced, + {"MIMO_DL_Enhanced_IE (not implemented)", "wmx.extended_diuc_dependent_ie.mimo_dl_enhanced", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { /* 8.4.5.3.10 HARQ_Map_Pointer_IE */ + &hf_extended_diuc_dependent_ie_harq_map_pointer, + {"HARQ_Map_Pointer_IE (not implemented)", "wmx.extended_diuc_dependent_ie.harq_map_pointer", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { /* 8.4.5.3.11 PHYMOD_DL_IE */ + &hf_extended_diuc_dependent_ie_phymod_dl, + {"PHYMOD_DL_IE (not implemented)", "wmx.extended_diuc_dependent_ie.phymod_dl", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { /* 8.4.5.3.13 DL PUSC Burst Allocation in Other Segment IE */ + &hf_extended_diuc_dependent_ie_dl_pusc_burst_allocation, + {"DL_PUSC_Burst_Allocation_in_Other_Segment_IE (not implemented)", "wmx.extended_diuc_dependent_ie.dl_pusc_burst_allocation", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { /* 8.4.5.3.19 UL_interference_and_noise_level_IE */ + &hf_extended_diuc_dependent_ie_ul_interference_and_noise_level, + {"UL_interference_and_noise_level_IE (not implemented)", "wmx.extended_diuc_dependent_ie.ul_interference_and_noise_level", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { /* unknown DIUC */ + &hf_extended_diuc_dependent_ie_unknown_diuc, + {"Unknown Extended DIUC", "wmx.extended_diuc_dependent_ie.unknown_diuc", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } + } + }; + +#if 0 /* Not used ?? */ + /* Setup protocol subtree array */ + static gint *ett[] = + { + &ett_wimax_compact_dlmap_ie_decoder, + &ett_wimax_format_configuration_ie_decoder, + &ett_wimax_rcid_ie_decoder, + &ett_wimax_harq_control_ie_decoder, + &ett_wimax_extended_diuc_dependent_ie_decoder, + &ett_wimax_cqich_control_ie_decoder, + &ett_wimax_extension_type_ie_decoder, + }; + proto_register_subtree_array(ett, array_length(ett)); +#endif + + proto_wimax_compact_dlmap_ie_decoder = proto_wimax; + + proto_register_field_array(proto_wimax_compact_dlmap_ie_decoder, hf_compact_dlmap, array_length(hf_compact_dlmap)); + proto_register_field_array(proto_wimax_compact_dlmap_ie_decoder, hf_format_config, array_length(hf_format_config)); + proto_register_field_array(proto_wimax_compact_dlmap_ie_decoder, hf_rcid, array_length(hf_rcid)); + proto_register_field_array(proto_wimax_compact_dlmap_ie_decoder, hf_harq_control, array_length(hf_harq_control)); + proto_register_field_array(proto_wimax_compact_dlmap_ie_decoder, hf_cqich_control, array_length(hf_cqich_control)); + proto_register_field_array(proto_wimax_compact_dlmap_ie_decoder, hf_extension_type, array_length(hf_extension_type)); + proto_register_field_array(proto_wimax_compact_dlmap_ie_decoder, hf_extended_diuc, array_length(hf_extended_diuc)); +} + +/* + * Editor modelines - https://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 8 + * tab-width: 8 + * indent-tabs-mode: t + * End: + * + * vi: set shiftwidth=8 tabstop=8 noexpandtab: + * :indentSize=8:tabSize=8:noTabs=false: + */ -- cgit v1.2.3