Hy
I got a PDU which is build like that:
1. a value how many video rectangles are coming.
2. for each rectangle a header describing the rect followed by the
rect-data.
Now I'm dissecting this pdu. It works fine with Debug messages but
trying to add it do the tree like this :
- Protocol
- number of rect
- header rect 1
- header rect 2
...
Always brings this: Warn Dissector bug, protocol XYZ, in packet 802:
proto.c:1895: failed assertion "DISSECTOR_ASSERT_NOT_REACHED"
Following the code:
static int dissect_framebufferupdate(tvbuff_t * tvb, packet_info * pinfo,
proto_tree * tree)
{
static uint16_t count = 0, i = 0;
static unsigned int offset2 = 4;
uint16_t n_rects = 0;
uint32_t length = 0;
uint32_t offset = 0;
uint32_t avaible = tvb_reported_length_remaining(tvb, offset);
teststruct memstruct;
if (avaible >= 4)
{
n_rects = tvb_get_ntohs(tvb,2);
if (i == 0)
{
count = n_rects;
i++;
}
}else
{
pinfo->desegment_offset = offset;
pinfo->desegment_len = 1;
return (-1);
}
while(count>0)
{
if (avaible >(12+offset2))
{
memstruct.x = tvb_get_ntohs(tvb,(offset2));
memstruct.y = tvb_get_ntohs(tvb,(2+offset2));
memstruct.w = tvb_get_ntohs(tvb,(4+offset2));
memstruct.h = tvb_get_ntohs(tvb,(6+offset2));
memstruct.encoding = tvb_get_ntohl(tvb,(8+offset2));
}else
{
pinfo->desegment_offset = offset;
pinfo->desegment_len =1;
return (-1);
}
length = decoder(memstruct.x, memstruct.y, memstruct.w,
memstruct.h, memstruct.encoding);
if (avaible <= (12 + length + offset2))
{
pinfo->desegment_offset = offset;
pinfo->desegment_len = 1;
return(-1);
}else
{
proto_tree *ti,*xyz_tree;
/* Set the protocol column */
if(check_col(pinfo->cinfo,COL_INFO))
{
col_add_str(pinfo->cinfo, COL_INFO,
"FrameBuffer Update");
}
if (tree)
{
ti = proto_tree_add_item(tree,proto_xyz,
tvb, 0, -1, FALSE);
xyz_tree = proto_item_add_subtree(ti,
ett_xyz);
proto_tree_add_uint(xyz_tree,
hf_xyz_fb_update_n_rects, tvb, 2, 2, n_rects);
proto_tree_add_int(xyz_tree,
hf_xyz_fb_update_x , tvb, 4, 2, memstruct.x);
printf("x: %d\n",memstruct.x);
proto_tree_add_int(xyz_tree,
hf_xyz_fb_update_y, tvb, 6, 2, memstruct.y);
printf("y: %d\n",memstruct.y);
proto_tree_add_int(xyz_tree,
hf_xyz_fb_update_w, tvb, 8, 2, memstruct.w);
proto_tree_add_int(xyz_tree,
hf_xyz_fb_update_h, tvb, 10, 2, memstruct.h);
proto_tree_add_int(xyz_tree,
hf_xyz_fb_update_encoding, tvb, 12, 4, memstruct.encoding);
}
count --;
printf(" counter: %d\n", count);
offset2 = (offset2 + 13 + length);
}
}
if (count == 0 )
{
i = 0;
offset2 = 0x04;
}
}