summaryrefslogtreecommitdiff
path: root/plugins/wimax/msg_dcd.c
diff options
context:
space:
mode:
authorBill Meier <wmeier@newsguy.com>2009-08-04 19:01:34 +0000
committerBill Meier <wmeier@newsguy.com>2009-08-04 19:01:34 +0000
commit8589c2f11bb81dddd09d8bd2adcfb5e8a5b33dff (patch)
treeb8c8ee79da5947a5d0667ec76143c0440f2a95bb /plugins/wimax/msg_dcd.c
parentcb7dac7100ba7e3f9208dbee243b1a0160254f02 (diff)
downloadwireshark-8589c2f11bb81dddd09d8bd2adcfb5e8a5b33dff.tar.gz
Minor changes:
- Move proto_register...() to the end of the file as per convention; - Move ett[] to be local to proto_register...(); - "if (...==-1)" not req'd in proto_register...(); - #include <moduleinfo.h> not req'd; - Remove unneeded forward declarations. svn path=/trunk/; revision=29296
Diffstat (limited to 'plugins/wimax/msg_dcd.c')
-rw-r--r--plugins/wimax/msg_dcd.c944
1 files changed, 468 insertions, 476 deletions
diff --git a/plugins/wimax/msg_dcd.c b/plugins/wimax/msg_dcd.c
index 856bc569fa..0f4afedc95 100644
--- a/plugins/wimax/msg_dcd.c
+++ b/plugins/wimax/msg_dcd.c
@@ -36,8 +36,6 @@
#define DEBUG
*/
-#include "moduleinfo.h"
-
#include <glib.h>
#include <epan/packet.h>
#include "wimax_tlv.h"
@@ -48,19 +46,9 @@ extern gint proto_wimax;
/* Delete the following variable as soon as possible */
extern gboolean include_cor2_changes;
-/* forward reference */
-void proto_register_mac_mgmt_msg_dcd(void);
-void dissect_mac_mgmt_msg_dcd_decoder(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
-
gint proto_mac_mgmt_msg_dcd_decoder = -1;
static gint ett_mac_mgmt_msg_dcd_decoder = -1;
-/* Setup protocol subtree array */
-static gint *ett[] =
-{
- &ett_mac_mgmt_msg_dcd_decoder,
-};
-
/* fix fields */
static gint hf_dcd_message_type = -1;
static gint hf_dcd_downlink_channel_id = -1;
@@ -341,6 +329,462 @@ static const value_string tfs_support[] =
{0, NULL}
};
+
+/* WiMax MAC Management DCD message (table 15) dissector */
+void dissect_mac_mgmt_msg_dcd_decoder(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ guint offset = 0;
+ guint tvb_len, payload_type, length;
+ guint configChangeCount;
+ gint tlv_type, tlv_len, tlv_offset, tlv_value_offset;
+ guint dl_burst_diuc, dl_num_regions;
+ proto_item *dcd_item = NULL;
+ proto_tree *dcd_tree = NULL;
+ proto_item *tlv_item = NULL;
+ proto_tree *tlv_tree = NULL;
+ proto_tree *sub_tree = NULL;
+ tlv_info_t tlv_info;
+
+ /* Ensure the right payload type */
+ payload_type = tvb_get_guint8(tvb, offset);
+ if(payload_type != MAC_MGMT_MSG_DCD)
+ {
+ return;
+ }
+
+ if(tree)
+ { /* we are being asked for details */
+ /* Get the tvb reported length */
+ tvb_len = tvb_reported_length(tvb);
+ /* display MAC payload type DCD */
+ dcd_item = proto_tree_add_protocol_format(tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, tvb_len, "Downlink Channel Descriptor (DCD) (%u bytes)", tvb_len);
+ /* add MAC DCD subtree */
+ dcd_tree = proto_item_add_subtree(dcd_item, ett_mac_mgmt_msg_dcd_decoder);
+ /* Decode and display the Downlink Channel Descriptor (DCD) */
+ /* display the Message Type */
+ proto_tree_add_item(dcd_tree, hf_dcd_message_type, tvb, offset, 1, FALSE);
+ /* set the offset for the Downlink Channel ID */
+ offset++;
+ /* display the Downlink Channel ID */
+ proto_tree_add_item(dcd_tree, hf_dcd_downlink_channel_id, tvb, offset, 1, FALSE);
+ /* set the offset for the Configuration Change Count */
+ offset++;
+ /* get the Configuration Change Count */
+ configChangeCount = tvb_get_guint8(tvb, offset);
+ /* display the Configuration Change Count */
+ proto_tree_add_item(dcd_tree, hf_dcd_config_change_count, tvb, offset, 1, FALSE);
+ /* set the offset for the TLV Encoded info */
+ offset++;
+ /* process the DCD TLV Encoded information (table 358) */
+ while(offset < tvb_len)
+ {
+ /* get the TLV information */
+ init_tlv_info(&tlv_info, tvb, offset);
+ /* get the TLV type */
+ tlv_type = get_tlv_type(&tlv_info);
+ /* get the TLV length */
+ tlv_len = get_tlv_length(&tlv_info);
+ if(tlv_type == -1 || tlv_len > MAX_TLV_LEN || tlv_len < 1)
+ { /* invalid tlv info */
+ if(check_col(pinfo->cinfo, COL_INFO))
+ {
+ col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, "DCD TLV error");
+ }
+ proto_tree_add_item(dcd_tree, hf_dcd_invalid_tlv, tvb, offset, (tvb_len - offset), FALSE);
+ break;
+ }
+ /* get the TLV value offset */
+ tlv_value_offset = get_tlv_value_offset(&tlv_info);
+#ifdef DEBUG /* for debug only */
+ tlv_item = proto_tree_add_protocol_format(dcd_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, (tlv_len + tlv_value_offset), "DCD Type: %u (%u bytes, offset=%u, tvb_len=%u)", tlv_type, tlv_len, offset, tvb_len);
+#endif
+ /* update the offset */
+ offset += tlv_value_offset;
+ /* process DCD TLVs */
+ switch (tlv_type)
+ {
+ case DCD_DOWNLINK_BURST_PROFILE:
+ { /* Downlink Burst Profile TLV (table 363)*/
+ /* get the DIUC */
+ dl_burst_diuc = (tvb_get_guint8(tvb, offset) & 0x0F);
+ /* display TLV info */
+ /* add TLV subtree */
+ tlv_tree = add_protocol_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, tlv_len, "Downlink_Burst_Profile (DIUC=%u) (%u bytes)", (dl_burst_diuc+1), tlv_len);
+ /* detail display */
+ proto_tree_add_item(tlv_tree, hf_dcd_dl_burst_profile_rsv, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_dl_burst_profile_diuc, tvb, offset, 1, FALSE);
+ /* process subTLVs */
+ for (tlv_offset = 1; tlv_offset < tlv_len; )
+ { /* get the TLV information */
+ init_tlv_info(&tlv_info, tvb, (offset+tlv_offset));
+ /* get the TLV type */
+ tlv_type = get_tlv_type(&tlv_info);
+ /* get the TLV length */
+ length = get_tlv_length(&tlv_info);
+ if(tlv_type == -1 || length > MAX_TLV_LEN || length < 1)
+ { /* invalid tlv info */
+ if(check_col(pinfo->cinfo, COL_INFO))
+ {
+ col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, "DL Burst Profile TLV error");
+ }
+ proto_tree_add_item(tlv_tree, hf_dcd_invalid_tlv, tvb, offset, (tlv_len - offset - tlv_offset), FALSE);
+ break;
+ }
+ /* update the offset */
+ tlv_offset += get_tlv_value_offset(&tlv_info);
+ switch (tlv_type)
+ {
+ case DCD_BURST_FREQUENCY:
+ {
+ sub_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, tlv_tree, hf_dcd_burst_freq, tvb, (offset+tlv_offset), 1, FALSE);
+ tlv_item = proto_tree_add_item(sub_tree, hf_dcd_burst_freq, tvb, (offset+tlv_offset), 1, FALSE);
+ proto_item_append_text(tlv_item, " kHz");
+ break;
+ }
+ case DCD_BURST_FEC_CODE_TYPE:
+ {
+ sub_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, tlv_tree, hf_dcd_burst_fec, tvb, (offset+tlv_offset), 1, FALSE);
+ proto_tree_add_item(sub_tree, hf_dcd_burst_fec, tvb, (offset+tlv_offset), 1, FALSE);
+ break;
+ }
+ case DCD_BURST_DIUC_EXIT_THRESHOLD:
+ {
+ sub_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, tlv_tree, hf_dcd_burst_diuc_exit_threshold, tvb, (offset+tlv_offset), length, FALSE);
+ tlv_item = proto_tree_add_item(sub_tree, hf_dcd_burst_diuc_exit_threshold, tvb, (offset+tlv_offset), length, FALSE);
+ break;
+ }
+ case DCD_BURST_DIUC_ENTRY_THRESHOLD:
+ {
+ sub_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, tlv_tree, hf_dcd_burst_diuc_entry_threshold, tvb, (offset+tlv_offset), length, FALSE);
+ tlv_item = proto_tree_add_item(sub_tree, hf_dcd_burst_diuc_entry_threshold, tvb, (offset+tlv_offset), length, FALSE);
+ break;
+ }
+ case DCD_BURST_TCS_ENABLE:
+ {
+ sub_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, tlv_tree, hf_dcd_burst_tcs, tvb, (offset+tlv_offset), length, FALSE);
+ proto_tree_add_item(sub_tree, hf_dcd_burst_tcs, tvb, (offset+tlv_offset), 1, FALSE);
+ break;
+ }
+ default:
+ /* ??? */
+ break;
+ }
+ tlv_offset += length;
+ }
+ break;
+ }
+ case DCD_BS_EIRP:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_bs_eirp, tvb, offset, tlv_len, FALSE);
+ tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_bs_eirp, tvb, offset, tlv_len, FALSE);
+ proto_item_append_text(tlv_item, " dBm");
+ break;
+ }
+ case DCD_FRAME_DURATION:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_frame_duration, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_frame_duration, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+ case DCD_PHY_TYPE:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_phy_type, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_phy_type, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+ case DCD_POWER_ADJUSTMENT:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_power_adjustment, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_power_adjustment, tvb, offset, 1, FALSE);
+ break;
+ }
+ case DCD_CHANNEL_NR:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_channel_nr, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_channel_nr, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+ case DCD_TTG:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_ttg, tvb, offset, tlv_len, FALSE);
+ tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_ttg, tvb, offset, tlv_len, FALSE);
+ proto_item_append_text(tlv_item, " PS");
+ break;
+ }
+ case DCD_RTG:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_rtg, tvb, offset, tlv_len, FALSE);
+ tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_rtg, tvb, offset, tlv_len, FALSE);
+ proto_item_append_text(tlv_item, " PS");
+ break;
+ }
+#ifdef WIMAX_16D_2004
+ case DCD_RSS:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_rss, tvb, offset, tlv_len, FALSE);
+ tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_rss, tvb, offset, tlv_len, FALSE);
+ proto_item_append_text(tlv_item, " dBm");
+ break;
+ }
+#else
+ case DCD_EIRXP:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_eirxp, tvb, offset, tlv_len, FALSE);
+ tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_eirxp, tvb, offset, tlv_len, FALSE);
+ proto_item_append_text(tlv_item, " dBm");
+ break;
+ }
+#endif
+ case DCD_CHANNEL_SWITCH_FRAME_NR:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_channel_switch_frame_nr, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_channel_switch_frame_nr, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+ case DCD_FREQUENCY:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_frequency, tvb, offset, tlv_len, FALSE);
+ tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_frequency, tvb, offset, tlv_len, FALSE);
+ proto_item_append_text(tlv_item, " kHz");
+ break;
+ }
+ case DCD_BS_ID:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_bs_id, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_bs_id, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+ case DCD_FRAME_DURATION_CODE:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_frame_duration_code, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_frame_duration_code, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+ case DCD_FRAME_NR:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_frame_nr, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_frame_nr, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+#ifdef WIMAX_16D_2004
+ case DCD_SIZE_CQICH_ID:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_size_cqich_id, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_size_cqich_id, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+#endif
+ case DCD_H_ARQ_ACK_DELAY:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_h_arq_ack_delay, tvb, offset, tlv_len, FALSE);
+ tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_h_arq_ack_delay, tvb, offset, tlv_len, FALSE);
+ proto_item_append_text(tlv_item, " frame offset");
+ break;
+ }
+ case DCD_MAC_VERSION:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_mac_version, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_mac_version, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+ case DCD_TLV_T_19_PERMUTATION_TYPE_FOR_BROADCAST_REGION_IN_HARQ_ZONE:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_19_permutation_type_for_broadcast_regions_in_harq_zone, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_19_permutation_type_for_broadcast_regions_in_harq_zone, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+ case DCD_TLV_T_20_MAXIMUM_RETRANSMISSION:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_20_maximum_retransmission, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_20_maximum_retransmission, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+ case DCD_TLV_T_21_DEFAULT_RSSI_AND_CINR_AVERAGING_PARAMETER:
+ {
+ tlv_tree = add_protocol_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, 1, "Default RSSI and CINR averaging parameter (%u byte(s))", tlv_len);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_21_default_rssi_and_cinr_averaging_parameter, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_21_default_rssi_and_cinr_averaging_parameter_physical_cinr_measurements, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_21_default_rssi_and_cinr_averaging_parameter_rssi_measurements, tvb, offset, 1, FALSE);
+ break;
+ }
+ case DCD_TLV_T_22_DL_AMC_ALLOCATED_PHYSICAL_BANDS_BITMAP:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_22_dl_amc_allocated_physical_bands_bitmap, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_22_dl_amc_allocated_physical_bands_bitmap, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+ case DCD_TLV_T_34_DL_REGION_DEFINITION:
+ {
+ tlv_tree = add_protocol_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, tlv_len, "DL region definition (%u byte(s))", tlv_len);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_34_dl_region_definition, tvb, offset, tlv_len, FALSE);
+ dl_num_regions = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_34_dl_region_definition_num_region, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_34_dl_region_definition_reserved, tvb, offset, 1, FALSE);
+ tlv_offset = offset;
+ for(length = 0; length < dl_num_regions; length++)
+ {
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_34_dl_region_definition_symbol_offset, tvb, tlv_offset, 1, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_34_dl_region_definition_subchannel_offset, tvb, (tlv_offset+1), 1, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_34_dl_region_definition_num_symbols, tvb, (tlv_offset+2), 1, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_34_dl_region_definition_num_subchannels, tvb, (tlv_offset+3), 1, FALSE);
+ tlv_offset += 4;
+ }
+ break;
+ }
+ case DCD_TLV_T_50_HO_TYPE_SUPPORT:
+ {
+ tlv_tree = add_protocol_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, tlv_len, "HO type support (%u byte(s))", tlv_len);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_50_ho_type_support, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_50_ho_type_support_ho, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_50_ho_type_support_mdho, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_50_ho_type_support_fbss_ho, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_50_ho_type_support_reserved, tvb, offset, 1, FALSE);
+ break;
+ }
+ case DCD_TLV_T_31_H_ADD_THRESHOLD:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_31_h_add_threshold, tvb, offset, 1, FALSE);
+ tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_31_h_add_threshold, tvb, offset, tlv_len, FALSE);
+ proto_item_append_text(tlv_item, " dB");
+ break;
+ }
+ case DCD_TLV_T_32_H_DELETE_THRESHOLD:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_32_h_delete_threshold, tvb, offset, tlv_len, FALSE);
+ tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_32_h_delete_threshold, tvb, offset, tlv_len, FALSE);
+ proto_item_append_text(tlv_item, " dB");
+ break;
+ }
+ case DCD_TLV_T_33_ASR:
+ {
+ tlv_tree = add_protocol_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, tlv_len, "ASR Slot Length (M) and Switching Period (L) (%u byte(s))", tlv_len);
+ proto_tree_add_item(dcd_tree, hf_dcd_tlv_t_33_asr, tvb, offset, 1, FALSE);
+ tlv_item = proto_tree_add_item(dcd_tree, hf_dcd_tlv_t_33_asr_m, tvb, offset, 1, FALSE);
+ proto_item_append_text(tlv_item, " frames");
+ tlv_item = proto_tree_add_item(dcd_tree, hf_dcd_tlv_t_33_asr_l, tvb, offset, 1, FALSE);
+ proto_item_append_text(tlv_item, " frames");
+ break;
+ }
+ case DCD_TLV_T_35_PAGING_GROUP_ID:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_35_paging_group_id, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_35_paging_group_id, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+ case DCD_TLV_T_36_TUSC1_PERMUTATION_ACTIVE_SUBCHANNELS_BITMAP:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_36_tusc1_permutation_active_subchannels_bitmap, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_36_tusc1_permutation_active_subchannels_bitmap, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+ case DCD_TLV_T_37_TUSC2_PERMUTATION_ACTIVE_SUBCHANNELS_BITMAP:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_37_tusc2_permutation_active_subchannels_bitmap, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_37_tusc2_permutation_active_subchannels_bitmap, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+ case DCD_TLV_T_51_HYSTERSIS_MARGIN:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_51_hysteresis_margin, tvb, offset, tlv_len, FALSE);
+ tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_51_hysteresis_margin, tvb, offset, tlv_len, FALSE);
+ proto_item_append_text(tlv_item, " dB");
+ break;
+ }
+ case DCD_TLV_T_52_TIME_TO_TRIGGER_DURATION:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_52_time_to_trigger_duration, tvb, offset, tlv_len, FALSE);
+ tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_52_time_to_trigger_duration, tvb, offset, tlv_len, FALSE);
+ proto_item_append_text(tlv_item, " ms");
+ break;
+ }
+ case DCD_TLV_T_54_TRIGGER:
+ { /* Trigger TLV (table 358a & 358b) */
+ /* add TLV subtree */
+ tlv_tree = add_protocol_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, tlv_len, "DCD Trigger (%u bytes)", tlv_len);
+ for (tlv_offset = 0; tlv_offset < tlv_len; )
+ {
+ /* get the TLV information */
+ init_tlv_info(&tlv_info, tvb, (offset + tlv_offset));
+ /* get the TLV type */
+ tlv_type = get_tlv_type(&tlv_info);
+ /* get the TLV length */
+ length = get_tlv_length(&tlv_info);
+ if(tlv_type == -1 || length > MAX_TLV_LEN || length < 1)
+ { /* invalid tlv info */
+ if(check_col(pinfo->cinfo, COL_INFO))
+ {
+ col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, "Trigger TLV error");
+ }
+ proto_tree_add_item(tlv_tree, hf_dcd_invalid_tlv, tvb, offset, (tlv_len - offset - tlv_offset), FALSE);
+ break;
+ }
+ /* update the offset */
+ tlv_offset += get_tlv_value_offset(&tlv_info);
+ /* table 358a */
+ switch (tlv_type)
+ {
+ case DCD_TLV_T_541_TYPE_FUNCTION_ACTION:
+ { /* table 358b */
+ sub_tree = add_protocol_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, tlv_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, (offset + tlv_offset), length, "Trigger; Type/function/action description (%u byte(s))", tlv_len);
+ proto_tree_add_item(sub_tree, hf_dcd_tlv_t_541_type, tvb, (offset + tlv_offset), 1, FALSE);
+ proto_tree_add_item(sub_tree, hf_dcd_tlv_t_541_function, tvb, (offset + tlv_offset), 1, FALSE);
+ proto_tree_add_item(sub_tree, hf_dcd_tlv_t_541_action, tvb, (offset + tlv_offset), 1, FALSE);
+ }
+ break;
+ case DCD_TLV_T542_TRIGGER_VALUE:
+ sub_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, tlv_tree, hf_dcd_tlv_t_542_trigger_value, tvb, (offset + tlv_offset), length, FALSE);
+ proto_tree_add_item(sub_tree, hf_dcd_tlv_t_542_trigger_value, tvb, (offset + tlv_offset), length, FALSE);
+ break;
+ case DCD_TLV_T_543_TRIGGER_AVERAGING_DURATION:
+ sub_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, tlv_tree, hf_dcd_tlv_t_543_trigger_averaging_duration, tvb, (offset + tlv_offset), length, FALSE);
+ proto_tree_add_item(sub_tree, hf_dcd_tlv_t_543_trigger_averaging_duration, tvb, (offset + tlv_offset), length, FALSE);
+ break;
+ }
+ tlv_offset += length;
+ }
+ break;
+ }
+ case DCD_TLV_T_60_NOISE_AND_INTERFERENCE:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_60_noise_interference, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_60_noise_interference, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+ case DCD_TLV_T_153_DOWNLINK_BURST_PROFILE_FOR_MULTIPLE_FEC_TYPES:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_153_downlink_burst_profile_for_mutiple_fec_types, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_153_downlink_burst_profile_for_mutiple_fec_types, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+ case DCD_RESTART_COUNT:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_restart_count, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_restart_count, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+ case DCD_TLV_T_45_PAGING_INTERVAL_LENGTH:
+ {
+ if (include_cor2_changes) {
+ tlv_tree = add_protocol_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, tlv_len, "Reserved (%u byte(s))", tlv_len);
+ proto_tree_add_text(tlv_tree, tvb, offset, tlv_len, "Reserved");
+ } else {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_45_paging_interval_length, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_45_paging_interval_length, tvb, offset, tlv_len, FALSE);
+ }
+ break;
+ }
+ default:
+ {
+ tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_unknown_type, tvb, offset, tlv_len, FALSE);
+ proto_tree_add_item(tlv_tree, hf_dcd_unknown_type, tvb, offset, tlv_len, FALSE);
+ break;
+ }
+ }
+ offset += tlv_len;
+ } /* end of TLV process while loop */
+ }
+}
+
/* Register Wimax Mac Payload Protocol and Dissector */
void proto_register_mac_mgmt_msg_dcd(void)
{
@@ -848,470 +1292,18 @@ void proto_register_mac_mgmt_msg_dcd(void)
}
};
- if (proto_mac_mgmt_msg_dcd_decoder == -1)
- {
- proto_mac_mgmt_msg_dcd_decoder = proto_register_protocol (
- "WiMax DCD/UCD Messages", /* name */
- "WiMax DCD/UCD (cd)", /* short name */
- "wmx.cd" /* abbrev */
- );
-
- proto_register_field_array(proto_mac_mgmt_msg_dcd_decoder, hf, array_length(hf));
- proto_register_subtree_array(ett, array_length(ett));
- }
-}
-
-/* WiMax MAC Management DCD message (table 15) dissector */
-void dissect_mac_mgmt_msg_dcd_decoder(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
-{
- guint offset = 0;
- guint tvb_len, payload_type, length;
- guint configChangeCount;
- gint tlv_type, tlv_len, tlv_offset, tlv_value_offset;
- guint dl_burst_diuc, dl_num_regions;
- proto_item *dcd_item = NULL;
- proto_tree *dcd_tree = NULL;
- proto_item *tlv_item = NULL;
- proto_tree *tlv_tree = NULL;
- proto_tree *sub_tree = NULL;
- tlv_info_t tlv_info;
+ /* Setup protocol subtree array */
+ static gint *ett[] =
+ {
+ &ett_mac_mgmt_msg_dcd_decoder,
+ };
- /* Ensure the right payload type */
- payload_type = tvb_get_guint8(tvb, offset);
- if(payload_type != MAC_MGMT_MSG_DCD)
- {
- return;
- }
+ proto_mac_mgmt_msg_dcd_decoder = proto_register_protocol (
+ "WiMax DCD/UCD Messages", /* name */
+ "WiMax DCD/UCD (cd)", /* short name */
+ "wmx.cd" /* abbrev */
+ );
- if(tree)
- { /* we are being asked for details */
- /* Get the tvb reported length */
- tvb_len = tvb_reported_length(tvb);
- /* display MAC payload type DCD */
- dcd_item = proto_tree_add_protocol_format(tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, tvb_len, "Downlink Channel Descriptor (DCD) (%u bytes)", tvb_len);
- /* add MAC DCD subtree */
- dcd_tree = proto_item_add_subtree(dcd_item, ett_mac_mgmt_msg_dcd_decoder);
- /* Decode and display the Downlink Channel Descriptor (DCD) */
- /* display the Message Type */
- proto_tree_add_item(dcd_tree, hf_dcd_message_type, tvb, offset, 1, FALSE);
- /* set the offset for the Downlink Channel ID */
- offset++;
- /* display the Downlink Channel ID */
- proto_tree_add_item(dcd_tree, hf_dcd_downlink_channel_id, tvb, offset, 1, FALSE);
- /* set the offset for the Configuration Change Count */
- offset++;
- /* get the Configuration Change Count */
- configChangeCount = tvb_get_guint8(tvb, offset);
- /* display the Configuration Change Count */
- proto_tree_add_item(dcd_tree, hf_dcd_config_change_count, tvb, offset, 1, FALSE);
- /* set the offset for the TLV Encoded info */
- offset++;
- /* process the DCD TLV Encoded information (table 358) */
- while(offset < tvb_len)
- {
- /* get the TLV information */
- init_tlv_info(&tlv_info, tvb, offset);
- /* get the TLV type */
- tlv_type = get_tlv_type(&tlv_info);
- /* get the TLV length */
- tlv_len = get_tlv_length(&tlv_info);
- if(tlv_type == -1 || tlv_len > MAX_TLV_LEN || tlv_len < 1)
- { /* invalid tlv info */
- if(check_col(pinfo->cinfo, COL_INFO))
- {
- col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, "DCD TLV error");
- }
- proto_tree_add_item(dcd_tree, hf_dcd_invalid_tlv, tvb, offset, (tvb_len - offset), FALSE);
- break;
- }
- /* get the TLV value offset */
- tlv_value_offset = get_tlv_value_offset(&tlv_info);
-#ifdef DEBUG /* for debug only */
- tlv_item = proto_tree_add_protocol_format(dcd_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, (tlv_len + tlv_value_offset), "DCD Type: %u (%u bytes, offset=%u, tvb_len=%u)", tlv_type, tlv_len, offset, tvb_len);
-#endif
- /* update the offset */
- offset += tlv_value_offset;
- /* process DCD TLVs */
- switch (tlv_type)
- {
- case DCD_DOWNLINK_BURST_PROFILE:
- { /* Downlink Burst Profile TLV (table 363)*/
- /* get the DIUC */
- dl_burst_diuc = (tvb_get_guint8(tvb, offset) & 0x0F);
- /* display TLV info */
- /* add TLV subtree */
- tlv_tree = add_protocol_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, tlv_len, "Downlink_Burst_Profile (DIUC=%u) (%u bytes)", (dl_burst_diuc+1), tlv_len);
- /* detail display */
- proto_tree_add_item(tlv_tree, hf_dcd_dl_burst_profile_rsv, tvb, offset, 1, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_dl_burst_profile_diuc, tvb, offset, 1, FALSE);
- /* process subTLVs */
- for (tlv_offset = 1; tlv_offset < tlv_len; )
- { /* get the TLV information */
- init_tlv_info(&tlv_info, tvb, (offset+tlv_offset));
- /* get the TLV type */
- tlv_type = get_tlv_type(&tlv_info);
- /* get the TLV length */
- length = get_tlv_length(&tlv_info);
- if(tlv_type == -1 || length > MAX_TLV_LEN || length < 1)
- { /* invalid tlv info */
- if(check_col(pinfo->cinfo, COL_INFO))
- {
- col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, "DL Burst Profile TLV error");
- }
- proto_tree_add_item(tlv_tree, hf_dcd_invalid_tlv, tvb, offset, (tlv_len - offset - tlv_offset), FALSE);
- break;
- }
- /* update the offset */
- tlv_offset += get_tlv_value_offset(&tlv_info);
- switch (tlv_type)
- {
- case DCD_BURST_FREQUENCY:
- {
- sub_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, tlv_tree, hf_dcd_burst_freq, tvb, (offset+tlv_offset), 1, FALSE);
- tlv_item = proto_tree_add_item(sub_tree, hf_dcd_burst_freq, tvb, (offset+tlv_offset), 1, FALSE);
- proto_item_append_text(tlv_item, " kHz");
- break;
- }
- case DCD_BURST_FEC_CODE_TYPE:
- {
- sub_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, tlv_tree, hf_dcd_burst_fec, tvb, (offset+tlv_offset), 1, FALSE);
- proto_tree_add_item(sub_tree, hf_dcd_burst_fec, tvb, (offset+tlv_offset), 1, FALSE);
- break;
- }
- case DCD_BURST_DIUC_EXIT_THRESHOLD:
- {
- sub_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, tlv_tree, hf_dcd_burst_diuc_exit_threshold, tvb, (offset+tlv_offset), length, FALSE);
- tlv_item = proto_tree_add_item(sub_tree, hf_dcd_burst_diuc_exit_threshold, tvb, (offset+tlv_offset), length, FALSE);
- break;
- }
- case DCD_BURST_DIUC_ENTRY_THRESHOLD:
- {
- sub_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, tlv_tree, hf_dcd_burst_diuc_entry_threshold, tvb, (offset+tlv_offset), length, FALSE);
- tlv_item = proto_tree_add_item(sub_tree, hf_dcd_burst_diuc_entry_threshold, tvb, (offset+tlv_offset), length, FALSE);
- break;
- }
- case DCD_BURST_TCS_ENABLE:
- {
- sub_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, tlv_tree, hf_dcd_burst_tcs, tvb, (offset+tlv_offset), length, FALSE);
- proto_tree_add_item(sub_tree, hf_dcd_burst_tcs, tvb, (offset+tlv_offset), 1, FALSE);
- break;
- }
- default:
- /* ??? */
- break;
- }
- tlv_offset += length;
- }
- break;
- }
- case DCD_BS_EIRP:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_bs_eirp, tvb, offset, tlv_len, FALSE);
- tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_bs_eirp, tvb, offset, tlv_len, FALSE);
- proto_item_append_text(tlv_item, " dBm");
- break;
- }
- case DCD_FRAME_DURATION:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_frame_duration, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_frame_duration, tvb, offset, tlv_len, FALSE);
- break;
- }
- case DCD_PHY_TYPE:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_phy_type, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_phy_type, tvb, offset, tlv_len, FALSE);
- break;
- }
- case DCD_POWER_ADJUSTMENT:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_power_adjustment, tvb, offset, 1, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_power_adjustment, tvb, offset, 1, FALSE);
- break;
- }
- case DCD_CHANNEL_NR:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_channel_nr, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_channel_nr, tvb, offset, tlv_len, FALSE);
- break;
- }
- case DCD_TTG:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_ttg, tvb, offset, tlv_len, FALSE);
- tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_ttg, tvb, offset, tlv_len, FALSE);
- proto_item_append_text(tlv_item, " PS");
- break;
- }
- case DCD_RTG:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_rtg, tvb, offset, tlv_len, FALSE);
- tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_rtg, tvb, offset, tlv_len, FALSE);
- proto_item_append_text(tlv_item, " PS");
- break;
- }
-#ifdef WIMAX_16D_2004
- case DCD_RSS:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_rss, tvb, offset, tlv_len, FALSE);
- tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_rss, tvb, offset, tlv_len, FALSE);
- proto_item_append_text(tlv_item, " dBm");
- break;
- }
-#else
- case DCD_EIRXP:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_eirxp, tvb, offset, tlv_len, FALSE);
- tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_eirxp, tvb, offset, tlv_len, FALSE);
- proto_item_append_text(tlv_item, " dBm");
- break;
- }
-#endif
- case DCD_CHANNEL_SWITCH_FRAME_NR:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_channel_switch_frame_nr, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_channel_switch_frame_nr, tvb, offset, tlv_len, FALSE);
- break;
- }
- case DCD_FREQUENCY:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_frequency, tvb, offset, tlv_len, FALSE);
- tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_frequency, tvb, offset, tlv_len, FALSE);
- proto_item_append_text(tlv_item, " kHz");
- break;
- }
- case DCD_BS_ID:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_bs_id, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_bs_id, tvb, offset, tlv_len, FALSE);
- break;
- }
- case DCD_FRAME_DURATION_CODE:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_frame_duration_code, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_frame_duration_code, tvb, offset, tlv_len, FALSE);
- break;
- }
- case DCD_FRAME_NR:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_frame_nr, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_frame_nr, tvb, offset, tlv_len, FALSE);
- break;
- }
-#ifdef WIMAX_16D_2004
- case DCD_SIZE_CQICH_ID:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_size_cqich_id, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_size_cqich_id, tvb, offset, tlv_len, FALSE);
- break;
- }
-#endif
- case DCD_H_ARQ_ACK_DELAY:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_h_arq_ack_delay, tvb, offset, tlv_len, FALSE);
- tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_h_arq_ack_delay, tvb, offset, tlv_len, FALSE);
- proto_item_append_text(tlv_item, " frame offset");
- break;
- }
- case DCD_MAC_VERSION:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_mac_version, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_mac_version, tvb, offset, tlv_len, FALSE);
- break;
- }
- case DCD_TLV_T_19_PERMUTATION_TYPE_FOR_BROADCAST_REGION_IN_HARQ_ZONE:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_19_permutation_type_for_broadcast_regions_in_harq_zone, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_19_permutation_type_for_broadcast_regions_in_harq_zone, tvb, offset, tlv_len, FALSE);
- break;
- }
- case DCD_TLV_T_20_MAXIMUM_RETRANSMISSION:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_20_maximum_retransmission, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_20_maximum_retransmission, tvb, offset, tlv_len, FALSE);
- break;
- }
- case DCD_TLV_T_21_DEFAULT_RSSI_AND_CINR_AVERAGING_PARAMETER:
- {
- tlv_tree = add_protocol_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, 1, "Default RSSI and CINR averaging parameter (%u byte(s))", tlv_len);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_21_default_rssi_and_cinr_averaging_parameter, tvb, offset, 1, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_21_default_rssi_and_cinr_averaging_parameter_physical_cinr_measurements, tvb, offset, 1, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_21_default_rssi_and_cinr_averaging_parameter_rssi_measurements, tvb, offset, 1, FALSE);
- break;
- }
- case DCD_TLV_T_22_DL_AMC_ALLOCATED_PHYSICAL_BANDS_BITMAP:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_22_dl_amc_allocated_physical_bands_bitmap, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_22_dl_amc_allocated_physical_bands_bitmap, tvb, offset, tlv_len, FALSE);
- break;
- }
- case DCD_TLV_T_34_DL_REGION_DEFINITION:
- {
- tlv_tree = add_protocol_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, tlv_len, "DL region definition (%u byte(s))", tlv_len);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_34_dl_region_definition, tvb, offset, tlv_len, FALSE);
- dl_num_regions = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_34_dl_region_definition_num_region, tvb, offset, 1, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_34_dl_region_definition_reserved, tvb, offset, 1, FALSE);
- tlv_offset = offset;
- for(length = 0; length < dl_num_regions; length++)
- {
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_34_dl_region_definition_symbol_offset, tvb, tlv_offset, 1, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_34_dl_region_definition_subchannel_offset, tvb, (tlv_offset+1), 1, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_34_dl_region_definition_num_symbols, tvb, (tlv_offset+2), 1, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_34_dl_region_definition_num_subchannels, tvb, (tlv_offset+3), 1, FALSE);
- tlv_offset += 4;
- }
- break;
- }
- case DCD_TLV_T_50_HO_TYPE_SUPPORT:
- {
- tlv_tree = add_protocol_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, tlv_len, "HO type support (%u byte(s))", tlv_len);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_50_ho_type_support, tvb, offset, 1, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_50_ho_type_support_ho, tvb, offset, 1, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_50_ho_type_support_mdho, tvb, offset, 1, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_50_ho_type_support_fbss_ho, tvb, offset, 1, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_50_ho_type_support_reserved, tvb, offset, 1, FALSE);
- break;
- }
- case DCD_TLV_T_31_H_ADD_THRESHOLD:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_31_h_add_threshold, tvb, offset, 1, FALSE);
- tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_31_h_add_threshold, tvb, offset, tlv_len, FALSE);
- proto_item_append_text(tlv_item, " dB");
- break;
- }
- case DCD_TLV_T_32_H_DELETE_THRESHOLD:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_32_h_delete_threshold, tvb, offset, tlv_len, FALSE);
- tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_32_h_delete_threshold, tvb, offset, tlv_len, FALSE);
- proto_item_append_text(tlv_item, " dB");
- break;
- }
- case DCD_TLV_T_33_ASR:
- {
- tlv_tree = add_protocol_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, tlv_len, "ASR Slot Length (M) and Switching Period (L) (%u byte(s))", tlv_len);
- proto_tree_add_item(dcd_tree, hf_dcd_tlv_t_33_asr, tvb, offset, 1, FALSE);
- tlv_item = proto_tree_add_item(dcd_tree, hf_dcd_tlv_t_33_asr_m, tvb, offset, 1, FALSE);
- proto_item_append_text(tlv_item, " frames");
- tlv_item = proto_tree_add_item(dcd_tree, hf_dcd_tlv_t_33_asr_l, tvb, offset, 1, FALSE);
- proto_item_append_text(tlv_item, " frames");
- break;
- }
- case DCD_TLV_T_35_PAGING_GROUP_ID:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_35_paging_group_id, tvb, offset, 1, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_35_paging_group_id, tvb, offset, tlv_len, FALSE);
- break;
- }
- case DCD_TLV_T_36_TUSC1_PERMUTATION_ACTIVE_SUBCHANNELS_BITMAP:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_36_tusc1_permutation_active_subchannels_bitmap, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_36_tusc1_permutation_active_subchannels_bitmap, tvb, offset, tlv_len, FALSE);
- break;
- }
- case DCD_TLV_T_37_TUSC2_PERMUTATION_ACTIVE_SUBCHANNELS_BITMAP:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_37_tusc2_permutation_active_subchannels_bitmap, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_37_tusc2_permutation_active_subchannels_bitmap, tvb, offset, tlv_len, FALSE);
- break;
- }
- case DCD_TLV_T_51_HYSTERSIS_MARGIN:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_51_hysteresis_margin, tvb, offset, tlv_len, FALSE);
- tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_51_hysteresis_margin, tvb, offset, tlv_len, FALSE);
- proto_item_append_text(tlv_item, " dB");
- break;
- }
- case DCD_TLV_T_52_TIME_TO_TRIGGER_DURATION:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_52_time_to_trigger_duration, tvb, offset, tlv_len, FALSE);
- tlv_item = proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_52_time_to_trigger_duration, tvb, offset, tlv_len, FALSE);
- proto_item_append_text(tlv_item, " ms");
- break;
- }
- case DCD_TLV_T_54_TRIGGER:
- { /* Trigger TLV (table 358a & 358b) */
- /* add TLV subtree */
- tlv_tree = add_protocol_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, tlv_len, "DCD Trigger (%u bytes)", tlv_len);
- for (tlv_offset = 0; tlv_offset < tlv_len; )
- {
- /* get the TLV information */
- init_tlv_info(&tlv_info, tvb, (offset + tlv_offset));
- /* get the TLV type */
- tlv_type = get_tlv_type(&tlv_info);
- /* get the TLV length */
- length = get_tlv_length(&tlv_info);
- if(tlv_type == -1 || length > MAX_TLV_LEN || length < 1)
- { /* invalid tlv info */
- if(check_col(pinfo->cinfo, COL_INFO))
- {
- col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, "Trigger TLV error");
- }
- proto_tree_add_item(tlv_tree, hf_dcd_invalid_tlv, tvb, offset, (tlv_len - offset - tlv_offset), FALSE);
- break;
- }
- /* update the offset */
- tlv_offset += get_tlv_value_offset(&tlv_info);
- /* table 358a */
- switch (tlv_type)
- {
- case DCD_TLV_T_541_TYPE_FUNCTION_ACTION:
- { /* table 358b */
- sub_tree = add_protocol_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, tlv_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, (offset + tlv_offset), length, "Trigger; Type/function/action description (%u byte(s))", tlv_len);
- proto_tree_add_item(sub_tree, hf_dcd_tlv_t_541_type, tvb, (offset + tlv_offset), 1, FALSE);
- proto_tree_add_item(sub_tree, hf_dcd_tlv_t_541_function, tvb, (offset + tlv_offset), 1, FALSE);
- proto_tree_add_item(sub_tree, hf_dcd_tlv_t_541_action, tvb, (offset + tlv_offset), 1, FALSE);
- }
- break;
- case DCD_TLV_T542_TRIGGER_VALUE:
- sub_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, tlv_tree, hf_dcd_tlv_t_542_trigger_value, tvb, (offset + tlv_offset), length, FALSE);
- proto_tree_add_item(sub_tree, hf_dcd_tlv_t_542_trigger_value, tvb, (offset + tlv_offset), length, FALSE);
- break;
- case DCD_TLV_T_543_TRIGGER_AVERAGING_DURATION:
- sub_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, tlv_tree, hf_dcd_tlv_t_543_trigger_averaging_duration, tvb, (offset + tlv_offset), length, FALSE);
- proto_tree_add_item(sub_tree, hf_dcd_tlv_t_543_trigger_averaging_duration, tvb, (offset + tlv_offset), length, FALSE);
- break;
- }
- tlv_offset += length;
- }
- break;
- }
- case DCD_TLV_T_60_NOISE_AND_INTERFERENCE:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_60_noise_interference, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_60_noise_interference, tvb, offset, tlv_len, FALSE);
- break;
- }
- case DCD_TLV_T_153_DOWNLINK_BURST_PROFILE_FOR_MULTIPLE_FEC_TYPES:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_153_downlink_burst_profile_for_mutiple_fec_types, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_153_downlink_burst_profile_for_mutiple_fec_types, tvb, offset, tlv_len, FALSE);
- break;
- }
- case DCD_RESTART_COUNT:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_restart_count, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_restart_count, tvb, offset, tlv_len, FALSE);
- break;
- }
- case DCD_TLV_T_45_PAGING_INTERVAL_LENGTH:
- {
- if (include_cor2_changes) {
- tlv_tree = add_protocol_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, proto_mac_mgmt_msg_dcd_decoder, tvb, offset, tlv_len, "Reserved (%u byte(s))", tlv_len);
- proto_tree_add_text(tlv_tree, tvb, offset, tlv_len, "Reserved");
- } else {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_tlv_t_45_paging_interval_length, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_tlv_t_45_paging_interval_length, tvb, offset, tlv_len, FALSE);
- }
- break;
- }
- default:
- {
- tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_dcd_decoder, dcd_tree, hf_dcd_unknown_type, tvb, offset, tlv_len, FALSE);
- proto_tree_add_item(tlv_tree, hf_dcd_unknown_type, tvb, offset, tlv_len, FALSE);
- break;
- }
- }
- offset += tlv_len;
- } /* end of TLV process while loop */
- }
+ proto_register_field_array(proto_mac_mgmt_msg_dcd_decoder, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
}