⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plugins-wimax-mac_hd_generic_decoder.c

📁 Intel的WIMAX代码,主要是mac层code
💻 C
📖 第 1 页 / 共 5 页
字号:
			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 + -