* Greg Morris <gmorris@novell.com>
* Copyright (c) Novell, Inc. 2002-2003
*
- * $Id: packet-ndps.c,v 1.22 2003/06/04 08:38:09 guy Exp $
+ * $Id: packet-ndps.c,v 1.25 2003/10/17 22:59:18 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
/* desegmentation of ndps */
static gboolean ndps_defragment = TRUE;
-static guint32 frag_number = 0;
-static guint32 save_frag_length=0;
-static guint32 save_frag_seq=0;
-static gboolean ndps_fragmented = FALSE;
-static gboolean more_fragment = FALSE;
+
static guint32 tid = 1;
/* Show ID's value */
static int hf_ndps_colorant_set = -1;
static int hf_ndps_card_enum_time = -1;
static int hf_ndps_attrs_arg = -1;
+static int hf_ndps_context_len = -1;
static int hf_ndps_context = -1;
static int hf_ndps_filter = -1;
static int hf_ndps_item_filter = -1;
foffset = ndps_string(tvb, hf_local_object_name, ndps_tree, foffset, NULL, 0);
break;
}
+ foffset += align_4(tvb, foffset);
return foffset;
}
atree = proto_item_add_subtree(aitem, ett_ndps);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(atree, hf_ndps_password, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(atree, hf_ndps_password, tvb, foffset, length, FALSE);
+ }
proto_item_set_end(aitem, tvb, foffset);
foffset += length;
}
case 1:
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_certified, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_certified, tvb, foffset, length, FALSE);
+ }
foffset += length;
break;
case 2:
atree = proto_item_add_subtree(aitem, ett_ndps);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(atree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(atree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset += (length%2);
proto_item_set_end(aitem, tvb, foffset);
case 14: /* Cardinal Seq */
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_info_int32, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_info_int32, tvb, foffset, length, FALSE);
+ }
foffset += length;
break;
case 16: /* Integer Range */
foffset = qualifiedname(tvb, ndps_tree, foffset);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ }
foffset += length;
proto_tree_add_item(ndps_tree, hf_ndps_language_id, tvb, foffset, 4, FALSE);
foffset += 4;
foffset = name_or_id(tvb, ndps_tree, foffset);
+
number_of_items = tvb_get_ntohl(tvb, foffset);
proto_tree_add_uint(ndps_tree, hf_ndps_num_address_items, tvb, foffset, 4, number_of_items);
foffset += 4;
{
aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Address Item %u", i);
atree = proto_item_add_subtree(aitem, ett_ndps);
- foffset += address_item(tvb, atree, foffset);
+ foffset = address_item(tvb, atree, foffset);
proto_item_set_end(aitem, tvb, foffset);
}
number_of_items = tvb_get_ntohl(tvb, foffset);
proto_tree_add_item(atree, hf_ndps_event_type, tvb, foffset, 4, FALSE);
foffset += 4;
foffset = objectidentifier(tvb, atree, foffset);
+ foffset += align_4(tvb, foffset);
foffset = objectidentification(tvb, atree, foffset);
proto_tree_add_item(atree, hf_ndps_object_op, tvb, foffset, 4, FALSE);
foffset += 4;
-
event_object_type = tvb_get_ntohl(tvb, foffset);
proto_tree_add_uint(atree, hf_ndps_event_object_identifier, tvb, foffset, 4, event_object_type);
foffset += 4;
switch (event_object_type)
{
+ case 2:
+ /* Number of Objects */
+ number_of_items2 = tvb_get_ntohl(tvb, foffset);
+ proto_tree_add_uint(atree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items2);
+ foffset += 4;
+ for (j = 1 ; j <= number_of_items2; j++ )
+ {
+ foffset = objectidentifier(tvb, atree, foffset);
+ }
+ foffset += 4;
+ break;
+
case 1:
foffset = objectidentifier(tvb, atree, foffset);
break;
atree = proto_item_add_subtree(aitem, ett_ndps);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(atree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(atree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset += (length%2);
proto_item_set_end(aitem, tvb, foffset);
{
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_octet_string, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_octet_string, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset += (length%2);
}
atree = proto_item_add_subtree(aitem, ett_ndps);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(atree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(atree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset += (length%2);
}
atree = proto_item_add_subtree(aitem, ett_ndps);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(atree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(atree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset += (length%2);
proto_item_set_end(aitem, tvb, foffset);
foffset += 4;
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_add_bytes, tvb, foffset, 4, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_add_bytes, tvb, foffset, 4, FALSE);
+ }
foffset += length;
break;
case 92: /* XY Dimensions Value */
case 106: /* Octet String Pair */
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_octet_string, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_octet_string, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset += (length%2);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_octet_string, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_octet_string, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset += (length%2);
break;
case 107: /* Octet String Integer Pair */
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_octet_string, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_octet_string, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset += (length%2);
proto_tree_add_item(ndps_tree, hf_ndps_attribute_value, tvb, foffset, 4, FALSE);
foffset = qualifiedname(tvb, ndps_tree, foffset);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_octet_string, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_octet_string, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset += (length%2);
proto_tree_add_item(ndps_tree, hf_ndps_attribute_value, tvb, foffset, 4, FALSE);
case 3: /*OCTET_STRING*/
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_octet_string, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_octet_string, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset += (length%2);
break;
guint32 ndps_prog;
guint32 ndps_func;
guint32 ndps_frame_num;
+ gboolean ndps_frag;
+ guint32 ndps_end_frag;
} ndps_req_hash_value;
static GHashTable *ndps_req_hash = NULL;
request_value->ndps_prog = 0;
request_value->ndps_func = 0;
request_value->ndps_frame_num = 0;
+ request_value->ndps_frag = FALSE;
+ request_value->ndps_end_frag = 0;
g_hash_table_insert(ndps_req_hash, request_key, request_value);
static guint
get_ndps_pdu_len(tvbuff_t *tvb, int offset)
{
- guint16 plen;
-
- /*
- * Get the length of the NDPS packet.
- */
- plen = tvb_get_ntohs(tvb, offset + 2);
-
- /*
- * That length doesn't include the length of the record mark field
- * or the length field itself; add that in.
- * (XXX - is the field really a 31-bit length with the uppermost bit
- * being a record mark bit?)
- */
- return plen + 4;
+ return tvb_get_ntohs(tvb, offset +2) + 4;
}
static void
dissect_ndps(tvb, pinfo, ndps_tree);
}
+/*
+ * Defrag logic
+ *
+ * SPX EOM not being set indicates we are inside or at the
+ * beginning of a fragment. But when the end of the fragment
+ * is encounterd the flag is set. So we must mark what the
+ * frame number is of the end fragment so that we will be
+ * able to redissect if the user clicks on the packet
+ * or resorts/filters the trace.
+ *
+ * Once we are certain that we are in a fragment sequence
+ * then we can just process each fragment in this conversation
+ * until we reach the eom message packet. We can tell we are at
+ * the final fragment because it is flagged as SPX EOM.
+ *
+ * We will be able to easily determine if a conversation is a fragment
+ * with the exception of the last packet in the fragment. So remember
+ * the last fragment packet number.
+ */
static void
ndps_defrag(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
- guint16 record_mark=0;
- guint16 ndps_length=0;
- int len=0;
- tvbuff_t *next_tvb = NULL;
- fragment_data *fd_head;
- spx_info *spx_info;
+ int len=0;
+ tvbuff_t *next_tvb = NULL;
+ fragment_data *fd_head;
+ spx_info *spx_info;
+ ndps_req_hash_value *request_value = NULL;
+ conversation_t *conversation;
+ /* Get SPX info from SPX dissector */
spx_info = pinfo->private_data;
+ /* Check to see if defragmentation is enabled in the dissector */
if (!ndps_defragment) {
dissect_ndps(tvb, pinfo, tree);
return;
}
- record_mark = tvb_get_ntohs(tvb, 0);
- ndps_length = tvb_get_ntohs(tvb, 2);
- if (ndps_length > tvb_length_remaining(tvb, 0) || ndps_fragmented || ndps_length==0)
+ /* Has this already been dissected? */
+ if (!pinfo->fd->flags.visited)
+ {
+ /* Lets see if this is a new conversation */
+ conversation = find_conversation(&pinfo->src, &pinfo->dst,
+ PT_NCP, (guint32) pinfo->srcport, (guint32) pinfo->srcport, 0);
+
+ if (conversation == NULL)
+ {
+ /* It's not part of any conversation - create a new one. */
+ conversation = conversation_new(&pinfo->src, &pinfo->dst,
+ PT_NCP, (guint32) pinfo->srcport, (guint32) pinfo->srcport, 0);
+ /* Create new request value hash */
+ request_value = ndps_hash_insert(conversation, (guint32) pinfo->srcport);
+ }
+ /* So now we need to get the request info for this conversation */
+ request_value = ndps_hash_lookup(conversation, (guint32) pinfo->srcport);
+ if (request_value == NULL)
+ {
+ /* We haven't seen a packet with this conversation yet so create one. */
+ request_value = ndps_hash_insert(conversation, (guint32) pinfo->srcport);
+ }
+ /* Add it to pinfo so we can get it on further dissection requests */
+ p_add_proto_data(pinfo->fd, proto_ndps, (void*) request_value);
+ }
+ else
+ {
+ /* Get request value data */
+ request_value = p_get_proto_data(pinfo->fd, proto_ndps);
+ }
+ /* Check to see of this is a fragment. If so then mark as a fragment. */
+ if (!spx_info->eom) {
+ request_value->ndps_frag = TRUE;
+ }
+ /* Now we process the fragments */
+ if (request_value->ndps_frag || (request_value->ndps_end_frag == pinfo->fd->num))
{
- more_fragment = TRUE;
- ndps_fragmented = TRUE;
-
/*
* Fragment
*/
tid = (pinfo->srcport+pinfo->destport);
len = tvb_reported_length_remaining(tvb, 0);
- if ((frag_number + tvb_length_remaining(tvb, 0)-save_frag_length)<=10)
- {
- more_fragment = FALSE;
- }
if (tvb_bytes_exist(tvb, 0, len))
{
- fd_head = fragment_add_seq_next(tvb, 0, pinfo, tid, ndps_fragment_table, ndps_reassembled_table, len, more_fragment);
+ fd_head = fragment_add_seq_next(tvb, 0, pinfo, tid, ndps_fragment_table, ndps_reassembled_table, len, !spx_info->eom);
if (fd_head != NULL)
{
- if (fd_head->next != NULL)
+ /* Is this the last fragment? EOM will indicate */
+ if (fd_head->next != NULL && spx_info->eom)
{
next_tvb = tvb_new_real_data(fd_head->data,
fd_head->len, fd_head->len);
next_tvb);
tid++;
}
- more_fragment = FALSE;
- save_frag_length = 0;
- frag_number=0;
- ndps_fragmented=FALSE;
+ /* Remember this fragment number so we can dissect again */
+ request_value->ndps_end_frag = pinfo->fd->num;
+
}
else
{
+ /* This is either a beggining or middle fragment on second dissection */
next_tvb = tvb_new_subset(tvb, 0, -1, -1);
- }
- }
- else
- {
- if (save_frag_length == 0)
- {
- save_frag_length = ndps_length; /* First Fragment */
- save_frag_seq = tid;
- }
- if ((pinfo->srcport+pinfo->destport) == save_frag_seq)
- {
- if (!pinfo->fd->flags.visited)
- {
- frag_number += tvb_length_remaining(tvb, 0); /* Current offset */
- }
if (check_col(pinfo->cinfo, COL_INFO))
{
- if (more_fragment)
+ if (!spx_info->eom)
{
- col_append_fstr(pinfo->cinfo, COL_INFO, " [NDPS Fragment]");
+ col_append_fstr(pinfo->cinfo, COL_INFO, "[NDPS Fragment]");
}
}
}
+ }
+ else
+ {
+ /* Fragment from first pass of dissection */
+ if (check_col(pinfo->cinfo, COL_INFO))
+ {
+ if (!spx_info->eom)
+ {
+ col_append_fstr(pinfo->cinfo, COL_INFO, "[NDPS Fragment]");
+ }
+ }
next_tvb = NULL;
}
}
else
{
/*
- * Dissect this
+ * There are no bytes so Dissect this
*/
next_tvb = tvb_new_subset(tvb, 0, -1, -1);
}
if (next_tvb == NULL)
{
- if ((pinfo->srcport+pinfo->destport) == save_frag_seq)
- {
- next_tvb = tvb_new_subset (tvb, 0, -1, -1);
- call_dissector(ndps_data_handle, next_tvb, pinfo, tree);
- }
- else
- {
- if (spx_info->eom)
- {
- ndps_fragmented=FALSE;
- }
- dissect_ndps(tvb, pinfo, tree);
- }
+ /* This is a fragment packet */
+ next_tvb = tvb_new_subset (tvb, 0, -1, -1);
+ call_dissector(ndps_data_handle, next_tvb, pinfo, tree);
}
else
{
- if (spx_info->eom)
- {
- ndps_fragmented=FALSE;
+ /* This is the end fragment so dissect and mark end */
+ if (spx_info->eom) {
+ request_value->ndps_frag = FALSE;
+ dissect_ndps(next_tvb, pinfo, tree);
}
- dissect_ndps(next_tvb, pinfo, tree);
}
}
else
{
- if (spx_info->eom)
- {
- ndps_fragmented=FALSE;
- }
+ /* This is not any fragment packet */
+ request_value->ndps_frag = FALSE;
dissect_ndps(tvb, pinfo, tree);
}
}
guint32 profiles_choice_type;
guint32 integer_type_flag;
guint32 local_servers_type;
+ gint length_remaining;
proto_tree *atree;
proto_item *aitem;
proto_tree *btree;
if (!pinfo->fd->flags.visited)
{
-
/* This is the first time we've looked at this packet.
Keep track of the Program and connection whence the request
came, and the address and connection to which the request
PT_NCP, (guint32) pinfo->srcport, (guint32) pinfo->srcport, 0);
if (conversation == NULL)
- {
+ {
/* It's not part of any conversation - create a new one. */
conversation = conversation_new(&pinfo->src, &pinfo->dst,
PT_NCP, (guint32) pinfo->srcport, (guint32) pinfo->srcport, 0);
aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Security %u", i);
atree = proto_item_add_subtree(aitem, ett_ndps);
length = tvb_get_ntohl(tvb, foffset);
- proto_tree_add_uint(atree, hf_bind_security, tvb, foffset, 4, length);
+ if (length!=0)
+ {
+ proto_tree_add_uint(atree, hf_bind_security, tvb, foffset, 4, length);
+ }
foffset += 4;
proto_item_set_end(aitem, tvb, foffset);
}
length = tvb_get_ntohl(tvb, foffset);
proto_tree_add_uint(btree, hf_ndps_included_doc_len, tvb, foffset, 4, length);
foffset += 4;
- if (length > tvb_length_remaining(tvb, foffset)) /* Segmented Data */
+ length_remaining = tvb_length_remaining(tvb, foffset);
+ if (length_remaining == -1 || length > (guint32) length_remaining) /* Segmented Data */
{
proto_tree_add_item(btree, hf_ndps_data, tvb, foffset, -1, FALSE);
return;
}
- proto_tree_add_item(btree, hf_ndps_included_doc, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(btree, hf_ndps_included_doc, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset += (length%2);
}
if (list_attr_op==0) /* Continuation */
{
length = tvb_get_ntohl(tvb, foffset);
- proto_tree_add_item(ndps_tree, hf_ndps_context, tvb, foffset, length, FALSE);
+ proto_tree_add_uint(ndps_tree, hf_ndps_context_len, tvb, foffset, 4, length);
+ foffset += 4;
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_context, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset += (length%2);
proto_tree_add_item(ndps_tree, hf_ndps_abort_flag, tvb, foffset, 4, FALSE);
atree = proto_item_add_subtree(aitem, ett_ndps);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(atree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(atree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ }
foffset += length;
proto_item_set_end(aitem, tvb, foffset);
}
else /* Cont */
{
length = tvb_get_ntohl(tvb, foffset);
- proto_tree_add_item(ndps_tree, hf_ndps_context, tvb, foffset, length, FALSE);
+ proto_tree_add_uint(ndps_tree, hf_ndps_context_len, tvb, foffset, 4, length);
+ foffset += 4;
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_context, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset += (length%2);
proto_tree_add_item(ndps_tree, hf_ndps_abort_flag, tvb, foffset, 4, FALSE);
case 0x00000022: /* Map GUID to NDS Name */
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_guid, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_guid, tvb, foffset, length, FALSE);
+ }
foffset += length;
break;
case 0x00000023: /* AddEventProfile2 */
else /* Cont */
{
length = tvb_get_ntohl(tvb, foffset);
- proto_tree_add_item(ndps_tree, hf_ndps_context, tvb, foffset, length, FALSE);
+ proto_tree_add_uint(ndps_tree, hf_ndps_context_len, tvb, foffset, 4, length);
+ foffset += 4;
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_context, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset += (length%2);
proto_tree_add_item(ndps_tree, hf_ndps_abort_flag, tvb, foffset, 4, FALSE);
atree = proto_item_add_subtree(aitem, ett_ndps);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(atree, hf_bind_security, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(atree, hf_bind_security, tvb, foffset, length, FALSE);
+ }
proto_item_set_end(aitem, tvb, foffset);
}
break;
{
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(atree, hf_ndps_item_bytes, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(atree, hf_ndps_item_bytes, tvb, foffset, length, FALSE);
+ }
foffset += length;
}
proto_item_set_end(aitem, tvb, foffset);
atree = proto_item_add_subtree(aitem, ett_ndps);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(atree, hf_bind_security, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(atree, hf_bind_security, tvb, foffset, length, FALSE);
+ }
proto_item_set_end(aitem, tvb, foffset);
}
break;
else
{
length = tvb_get_ntohl(tvb, foffset);
- proto_tree_add_item(ndps_tree, hf_ndps_context, tvb, foffset, length, FALSE);
+ proto_tree_add_uint(ndps_tree, hf_ndps_context_len, tvb, foffset, 4, length);
+ foffset += 4;
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_context, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset += (length%2);
proto_tree_add_item(ndps_tree, hf_ndps_abort_flag, tvb, foffset, 4, FALSE);
atree = proto_item_add_subtree(aitem, ett_ndps);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(atree, hf_bind_security, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(atree, hf_bind_security, tvb, foffset, length, FALSE);
+ }
proto_item_set_end(aitem, tvb, foffset);
}
break;
proto_item_set_end(aitem, tvb, foffset);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ }
foffset += length;
proto_tree_add_item(ndps_tree, hf_ndps_language_id, tvb, foffset, 4, FALSE);
foffset += 4;
{
bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Address %d", i);
btree = proto_item_add_subtree(bitem, ett_ndps);
- foffset += address_item(tvb, btree, foffset);
+ foffset = address_item(tvb, btree, foffset);
proto_item_set_end(bitem, tvb, foffset);
}
proto_item_set_end(aitem, tvb, foffset);
atree = proto_item_add_subtree(aitem, ett_ndps);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(atree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(atree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ }
foffset += length;
proto_item_set_end(aitem, tvb, foffset);
}
else /* Cont */
{
length = tvb_get_ntohl(tvb, foffset);
- proto_tree_add_item(ndps_tree, hf_ndps_context, tvb, foffset, length, FALSE);
+ proto_tree_add_uint(ndps_tree, hf_ndps_context_len, tvb, foffset, 4, length);
+ foffset += 4;
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_context, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset += (length%2);
proto_tree_add_item(ndps_tree, hf_ndps_abort_flag, tvb, foffset, 4, FALSE);
break;
case 1: /* Continuation */
length = tvb_get_ntohl(tvb, foffset);
- proto_tree_add_item(ndps_tree, hf_ndps_context, tvb, foffset, length, FALSE);
+ proto_tree_add_uint(ndps_tree, hf_ndps_context_len, tvb, foffset, 4, length);
+ foffset += 4;
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_context, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset += (length%2);
proto_tree_add_item(ndps_tree, hf_ndps_abort_flag, tvb, foffset, 4, FALSE);
atree = proto_item_add_subtree(aitem, ett_ndps);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(atree, hf_bind_security, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(atree, hf_bind_security, tvb, foffset, length, FALSE);
+ }
proto_item_set_end(aitem, tvb, foffset);
}
break;
aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Item %d", i);
atree = proto_item_add_subtree(aitem, ett_ndps);
length=tvb_get_ntohl(tvb, foffset);
- if(tvb_length_remaining(tvb, foffset) < length)
+ length_remaining = tvb_length_remaining(tvb, foffset);
+ if(length_remaining == -1 || (guint32) length_remaining < length)
{
return;
}
btree = proto_item_add_subtree(bitem, ett_ndps);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(btree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(btree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ }
foffset += length;
proto_tree_add_item(btree, hf_ndps_event_type, tvb, foffset, 4, FALSE);
foffset += 4;
btree = proto_item_add_subtree(bitem, ett_ndps);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(btree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(btree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ }
foffset += length;
proto_tree_add_item(atree, hf_ndps_event_type, tvb, foffset, 4, FALSE);
foffset += 4;
guint32 ndps_prog=0;
guint32 error_val=0;
guint32 resource_type=0;
+ gint length_remaining;
if (!pinfo->fd->flags.visited) {
/* Find the conversation whence the request would have come. */
bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Option %d", i);
btree = proto_item_add_subtree(bitem, ett_ndps);
length=tvb_get_ntohl(tvb, foffset);
- if(tvb_length_remaining(tvb, foffset) < length)
+ length_remaining = tvb_length_remaining(tvb, foffset);
+ if(length_remaining == -1 || (guint32) length_remaining < length)
{
return;
}
case 0x0000001d: /* List Event Profiles */
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ }
foffset += length;
/* Start of Eventhandling */
proto_tree_add_item(ndps_tree, hf_ndps_profile_id, tvb, foffset, 4, FALSE);
foffset = qualifiedname(tvb, atree, foffset);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ }
foffset += length;
proto_tree_add_item(ndps_tree, hf_ndps_language_id, tvb, foffset, 4, FALSE);
foffset += 4;
{
bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Address %d", i);
btree = proto_item_add_subtree(bitem, ett_ndps);
- foffset += address_item(tvb, btree, foffset);
+ foffset = address_item(tvb, btree, foffset);
proto_item_set_end(bitem, tvb, foffset);
}
proto_item_set_end(aitem, tvb, foffset);
/* End of Eventhandling */
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_continuation_option, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_continuation_option, tvb, foffset, length, FALSE);
+ }
foffset += length;
if(error_val != 0)
{
foffset = ndps_string(tvb, hf_notify_printer_uri, atree, foffset, NULL, 0);
proto_item_set_end(aitem, tvb, foffset);
/* End of Eventhandling2 */
- proto_tree_add_item(ndps_tree, hf_ndps_continuation_option, tvb, foffset, length, FALSE);
+ length = tvb_get_ntohl(tvb, foffset); /* Added on 10-17-03 */
+ foffset += 4;
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_continuation_option, tvb, foffset, length, FALSE);
+ }
foffset += length;
if(error_val != 0)
{
atree = proto_item_add_subtree(aitem, ett_ndps);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(atree, hf_ndps_attribute_set, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(atree, hf_ndps_attribute_set, tvb, foffset, length, FALSE);
+ }
proto_item_set_end(aitem, tvb, foffset);
}
break;
}
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_continuation_option, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_continuation_option, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset = return_code(tvb, pinfo, ndps_tree, foffset);
break;
}
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_continuation_option, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_continuation_option, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset = return_code(tvb, pinfo, ndps_tree, foffset);
break;
atree = proto_item_add_subtree(aitem, ett_ndps);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(atree, hf_ndps_attribute_set, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(atree, hf_ndps_attribute_set, tvb, foffset, length, FALSE);
+ }
proto_item_set_end(aitem, tvb, foffset);
}
break;
proto_item_set_end(aitem, tvb, foffset);
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_attribute_value, tvb, foffset, length, FALSE);
+ }
foffset += length;
proto_tree_add_item(ndps_tree, hf_ndps_language_id, tvb, foffset, 4, FALSE);
foffset += 4;
{
bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Address %d", i);
btree = proto_item_add_subtree(bitem, ett_ndps);
- foffset += address_item(tvb, btree, foffset);
+ foffset = address_item(tvb, btree, foffset);
proto_item_set_end(bitem, tvb, foffset);
}
proto_item_set_end(aitem, tvb, foffset);
/* End of ProfileResultSet */
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_continuation_option, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_continuation_option, tvb, foffset, length, FALSE);
+ }
foffset += length;
foffset = return_code(tvb, pinfo, ndps_tree, foffset);
break;
/* Start of IntegerSeq */
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_language_id, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_language_id, tvb, foffset, length, FALSE);
+ }
foffset += length;
/* End of IntegerSeq */
foffset = return_code(tvb, pinfo, ndps_tree, foffset);
{
bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Address %d", i);
btree = proto_item_add_subtree(bitem, ett_ndps);
- foffset += address_item(tvb, btree, foffset);
+ foffset = address_item(tvb, btree, foffset);
proto_item_set_end(bitem, tvb, foffset);
}
proto_item_set_end(aitem, tvb, foffset);
case 0x00000001: /* Bind */
length = tvb_get_ntohl(tvb, foffset);
foffset += 4;
- proto_tree_add_item(ndps_tree, hf_ndps_attribute_set, tvb, foffset, length, FALSE);
+ if (length!=0)
+ {
+ proto_tree_add_item(ndps_tree, hf_ndps_attribute_set, tvb, foffset, length, FALSE);
+ }
break;
case 0x00000002: /* Unbind */
/* NoOp */
bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Item %d", i);
btree = proto_item_add_subtree(bitem, ett_ndps);
length=tvb_get_ntohl(tvb, foffset);
- if(tvb_length_remaining(tvb, foffset) < length)
+ length_remaining = tvb_length_remaining(tvb, foffset);
+ if(length_remaining == -1 || (guint32) length_remaining < length)
{
return;
}
FT_UINT32, BASE_HEX, VALS(ndps_attrs_arg_enum), 0x0,
"List Attribute Operation", HFILL }},
+ { &hf_ndps_context_len,
+ { "Context Length", "ndps.context_len",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Context Length", HFILL }},
+
{ &hf_ndps_context,
{ "Context", "ndps.context",
FT_BYTES, BASE_NONE, NULL, 0x0,