Improved the decoding of OID search ranges in AgentX dissector:
1/ OID highlighting on first OID of a range was too long.
The code incorrectly used the length of the printable string instead
of the length of the source data.
2/ Added bitwise dissection of the 'include' field of an OID decoding.
3/ Added corrected 'start/end' range information to SearchRange decoding to
discriminate between an 'end' indicator (old way) and the new way that
shows both an inclusive/exclusive indicator as well as a start/end range
indicator. (applicable to getnext/getbulk requests).
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@35500
f5534014-38df-0310-8fa8-
9805f1628bb7
+/* OID usage indicators */
+enum OID_USAGE { OID_START_RANGE, OID_END_RANGE, OID_EXACT };
#define NON_DEFAULT_CONTEXT 0x08
#define NETWORK_BYTE_ORDER 0x10
#define NON_DEFAULT_CONTEXT 0x08
#define NETWORK_BYTE_ORDER 0x10
+#define OID_IS_INCLUSIVE 0x01
+
#define PDU_HDR_LEN 20
#define PADDING(x) ((((x) + 3) >> 2) << 2)
#define PDU_HDR_LEN 20
#define PADDING(x) ((((x) + 3) >> 2) << 2)
-dissect_object_id(tvbuff_t *tvb, proto_tree *tree, int offset, char flags)
+dissect_object_id(tvbuff_t *tvb, proto_tree *tree, int offset, char flags, enum OID_USAGE oid_usage)
{
guint8 n_subid;
guint8 prefix;
{
guint8 n_subid;
guint8 prefix;
slen = g_snprintf(&str_oid[0], 2048, "(null)");
if(tree) {
slen = g_snprintf(&str_oid[0], 2048, "(null)");
if(tree) {
+ char *range = "";
+ char *inclusion = (include) ? " (Inclusive)" : " (Exclusive)";
+ switch (oid_usage) {
+ case OID_START_RANGE: range = "(Range Start) "; break;
+ case OID_END_RANGE: range = " (Range End) "; break;
+ default: inclusion = ""; break;
+ }
item = proto_tree_add_text(tree, tvb, offset, 4 + (n_subid * 4) ,
item = proto_tree_add_text(tree, tvb, offset, 4 + (n_subid * 4) ,
- "Object Identifier: (%s) %s", (include) ? "Start" : "End" , str_oid);
+ "Object Identifier: %s%s%s", range, str_oid, inclusion);
subtree = proto_item_add_subtree(item, ett_obj_ident);
} else return offset;
proto_tree_add_uint(subtree, hf_oid_sub, tvb, offset, 1, n_subid);
proto_tree_add_uint(subtree, hf_oid_prefix, tvb, offset + 1, 1, prefix);
subtree = proto_item_add_subtree(item, ett_obj_ident);
} else return offset;
proto_tree_add_uint(subtree, hf_oid_sub, tvb, offset, 1, n_subid);
proto_tree_add_uint(subtree, hf_oid_prefix, tvb, offset + 1, 1, prefix);
- proto_tree_add_uint(subtree, hf_oid_include, tvb, offset + 2, 1, include);
- proto_tree_add_string(subtree, hf_oid_str, tvb, offset + 4, slen, str_oid);
+ proto_tree_add_boolean(subtree, hf_oid_include, tvb, offset + 2, 1, include);
+ proto_tree_add_string(subtree, hf_oid_str, tvb, offset + 4, (n_subid * 4), str_oid);
return 4 + (n_subid * 4);
}
static int
return 4 + (n_subid * 4);
}
static int
-dissect_search_range(tvbuff_t *tvb, proto_tree *tree, int start_offset, char flags)
+dissect_search_range(tvbuff_t *tvb, proto_tree *tree, int start_offset, char flags, guint8 pdu_type)
{
int offset = start_offset;
{
int offset = start_offset;
- offset += dissect_object_id(tvb, tree, offset, flags);
- offset += dissect_object_id(tvb, tree, offset, flags);
+ offset += dissect_object_id(tvb, tree, offset, flags, (pdu_type == AGENTX_GET_PDU) ? OID_EXACT : OID_START_RANGE);
+ offset += dissect_object_id(tvb, tree, offset, flags, (pdu_type == AGENTX_GET_PDU) ? OID_EXACT : OID_END_RANGE);
return (offset - start_offset);
}
return (offset - start_offset);
}
} else return len;
proto_tree_add_uint(subtree, hf_vtag, tvb, offset, 2, vtag);
} else return len;
proto_tree_add_uint(subtree, hf_vtag, tvb, offset, 2, vtag);
- tlen = dissect_object_id(tvb, subtree, offset + 4, flags);
+ tlen = dissect_object_id(tvb, subtree, offset + 4, flags, OID_EXACT);
switch(vtag)
{
case VB_OID:
switch(vtag)
{
case VB_OID:
- tlen += dissect_object_id(tvb, subtree, offset + tlen + 4, flags);
+ tlen += dissect_object_id(tvb, subtree, offset + tlen + 4, flags, OID_EXACT);
len += PDU_HDR_LEN;
while(len > offset) {
len += PDU_HDR_LEN;
while(len > offset) {
- offset += dissect_search_range(tvb, subtree, offset, flags);
+ offset += dissect_search_range(tvb, subtree, offset, flags, 0);
len += PDU_HDR_LEN;
while(len > offset) {
len += PDU_HDR_LEN;
while(len > offset) {
- offset += dissect_search_range(tvb, subtree, offset, flags);
+ offset += dissect_search_range(tvb, subtree, offset, flags, AGENTX_GET_PDU);
offset+=4;
while(len >= offset) {
offset+=4;
while(len >= offset) {
- offset += dissect_search_range(tvb, subtree, offset, flags);
+ offset += dissect_search_range(tvb, subtree, offset, flags, 0);
offset+=4;
/* Search Range */
offset+=4;
/* Search Range */
- offset += dissect_object_id(tvb, subtree, offset, flags);
+ offset += dissect_object_id(tvb, subtree, offset, flags, OID_EXACT);
/* Octet string */
offset += dissect_octet_string(tvb, subtree, offset, flags);
/* Octet string */
offset += dissect_octet_string(tvb, subtree, offset, flags);
- offset += dissect_object_id(tvb, subtree, offset, flags);
+ offset += dissect_object_id(tvb, subtree, offset, flags, OID_EXACT);
if(len > offset) {
/* Upper bound (opt) */
if(len > offset) {
/* Upper bound (opt) */
- offset += dissect_object_id(tvb, subtree, offset, flags);
+ offset += dissect_object_id(tvb, subtree, offset, flags, OID_EXACT);
if(len > offset) {
/* Upper bound (opt) */
if(len > offset) {
/* Upper bound (opt) */
offset += dissect_octet_string(tvb, subtree, offset, flags);
}
offset += dissect_octet_string(tvb, subtree, offset, flags);
}
- offset += dissect_object_id(tvb, subtree, offset, flags);
+ offset += dissect_object_id(tvb, subtree, offset, flags, OID_EXACT);
offset += dissect_octet_string(tvb, subtree, offset, flags);
}
offset += dissect_octet_string(tvb, subtree, offset, flags);
}
offset += dissect_octet_string(tvb, subtree, offset, flags);
}
offset += dissect_octet_string(tvb, subtree, offset, flags);
}
- offset += dissect_object_id(tvb, subtree, offset, flags);
+ offset += dissect_object_id(tvb, subtree, offset, flags, OID_EXACT);
+static const true_false_string tfs_agentx_include = { "Yes", "No" };
static const true_false_string tfs_agentx_register = { "Yes", "No" };
static const true_false_string tfs_agentx_newindex = { "Yes", "No" };
static const true_false_string tfs_agentx_anyindex = { "Yes", "No" };
static const true_false_string tfs_agentx_register = { "Yes", "No" };
static const true_false_string tfs_agentx_newindex = { "Yes", "No" };
static const true_false_string tfs_agentx_anyindex = { "Yes", "No" };
NULL, HFILL }},
{ &hf_oid_include,
NULL, HFILL }},
{ &hf_oid_include,
- { "OID include", "agentx.oid_include", FT_UINT8, BASE_DEC, NULL, 0x0,
- NULL, HFILL }},
+ { "OID include", "agentx.oid_include", FT_BOOLEAN, 8, TFS(&tfs_agentx_include),
+ OID_IS_INCLUSIVE, NULL, HFILL }},
{ &hf_oid_str,
{ "OID", "agentx.oid", FT_STRING, BASE_NONE, NULL, 0x0,
{ &hf_oid_str,
{ "OID", "agentx.oid", FT_STRING, BASE_NONE, NULL, 0x0,