?? plugins-wimax-wimax_compact_dlmap_ie_decoder.c
字號:
#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 */
if (check_col(pinfo->cinfo, COL_INFO))
{
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, FALSE);
/* display the UL-MAP append */
proto_tree_add_item(tree, hf_cdlmap_ul_map_append_1, tvb, dl_map_offset, 1, FALSE);
/* move to next byte */
dl_map_offset++;
nibble_offset = 0;
}
else
{ /* display the DL-MAP type */
/* display the UL-MAP append */
proto_tree_add_item(tree, hf_cdlmap_ul_map_append, tvb, dl_map_offset, 1, FALSE);
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, FALSE);
/* move to next byte */
dl_map_offset++;
proto_tree_add_item(tree, hf_cdlmap_nsch_code, tvb, dl_map_offset, 1, FALSE);
}
else
{
proto_tree_add_item(tree, hf_cdlmap_nep_code, tvb, dl_map_offset, 1, FALSE);
proto_tree_add_item(tree, hf_cdlmap_nsch_code_1, tvb, dl_map_offset, 1, FALSE);
/* 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, FALSE);
proto_tree_add_item(tree, hf_cdlmap_companded_sc_1, tvb, dl_map_offset, 2, FALSE);
}
else
{
proto_tree_add_item(tree, hf_cdlmap_shortened_diuc, tvb, dl_map_offset, 1, FALSE);
proto_tree_add_item(tree, hf_cdlmap_companded_sc, tvb, dl_map_offset, 1, FALSE);
}
/* 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, FALSE);
proto_tree_add_item(tree, hf_cdlmap_companded_sc_1, tvb, dl_map_offset, 2, FALSE);
}
else
{
proto_tree_add_item(tree, hf_cdlmap_shortened_uiuc, tvb, dl_map_offset, 1, FALSE);
proto_tree_add_item(tree, hf_cdlmap_companded_sc, tvb, dl_map_offset, 1, FALSE);
}
/* 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, FALSE);
/* move to next byte */
dl_map_offset++;
proto_tree_add_item(tree, hf_cdlmap_nsch_code, tvb, dl_map_offset, 1, FALSE);
}
else
{
proto_tree_add_item(tree, hf_cdlmap_nep_code, tvb, dl_map_offset, 1, FALSE);
proto_tree_add_item(tree, hf_cdlmap_nsch_code_1, tvb, dl_map_offset, 1, FALSE);
/* 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, FALSE);
/* display the reserved */
proto_tree_add_item(tree, hf_cdlmap_reserved_1, tvb, dl_map_offset, 1, FALSE);
/* 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, FALSE);
/* display the reserved */
proto_tree_add_item(tree, hf_cdlmap_reserved, tvb, dl_map_offset, 1, FALSE);
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, FALSE);
/* move to next byte */
dl_map_offset++;
proto_tree_add_item(tree, hf_cdlmap_nsch_code, tvb, dl_map_offset, 1, FALSE);
}
else
{
proto_tree_add_item(tree, hf_cdlmap_nep_code, tvb, dl_map_offset, 1, FALSE);
proto_tree_add_item(tree, hf_cdlmap_nsch_code_1, tvb, dl_map_offset, 1, FALSE);
/* 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, FALSE);
proto_tree_add_item(tree, hf_cdlmap_companded_sc_1, tvb, dl_map_offset, 2, FALSE);
}
else
{
proto_tree_add_item(tree, hf_cdlmap_shortened_diuc, tvb, dl_map_offset, 1, FALSE);
proto_tree_add_item(tree, hf_cdlmap_companded_sc, tvb, dl_map_offset, 1, FALSE);
}
/* 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, FALSE);
/* 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, FALSE);
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), FALSE);
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, FALSE);
nibble_offset = 1;
if(max_logical_bands == 3)
{
proto_tree_add_item(tree, hf_cdlmap_band_index, tvb, dl_map_offset, (nband + nibble_offset), FALSE);
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), FALSE);
length += nband;
/* update offset */
dl_map_offset += ((nband + nibble_offset) >> 1);
nibble_offset = 0;
}
}
length++;
band_count = nband;
}
else
{
nband = 0;
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, FALSE);
/* 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, FALSE);
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, FALSE);
proto_tree_add_item(tree, hf_cdlmap_allocation_mode_rsvd_1, tvb, dl_map_offset, 1, FALSE);
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, FALSE);
proto_tree_add_item(tree, hf_cdlmap_allocation_mode_rsvd, tvb, dl_map_offset, 1, FALSE);
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, FALSE);
}
else
{
proto_tree_add_item(tree, hf_cdlmap_num_subchannels, tvb, dl_map_offset, 1, FALSE);
}
dl_map_offset++;
}
else if(allocation_mode == 1)
{
for(i=0; i<band_count; i++)
{
if(nibble_offset & 1)
{
proto_tree_add_item(tree, hf_cdlmap_num_subchannels_1, tvb, dl_map_offset, 2, FALSE);
}
else
{
proto_tree_add_item(tree, hf_cdlmap_num_subchannels, tvb, dl_map_offset, 1, FALSE);
}
dl_map_offset++;
}
}
/* 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_SAFETY:/* 6.3.2.3.43.6.3 */
if(nibble_offset & 1)
{ /* display the DL-MAP type */
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -