📄 plugins-wimax-msg_rep.c
字号:
{ /* 5.5 */
&hf_rep_rsp_zone_spec_effective_cinr_rep_amc_aas,
{
"AMC AAS Zone", "wimax.rep_rsp.zone_spec_effective_cinr_report.amc_aas",
FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL
}
},
{ /* 5.3 */
&hf_rep_rsp_zone_spec_effective_cinr_rep_fusc,
{
"FUSC Zone", "wimax.rep_rsp.zone_spec_effective_cinr_report.fusc",
FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL
}
},
{ /* 5.4 */
&hf_rep_rsp_zone_spec_effective_cinr_rep_optional_fusc,
{
"Optional FUSC Zone", "wimax.rep_rsp.zone_spec_effective_cinr_report.optional_fusc",
FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL
}
},
{ /* 5.1 */
&hf_rep_rsp_zone_spec_effective_cinr_rep_pusc_sc0,
{
"PUSC Zone (use all SC=0)", "wimax.rep_rsp.zone_spec_effective_cinr_report.pusc_sc0",
FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL
}
},
{ /* 5.2 */
&hf_rep_rsp_zone_spec_effective_cinr_rep_pusc_sc1,
{
"PUSC Zone (use all SC=1)", "wimax.rep_rsp.zone_spec_effective_cinr_report.pusc_sc1",
FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL
}
},
{
&hf_rep_rsp_zone_spec_phy_cinr_report,
{
"Zone-specific Physical CINR Report", "wimax.rep_rsp.zone_spec_phy_cinr_report",
FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL
}
},
{ /* 3.6 */
&hf_rep_rsp_zone_spec_phy_cinr_rep_amc,
{
"AMC Zone", "wimax.rep_rsp.zone_spec_phy_cinr_report.amc",
FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL
}
},
{ /* 3.3 */
&hf_rep_rsp_zone_spec_phy_cinr_rep_fusc,
{
"FUSC Zone", "wimax.rep_rsp.zone_spec_phy_cinr_report.fusc",
FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL
}
},
{ /* 3.4 */
&hf_rep_rsp_zone_spec_phy_cinr_rep_optional_fusc,
{
"Optional FUSC Zone", "wimax.rep_rsp.zone_spec_phy_cinr_report.optional_fusc",
FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL
}
},
{ /* 3.1 */
&hf_rep_rsp_zone_spec_phy_cinr_rep_pusc_sc0,
{
"PUSC Zone (use all SC=0)", "wimax.rep_rsp.zone_spec_phy_cinr_report.pusc_sc0",
FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL
}
},
{ /* 3.2 */
&hf_rep_rsp_zone_spec_phy_cinr_rep_pusc_sc1,
{
"PUSC Zone (use all SC=1)", "wimax.rep_rsp.zone_spec_phy_cinr_report.pusc_sc1",
FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL
}
},
{ /* 3.5 */
&hf_rep_rsp_zone_spec_phy_cinr_rep_safety_channel,
{
"Safety Channel", "wimax.rep_rsp.zone_spec_phy_cinr_report.safety_channel",
FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL
}
},
{
&hf_rep_unknown_type,
{
"Unknown TLV type", "wimax.rep.unknown_tlv_type",
FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL
}
}
};
/* Register Wimax Mac REP-REQ Messages Dissectors */
void proto_register_mac_mgmt_msg_rep(void)
{
if (proto_mac_mgmt_msg_rep_decoder == -1)
{
proto_mac_mgmt_msg_rep_decoder = proto_register_protocol (
"WiMax REP-REQ/RSP Messages", /* name */
"WiMax REP-REQ/RSP (rep)", /* short name */
"rep" /* abbrev */
);
proto_register_field_array(proto_mac_mgmt_msg_rep_decoder, hf_rep, array_length(hf_rep));
proto_register_subtree_array(ett_rep, array_length(ett_rep));
}
}
/* Wimax Mac REP-REQ Message Dissector */
void dissect_mac_mgmt_msg_rep_req_decoder(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
guint offset = 0;
guint tvb_len, payload_type;
gint tlv_type, tlv_len, tlv_value_offset, length, tlv_offset;
proto_item *rep_item = NULL;
proto_tree *rep_tree = NULL;
proto_tree *tlv_tree = NULL;
proto_tree *ti_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_REP_REQ)
{
return;
}
if(tree)
{ /* we are being asked for details */
/* Get the tvb reported length */
tvb_len = tvb_reported_length(tvb);
/* display MAC payload type REP-REQ */
rep_item = proto_tree_add_protocol_format(tree, proto_mac_mgmt_msg_rep_decoder, tvb, offset, tvb_len, "Report Request (REP-REQ) (%u bytes)", tvb_len);
/* add MAC REP-REQ subtree */
rep_tree = proto_item_add_subtree(rep_item, ett_mac_mgmt_msg_rep_req_decoder);
/* Decode and display the Report Request message (REP-REQ) */
/* display the Message Type */
proto_tree_add_item(rep_tree, hf_rep_req_message_type, tvb, offset, 1, FALSE);
/* set the offset for the TLV Encoded info */
offset++;
/* process the REP-REQ TLVs */
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(pinfo->cinfo)
{
col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, "REP-REQ TLV error");
}
proto_tree_add_item(rep_tree, hf_rep_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 */
proto_tree_add_protocol_format(rep_tree, proto_mac_mgmt_msg_rep_decoder, tvb, offset, (tlv_len + tlv_value_offset), "REP-REQ Type: %u (%u bytes, offset=%u, length=%u, tvb_len=%u)", tlv_type, (tlv_len + tlv_value_offset), offset, tlv_len, tvb_len);
#endif
/* update the offset for the TLV value */
offset += tlv_value_offset;
/* process REP-REQ TLV Encoded information (11.11) */
switch (tlv_type)
{
case REP_REQ_REPORT_REQUEST:
/* process the REP-REQ report request TLVs */
tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_rep_req_decoder, rep_tree, hf_rep_req_report_request, tvb, offset, tlv_len, FALSE);
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(pinfo->cinfo)
{
col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, "REP-REQ Report Request TLV error");
}
proto_tree_add_item(tlv_tree, hf_rep_invalid_tlv, tvb, (offset + tlv_offset), (tlv_len - offset - tlv_offset), FALSE);
break;
}
#ifdef DEBUG /* for debug only */
proto_tree_add_protocol_format(rep_tree, proto_mac_mgmt_msg_rep_decoder, tvb, offset, (length + tlv_value_offset), "REP-REQ Report Request Type: %u (%u bytes, offset=%u, length=%u, tvb_len=%u)", tlv_type, (length + tlv_value_offset), offset, length, tvb_len);
#endif
/* update the offset */
tlv_offset += get_tlv_value_offset(&tlv_info);
switch (tlv_type)
{
case REP_REQ_REPORT_TYPE:
/* decode and display the Report type */
ti_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_rep_req_decoder, tlv_tree, hf_rep_req_report_type, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_rep_type_bit0, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_rep_type_bit1, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_rep_type_bit2, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_rep_type_bit3_6, tvb, (offset + tlv_offset), length, FALSE);
// proto_item_append_text(ti, " dB");
proto_tree_add_item(ti_tree, hf_rep_req_rep_type_bit7, tvb, (offset + tlv_offset), length, FALSE);
break;
case REP_REQ_CHANNEL_NUMBER:
/* decode and display the Channel Number */
ti_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_rep_req_decoder, tlv_tree, hf_rep_req_channel_number, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_channel_number, tvb, (offset + tlv_offset), length, FALSE);
break;
case REP_REQ_CHANNEL_TYPE:
/* decode and display the Channel Type */
ti_tree = add_protocol_subtree(&tlv_info, ett_mac_mgmt_msg_rep_req_decoder, tlv_tree, proto_mac_mgmt_msg_rep_decoder, tvb, (offset + tlv_offset), length, "Channel Type (%u byte(s))", length);
proto_tree_add_item(ti_tree, hf_rep_req_channel_type_request, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_channel_type_reserved, tvb, (offset + tlv_offset), length, FALSE);
break;
case REP_REQ_ZONE_SPEC_PHY_CINR_REQ:
/* decode and display the zone specific physical cinr request */
ti_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_rep_req_decoder, tlv_tree, hf_rep_req_zone_spec_phy_cinr_request, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_zone_spec_phy_cinr_req_bit0_2, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_zone_spec_phy_cinr_req_bit3, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_zone_spec_phy_cinr_req_bit4, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_zone_spec_phy_cinr_req_bit5_6, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_zone_spec_phy_cinr_req_bit7, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_zone_spec_phy_cinr_req_bit8_13, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_zone_spec_phy_cinr_req_bit14_17, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_zone_spec_phy_cinr_req_bit18, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_zone_spec_phy_cinr_req_bit19_23, tvb, (offset + tlv_offset), length, FALSE);
break;
case REP_REQ_PREAMBLE_PHY_CINR_REQ:
/* decode and display the preamble phy cinr request */
ti_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_rep_req_decoder, tlv_tree, hf_rep_req_preamble_phy_cinr_request, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_preamble_phy_cinr_req_bit0_1, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_preamble_phy_cinr_req_bit2_5, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_preamble_phy_cinr_req_bit6, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_preamble_phy_cinr_req_bit7, tvb, (offset + tlv_offset), length, FALSE);
break;
case REP_REQ_ZONE_SPEC_EFF_CINR_REQ:
/* decode and display the zone specific effective cinr request */
ti_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_rep_req_decoder, tlv_tree, hf_rep_req_zone_spec_effective_cinr_request, tvb, offset, tlv_len, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_zone_spec_effective_cinr_req_bit0_2, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_zone_spec_effective_cinr_req_bit3, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_zone_spec_effective_cinr_req_bit4, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_zone_spec_effective_cinr_req_bit5_6, tvb, (offset + tlv_offset), length, FALSE);
// proto_item_append_text(ti, " dB");
proto_tree_add_item(ti_tree, hf_rep_req_zone_spec_effective_cinr_req_bit7, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_zone_spec_effective_cinr_req_bit8_13, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_zone_spec_effective_cinr_req_bit14_15, tvb, (offset + tlv_offset), length, FALSE);
break;
case REP_REQ_PREAMBLE_EFF_CINR_REQ:
/* decode and display the preamble effective cinr request */
ti_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_rep_req_decoder, tlv_tree, hf_rep_req_preamble_effective_cinr_request, tvb, offset, tlv_len, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_preamble_effective_cinr_req_bit0_1, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_preamble_effective_cinr_req_bit2_7, tvb, (offset + tlv_offset), length, FALSE);
break;
case REP_REQ_CHANNEL_SELECTIVITY_REPORT:
/* decode and display the channel selectivity report */
ti_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_rep_req_decoder, tlv_tree, hf_rep_req_channel_selectivity_report, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_channel_selectivity_rep_bit0, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_req_channel_selectivity_rep_bit1_7, tvb, (offset + tlv_offset), length, FALSE);
break;
default:
/* display the unknown tlv in hex */
ti_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_rep_req_decoder, tlv_tree, hf_rep_unknown_type, tvb, (offset + tlv_offset), length, FALSE);
proto_tree_add_item(ti_tree, hf_rep_unknown_type, tvb, (offset + tlv_offset), length, FALSE);
break;
}
tlv_offset += length;
} /* end of TLV process for loop */
break;
default:
/* display the unknown tlv in hex */
tlv_tree = add_tlv_subtree(&tlv_info, ett_mac_mgmt_msg_rep_req_decoder, rep_tree, hf_rep_unknown_type, tvb, offset, tlv_len, FALSE);
proto_tree_add_item(tlv_tree, hf_rep_unknown_type, tvb, offset, tlv_len, FALSE);
break;
}
offset += tlv_len;
} /* end of TLV process while loop */
}
}
/* Wimax Mac REP-RSP Message Dissector */
void dissect_mac_mgmt_msg_rep_rsp_decoder(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
guint offset = 0;
guint tvb_len, payload_type, length, value;
gint tlv_type, tlv_len, tlv_value_offset, tlv_offset;
gint db_val;
proto_item *rep_item = NULL;
proto_tree *rep_tree = NULL;
proto_tree *tlv_tree = NULL;
proto_item *ti = NULL;
proto_tree *ti_tree = NULL;
tlv_info_t tlv_info;
gfloat current_power;
/* Ensure the right payload type */
payload_type = tvb_get_guint8(tvb, offset);
if(payload_type != MAC_MGMT_MSG_REP_RSP)
{
return;
}
if(tree)
{ /* we are being asked for details */
/* Get the tvb reported length */
tvb_len = tvb_reported_length(tvb);
/* display MAC payload type REP-RSP */
rep_item = proto_tree_add_protocol_format(tree, proto_mac_mgmt_msg_rep_decoder, tvb, offset, tvb_len, "Report Response (REP-RSP) (%u bytes)", tvb_len);
/* add MAC REP-RSP subtree */
rep_tree = proto_item_add_subtree(rep_item, ett_mac_mgmt_msg_rep_rsp_decoder);
/* Decode and display the Report Response message (REP-RSP) */
/* display the Message Type */
proto_tree_add_item(rep_tree, hf_rep_rsp_message_type, tvb, offset, 1, FALSE);
/* set the offset for the TLV Encoded info */
offset++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -