📄 plugins-wimax-mac_hd_generic_decoder.c
字号:
FT_UINT16, BASE_DEC, VALS(si_msgs), GRANT_MGMT_SUBHEADER_UGS_SI_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_grant_mgmt_subhd_ugs_pm,
{
"Poll-Me", "wimax.genericGrantSubhd.Pm",
FT_UINT16, BASE_DEC, VALS(pm_msgs), GRANT_MGMT_SUBHEADER_UGS_PM_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_grant_mgmt_subhd_ugs_fli,
{
"Frame Latency Indication", "wimax.genericGrantSubhd.Fli",
FT_UINT16, BASE_DEC, VALS(fli_msgs), GRANT_MGMT_SUBHEADER_UGS_FLI_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_grant_mgmt_subhd_ugs_fl,
{
"Frame Latency", "wimax.genericGrantSubhd.Fl",
FT_UINT16, BASE_DEC, NULL, GRANT_MGMT_SUBHEADER_UGS_FL_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_grant_mgmt_subhd_ugs_rsv,
{
"Reserved", "wimax.genericGrantSubhd.Rsv",
FT_UINT16, BASE_DEC, NULL, GRANT_MGMT_SUBHEADER_UGS_RSV_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_grant_mgmt_ext_rtps_tree,
{
"Scheduling Service Type (Extended rtPS)",
"wimax.genericGrantSubhd.ExtendedRTPS",
FT_UINT16, BASE_DEC, NULL, 0x0,
"", HFILL
}
},
{
&hf_mac_header_generic_grant_mgmt_subhd_ext_pbr,
{
"Extended PiggyBack Request", "wimax.genericGrantSubhd.ExtPbr",
FT_UINT16, BASE_DEC, NULL, GRANT_MGMT_SUBHEADER_EXT_PBR_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_grant_mgmt_subhd_ext_fli,
{
"Frame Latency Indication", "wimax.genericGrantSubhd.ExtFli",
FT_UINT16, BASE_DEC, VALS(fli_msgs), GRANT_MGMT_SUBHEADER_EXT_FLI_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_grant_mgmt_subhd_ext_fl,
{
"Frame Latency", "wimax.genericGrantSubhd.ExtFl",
FT_UINT16, BASE_DEC, NULL, GRANT_MGMT_SUBHEADER_EXT_FL_MASK,
"", HFILL
}
}
};
/* ARQ Feedback Payload */
/* ARQ Feedback IE bit masks (table 111) */
#define ARQ_FB_IE_LAST_BIT_MASK 0x8000 /*0x0001*/
#define ARQ_FB_IE_ACK_TYPE_MASK 0x6000 /*0x0006*/
#define ARQ_FB_IE_BSN_MASK 0x1FFC /*0x3FF8*/
#define ARQ_FB_IE_NUM_MAPS_MASK 0x0003 /*0xC000*/
#define ARQ_FB_IE_SEQ_FORMAT_MASK 0x8000 /*0x0001*/
#define ARQ_FB_IE_SEQ_ACK_MAP_MASK 0x7000 /*0x000E*/
#define ARQ_FB_IE_SEQ1_LENGTH_MASK 0x0F00 /*0x00F0*/
#define ARQ_FB_IE_SEQ2_LENGTH_MASK 0x00F0 /*0x0F00*/
#define ARQ_FB_IE_SEQ3_LENGTH_MASK 0x000F /*0xF000*/
#define ARQ_FB_IE_SEQ_ACK_MAP_2_MASK 0x6000 /*0x0006*/
#define ARQ_FB_IE_SEQ1_LENGTH_6_MASK 0x1F80 /*0x01F8*/
#define ARQ_FB_IE_SEQ2_LENGTH_6_MASK 0x007E /*0x7E00*/
#define ARQ_FB_IE_RSV_MASK 0x0001 /*0x8000*/
static gint hf_mac_header_generic_arq_fb_ie_cid = -1;
static gint hf_mac_header_generic_arq_fb_ie_last = -1;
static gint hf_mac_header_generic_arq_fb_ie_ack_type = -1;
static gint hf_mac_header_generic_arq_fb_ie_bsn = -1;
static gint hf_mac_header_generic_arq_fb_ie_num_maps = -1;
static gint hf_ack_type_reserved = -1;
static gint hf_mac_header_generic_arq_fb_ie_sel_ack_map = -1;
static gint hf_mac_header_generic_arq_fb_ie_seq_format = -1;
static gint hf_mac_header_generic_arq_fb_ie_seq_ack_map = -1;
static gint hf_mac_header_generic_arq_fb_ie_seq1_length = -1;
static gint hf_mac_header_generic_arq_fb_ie_seq2_length = -1;
static gint hf_mac_header_generic_arq_fb_ie_seq3_length = -1;
static gint hf_mac_header_generic_arq_fb_ie_seq_ack_map_2 = -1;
static gint hf_mac_header_generic_arq_fb_ie_seq1_length_6 = -1;
static gint hf_mac_header_generic_arq_fb_ie_seq2_length_6 = -1;
static gint hf_mac_header_generic_arq_fb_ie_rsv = -1;
/* Last IE Indicators */
static const value_string last_ie_msgs[] =
{
{ 0, "No" },
{ 1, "Yes" },
{ 0, NULL}
};
/* ARQ Feedback Payload display */
static hf_register_info hf_arq[] =
{
{
&hf_mac_header_generic_arq_fb_ie_cid,
{
"CID", "wimax.genericArq.FbIeCid",
FT_UINT16, BASE_DEC, NULL, 0x0,
"", HFILL
}
},
{
&hf_mac_header_generic_arq_fb_ie_last,
{
"Last IE", "wimax.genericArq.FbIeLast",
FT_UINT16, BASE_DEC, VALS(last_ie_msgs), ARQ_FB_IE_LAST_BIT_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_arq_fb_ie_ack_type,
{
"ACK Type", "wimax.genericArq.FbIeAckType",
FT_UINT16, BASE_DEC, NULL, ARQ_FB_IE_ACK_TYPE_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_arq_fb_ie_bsn,
{
"BSN", "wimax.genericArq.FbIeBsn",
FT_UINT16, BASE_DEC, NULL, ARQ_FB_IE_BSN_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_arq_fb_ie_num_maps,
{
"Number of ACK Maps", "wimax.genericArq.FbIeMaps",
FT_UINT16, BASE_DEC, NULL, ARQ_FB_IE_NUM_MAPS_MASK,
"", HFILL
}
},
{
&hf_ack_type_reserved,
{
"Reserved", "wimax.genericArq.FbIeRsvd", FT_UINT16, BASE_DEC, NULL, 0x03, "", HFILL
}
},
{
&hf_mac_header_generic_arq_fb_ie_sel_ack_map,
{
"Selective ACK Map", "wimax.genericArq.FbIeSelAckMap",
FT_UINT16, BASE_HEX, NULL, 0x0,
"", HFILL
}
},
{
&hf_mac_header_generic_arq_fb_ie_seq_format,
{
"Sequence Format", "wimax.genericArq.FbIeSeqFmt",
FT_UINT16, BASE_DEC, NULL, ARQ_FB_IE_SEQ_FORMAT_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_arq_fb_ie_seq_ack_map,
{
"Sequence ACK Map", "wimax.genericArq.FbIeSeqAckMap",
FT_UINT16, BASE_HEX, NULL, ARQ_FB_IE_SEQ_ACK_MAP_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_arq_fb_ie_seq1_length,
{
"Sequence 1 Length", "wimax.genericArq.FbIeSeq1Len",
FT_UINT16, BASE_DEC, NULL, ARQ_FB_IE_SEQ1_LENGTH_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_arq_fb_ie_seq2_length,
{
"Sequence 2 Length", "wimax.genericArq.FbIeSeq2Len",
FT_UINT16, BASE_DEC, NULL, ARQ_FB_IE_SEQ2_LENGTH_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_arq_fb_ie_seq3_length,
{
"Sequence 3 Length", "wimax.genericArq.FbIeSeq3Len",
FT_UINT16, BASE_DEC, NULL, ARQ_FB_IE_SEQ3_LENGTH_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_arq_fb_ie_seq_ack_map_2,
{
"Sequence ACK Map", "wimax.genericArq.FbIeSeqAckMap2",
FT_UINT16, BASE_HEX, NULL, ARQ_FB_IE_SEQ_ACK_MAP_2_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_arq_fb_ie_seq1_length_6,
{
"Sequence 1 Length", "wimax.genericArq.FbIeSeq1Len",
FT_UINT16, BASE_DEC, NULL, ARQ_FB_IE_SEQ1_LENGTH_6_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_arq_fb_ie_seq2_length_6,
{
"Sequence 2 Length", "wimax.genericArq.FbIeSeq2Len",
FT_UINT16, BASE_DEC, NULL, ARQ_FB_IE_SEQ2_LENGTH_6_MASK,
"", HFILL
}
},
{
&hf_mac_header_generic_arq_fb_ie_rsv,
{
"Reserved", "wimax.genericArq.FbIeRsv",
FT_UINT16, BASE_DEC, NULL, ARQ_FB_IE_RSV_MASK,
"", HFILL
}
}
};
/* Register Wimax defrag table init routine. */
void wimax_defragment_init(void)
{
gint i;
fragment_table_init(&payload_frag_table);
/* Init fragmentation variables. */
for (i = 0; i < MAX_CID; i++)
{
cid_adjust[i] = 1; /* Must not start with 0 */
cid_vernier[i] = 0;
}
cid_adj_array_size = 0;
/* Free the array memory. */
if (cid_adj_array) {
free(cid_adj_array);
}
cid_adj_array = NULL;
if (frag_num_array) {
free(frag_num_array);
}
frag_num_array = NULL;
/* Initialize to make sure bs_address gets set in FCH decoder. */
bs_address.len = 0;
/* Initialize the Scheduling Service Type flag */
seen_a_service_type = 0;
max_logical_bands = 12;
/* Initialize UL_MAP globals. */
init_wimax_globals();
}
static guint decode_packing_subheader(tvbuff_t *payload_tvb, packet_info *pinfo, proto_tree *tree, guint payload_length, guint payload_offset, proto_item *parent_item)
{
proto_item *generic_item = NULL;
proto_tree *generic_tree = NULL;
guint starting_offset = payload_offset;
/* update the info column */
if (check_col(pinfo->cinfo, COL_INFO))
{
col_append_sep_str(pinfo->cinfo, COL_INFO, NULL, "Packing subhdr");
}
/* add the Packing subheader info */
proto_item_append_text(parent_item, ", Packing Subheader");
/* display Packing subheader type */
generic_item = proto_tree_add_protocol_format(tree, proto_mac_header_generic_decoder, payload_tvb, payload_offset, ((arq_enabled|extended_type)?3:2), "Packing subheader (%u bytes)", ((arq_enabled|extended_type)?3:2));
/* add Packing subheader subtree */
generic_tree = proto_item_add_subtree(generic_item, ett_mac_pkt_subheader_decoder);
/* decode and display the Packing subheader */
/* Get the fragment type */
frag_type = (tvb_get_guint8(payload_tvb, payload_offset) & FRAGMENT_TYPE_MASK) >> 6;
/* if ARQ Feedback payload is present */
if (arq_fb_payload)
{ /* get the frag length */
frag_len = ((tvb_get_ntohl(payload_tvb, payload_offset) & FRAG_LENGTH_MASK) >> 8);
/* get the sequence number */
seq_number = (tvb_get_ntohs(payload_tvb, payload_offset) & SEQ_NUMBER_MASK_11) >> 3;
proto_tree_add_item(generic_tree, hf_mac_header_generic_packing_subhd_fc_ext, payload_tvb, payload_offset, 3, FALSE);
proto_tree_add_item(generic_tree, hf_mac_header_generic_packing_subhd_bsn, payload_tvb, payload_offset, 3, FALSE);
proto_tree_add_item(generic_tree, hf_mac_header_generic_packing_subhd_len_ext, payload_tvb, payload_offset, 3, FALSE);
/* update the length and offset */
payload_length -= 3;
payload_offset += 3;
frag_len -= 3;
}
else
{
if (extended_type)
{ /* get the frag length */
frag_len = ((tvb_get_ntohl(payload_tvb, payload_offset) & FRAG_LENGTH_MASK) >> 8);
/* get the sequence number */
seq_number = (tvb_get_ntohs(payload_tvb, payload_offset) & SEQ_NUMBER_MASK_11) >> 3;
proto_tree_add_item(generic_tree, hf_mac_header_generic_packing_subhd_fc_ext, payload_tvb, payload_offset, 3, FALSE);
proto_tree_add_item(generic_tree, hf_mac_header_generic_packing_subhd_fsn_ext, payload_tvb, payload_offset, 3, FALSE);
proto_tree_add_item(generic_tree, hf_mac_header_generic_packing_subhd_len_ext, payload_tvb, payload_offset, 3, FALSE);
/* update the length and offset */
payload_length -= 3;
payload_offset += 3;
frag_len -= 3;
}
else
{ /* get the frag length */
frag_len = (tvb_get_ntohs(payload_tvb, payload_offset) & PACKING_SUBHEADER_LENGTH_MASK);
/* get the sequence number */
seq_number = (tvb_get_guint8(payload_tvb, payload_offset) & SEQ_NUMBER_MASK) >> 3;
proto_tree_add_item(generic_tree, hf_mac_header_generic_packing_subhd_fc, payload_tvb, payload_offset, 2, FALSE);
proto_tree_add_item(generic_tree, hf_mac_header_generic_packing_subhd_fsn, payload_tvb, payload_offset, 2, FALSE);
proto_tree_add_item(generic_tree, hf_mac_header_generic_packing_subhd_len, payload_tvb, payload_offset, 2, FALSE);
/* update the length and offset */
payload_length -= 2;
payload_offset += 2;
frag_len -= 2;
}
}
/* Prevent a crash! */
if ((gint)frag_len < 0)
frag_len = 0;
/* Return the number of bytes decoded. */
return payload_offset - starting_offset;
}
/* Register Wimax Generic Mac Header Protocol and Dissector */
void proto_register_mac_header_generic(void)
{
if (proto_mac_header_generic_decoder == -1)
{
proto_mac_header_generic_decoder = proto_register_protocol (
"WiMax Generic/Type1/Type2 MAC Header Messages", /* name */
"WiMax Generic/Type1/Type2 MAC Header (hdr)", /* short name */
"hdr" /* abbrev */
);
/* register the field display messages */
proto_register_field_array(proto_mac_header_generic_decoder, hf, array_length(hf));
proto_register_field_array(proto_mac_header_generic_decoder, hf_ext, array_length(hf_ext));
proto_register_field_array(proto_mac_header_generic_decoder, hf_mesh, array_length(hf_mesh));
proto_register_field_array(proto_mac_header_generic_decoder, hf_frag, array_length(hf_frag));
proto_register_field_array(proto_mac_header_generic_decoder, hf_pack, array_length(hf_pack));
proto_register_field_array(proto_mac_header_generic_decoder, hf_fast, array_length(hf_fast));
proto_register_field_array(proto_mac_header_generic_decoder, hf_grant, array_length(hf_grant));
proto_register_field_array(proto_mac_header_generic_decoder, hf_arq, array_length(hf_arq));
proto_register_subtree_array(ett, array_length(ett));
}
/* register the generic mac header dissector */
register_dissector("mac_header_generic_handler", dissect_mac_header_generic_decoder, proto_mac_header_generic_decoder);
/* register the mac payload dissector */
proto_register_mac_mgmt_msg();
/* Register the payload fragment table init routine */
register_init_routine(wimax_defragment_init);
}
void dissect_mac_header_generic_decoder(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
guint offset = 0;
guint payload_offset, payload_length;
static guint8 frag_number[MAX_CID];
static guint cid_list[MAX_CID];
static guint cid_base;
static char *reassem_str = "Reassembled Data transport PDU (%u bytes)";
static char *data_str = "Data transport PDU (%u bytes)";
char *str_ptr;
gint length, i, cid_index;
guint tvb_len, ret_length, ubyte, new_tvb_len, new_payload_len;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -