Eliminate proto_tree_add_text from some dissectors.

Other minor cleanup while in the neighborhood.

Change-Id: Ib76f4a9f89b5933425760af0a980c6a549031b8f
Reviewed-on: https://code.wireshark.org/review/3537
Petri-Dish: Michael Mann <mmann78@netscape.net>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
This commit is contained in:
Michael Mann 2014-08-09 13:43:44 -04:00
parent 18346c8477
commit 3635d7bed7
29 changed files with 765 additions and 529 deletions

View File

@ -31,6 +31,9 @@ void proto_reg_handoff_nonstd(void);
/* Define the nonstd proto */
static int proto_nonstd = -1;
static int hf_h221_nonstd_netmeeting_codec = -1;
static int hf_h221_nonstd_netmeeting_non_standard = -1;
/*
* Define the trees for nonstd
* We need one for nonstd itself and one for the nonstd paramters
@ -56,13 +59,13 @@ dissect_ms_nonstd(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
proto_tree *tr;
guint32 offset=0;
gint tvb_len;
guint16 codec_value, codec_extra;
guint16 codec_extra;
it=proto_tree_add_protocol_format(tree, proto_nonstd, tvb, 0, tvb_length(tvb), "Microsoft NonStd");
tr=proto_item_add_subtree(it, ett_nonstd);
tvb_len = tvb_length(tvb);
tvb_len = tvb_reported_length(tvb);
/*
* XXX - why do this test? Are there any cases where throwing
@ -79,20 +82,18 @@ dissect_ms_nonstd(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
if(tvb_len >= 23)
{
codec_value = tvb_get_ntohs(tvb,offset+20);
codec_extra = tvb_get_ntohs(tvb,offset+22);
if(codec_extra == 0x0100)
{
proto_tree_add_text(tr, tvb, offset+20, 2, "Microsoft NetMeeting Codec=0x%04X %s",
codec_value,val_to_str(codec_value, ms_codec_vals,"Unknown (%u)"));
proto_tree_add_item(tr, hf_h221_nonstd_netmeeting_codec, tvb, offset+20, 2, ENC_BIG_ENDIAN);
}
else
{
proto_tree_add_text(tr, tvb, offset, -1, "Microsoft NetMeeting Non Standard");
proto_tree_add_item(tr, hf_h221_nonstd_netmeeting_non_standard, tvb, offset, -1, ENC_NA);
}
}
@ -103,6 +104,17 @@ dissect_ms_nonstd(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
void
proto_register_nonstd(void)
{
static hf_register_info hf[] = {
{ &hf_h221_nonstd_netmeeting_codec,
{ "Microsoft NetMeeting Codec", "h221nonstd.netmeeting.codec", FT_UINT32, BASE_HEX,
VALS(ms_codec_vals), 0, NULL, HFILL }
},
{ &hf_h221_nonstd_netmeeting_non_standard,
{ "Microsoft NetMeeting Non Standard", "netmeeting.non_standard", FT_BYTES, BASE_NONE,
NULL, 0, NULL, HFILL }
},
};
static gint *ett[] = {
&ett_nonstd,
};
@ -110,6 +122,7 @@ proto_register_nonstd(void)
proto_nonstd = proto_register_protocol("H221NonStandard","h221nonstd", "h221nonstd");
proto_register_subtree_array(ett, array_length(ett));
proto_register_field_array(proto_nonstd, hf, array_length(hf));
}
/* The registration hand-off routine */

View File

@ -63,6 +63,7 @@ static int hf_hdcp2_r_n = -1;
static int hf_hdcp2_l_prime = -1;
static int hf_hdcp2_e_dkey_ks = -1;
static int hf_hdcp2_r_iv = -1;
static int hf_hdcp2_reserved = -1;
static expert_field ei_hdcp2_reserved_0 = EI_INIT;
@ -171,8 +172,8 @@ dissect_hdcp2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U
ptvcursor_add(cursor, hf_hdcp2_cert_n, N_LEN, ENC_NA);
ptvcursor_add(cursor, hf_hdcp2_cert_e, E_LEN, ENC_BIG_ENDIAN);
reserved = tvb_get_ntohs(tvb, ptvcursor_current_offset(cursor));
pi = proto_tree_add_text(cert_tree, tvb,
ptvcursor_current_offset(cursor), 2, "reserved bytes");
pi = proto_tree_add_item(cert_tree, hf_hdcp2_reserved, tvb,
ptvcursor_current_offset(cursor), 2, ENC_BIG_ENDIAN);
if (reserved != 0) {
expert_add_info(pinfo, pi, &ei_hdcp2_reserved_0);
}
@ -269,7 +270,11 @@ proto_register_hdcp2(void)
NULL, 0, NULL, HFILL } },
{ &hf_hdcp2_r_iv,
{ "r_iv", "hdcp2.r_iv", FT_UINT64, BASE_HEX,
NULL, 0, NULL, HFILL } },
{ &hf_hdcp2_reserved,
{ "Reserved", "hdcp2.reserved", FT_UINT16, BASE_HEX,
NULL, 0, NULL, HFILL } }
};
static gint *ett[] = {

View File

@ -52,6 +52,7 @@ static int hf_hdmi_edid_manf_serial = -1;
static int hf_hdmi_edid_manf_week = -1;
static int hf_hdmi_edid_mod_year = -1;
static int hf_hdmi_edid_manf_year = -1;
static int hf_hdmi_edid_version = -1;
/* also called Source and Sink in the HDMI spec */
@ -107,8 +108,6 @@ dissect_hdmi_edid(tvbuff_t *tvb, gint offset, packet_info *pinfo, proto_tree *tr
gchar manf_id_str[4]; /* 3 letters + 0-termination */
guint8 week, year;
int year_hf;
guint8 edid_ver, edid_rev;
edid_tree = proto_tree_add_subtree(tree, tvb,
offset, -1, ett_hdmi_edid, NULL,
@ -155,12 +154,7 @@ dissect_hdmi_edid(tvbuff_t *tvb, gint offset, packet_info *pinfo, proto_tree *tr
proto_item_append_text(yi, " (year %d)", 1990+year);
offset += 1;
edid_ver = tvb_get_guint8(tvb, offset);
edid_rev = tvb_get_guint8(tvb, offset+1);
/* XXX make this filterable */
proto_tree_add_text(edid_tree, tvb, offset, 2,
"EDID Version %d.%d", edid_ver, edid_rev);
proto_tree_add_item(edid_tree, hf_hdmi_edid_version, tvb, offset, 2, ENC_NA);
/* XXX dissect the parts following the EDID header */
@ -226,6 +220,11 @@ dissect_hdmi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
return dissect_hdmi_edid(tvb, offset, pinfo, hdmi_tree);
}
static void
hdmi_fmt_edid_version( gchar *result, guint32 revision )
{
g_snprintf( result, ITEM_LABEL_LENGTH, "%d.%02d", (guint8)(( revision & 0xFF00 ) >> 8), (guint8)(revision & 0xFF) );
}
void
proto_register_hdmi(void)
@ -257,7 +256,11 @@ proto_register_hdmi(void)
FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } },
{ &hf_hdmi_edid_manf_year,
{ "Year of manufacture", "hdmi.edid.manf_year",
FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } }
FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } },
{ &hf_hdmi_edid_version,
{ "EDID Version", "hdmi.edid.version",
FT_UINT16, BASE_CUSTOM, hdmi_fmt_edid_version, 0, NULL, HFILL } }
};
static gint *ett[] = {

View File

@ -35,6 +35,7 @@
#include "config.h"
#include <epan/packet.h>
#include <epan/expert.h>
#include <epan/addr_resolv.h>
#include <epan/ipproto.h>
@ -296,7 +297,7 @@ static const value_string hit_suite_vals[] = {
};
/* functions */
static int dissect_hip_tlv(tvbuff_t *tvb, int offset, proto_item *ti, int type, int tlv_len);
static int dissect_hip_tlv(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_item *ti, int type, int tlv_len);
static int proto_hip = -1;
static int hf_hip_proto = -1;
@ -399,6 +400,9 @@ static int hf_hip_tlv_reg_from_port = -1;
static int hf_hip_tlv_reg_from_protocol = -1;
static int hf_hip_tlv_reg_from_reserved = -1;
static int hf_hip_tlv_reg_from_address = -1;
static int hf_hip_encrypted_parameter_data = -1;
static int hf_hip_fqdn = -1;
static int hf_hip_nai = -1;
static gint ett_hip = -1;
static gint ett_hip_controls = -1;
@ -407,171 +411,172 @@ static gint ett_hip_tlv_data = -1;
static gint ett_hip_tlv_host_id_hdr = -1;
static gint ett_hip_locator_data = -1;
static expert_field ei_hip_tlv_host_id_len = EI_INIT;
static expert_field ei_hip_tlv_host_id_e_len = EI_INIT;
static expert_field ei_hip_tlv_host_id_hdr_alg = EI_INIT;
/* Dissect the HIP packet */
static void
dissect_hip_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean udp)
{
proto_tree *hip_tree, *hip_tlv_tree=NULL;
proto_item *ti, *ti_tlv;
int length, offset = 0, newoffset = 0;
guint16 control_h, checksum_h, computed_checksum;
guint16 tlv_type_h, tlv_length_h; /* For storing in host order */
guint len;
guint reported_len;
vec_t cksum_vec[4];
guint32 phdr[2];
proto_tree *hip_tree, *hip_tlv_tree=NULL;
proto_item *ti, *ti_tlv;
int length, offset = 0, newoffset = 0;
guint16 control_h, checksum_h, computed_checksum;
guint16 tlv_type_h, tlv_length_h; /* For storing in host order */
guint len;
guint reported_len;
vec_t cksum_vec[4];
guint32 phdr[2];
/* Payload format RFC 5201 section 5.1 */
/* hiph_proto; */ /* payload protocol */
guint8 hiph_hdr_len; /* header length */
guint8 hiph_shim6_fixed_bit_s; /* This is always 0 */
guint8 hiph_packet_type; /* packet type */
guint8 hiph_res_ver, hiph_version, hiph_reserved;
/* byte for reserved and version */
guint8 hiph_shim6_fixed_bit_p; /* This is always 1 */
/* checksum_h */ /* checksum */
/* control_h */ /* control */
/* HIP parameters ... */
/* Payload format RFC 5201 section 5.1 */
/* hiph_proto; */ /* payload protocol */
guint8 hiph_hdr_len; /* header length */
guint8 hiph_shim6_fixed_bit_s; /* This is always 0 */
guint8 hiph_packet_type; /* packet type */
guint8 hiph_res_ver, hiph_version, hiph_reserved;
/* byte for reserved and version */
guint8 hiph_shim6_fixed_bit_p; /* This is always 1 */
/* checksum_h */ /* checksum */
/* control_h */ /* control */
/* HIP parameters ... */
/* load the top pane info. This should be overwritten by
the next protocol in the stack */
col_set_str(pinfo->cinfo, COL_PROTOCOL, "HIP");
col_clear(pinfo->cinfo, COL_INFO);
/* load the top pane info. This should be overwritten by
the next protocol in the stack */
col_set_str(pinfo->cinfo, COL_PROTOCOL, "HIP");
col_clear(pinfo->cinfo, COL_INFO);
newoffset = offset;
/* hiph Proto */
newoffset++;
hiph_hdr_len = tvb_get_guint8(tvb, newoffset);
newoffset++;
hiph_packet_type = tvb_get_guint8(tvb, newoffset);
/* draft-ietf-shim6-proto-12 see section 5.3 */
hiph_shim6_fixed_bit_p = (hiph_packet_type & HIP_SHIM6_FIXED_BIT_P_MASK) >> 7;
hiph_packet_type = hiph_packet_type & HIP_PACKET_TYPE_MASK;
newoffset++;
hiph_res_ver = tvb_get_guint8(tvb, newoffset);
/* divide to reserved and version and shim6_fixed_bit_s
draft-ietf-shim6-proto-12 see section 5.3 */
hiph_version = (hiph_res_ver & HIP_VERSION_MASK) >> 4;
hiph_reserved = hiph_res_ver & HIP_RESERVED_MASK;
hiph_shim6_fixed_bit_s = hiph_res_ver & HIP_SHIM6_FIXED_BIT_S_MASK;
newoffset++;
checksum_h = tvb_get_ntohs(tvb, newoffset);
newoffset += 2;
control_h = tvb_get_ntohs(tvb, newoffset);
newoffset = offset;
/* hiph Proto */
newoffset++;
hiph_hdr_len = tvb_get_guint8(tvb, newoffset);
newoffset++;
hiph_packet_type = tvb_get_guint8(tvb, newoffset);
/* draft-ietf-shim6-proto-12 see section 5.3 */
hiph_shim6_fixed_bit_p = (hiph_packet_type & HIP_SHIM6_FIXED_BIT_P_MASK) >> 7;
hiph_packet_type = hiph_packet_type & HIP_PACKET_TYPE_MASK;
newoffset++;
hiph_res_ver = tvb_get_guint8(tvb, newoffset);
/* divide to reserved and version and shim6_fixed_bit_s
draft-ietf-shim6-proto-12 see section 5.3 */
hiph_version = (hiph_res_ver & HIP_VERSION_MASK) >> 4;
hiph_reserved = hiph_res_ver & HIP_RESERVED_MASK;
hiph_shim6_fixed_bit_s = hiph_res_ver & HIP_SHIM6_FIXED_BIT_S_MASK;
newoffset++;
checksum_h = tvb_get_ntohs(tvb, newoffset);
newoffset += 2;
control_h = tvb_get_ntohs(tvb, newoffset);
col_set_str(pinfo->cinfo, COL_INFO, val_to_str_const(hiph_packet_type, pinfo_vals, "Unknown"));
col_set_str(pinfo->cinfo, COL_INFO, val_to_str_const(hiph_packet_type, pinfo_vals, "Unknown"));
/* populate a tree in the second pane with the status of the link layer (i.e. none) */
if(tree) {
ti = proto_tree_add_item(tree, proto_hip, tvb, 0, -1, ENC_NA);
/* populate a tree in the second pane with the status of the link layer (i.e. none) */
ti = proto_tree_add_item(tree, proto_hip, tvb, 0, -1, ENC_NA);
hip_tree = proto_item_add_subtree(ti, ett_hip);
proto_tree_add_item(hip_tree, hf_hip_proto, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(hip_tree, hf_hip_hdr_len, tvb, offset+1, 1, ENC_BIG_ENDIAN);
proto_tree_add_uint_format(hip_tree, hf_hip_shim6_fixed_bit_p, tvb, offset+2, 1,
hiph_shim6_fixed_bit_p,
"Fixed P-bit: %u (Always zero)",
hiph_shim6_fixed_bit_p);
proto_tree_add_uint(hip_tree, hf_hip_packet_type, tvb, offset+2, 1,
hiph_packet_type);
proto_tree_add_uint_format_value(hip_tree, hf_hip_version, tvb, offset+3, 1,
hiph_version, "%u, Reserved: %u",
hiph_version, hiph_reserved);
proto_tree_add_uint_format(hip_tree, hf_hip_shim6_fixed_bit_s, tvb, offset+3, 1,
hiph_shim6_fixed_bit_s,
"Fixed S-bit: %u (%s)",
hiph_shim6_fixed_bit_s,
((hiph_shim6_fixed_bit_s) ? "HIP" : "SHIM6"));
hip_tree = proto_item_add_subtree(ti, ett_hip);
proto_tree_add_item(hip_tree, hf_hip_proto, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(hip_tree, hf_hip_hdr_len, tvb, offset+1, 1, ENC_BIG_ENDIAN);
proto_tree_add_uint_format(hip_tree, hf_hip_shim6_fixed_bit_p, tvb, offset+2, 1,
hiph_shim6_fixed_bit_p,
"Fixed P-bit: %u (Always zero)",
hiph_shim6_fixed_bit_p);
proto_tree_add_uint(hip_tree, hf_hip_packet_type, tvb, offset+2, 1,
hiph_packet_type);
proto_tree_add_uint_format_value(hip_tree, hf_hip_version, tvb, offset+3, 1,
hiph_version, "%u, Reserved: %u",
hiph_version, hiph_reserved);
proto_tree_add_uint_format(hip_tree, hf_hip_shim6_fixed_bit_s, tvb, offset+3, 1,
hiph_shim6_fixed_bit_s,
"Fixed S-bit: %u (%s)",
hiph_shim6_fixed_bit_s,
((hiph_shim6_fixed_bit_s) ? "HIP" : "SHIM6"));
/* Checksum - this is the same algorithm from UDP, ICMPv6 */
reported_len = tvb_reported_length(tvb);
len = tvb_captured_length(tvb);
if (!pinfo->fragmented && len >= reported_len) {
/* IPv4 or IPv6 addresses */
SET_CKSUM_VEC_PTR(cksum_vec[0], (const guint8 *)pinfo->src.data, pinfo->src.len);
SET_CKSUM_VEC_PTR(cksum_vec[1], (const guint8 *)pinfo->dst.data, pinfo->dst.len);
/* Checksum - this is the same algorithm from UDP, ICMPv6 */
reported_len = tvb_reported_length(tvb);
len = tvb_captured_length(tvb);
if (!pinfo->fragmented && len >= reported_len) {
/* IPv4 or IPv6 addresses */
SET_CKSUM_VEC_PTR(cksum_vec[0], (const guint8 *)pinfo->src.data, pinfo->src.len);
SET_CKSUM_VEC_PTR(cksum_vec[1], (const guint8 *)pinfo->dst.data, pinfo->dst.len);
/* the rest of the pseudo-header */
if (pinfo->src.type == AT_IPv6) {
phdr[0] = reported_len;
phdr[0] = g_htonl(phdr[0]); /* Note: g_htonl() macro may eval arg multiple times */
phdr[1] = g_htonl(IP_PROTO_HIP);
SET_CKSUM_VEC_PTR(cksum_vec[2], (const guint8 *)&phdr, 8);
} else {
phdr[0] = (IP_PROTO_HIP<<16)+reported_len;
phdr[0] = g_htonl(phdr[0]); /* Note: g_htonl() macro may eval arg multiple times */
SET_CKSUM_VEC_PTR(cksum_vec[2], (const guint8 *)&phdr, 4);
}
/* pointer to the HIP header (packet data) */
SET_CKSUM_VEC_TVB(cksum_vec[3], tvb, 0, reported_len);
computed_checksum = in_cksum(cksum_vec, 4);
if (computed_checksum == 0) {
proto_tree_add_uint_format_value(hip_tree, hf_hip_checksum, tvb,
offset+4, 2, checksum_h,
"0x%04x (correct)",
checksum_h);
} else {
if (checksum_h == 0 && udp) {
proto_tree_add_uint_format_value(hip_tree, hf_hip_checksum, tvb,
offset+4, 2, checksum_h,
"0x%04x (correct)",
checksum_h);
} else {
proto_tree_add_uint_format_value(hip_tree, hf_hip_checksum, tvb,
offset+4, 2, checksum_h,
"0x%04x (incorrect, should be 0x%04x)",
checksum_h,
in_cksum_shouldbe(checksum_h,
computed_checksum));
}
}
} else {
proto_tree_add_uint_format_value(hip_tree, hf_hip_checksum, tvb,
offset+4, 2, checksum_h,
"0x%04x (unverified)",
checksum_h);
}
/* the rest of the pseudo-header */
if (pinfo->src.type == AT_IPv6) {
phdr[0] = reported_len;
phdr[0] = g_htonl(phdr[0]); /* Note: g_htonl() macro may eval arg multiple times */
phdr[1] = g_htonl(IP_PROTO_HIP);
SET_CKSUM_VEC_PTR(cksum_vec[2], (const guint8 *)&phdr, 8);
} else {
phdr[0] = (IP_PROTO_HIP<<16)+reported_len;
phdr[0] = g_htonl(phdr[0]); /* Note: g_htonl() macro may eval arg multiple times */
SET_CKSUM_VEC_PTR(cksum_vec[2], (const guint8 *)&phdr, 4);
}
/* pointer to the HIP header (packet data) */
SET_CKSUM_VEC_TVB(cksum_vec[3], tvb, 0, reported_len);
computed_checksum = in_cksum(cksum_vec, 4);
if (computed_checksum == 0) {
proto_tree_add_uint_format_value(hip_tree, hf_hip_checksum, tvb,
offset+4, 2, checksum_h,
"0x%04x (correct)",
checksum_h);
} else {
if (checksum_h == 0 && udp) {
proto_tree_add_uint_format_value(hip_tree, hf_hip_checksum, tvb,
offset+4, 2, checksum_h,
"0x%04x (correct)",
checksum_h);
} else {
proto_tree_add_uint_format_value(hip_tree, hf_hip_checksum, tvb,
offset+4, 2, checksum_h,
"0x%04x (incorrect, should be 0x%04x)",
checksum_h,
in_cksum_shouldbe(checksum_h,
computed_checksum));
}
}
} else {
proto_tree_add_uint_format_value(hip_tree, hf_hip_checksum, tvb,
offset+4, 2, checksum_h,
"0x%04x (unverified)",
checksum_h);
}
ti = proto_tree_add_item(hip_tree, hf_hip_controls, tvb, offset+6, 2, ENC_BIG_ENDIAN);
if (ti) {
/* HIP Controls subtree */
ti = proto_item_add_subtree(ti, ett_hip_controls);
proto_tree_add_boolean(ti, hf_hip_controls_anon, tvb,
offset+7,1, control_h);
}
ti = proto_tree_add_item(hip_tree, hf_hip_controls, tvb, offset+6, 2, ENC_BIG_ENDIAN);
if (ti) {
/* HIP Controls subtree */
ti = proto_item_add_subtree(ti, ett_hip_controls);
proto_tree_add_boolean(ti, hf_hip_controls_anon, tvb,
offset+7,1, control_h);
}
offset += 8;
proto_tree_add_item(hip_tree, hf_hip_hit_sndr, tvb, offset,
16, ENC_NA);
offset += 16;
proto_tree_add_item(hip_tree, hf_hip_hit_rcvr, tvb, offset,
16, ENC_NA);
offset += 16;
offset += 8;
proto_tree_add_item(hip_tree, hf_hip_hit_sndr, tvb, offset,
16, ENC_NA);
offset += 16;
proto_tree_add_item(hip_tree, hf_hip_hit_rcvr, tvb, offset,
16, ENC_NA);
offset += 16;
length = (hiph_hdr_len + 1) * 8;
/* Begin TLV parsing */
if (offset < length) {
hip_tlv_tree = proto_tree_add_subtree(hip_tree, tvb, offset,
-1, ett_hip_tlv, NULL, "HIP Parameters");
}
/* Parse type and length in TLV */
while (offset < length)
{
tlv_type_h = tvb_get_ntohs(tvb, offset);
tlv_length_h = tvb_get_ntohs(tvb, offset + 2);
ti_tlv = proto_tree_add_uint_format(hip_tlv_tree, hf_hip_type, tvb,
offset, 4 + tlv_length_h, tlv_type_h,
"%s (type=%u, length=%u)",
val_to_str_const(tlv_type_h, hip_param_vals, "Unknown"),
tlv_type_h, tlv_length_h);
length = (hiph_hdr_len + 1) * 8;
/* Begin TLV parsing */
if (offset < length) {
hip_tlv_tree = proto_tree_add_subtree(hip_tree, tvb, offset,
-1, ett_hip_tlv, NULL, "HIP Parameters");
}
/* Parse type and length in TLV */
while (offset < length)
{
tlv_type_h = tvb_get_ntohs(tvb, offset);
tlv_length_h = tvb_get_ntohs(tvb, offset + 2);
ti_tlv = proto_tree_add_uint_format(hip_tlv_tree, hf_hip_type, tvb,
offset, 4 + tlv_length_h, tlv_type_h,
"%s (type=%u, length=%u)",
val_to_str_const(tlv_type_h, hip_param_vals, "Unknown"),
tlv_type_h, tlv_length_h);
/* Parse value */
dissect_hip_tlv(tvb, offset, ti_tlv, tlv_type_h, tlv_length_h);
/* Parse value */
dissect_hip_tlv(tvb, pinfo, offset, ti_tlv, tlv_type_h, tlv_length_h);
offset += 11 + tlv_length_h - (tlv_length_h + 3) % 8;
}
}
offset += 11 + tlv_length_h - (tlv_length_h + 3) % 8;
}
}
static void
@ -594,10 +599,10 @@ dissect_hip_in_udp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
static int
dissect_hip_tlv(tvbuff_t *tvb, int offset, proto_item *ti, int type, int tlv_len)
dissect_hip_tlv(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_item *ti, int type, int tlv_len)
{
proto_tree *t=NULL;
proto_item *ti_tlv, *ti_loc;
proto_item *ti_tlv, *ti_loc, *hi_len_item, *e_len_item, *arg_item;
guint8 n, algorithm, reg_type;
guint16 trans, hi_len, di_len, di_type, e_len, pv_len;
guint32 reserved, hi_hdr;
@ -871,8 +876,7 @@ dissect_hip_tlv(tvbuff_t *tvb, int offset, proto_item *ti, int type, int tlv_len
* and
* encrypted data after that.
*/
proto_tree_add_text(t, tvb, newoffset, tlv_len - 4,
"Encrypted Parameter Data (%u bytes)", tlv_len - 4);
proto_tree_add_item(t, hf_hip_encrypted_parameter_data, tvb, newoffset, tlv_len - 4, ENC_NA);
break;
case PARAM_HIP_CIPHER:
while (tlv_len > 0) {
@ -896,7 +900,7 @@ dissect_hip_tlv(tvbuff_t *tvb, int offset, proto_item *ti, int type, int tlv_len
break;
case PARAM_HOST_ID:
hi_len = tvb_get_ntohs(tvb, newoffset);
proto_tree_add_item(t, hf_hip_tlv_host_id_len, tvb, newoffset, 2, ENC_BIG_ENDIAN);
hi_len_item = proto_tree_add_item(t, hf_hip_tlv_host_id_len, tvb, newoffset, 2, ENC_BIG_ENDIAN);
newoffset += 2;
di_len = tvb_get_ntohs(tvb, newoffset);
di_type = (di_len >> 12) & 0x000F; /* get 4 bits for DI type */
@ -915,21 +919,21 @@ dissect_hip_tlv(tvbuff_t *tvb, int offset, proto_item *ti, int type, int tlv_len
hi_hdr = tvb_get_ntohl(tvb, newoffset);
ti_tlv = proto_tree_add_item(t, hf_hip_tlv_host_id_hdr,
tvb, newoffset, 4, ENC_BIG_ENDIAN);
if (ti_tlv) {
ti_tlv = proto_item_add_subtree(ti_tlv, ett_hip_tlv_host_id_hdr);
/* HDR Flags*/
proto_tree_add_uint(ti_tlv, hf_hip_tlv_host_id_hdr_flags, tvb,
newoffset, 2, hi_hdr);
newoffset += 2;
/* HDR Protocol */
proto_tree_add_uint(ti_tlv, hf_hip_tlv_host_id_hdr_proto, tvb,
newoffset, 1, hi_hdr);
newoffset += 1;
/* HDR Algorithm */
proto_tree_add_uint(ti_tlv, hf_hip_tlv_host_id_hdr_alg, tvb,
newoffset, 1, hi_hdr);
}
ti_tlv = proto_item_add_subtree(ti_tlv, ett_hip_tlv_host_id_hdr);
/* HDR Flags*/
proto_tree_add_uint(ti_tlv, hf_hip_tlv_host_id_hdr_flags, tvb,
newoffset, 2, hi_hdr);
newoffset += 2;
/* HDR Protocol */
proto_tree_add_uint(ti_tlv, hf_hip_tlv_host_id_hdr_proto, tvb,
newoffset, 1, hi_hdr);
newoffset += 1;
/* HDR Algorithm */
algorithm = tvb_get_guint8(tvb, newoffset);
arg_item = proto_tree_add_uint(ti_tlv, hf_hip_tlv_host_id_hdr_alg, tvb,
newoffset, 1, hi_hdr);
switch (algorithm) {
case HI_ALG_DSA:
/* DSA KEY RR RFC 2536
@ -972,7 +976,7 @@ dissect_hip_tlv(tvbuff_t *tvb, int offset, proto_item *ti, int type, int tlv_len
newoffset++; /* 12 + offset */
/* E len */
e_len = tvb_get_guint8(tvb, newoffset);
proto_tree_add_item(t, hf_hip_tlv_host_id_e_len, tvb, newoffset,
e_len_item = proto_tree_add_item(t, hf_hip_tlv_host_id_e_len, tvb, newoffset,
(e_len > 255) ? 3 : 1, ENC_BIG_ENDIAN);
newoffset++;
hi_len -= 5; /* subtract RDATA + e_len */
@ -982,8 +986,7 @@ dissect_hip_tlv(tvbuff_t *tvb, int offset, proto_item *ti, int type, int tlv_len
hi_len -= 2;
}
if (e_len > 512) { /* per, RFC 3110 < 4096 bits */
proto_tree_add_text(t, tvb, newoffset, 2,
"<< e_len too large >>");
expert_add_info(pinfo, e_len_item, &ei_hip_tlv_host_id_len);
break;
}
/* e */
@ -993,8 +996,7 @@ dissect_hip_tlv(tvbuff_t *tvb, int offset, proto_item *ti, int type, int tlv_len
hi_len -= e_len;
if (hi_len > 512) {
proto_tree_add_text(t, tvb, newoffset, 1,
"<< Invalid HI length >>");
expert_add_info(pinfo, hi_len_item, &ei_hip_tlv_host_id_len);
break;
}
@ -1003,8 +1005,7 @@ dissect_hip_tlv(tvbuff_t *tvb, int offset, proto_item *ti, int type, int tlv_len
hi_len, ENC_NA);
break;
default:
proto_tree_add_text(t, tvb, newoffset, 1,
"Unknown algorithm type (%d).\n", algorithm);
expert_add_info(pinfo, arg_item, &ei_hip_tlv_host_id_hdr_alg);
break;
}
@ -1013,12 +1014,10 @@ dissect_hip_tlv(tvbuff_t *tvb, int offset, proto_item *ti, int type, int tlv_len
break;
if (di_type == 1) {
/* RFC 1035 */
proto_tree_add_text(t, tvb, offset+16+hi_len, di_len,
"FQDN: %s", tvb_get_string_enc(wmem_packet_scope(), tvb, offset+16+hi_len, di_len, ENC_ASCII));
proto_tree_add_item(t, hf_hip_fqdn, tvb, offset+16+hi_len, di_len, ENC_ASCII|ENC_NA);
} else if (di_type == 2) {
/* RFC 4282 */
proto_tree_add_text(t, tvb, offset+16+hi_len, di_len,
"NAI: %s", tvb_get_string_enc(wmem_packet_scope(), tvb, offset+16+hi_len, di_len, ENC_ASCII));
proto_tree_add_item(t, hf_hip_nai, tvb, offset+16+hi_len, di_len, ENC_ASCII|ENC_NA);
}
break;
case PARAM_CERT: /* CERT */
@ -1559,6 +1558,18 @@ proto_register_hip(void)
{ "Address" , "hip.tlv_reg_from_address",
FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
{ &hf_hip_encrypted_parameter_data,
{ "Encrypted Parameter Data" , "hip.encrypted_parameter_data",
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
{ &hf_hip_fqdn,
{ "FQDN" , "hip.fqdn",
FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
{ &hf_hip_nai,
{ "NAI" , "hip.nai",
FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
};
static gint *ett[] = {
@ -1570,11 +1581,20 @@ proto_register_hip(void)
&ett_hip_locator_data,
};
proto_hip = proto_register_protocol("Host Identity Protocol",
"HIP", "hip");
static ei_register_info ei[] = {
{ &ei_hip_tlv_host_id_len, { "hip.tlv.host_id_length.invalid", PI_PROTOCOL, PI_WARN, "Invalid HI length", EXPFILL }},
{ &ei_hip_tlv_host_id_e_len, { "hip.tlv.host_id_e_length.invalid", PI_PROTOCOL, PI_WARN, "e_len too large", EXPFILL }},
{ &ei_hip_tlv_host_id_hdr_alg, { "hip.tlv.host_id_header_algo.invalid", PI_PROTOCOL, PI_WARN, "Unknown algorithm type", EXPFILL }},
};
expert_module_t* expert_hip;
proto_hip = proto_register_protocol("Host Identity Protocol", "HIP", "hip");
proto_register_field_array(proto_hip, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
expert_hip = expert_register_protocol(proto_hip);
expert_register_field_array(expert_hip, ei, array_length(ei));
}
void

View File

@ -28,6 +28,7 @@
#include <glib.h>
#include <epan/packet.h>
#include <epan/expert.h>
#include <epan/etypes.h>
@ -159,6 +160,7 @@ static int hf_homeplug_ns_extended = -1;
static int hf_homeplug_ns_netw_ctrl_ac = -1;
static int hf_homeplug_ns_netw_ctrl_icid = -1;
static int hf_homeplug_ns_bytes40_robo = -1;
static int hf_homeplug_ns_mhz = -1;
static int hf_homeplug_ns_fails_robo = -1;
static int hf_homeplug_ns_drops_robo = -1;
static int hf_homeplug_ns_netw_da = -1;
@ -228,6 +230,7 @@ static gint ett_homeplug_bcn = -1;
static gint ett_homeplug_bcl = -1;
static gint ett_homeplug_stc = -1;
static expert_field ei_homeplug_tone_map_not_exist = EI_INIT;
static guint8 homeplug_ne = 0;
static guint8 homeplug_melen = 0;
@ -1016,7 +1019,6 @@ static void dissect_homeplug_ns(ptvcursor_t * cursor, packet_info * pinfo)
guint8 iTone = 0;
guint8 i_buffer = 0;
guint16 ns_bytes40 = 0;
guint64 newt_da = 0;
gboolean extended = (homeplug_melen >= HOMEPLUG_NS_EXT_LEN);
proto_item * ti;
@ -1038,11 +1040,7 @@ static void dissect_homeplug_ns(ptvcursor_t * cursor, packet_info * pinfo)
ptvcursor_add(cursor, hf_homeplug_ns_netw_ctrl_icid, 1, ENC_BIG_ENDIAN);
ptvcursor_add_no_advance(cursor, hf_homeplug_ns_bytes40_robo, 2, ENC_LITTLE_ENDIAN);
ns_bytes40 = tvb_get_letohs(ptvcursor_tvbuff(cursor),
ptvcursor_current_offset(cursor));
proto_tree_add_text(ptvcursor_tree(cursor), ptvcursor_tvbuff(cursor),
ptvcursor_current_offset(cursor), 2, "MHz : %.3f", (float)(ns_bytes40)/42);
ptvcursor_advance(cursor, 2);
ptvcursor_add(cursor, hf_homeplug_ns_mhz, 2, ENC_BIG_ENDIAN);
ptvcursor_add(cursor, hf_homeplug_ns_fails_robo, 2, ENC_LITTLE_ENDIAN);
ptvcursor_add(cursor, hf_homeplug_ns_drops_robo, 2, ENC_LITTLE_ENDIAN);
@ -1060,18 +1058,14 @@ static void dissect_homeplug_ns(ptvcursor_t * cursor, packet_info * pinfo)
ptvcursor_add(cursor, hf_homeplug_ns_netw_da, 6, ENC_NA);
ptvcursor_add_no_advance(cursor, hf_homeplug_ns_bytes40, 2, ENC_LITTLE_ENDIAN);
ns_bytes40 = tvb_get_letohs(ptvcursor_tvbuff(cursor),
ptvcursor_current_offset(cursor));
proto_tree_add_text(ptvcursor_tree(cursor), ptvcursor_tvbuff(cursor),
ptvcursor_current_offset(cursor), 2, "MHz : %.3f", (float)(ns_bytes40)/42);
ptvcursor_advance(cursor, 2);
ptvcursor_add(cursor, hf_homeplug_ns_mhz, 2, ENC_BIG_ENDIAN);
ptvcursor_add(cursor, hf_homeplug_ns_fails, 2, ENC_LITTLE_ENDIAN);
ptvcursor_add(cursor, hf_homeplug_ns_drops, 2, ENC_LITTLE_ENDIAN);
}
ptvcursor_pop_subtree(cursor);
} else {
proto_tree_add_text(ptvcursor_tree(cursor), ptvcursor_tvbuff(cursor),
proto_tree_add_expert_format(ptvcursor_tree(cursor), pinfo, &ei_homeplug_tone_map_not_exist, ptvcursor_tvbuff(cursor),
ptvcursor_current_offset(cursor), 12, "Tone Map #%d does not exist", iTone+1);
}
@ -1353,6 +1347,11 @@ dissect_homeplug(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
ptvcursor_free(cursor);
}
static void
homeplug_fmt_mhz( gchar *result, guint32 ns_bytes40 )
{
g_snprintf( result, ITEM_LABEL_LENGTH, "%.3f", (float)(ns_bytes40)/42);
}
void
proto_reg_handoff_homeplug(void)
@ -1915,6 +1914,11 @@ proto_register_homeplug(void)
FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }
},
{ &hf_homeplug_ns_mhz,
{ "Mhz", "homeplug.ns.mhz",
FT_UINT16, BASE_CUSTOM, homeplug_fmt_mhz, 0x0, NULL, HFILL }
},
{ &hf_homeplug_ns_fails_robo,
{ "Fails Received in ROBO", "homeplug.ns.fails_robo",
FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }
@ -2174,9 +2178,16 @@ proto_register_homeplug(void)
&ett_homeplug_stc
};
static ei_register_info ei[] = {
{ &ei_homeplug_tone_map_not_exist, { "homeplug.tone_map_not_exist", PI_PROTOCOL, PI_WARN, "Tone Map does not exist", EXPFILL }},
};
expert_module_t* expert_homeplug;
proto_homeplug = proto_register_protocol("HomePlug protocol", "HomePlug", "homeplug");
proto_register_field_array(proto_homeplug, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
expert_homeplug = expert_register_protocol(proto_homeplug);
expert_register_field_array(expert_homeplug, ei, array_length(ei));
}

View File

@ -60,6 +60,10 @@ static header_field_info hfi_hpext_sxsap HPEXT_HFI_INIT =
{ "SXSAP", "hpext.sxsap", FT_UINT16, BASE_HEX,
VALS(xsap_vals), 0x0, NULL, HFILL };
static header_field_info hfi_hpext_reserved HPEXT_HFI_INIT =
{ "Reserved", "hpext.reserved", FT_UINT24, BASE_HEX,
NULL, 0x0, NULL, HFILL };
static gint ett_hpext = -1;
@ -81,7 +85,7 @@ dissect_hpext(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
if (tree) {
ti = proto_tree_add_item(tree, hfi_hpext, tvb, 0, 7, ENC_NA);
hpext_tree = proto_item_add_subtree(ti, ett_hpext);
proto_tree_add_text(hpext_tree, tvb, 0, 3, "Reserved");
proto_tree_add_item(hpext_tree, &hfi_hpext_reserved, tvb, 0, 3, ENC_NA);
proto_tree_add_uint(hpext_tree, &hfi_hpext_dxsap, tvb, 3,
2, dxsap);
proto_tree_add_uint(hpext_tree, &hfi_hpext_sxsap, tvb, 5,

View File

@ -127,15 +127,13 @@ static void
dissect_hpfeeds_info_pdu(tvbuff_t *tvb, proto_tree *tree, guint offset)
{
guint8 len = 0;
proto_item *ti = NULL;
proto_tree *data_subtree = NULL;
proto_tree *data_subtree;
guint8 *strptr = NULL;
len = tvb_get_guint8(tvb, offset);
/* don't move the offset yet as we need to get data after this operation */
strptr = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 1, len, ENC_ASCII);
ti = proto_tree_add_text(tree, tvb, offset, -1, "Broker: %s", strptr);
data_subtree = proto_item_add_subtree(ti, ett_hpfeeds);
data_subtree = proto_tree_add_subtree_format(tree, tvb, offset, -1, ett_hpfeeds, NULL, "Broker: %s", strptr);
proto_tree_add_item(data_subtree, hf_hpfeeds_server_len, tvb, offset, 1,
ENC_BIG_ENDIAN);

View File

@ -54,6 +54,7 @@ static int hf_hpsw_config_name = -1;
static int hf_hpsw_root_mac_addr = -1;
static int hf_hpsw_device_id = -1;
static int hf_hpsw_device_id_data = -1;
static int hf_hpsw_data = -1;
static gint ett_hpsw = -1;
@ -220,7 +221,7 @@ dissect_hpsw_tlv(tvbuff_t *tvb, packet_info *pinfo, int offset, int length,
break;
default:
proto_tree_add_text(tree, tvb, offset, length, "Data");
proto_tree_add_item(tree, hf_hpsw_data, tvb, offset, length, ENC_NA);
break;
}
}
@ -337,6 +338,9 @@ proto_register_hpsw(void)
{ &hf_hpsw_device_id_data,
{ "Data", "hpsw.device_id_data", FT_BYTES, BASE_NONE,
NULL, 0x0, NULL, HFILL }},
{ &hf_hpsw_data,
{ "Data", "hpsw.data", FT_BYTES, BASE_NONE,
NULL, 0x0, NULL, HFILL }},
};
static gint *ett[] = {

View File

@ -24,6 +24,7 @@
#include "config.h"
#include <epan/packet.h>
#include <epan/expert.h>
#include <epan/to_str.h>
#include <epan/oui.h>
@ -34,12 +35,29 @@ void proto_reg_handoff_iapp(void);
static int proto_iapp = -1;
static int hf_iapp_version = -1;
static int hf_iapp_type = -1;
static int hf_iapp_cap_forwarding = -1;
static int hf_iapp_cap_wep = -1;
static int hf_iapp_auth_status = -1;
static int hf_iapp_auth_string = -1;
static int hf_iapp_auth_uint = -1;
static int hf_iapp_auth_ipaddr = -1;
static int hf_iapp_auth_trailer = -1;
static int hf_iapp_pdu_ssid = -1;
static int hf_iapp_pdu_bytes = -1;
static int hf_iapp_pdu_uint = -1;
static int hf_iapp_pdu_phytype = -1;
static int hf_iapp_pdu_regdomain = -1;
static int hf_iapp_pdu_oui_ident = -1;
/* Initialize the subtree pointers */
static gint ett_iapp = -1;
static gint ett_iapp_pdu = -1;
static gint ett_iapp_subpdu = -1;
static gint ett_iapp_cap = -1;
static gint ett_iapp_auth = -1;
static gint ett_iapp_authinfo = -1;
static expert_field ei_iapp_no_pdus = EI_INIT;
#define UDP_PORT_IAPP 2313
@ -95,18 +113,6 @@ static gint ett_iapp_auth = -1;
#define IAPP_AUTH_IPADDR 0x0e
#define IAPP_AUTH_TRAILER 0xff
typedef struct _e_iapphdr {
guint8 ia_version;
guint8 ia_type;
} e_iapphdr;
typedef struct _e_pduhdr {
guint8 pdu_type;
guint8 pdu_len_h;
guint8 pdu_len_l;
} e_pduhdr;
static const value_string iapp_vals[] = {
{IAPP_ANNOUNCE_REQUEST, "Announce Request"},
{IAPP_ANNOUNCE_RESPONSE, "Announce Response"},
@ -180,45 +186,29 @@ static const value_string iapp_auth_type_vals[] = {
/* dissect a capability bit field */
static void dissect_caps(proto_item *pitem, tvbuff_t *tvb, int offset)
static void dissect_caps(proto_tree *tree, tvbuff_t *tvb, int offset)
{
proto_tree *captree;
int bit, val, thisbit;
const gchar *strval;
gchar bitval[4+1+4+1]; /* "xxxx xxxx\0" */
captree = proto_item_add_subtree(pitem, ett_iapp_cap);
val = tvb_get_guint8(tvb, offset + 3);
for (bit = 7; bit >= 0; bit--)
{
thisbit = 1 << bit;
strval = try_val_to_str(thisbit, iapp_cap_vals);
if (strval)
{
other_decode_bitfield_value(bitval, val, thisbit, 8);
proto_tree_add_text(captree, tvb, offset + 3, 1, "%s %s: %s",
bitval, strval, val & thisbit ? "Yes" : "No");
}
}
captree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_iapp_cap, NULL, "Capabilities");
proto_tree_add_item(captree, hf_iapp_cap_forwarding, tvb, offset, 1, ENC_NA);
proto_tree_add_item(captree, hf_iapp_cap_wep, tvb, offset, 1, ENC_NA);
}
static void
append_authval_str(proto_item *ti, int type, int len, tvbuff_t *tvb, int offset)
add_authval_str(proto_tree *tree, int type, int len, tvbuff_t *tvb, int offset)
{
int z, val;
proto_item_append_text(ti, " Value: ");
int val;
switch (type)
{
case IAPP_AUTH_STATUS:
proto_item_append_text(ti, "%s", tvb_get_guint8(tvb, offset + 3) ? "Authenticated" : "Not authenticated");
val = tvb_get_guint8(tvb, offset);
proto_tree_add_uint_format_value(tree, hf_iapp_auth_status, tvb, offset, 1, val, "%s", val ? "Authenticated" : "Not authenticated");
break;
case IAPP_AUTH_USERNAME:
case IAPP_AUTH_PROVNAME:
proto_item_append_text(ti, "\"%s\"",
tvb_format_text(tvb, offset + 3, len));
proto_tree_add_item(tree, hf_iapp_auth_string, tvb, offset, 1, ENC_ASCII|ENC_NA);
break;
case IAPP_AUTH_RXPKTS:
case IAPP_AUTH_TXPKTS:
@ -227,22 +217,19 @@ append_authval_str(proto_item *ti, int type, int len, tvbuff_t *tvb, int offset)
case IAPP_AUTH_RXGWORDS:
case IAPP_AUTH_TXGWORDS:
case IAPP_AUTH_VOLLIMIT:
val = tvb_get_ntohl(tvb, offset + 3);
proto_item_append_text(ti, "%d", val);
proto_tree_add_item(tree, hf_iapp_auth_uint, tvb, offset, 4, ENC_BIG_ENDIAN);
break;
case IAPP_AUTH_LOGINTIME:
case IAPP_AUTH_TIMELIMIT:
case IAPP_AUTH_ACCCYCLE:
val = tvb_get_ntohl(tvb, offset + 3);
proto_item_append_text(ti, "%d seconds", val);
val = tvb_get_ntohl(tvb, offset);
proto_tree_add_uint_format_value(tree, hf_iapp_auth_uint, tvb, offset, 4, val, "%d seconds", val);
break;
case IAPP_AUTH_IPADDR:
proto_item_append_text(ti, "%s", tvb_ip_to_str(tvb, offset + 3));
proto_tree_add_item(tree, hf_iapp_auth_ipaddr, tvb, offset, 4, ENC_BIG_ENDIAN);
break;
case IAPP_AUTH_TRAILER:
for (z = 0; z < len; z++)
proto_item_append_text(ti, "%s%02x", z ? " " : "",
tvb_get_guint8(tvb, offset + 3 + z));
proto_tree_add_item(tree, hf_iapp_auth_trailer, tvb, offset, len, ENC_NA);
break;
}
}
@ -251,23 +238,22 @@ append_authval_str(proto_item *ti, int type, int len, tvbuff_t *tvb, int offset)
static void dissect_authinfo(proto_item *pitem, tvbuff_t *tvb, int offset, int sumlen)
{
proto_tree *authtree;
proto_item *ti;
e_pduhdr pduhdr;
int len;
proto_tree *authtree, *value_tree;
guint8 pdu_type;
guint16 len;
authtree = proto_item_add_subtree(pitem, ett_iapp_auth);
while (sumlen > 0)
{
tvb_memcpy(tvb, (guint8 *)&pduhdr, offset, sizeof(e_pduhdr));
len = (((int)pduhdr.pdu_len_h) << 8) + pduhdr.pdu_len_l;
pdu_type = tvb_get_guint8(tvb, offset);
len = tvb_get_ntohs(tvb, offset+1);
ti = proto_tree_add_text(authtree, tvb, offset, len + 3,
"%s(%d)",
val_to_str_const(pduhdr.pdu_type, iapp_auth_type_vals, "Unknown PDU Type"),
pduhdr.pdu_type);
append_authval_str(ti, pduhdr.pdu_type, len, tvb, offset);
value_tree = proto_tree_add_subtree_format(authtree, tvb, offset, len + 3,
ett_iapp_authinfo, NULL, "%s (%d)",
val_to_str_const(pdu_type, iapp_auth_type_vals, "Unknown PDU Type"),
pdu_type);
add_authval_str(value_tree, pdu_type, len, tvb, offset+3);
sumlen -= (len + 3);
offset += (len + 3);
@ -277,85 +263,55 @@ static void dissect_authinfo(proto_item *pitem, tvbuff_t *tvb, int offset, int s
/* get displayable values of PDU contents */
static gboolean
append_pduval_str(proto_item *ti, int type, int len, tvbuff_t *tvb, int offset,
append_pduval_str(proto_tree *tree, int type, int len, tvbuff_t *tvb, int offset,
gboolean is_fhss)
{
int z, val;
const gchar *strval;
proto_item_append_text(ti, " Value: ");
int val;
switch (type)
{
case IAPP_PDU_SSID:
proto_item_append_text(ti, "\"%s\"",
tvb_format_text(tvb, offset + 3, len));
proto_tree_add_item(tree, hf_iapp_pdu_ssid, tvb, offset, len, ENC_ASCII|ENC_NA);
break;
case IAPP_PDU_BSSID:
case IAPP_PDU_OLDBSSID:
case IAPP_PDU_MSADDR:
for (z = 0; z < len; z++)
proto_item_append_text(ti, "%s%02x", z ? ":" : "",
tvb_get_guint8(tvb, offset + 3 + z));
proto_tree_add_item(tree, hf_iapp_pdu_bytes, tvb, offset, len, ENC_NA);
break;
case IAPP_PDU_CAPABILITY:
{
int mask, first = 1;
val = tvb_get_guint8(tvb, offset + 3);
proto_item_append_text(ti, "%02x (", val);
for (mask = 0x80; mask; mask >>= 1)
if (val & mask)
{
strval = try_val_to_str(mask, iapp_cap_vals);
if (strval)
{
if (!first)
proto_item_append_text(ti, " ");
proto_item_append_text(ti, "%s", strval);
first=0;
}
}
proto_item_append_text(ti, ")");
dissect_caps(tree, tvb, offset);
break;
}
case IAPP_PDU_ANNOUNCEINT:
val = tvb_get_ntohs(tvb, offset + 3);
proto_item_append_text(ti, "%d seconds", val);
val = tvb_get_ntohs(tvb, offset);
proto_tree_add_uint_format_value(tree, hf_iapp_pdu_uint, tvb, offset, 2, val, "%d seconds", val);
break;
case IAPP_PDU_HOTIMEOUT:
case IAPP_PDU_BEACONINT:
val = tvb_get_ntohs(tvb, offset + 3);
proto_item_append_text(ti, "%d Kus", val);
val = tvb_get_ntohs(tvb, offset);
proto_tree_add_uint_format_value(tree, hf_iapp_pdu_uint, tvb, offset, 2, val, "%d Kus", val);
break;
case IAPP_PDU_MESSAGEID:
val = tvb_get_ntohs(tvb, offset + 3);
proto_item_append_text(ti, "%d", val);
proto_tree_add_item(tree, hf_iapp_pdu_uint, tvb, offset, 2, ENC_BIG_ENDIAN);
break;
case IAPP_PDU_PHYTYPE:
val = tvb_get_guint8(tvb, offset + 3);
strval = val_to_str_const(val, iapp_phy_vals, "Unknown");
proto_item_append_text(ti, "%s", strval);
is_fhss = (val == IAPP_PHY_FHSS);
proto_tree_add_item(tree, hf_iapp_pdu_phytype, tvb, offset, 1, ENC_BIG_ENDIAN);
is_fhss = (tvb_get_guint8(tvb, offset) == IAPP_PHY_FHSS);
break;
case IAPP_PDU_REGDOMAIN:
val = tvb_get_guint8(tvb, offset + 3);
strval = val_to_str_const(val, iapp_dom_vals, "Unknown");
proto_item_append_text(ti, "%s", strval);
proto_tree_add_item(tree, hf_iapp_pdu_regdomain, tvb, offset, 1, ENC_BIG_ENDIAN);
break;
case IAPP_PDU_CHANNEL:
val = tvb_get_guint8(tvb, offset + 3);
if (is_fhss)
proto_item_append_text(ti, "Pattern set %d, sequence %d",
((val >> 6) & 3) + 1, (val & 31) + 1);
{
val = tvb_get_guint8(tvb, offset);
proto_tree_add_uint_format(tree, hf_iapp_pdu_uint, tvb, offset, 1, val,
"Pattern set %d, sequence %d", ((val >> 6) & 3) + 1, (val & 31) + 1);
}
else
proto_item_append_text(ti, "%d", val);
proto_tree_add_item(tree, hf_iapp_pdu_uint, tvb, offset, 1, ENC_NA);
break;
case IAPP_PDU_OUIIDENT:
for (val = z = 0; z < 3; z++)
val = (val << 8) | tvb_get_guint8(tvb, offset + 3 + z);
strval = val_to_str_const(val, oui_vals, "Unknown");
proto_item_append_text(ti, "%s", strval);
proto_tree_add_item(tree, hf_iapp_pdu_oui_ident, tvb, offset, 3, ENC_BIG_ENDIAN);
break;
}
return is_fhss;
@ -364,36 +320,34 @@ append_pduval_str(proto_item *ti, int type, int len, tvbuff_t *tvb, int offset,
/* code to dissect a list of PDUs */
static void
dissect_pdus(tvbuff_t *tvb, int offset, proto_tree *pdutree, int pdulen)
dissect_pdus(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *pdutree, proto_item *pduitem, int pdulen)
{
e_pduhdr pduhdr;
int len;
guint8 pdu_type;
guint16 len;
proto_item *ti;
gboolean is_fhss;
proto_tree *subtree;
if (!pdulen)
{
proto_tree_add_text(pdutree, tvb, offset, 0, "No PDUs found");
expert_add_info(pinfo, pduitem, &ei_iapp_no_pdus);
return;
}
is_fhss = FALSE;
while (pdulen > 0)
{
tvb_memcpy(tvb, (guint8 *)&pduhdr, offset, sizeof(e_pduhdr));
len = (((int)pduhdr.pdu_len_h) << 8) + pduhdr.pdu_len_l;
pdu_type = tvb_get_guint8(tvb, offset);
len = tvb_get_ntohs(tvb, offset+1);
ti = proto_tree_add_text(pdutree, tvb, offset, len + 3,
"%s(%d)",
val_to_str_const(pduhdr.pdu_type, iapp_pdu_type_vals, "Unknown PDU Type"),
pduhdr.pdu_type);
is_fhss = append_pduval_str(ti, pduhdr.pdu_type, len, tvb,
offset, is_fhss);
subtree = proto_tree_add_subtree_format(pdutree, tvb, offset, len + 3,
ett_iapp_subpdu, &ti, "%s (%d)",
val_to_str_const(pdu_type, iapp_pdu_type_vals, "Unknown PDU Type"),
pdu_type);
is_fhss = append_pduval_str(subtree, pdu_type, len, tvb,
offset+3, is_fhss);
if (pduhdr.pdu_type == IAPP_PDU_CAPABILITY)
dissect_caps(ti, tvb, offset);
if (pduhdr.pdu_type == IAPP_PDU_AUTHINFO)
if (pdu_type == IAPP_PDU_AUTHINFO)
dissect_authinfo(ti, tvb, offset + 3, len);
pdulen -= (len + 3);
@ -405,21 +359,19 @@ dissect_pdus(tvbuff_t *tvb, int offset, proto_tree *pdutree, int pdulen)
static void
dissect_iapp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
proto_item *ti;
proto_item *ti, *pduitem;
proto_tree *iapp_tree, *pdutree;
e_iapphdr ih;
int ia_version;
int ia_type;
guint8 ia_version;
guint8 ia_type;
const gchar *codestrval;
col_set_str(pinfo->cinfo, COL_PROTOCOL, "IAPP");
col_clear(pinfo->cinfo, COL_INFO);
tvb_memcpy(tvb, (guint8 *)&ih, 0, sizeof(e_iapphdr));
ia_version = tvb_get_guint8(tvb, 0);
ia_type = tvb_get_guint8(tvb, 1);
ia_version = (int)ih.ia_version;
ia_type = (int)ih.ia_type;
codestrval = val_to_str_const(ia_type, iapp_vals, "Unknown Packet");
col_add_fstr(pinfo->cinfo, COL_INFO, "%s(%d) (version=%d)", codestrval, ia_type, ia_version);
@ -430,19 +382,14 @@ dissect_iapp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
/* common header for all IAPP frames */
proto_tree_add_uint(iapp_tree, hf_iapp_version, tvb, 0, 1,
ih.ia_version);
proto_tree_add_uint_format_value(iapp_tree, hf_iapp_type, tvb, 1, 1,
ih.ia_type, "%s(%d)", codestrval, ia_type);
proto_tree_add_item(iapp_tree, hf_iapp_version, tvb, 0, 1, ENC_NA);
proto_tree_add_item(iapp_tree, hf_iapp_type, tvb, 1, 1, ENC_NA);
pdutree = proto_tree_add_subtree(iapp_tree, tvb, 2, -1,
ett_iapp_pdu, NULL, "Protocol data units");
ett_iapp_pdu, &pduitem, "Protocol data units");
if (pdutree)
{
dissect_pdus(tvb, 2, pdutree,
dissect_pdus(tvb, pinfo, 2, pdutree, pduitem,
tvb_length_remaining(tvb, 2));
}
}
}
@ -462,24 +409,72 @@ proto_register_iapp(void)
{ "Version", "iapp.version", FT_UINT8, BASE_DEC, NULL, 0x00, NULL, HFILL }
},
{ &hf_iapp_type,
{ "Type", "iapp.type", FT_UINT8, BASE_DEC, NULL, 0x00, NULL, HFILL }
{ "Type", "iapp.type", FT_UINT8, BASE_DEC, VALS(iapp_vals), 0x00, NULL, HFILL }
},
{ &hf_iapp_cap_forwarding,
{ "Forwarding", "iapp.cap.forwarding", FT_BOOLEAN, 8, TFS(&tfs_yes_no), IAPP_CAP_FORWARDING, NULL, HFILL }
},
{ &hf_iapp_cap_wep,
{ "WEP", "iapp.cap.wep", FT_BOOLEAN, 8, TFS(&tfs_yes_no), IAPP_CAP_WEP, NULL, HFILL }
},
{ &hf_iapp_auth_status,
{ "Status", "iapp.auth.status", FT_UINT8, BASE_DEC, NULL, 0x00, NULL, HFILL }
},
{ &hf_iapp_auth_uint,
{ "Value", "iapp.auth.uint", FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL }
},
{ &hf_iapp_auth_string,
{ "Value", "iapp.auth.string", FT_STRING, BASE_NONE, NULL, 0x00, NULL, HFILL }
},
{ &hf_iapp_auth_ipaddr,
{ "IP Address", "iapp.auth.ipaddr", FT_IPv4, BASE_NONE, NULL, 0x00, NULL, HFILL }
},
{ &hf_iapp_auth_trailer,
{ "Trailer", "iapp.auth.trailer", FT_BYTES, BASE_NONE, NULL, 0x00, NULL, HFILL }
},
{ &hf_iapp_pdu_ssid,
{ "SSID", "iapp.pdu.ssid", FT_STRING, BASE_NONE, NULL, 0x00, NULL, HFILL }
},
{ &hf_iapp_pdu_bytes,
{ "Value", "iapp.pdu.bytes", FT_BYTES, BASE_NONE, NULL, 0x00, NULL, HFILL }
},
{ &hf_iapp_pdu_uint,
{ "Value", "iapp.pdu.uint", FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL }
},
{ &hf_iapp_pdu_phytype,
{ "PHY Type", "iapp.pdu.phytype", FT_UINT8, BASE_DEC, VALS(iapp_phy_vals), 0x00, NULL, HFILL }
},
{ &hf_iapp_pdu_regdomain,
{ "Reg domain", "iapp.pdu.regdomain", FT_UINT8, BASE_DEC, VALS(iapp_dom_vals), 0x00, NULL, HFILL }
},
{ &hf_iapp_pdu_oui_ident,
{ "OUI", "iapp.pdu.oui_ident", FT_UINT24, BASE_DEC, VALS(oui_vals), 0x00, NULL, HFILL }
},
};
static gint *ett[] = {
&ett_iapp,
&ett_iapp_pdu,
&ett_iapp_subpdu,
&ett_iapp_cap,
&ett_iapp_auth
&ett_iapp_auth,
&ett_iapp_authinfo
};
static ei_register_info ei[] = {
{ &ei_iapp_no_pdus, { "iapp.no_pdus", PI_PROTOCOL, PI_NOTE, "No PDUs found", EXPFILL }},
};
expert_module_t* expert_iapp;
/* Register the protocol name and description */
proto_iapp = proto_register_protocol("Inter-Access-Point Protocol",
"IAPP", "iapp");
proto_iapp = proto_register_protocol("Inter-Access-Point Protocol", "IAPP", "iapp");
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array(proto_iapp, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
expert_iapp = expert_register_protocol(proto_iapp);
expert_register_field_array(expert_iapp, ei, array_length(ei));
}

View File

@ -116,6 +116,8 @@ static int hf_iax2_trunk_call_scallno = -1;
static int hf_iax2_trunk_call_ts = -1;
static int hf_iax2_trunk_call_data = -1;
static int hf_iax2_ie_id = -1;
static int hf_iax2_length = -1;
static int hf_iax2_cap_g723_1 = -1;
static int hf_iax2_cap_gsm = -1;
static int hf_iax2_cap_ulaw = -1;
@ -140,6 +142,8 @@ static int hf_iax2_cap_h263_plus = -1;
static int hf_iax2_cap_h264 = -1;
static int hf_iax2_cap_mpeg4 = -1;
static int hf_iax2_fragment_unfinished = -1;
static int hf_iax2_payload_data = -1;
static int hf_iax2_fragments = -1;
static int hf_iax2_fragment = -1;
static int hf_iax2_fragment_overlap = -1;
@ -1323,11 +1327,8 @@ static guint32 dissect_ies(tvbuff_t *tvb, packet_info *pinfo, guint32 offset,
ies_tree = proto_tree_add_subtree(iax_tree, tvb, offset, ies_len+2, ett_iax2_ie, &ti, " ");
proto_tree_add_text(ies_tree, tvb, offset, 1, "IE id: %s (0x%02X)",
val_to_str_ext_const(ies_type, &iax_ies_type_ext, "Unknown"),
ies_type);
proto_tree_add_text(ies_tree, tvb, offset + 1, 1, "Length: %u", ies_len);
proto_tree_add_uint(ies_tree, hf_iax2_ie_id, tvb, offset, 1, ies_type);
proto_tree_add_uint(ies_tree, hf_iax2_length, tvb, offset + 1, 1, ies_len);
/* hf_iax2_ies[] is an array, indexed by IE number, of header-fields, one
@ -2362,8 +2363,7 @@ static void desegment_iax(tvbuff_t *tvb, packet_info *pinfo, proto_tree *iax2_tr
PROTO_ITEM_SET_GENERATED(iax_tree_item);
} else {
/* this fragment is never reassembled */
proto_tree_add_text(tree, tvb, deseg_offset, -1,
"IAX2 fragment, unfinished");
proto_tree_add_item(tree, hf_iax2_fragment_unfinished, tvb, deseg_offset, -1, ENC_NA);
}
if (pinfo->desegment_offset == 0) {
@ -2413,9 +2413,7 @@ static void dissect_payload(tvbuff_t *tvb, guint32 offset,
}
nbytes = tvb_reported_length(sub_tvb);
proto_tree_add_text(iax2_tree, sub_tvb, 0, -1,
"IAX2 payload (%u byte%s)", nbytes,
plurality(nbytes, "", "s"));
proto_tree_add_item(iax2_tree, hf_iax2_payload_data, sub_tvb, 0, -1, ENC_NA);
iax2_info->payload_len = nbytes;
iax2_info->payload_data = tvb_get_ptr(sub_tvb, 0, -1);
@ -2978,6 +2976,16 @@ proto_register_iax2(void)
FT_STRING, BASE_NONE, NULL, 0x0,
"Raw data for unknown IEs", HFILL}},
{&hf_iax2_ie_id,
{"IE id", "iax2.ie_id",
FT_UINT8, BASE_DEC|BASE_EXT_STRING, &iax_ies_type_ext, 0x0,
NULL, HFILL}},
{&hf_iax2_length,
{"Length", "iax2.length",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL}},
/* capabilities */
{&hf_iax2_cap_g723_1,
{"G.723.1 compression", "iax2.cap.g723_1",
@ -3094,6 +3102,16 @@ proto_register_iax2(void)
FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), AST_FORMAT_MP4_VIDEO,
NULL, HFILL }},
{&hf_iax2_fragment_unfinished,
{"IAX2 fragment, unfinished", "iax2.fragment_unfinished",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{&hf_iax2_payload_data,
{"IAX2 payload", "iax2.payload_data",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
/* reassembly stuff */
{&hf_iax2_fragments,
{"IAX2 Fragments", "iax2.fragments",

View File

@ -83,6 +83,7 @@ static int hf_icep_encoding_minor = -1;
static int hf_icep_message_type = -1;
static int hf_icep_compression_status = -1;
static int hf_icep_message_size = -1;
static int hf_icep_magic_number = -1;
/* [Batch] Request Message Body */
static int hf_icep_request_id = -1;
@ -106,6 +107,7 @@ static int hf_icep_reply_status = -1;
/* Initialize the subtree pointers */
static gint ett_icep = -1;
static gint ett_icep_msg = -1;
static gint ett_icep_invocation_context = -1;
static expert_field ei_icep_params_size = EI_INIT;
static expert_field ei_icep_context_missing = EI_INIT;
@ -119,6 +121,7 @@ static expert_field ei_icep_mode_missing = EI_INIT;
static expert_field ei_icep_params_encapsulated = EI_INIT;
static expert_field ei_icep_params_missing = EI_INIT;
static expert_field ei_icep_batch_requests = EI_INIT;
static expert_field ei_icep_empty_batch = EI_INIT;
static expert_field ei_icep_facet_missing = EI_INIT;
static expert_field ei_icep_context_too_long = EI_INIT;
@ -418,12 +421,13 @@ static void dissect_ice_context(packet_info *pinfo, proto_tree *tree, proto_item
/* value */
gint32 consumed_value = 0;
char *str_value = NULL;
proto_item *ti = NULL;
proto_item *ti;
proto_tree *context_tree;
DBG1("looping through context dictionary, loop #%d\n", i);
ti = proto_tree_add_text(tree, tvb, offset, -1, "Invocation Context");
context_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_icep_invocation_context, &ti, "Invocation Context");
dissect_ice_string(pinfo, tree, ti, hf_icep_invocation_key, tvb, offset, &consumed_key, &str_key);
dissect_ice_string(pinfo, context_tree, ti, hf_icep_invocation_key, tvb, offset, &consumed_key, &str_key);
if ( consumed_key == -1 ) {
(*consumed) = -1;
@ -433,7 +437,7 @@ static void dissect_ice_context(packet_info *pinfo, proto_tree *tree, proto_item
offset += consumed_key;
(*consumed) += consumed_key;
dissect_ice_string(pinfo, tree, ti, hf_icep_invocation_value, tvb, offset, &consumed_value, &str_value);
dissect_ice_string(pinfo, context_tree, ti, hf_icep_invocation_value, tvb, offset, &consumed_value, &str_value);
if ( consumed_value == -1 ) {
(*consumed) = -1;
@ -792,8 +796,7 @@ static void dissect_icep_batch_request(tvbuff_t *tvb, guint32 offset,
if ( num_reqs == 0 ) {
proto_tree_add_text(icep_tree, tvb, offset, -1,
"empty batch requests sequence");
proto_tree_add_expert(icep_tree, pinfo, &ei_icep_empty_batch, tvb, offset, -1);
col_append_str(pinfo->cinfo, COL_INFO, " (empty batch requests sequence)");
return;
@ -959,8 +962,7 @@ static int dissect_icep_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
/* message header */
proto_tree_add_text(icep_tree, tvb, offset, 4,
"Magic Number: 'I','c','e','P'");
proto_tree_add_item(icep_tree, hf_icep_magic_number, tvb, offset, 4, ENC_ASCII|ENC_NA);
offset += 4;
proto_tree_add_item(icep_tree, hf_icep_protocol_major,
@ -1104,6 +1106,14 @@ void proto_register_icep(void)
}
},
{ &hf_icep_magic_number,
{
"Magic Number", "icep.magic_number",
FT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL
}
},
{ &hf_icep_compression_status,
{
"Compression Status", "icep.compression_status",
@ -1255,6 +1265,7 @@ void proto_register_icep(void)
static gint *ett[] = {
&ett_icep,
&ett_icep_msg,
&ett_icep_invocation_context,
};
static ei_register_info ei[] = {
@ -1270,6 +1281,7 @@ void proto_register_icep(void)
{ &ei_icep_length, { "icep.length_invalid", PI_MALFORMED, PI_ERROR, "Invalid length", EXPFILL }},
{ &ei_icep_mode_missing, { "icep.mode.missing", PI_MALFORMED, PI_ERROR, "mode field missing", EXPFILL }},
{ &ei_icep_batch_requests, { "icep.batch_requests.invalid", PI_PROTOCOL, PI_WARN, "too many batch requests", EXPFILL }},
{ &ei_icep_empty_batch, { "icep.batch_requests.empty", PI_PROTOCOL, PI_WARN, "empty batch requests sequence", EXPFILL }},
{ &ei_icep_reply_data, { "icep.params.reply_data.missing", PI_MALFORMED, PI_ERROR, "Reply Data missing", EXPFILL }},
{ &ei_icep_message_type, { "icep.message_type.unknown", PI_PROTOCOL, PI_WARN, "Unknown Message Type", EXPFILL }},
};

View File

@ -32,6 +32,7 @@
#include <glib.h>
#include <epan/packet.h>
#include <epan/expert.h>
#include <epan/nlpid.h>
#include <math.h>
@ -122,6 +123,8 @@ static int hf_idrp_rib_refresh_rib_attr_locally_defined_qos_metric = -1;
static int hf_idrp_rib_refresh_rib_attr_security_reg_id = -1;
static int hf_idrp_rib_refresh_rib_attr_security_info = -1;
static expert_field ei_idrp_no_path_attributes = EI_INIT;
/* flags */
#define IDRP_UPDATE_PATH_FLAG_OPTIONAL 0x80
#define IDRP_UPDATE_PATH_FLAG_OPTIONAL_TRANSITIVE 0xc0
@ -1003,9 +1006,10 @@ static int dissect_BISPDU_ERROR(tvbuff_t * tvb, int offset, proto_tree * tree)
return offset;
}
static int dissect_BISPDU_RIB_REFRESH(tvbuff_t * tvb, int offset, proto_tree * tree)
static int dissect_BISPDU_RIB_REFRESH(tvbuff_t * tvb, packet_info *pinfo, int offset, proto_tree * tree)
{
proto_tree *sub_tree;
proto_item *sub_item;
guint8 number_of_non_empty_rib_attributes;
guint8 number_of_distinguishing_attributes;
guint8 rib_attribute_type;
@ -1019,14 +1023,14 @@ static int dissect_BISPDU_RIB_REFRESH(tvbuff_t * tvb, int offset, proto_tree * t
offset += 1;
/* Path Attributes subtree */
sub_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_idrp_sub, NULL, "Path Attributes");
sub_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_idrp_sub, &sub_item, "Path Attributes");
/* Number of Non-empty RIB-Atts */
number_of_non_empty_rib_attributes = tvb_get_guint8(tvb, offset);
offset += 1;
if (!number_of_non_empty_rib_attributes)
proto_tree_add_text(sub_tree, tvb, offset, 0, "none");
expert_add_info(pinfo, sub_item, &ei_idrp_no_path_attributes);
/* process Nth RIB-Atts */
for (i = number_of_non_empty_rib_attributes; i > 0; i--) {
@ -1213,7 +1217,7 @@ dissect_idrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
offset += 30;
break;
case IDRP_TYPE_RIB_REFRESH:
offset = dissect_BISPDU_RIB_REFRESH(tvb, offset, idrp_tree);
offset = dissect_BISPDU_RIB_REFRESH(tvb, pinfo, offset, idrp_tree);
break;
default:
break;
@ -1582,9 +1586,17 @@ void proto_register_idrp(void)
&ett_idrp_sub
};
static ei_register_info ei[] = {
{ &ei_idrp_no_path_attributes, { "idrp.no_path_attributes", PI_PROTOCOL, PI_NOTE, "No path attributes", EXPFILL }},
};
expert_module_t* expert_idrp;
proto_idrp = proto_register_protocol(IDRP_PROTO, "IDRP", "idrp");
proto_register_field_array(proto_idrp, hf_idrp, array_length(hf_idrp));
proto_register_subtree_array(ett, array_length(ett));
expert_idrp = expert_register_protocol(proto_idrp);
expert_register_field_array(expert_idrp, ei, array_length(ei));
new_register_dissector("idrp", dissect_idrp, proto_idrp);
}

View File

@ -594,6 +594,7 @@ static int hf_bcr_sq = -1;
static int hf_bcr_cy = -1;
static int hf_bcr_ca = -1;
static int hf_bcr_iv = -1;
static int hf_start = -1;
static int hf_asdu_bitstring = -1;
static int hf_asdu_float = -1;
@ -1402,7 +1403,7 @@ static int dissect_iec104apci(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre
proto_item_set_len(it104, Off + APCI_LEN);
proto_tree_add_text(it104tree, tvb, Off, 1, "START");
proto_tree_add_uint_format(it104tree, hf_start, tvb, Off, 1, Start, "START");
ti = proto_tree_add_item(it104tree, hf_apdulen, tvb, Off + 1, 1, ENC_LITTLE_ENDIAN);
len = tvb_get_guint8(tvb, Off + 1);
@ -1787,6 +1788,10 @@ proto_register_iec104asdu(void)
{ "IV", "104asdu.bcr.iv", FT_BOOLEAN, 8, TFS(&tfs_invalid_valid), 0x80,
"Counter Validity", HFILL }},
{ &hf_start,
{ "START", "104asdu.start", FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }},
{ &hf_asdu_bitstring,
{ "Value", "104asdu.bitstring", FT_UINT32, BASE_HEX, NULL, 0x0,
"BSI value", HFILL }},

View File

@ -32,6 +32,7 @@
#include "config.h"
#include <epan/packet.h>
#include <epan/expert.h>
#include <epan/etypes.h>
void proto_register_1722(void);
@ -117,6 +118,8 @@ static int ett_1722 = -1;
static int ett_1722_audio = -1;
static int ett_1722_sample = -1;
static expert_field ei_1722_incorrect_dbs = EI_INIT;
static dissector_table_t avb_dissector_table;
static void
@ -236,13 +239,12 @@ dissect_1722(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
/* If the DBS is ever 0 for whatever reason, then just add the rest of packet as unknown */
if(dbs == 0)
proto_tree_add_text(ieee1722_tree, tvb, IEEE_1722_DATA_OFFSET, datalen, "Incorrect DBS");
expert_add_info(pinfo, ti, &ei_1722_incorrect_dbs);
else {
/* Loop through all samples and add them to the audio tree. */
for (j = 0; j < (datalen / (dbs*4)); j++) {
ti = proto_tree_add_text(audio_tree, tvb, offset, 1, "Sample %d", j+1);
sample_tree = proto_item_add_subtree(ti, ett_1722_sample);
sample_tree = proto_tree_add_subtree_format(audio_tree, tvb, offset, 1, ett_1722_sample, NULL, "Sample %d", j+1);
for (i = 0; i < dbs; i++) {
proto_tree_add_item(sample_tree, hf_1722_label, tvb, offset, 1, ENC_BIG_ENDIAN);
offset += 1;
@ -383,12 +385,20 @@ void proto_register_1722(void)
&ett_1722_sample
};
static ei_register_info ei[] = {
{ &ei_1722_incorrect_dbs, { "ieee1722.incorrect_dbs", PI_PROTOCOL, PI_WARN, "Incorrect DBS", EXPFILL }},
};
expert_module_t* expert_1722;
/* Register the protocol name and description */
proto_1722 = proto_register_protocol("IEEE 1722 Protocol", "IEEE1722", "ieee1722");
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array(proto_1722, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
expert_1722 = expert_register_protocol(proto_1722);
expert_register_field_array(expert_1722, ei, array_length(ei));
/* Sub-dissector for 1772.1 */
avb_dissector_table = register_dissector_table("ieee1722.subtype",

View File

@ -204,6 +204,7 @@ static int proto_ieee802154_nonask_phy = -1;
static int hf_ieee802154_nonask_phy_preamble = -1;
static int hf_ieee802154_nonask_phy_sfd = -1;
static int hf_ieee802154_nonask_phy_length = -1;
static int hf_ieee802154_nonask_phr = -1;
static int proto_ieee802154 = -1;
static int hf_ieee802154_frame_length = -1;
@ -258,10 +259,12 @@ static int hf_ieee802154_assoc_permit = -1;
static int hf_ieee802154_gts_count = -1;
static int hf_ieee802154_gts_permit = -1;
static int hf_ieee802154_gts_direction = -1;
static int hf_ieee802154_gts_address = -1;
static int hf_ieee802154_pending16 = -1;
static int hf_ieee802154_pending64 = -1;
/* Registered fields for Auxiliary Security Header */
static int hf_ieee802154_security_control_field = -1;
static int hf_ieee802154_security_level = -1;
static int hf_ieee802154_key_id_mode = -1;
static int hf_ieee802154_aux_sec_reserved = -1;
@ -489,19 +492,19 @@ dissect_ieee802154_nonask_phy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre
phr=tvb_get_guint8(tvb,offset+4+1);
if(tree) {
proto_tree *phr_tree;
proto_item *pi;
guint loffset=offset;
static const int * phr_fields[] = {
&hf_ieee802154_nonask_phy_length,
NULL
};
proto_tree_add_item(ieee802154_tree, hf_ieee802154_nonask_phy_preamble, tvb, loffset, 4, ENC_LITTLE_ENDIAN);
loffset+=4;
proto_tree_add_item(ieee802154_tree, hf_ieee802154_nonask_phy_sfd, tvb, loffset, 1, ENC_LITTLE_ENDIAN);
loffset+=1;
pi = proto_tree_add_text(ieee802154_tree, tvb, loffset, 1, "PHR: 0x%02x", phr);
phr_tree = proto_item_add_subtree(pi, ett_ieee802154_nonask_phy_phr);
proto_tree_add_uint(phr_tree, hf_ieee802154_nonask_phy_length, tvb, loffset, 1, phr);
proto_tree_add_bitmask(ieee802154_tree, tvb, loffset, hf_ieee802154_nonask_phr, ett_ieee802154_nonask_phy_phr,
phr_fields, ENC_NA);
}
offset+=4+2*1;
@ -830,7 +833,8 @@ dissect_ieee802154_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, g
ieee_hints->map_rec->start_fnum);
}
else {
ti = proto_tree_add_text(ieee802154_tree, tvb, 0, 0, "Origin: Pre-configured");
ti = proto_tree_add_uint_format_value(ieee802154_tree, hf_ieee802154_src64_origin, tvb, 0, 0,
ieee_hints->map_rec->start_fnum, "Pre-configured");
}
PROTO_ITEM_SET_GENERATED(ti);
}
@ -900,6 +904,12 @@ dissect_ieee802154_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, g
proto_tree *header_tree, *field_tree;
guint8 security_control;
guint aux_length = 5; /* Minimum length of the auxiliary header. */
static const int * security_fields[] = {
&hf_ieee802154_security_level,
&hf_ieee802154_key_id_mode,
&hf_ieee802154_aux_sec_reserved,
NULL
};
/* Parse the security control field. */
security_control = tvb_get_guint8(tvb, offset);
@ -914,11 +924,7 @@ dissect_ieee802154_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, g
ett_ieee802154_auxiliary_security, NULL, "Auxiliary Security Header");
/* Security Control Field */
ti = proto_tree_add_text(header_tree, tvb, offset, 1, "Security Control Field (0x%02x)", security_control);
field_tree = proto_item_add_subtree(ti, ett_ieee802154_aux_sec_control);
proto_tree_add_item(field_tree, hf_ieee802154_security_level, tvb, offset, 1, ENC_NA);
proto_tree_add_item(field_tree, hf_ieee802154_key_id_mode, tvb, offset, 1, ENC_NA);
proto_tree_add_item(field_tree, hf_ieee802154_aux_sec_reserved, tvb, offset, 1, ENC_NA);
proto_tree_add_bitmask(header_tree, tvb, offset, hf_ieee802154_security_control_field, ett_ieee802154_aux_sec_control, security_fields, ENC_NA);
offset++;
/* Frame Counter Field */
@ -1297,9 +1303,9 @@ dissect_ieee802154_gtsinfo(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr
if (tree) {
/* Add address, slot, and time length fields. */
ti = proto_tree_add_text(subtree, tvb, (*offset), 3, "{Address: 0x%04x", gts_addr);
ti = proto_tree_add_uint(subtree, hf_ieee802154_gts_address, tvb, (*offset), 3, gts_addr);
proto_item_append_text(ti, ", Slot: %i", gts_slot);
proto_item_append_text(ti, ", Length: %i}", gts_length);
proto_item_append_text(ti, ", Length: %i", gts_length);
}
(*offset) += 3;
} /* for */
@ -2430,6 +2436,10 @@ void proto_register_ieee802154(void)
{ &hf_ieee802154_nonask_phy_length,
{ "Frame Length", "wpan-nonask-phy.frame_length", FT_UINT8, BASE_HEX, NULL,
IEEE802154_PHY_LENGTH_MASK, NULL, HFILL }},
{ &hf_ieee802154_nonask_phr,
{ "PHR", "wpan-nonask-phy.phr", FT_UINT8, BASE_HEX, NULL,
0x0, NULL, HFILL }},
};
static hf_register_info hf[] = {
@ -2635,6 +2645,10 @@ void proto_register_ieee802154(void)
{ "Direction", "wpan.gts.direction", FT_BOOLEAN, BASE_NONE, TFS(&ieee802154_gts_direction_tfs), 0x0,
"A flag defining the direction of the GTS Slot.", HFILL }},
{ &hf_ieee802154_gts_address,
{ "Address", "wpan.gts.address", FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }},
{ &hf_ieee802154_pending16,
{ "Address", "wpan.pending16", FT_UINT16, BASE_HEX, NULL, 0x0,
"Device with pending data to receive.", HFILL }},
@ -2649,6 +2663,10 @@ void proto_register_ieee802154(void)
{ "Security Level", "wpan.aux_sec.sec_level", FT_UINT8, BASE_HEX, VALS(ieee802154_sec_level_names),
IEEE802154_AUX_SEC_LEVEL_MASK, "The Security Level of the frame", HFILL }},
{ &hf_ieee802154_security_control_field,
{ "Security Control Field", "wpan.aux_sec.security_control_field", FT_UINT8, BASE_HEX, NULL,
0x0, NULL, HFILL }},
{ &hf_ieee802154_key_id_mode,
{ "Key Identifier Mode", "wpan.aux_sec.key_id_mode", FT_UINT8, BASE_HEX, VALS(ieee802154_key_id_mode_names),
IEEE802154_AUX_KEY_ID_MODE_MASK,

View File

@ -149,6 +149,7 @@ static int hf_record_type = -1;
static int hf_aux_data_len = -1;
static int hf_maddr = -1;
static int hf_aux_data = -1;
static int hf_data = -1;
static int hf_mtrace_max_hops = -1;
static int hf_mtrace_saddr = -1;
static int hf_mtrace_raddr = -1;
@ -383,7 +384,7 @@ dissect_igmp_unknown(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int ty
/* Just call the rest of it "data" */
len = tvb_length_remaining(tvb, offset);
proto_tree_add_text(tree, tvb, offset, len, "Data");
proto_tree_add_item(tree, hf_data, tvb, offset, -1, ENC_NA);
offset += len;
return offset;
@ -1086,6 +1087,10 @@ proto_register_igmp(void)
{ "Aux Data", "igmp.aux_data", FT_BYTES, BASE_NONE,
NULL, 0, "IGMP V3 Auxiliary Data", HFILL }},
{ &hf_data,
{ "Data", "igmp.data", FT_BYTES, BASE_NONE,
NULL, 0, NULL, HFILL }},
{ &hf_max_resp_exp,
{ "Exponent", "igmp.max_resp.exp", FT_UINT8, BASE_HEX,
NULL, IGMP_MAX_RESP_EXP, "Maximum Response Time, Exponent", HFILL }},

View File

@ -835,9 +835,7 @@ dissect_imf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
/*
* Put this line.
*/
proto_tree_add_text(text_tree, tvb, start_offset, end_offset - start_offset,
"%s",
tvb_format_text_wsp(tvb, start_offset, end_offset - start_offset));
proto_tree_add_format_wsp_text(text_tree, tvb, start_offset, end_offset - start_offset);
col_append_sep_str(pinfo->cinfo, COL_INFO, ", ",
tvb_format_text_wsp(tvb, start_offset, end_offset - start_offset));

View File

@ -120,6 +120,14 @@ static gint hf_ipmi_picmg_01_rs_fruid = -1;
static gint hf_ipmi_picmg_01_rs_site_num = -1;
static gint hf_ipmi_picmg_01_rs_site_type = -1;
static gint hf_ipmi_picmg_02_shelf_address = -1;
static gint hf_ipmi_picmg_02_shelf_type = -1;
static gint hf_ipmi_picmg_02_shelf_length = -1;
static gint hf_ipmi_picmg_03_shelf_address = -1;
static gint hf_ipmi_picmg_03_shelf_type = -1;
static gint hf_ipmi_picmg_03_shelf_length = -1;
static gint hf_ipmi_picmg_04_fruid = -1;
static gint hf_ipmi_picmg_04_cmd = -1;
@ -152,7 +160,11 @@ static gint hf_ipmi_picmg_08_state_local = -1;
static gint hf_ipmi_picmg_08_lamptest_duration = -1;
static gint hf_ipmi_picmg_09_ipmba = -1;
static gint hf_ipmi_picmg_09_ipmba_link = -1;
static gint hf_ipmi_picmg_09_ipmba_state = -1;
static gint hf_ipmi_picmg_09_ipmbb = -1;
static gint hf_ipmi_picmg_09_ipmbb_link = -1;
static gint hf_ipmi_picmg_09_ipmbb_state = -1;
static gint hf_ipmi_picmg_0a_fruid = -1;
static gint hf_ipmi_picmg_0a_msk_d_locked = -1;
@ -733,7 +745,7 @@ rs01(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
static void
rs02(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
{
ipmi_add_typelen(tree, "Shelf Address", tvb, 0, TRUE);
ipmi_add_typelen(tree, hf_ipmi_picmg_02_shelf_address, hf_ipmi_picmg_02_shelf_type, hf_ipmi_picmg_02_shelf_length, tvb, 0, TRUE);
}
/* Set Shelf Address Info
@ -741,7 +753,7 @@ rs02(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
static void
rq03(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
{
ipmi_add_typelen(tree, "Shelf Address", tvb, 0, TRUE);
ipmi_add_typelen(tree, hf_ipmi_picmg_03_shelf_address, hf_ipmi_picmg_03_shelf_type, hf_ipmi_picmg_03_shelf_length, tvb, 0, TRUE);
}
/* FRU Control.
@ -866,8 +878,10 @@ rs08(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
/* Set IPMB State
*/
static const true_false_string tfs_local_control_override = { "Local Control State", "Override State (Isolate)" };
static void
parse_ipmb_state(proto_tree *tree, tvbuff_t *tvb, guint offs, int hf, int ett)
parse_ipmb_state(proto_tree *tree, tvbuff_t *tvb, guint offs, int hf, int hf_link, int hf_state, int ett)
{
char buf[32];
const char *desc;
@ -892,18 +906,17 @@ parse_ipmb_state(proto_tree *tree, tvbuff_t *tvb, guint offs, int hf, int ett)
ti = proto_tree_add_uint_format_value(tree, hf, tvb, 0, 1,
v, "%s, %s", desc, (v & 1) ? "Local Control" : "Override");
s_tree = proto_item_add_subtree(ti, ett);
proto_tree_add_text(s_tree, tvb, 0, 1, "%sLink: %s (0x%02x)",
ipmi_dcd8(v, 0xfe), desc, num);
proto_tree_add_text(s_tree, tvb, 0, 1, "%sState: %s",
ipmi_dcd8(v, 0x01), (v & 1) ? "Local Control State" : "Override State (Isolate)");
proto_tree_add_uint_format_value(s_tree, hf_link, tvb, 0, 1, v, "%s (0x%02x)",
desc, num);
proto_tree_add_item(s_tree, hf_state, tvb, 0, 1, ENC_NA);
}
}
static void
rq09(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
{
parse_ipmb_state(tree, tvb, 0, hf_ipmi_picmg_09_ipmba, ett_ipmi_picmg_09_ipmba);
parse_ipmb_state(tree, tvb, 1, hf_ipmi_picmg_09_ipmbb, ett_ipmi_picmg_09_ipmbb);
parse_ipmb_state(tree, tvb, 0, hf_ipmi_picmg_09_ipmba, hf_ipmi_picmg_09_ipmba_link, hf_ipmi_picmg_09_ipmba_state, ett_ipmi_picmg_09_ipmba);
parse_ipmb_state(tree, tvb, 1, hf_ipmi_picmg_09_ipmbb, hf_ipmi_picmg_09_ipmbb_link, hf_ipmi_picmg_09_ipmbb_state, ett_ipmi_picmg_09_ipmbb);
}
/* Set FRU Activation Policy
@ -2016,7 +2029,7 @@ rs2f(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
desc = "Reserved";
}
ti = proto_tree_add_text(tree, tvb, 0, 0, "Property selector: %s (0x%02x)", desc, pno);
ti = proto_tree_add_uint_format_value(tree, hf_ipmi_picmg_2f_comp_prop, tvb, 0, 0, pno, "%s (0x%02x)", desc, pno);
PROTO_ITEM_SET_GENERATED(ti);
if (pno < array_length(compprops)) {
compprops[pno].intrp(tvb, tree);
@ -2814,6 +2827,26 @@ proto_register_ipmi_picmg(void)
{ "Site Type",
"ipmi.picmg01.rs_site_type", FT_UINT8, BASE_HEX, VALS(site_type_vals), 0, NULL, HFILL }},
{ &hf_ipmi_picmg_02_shelf_address,
{ "Shelf Address",
"ipmi.picmg02.shelf_address", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
{ &hf_ipmi_picmg_02_shelf_type,
{ "Type",
"ipmi.picmg02.shelf_type", FT_UINT8, BASE_DEC, NULL, 0xc0, NULL, HFILL }},
{ &hf_ipmi_picmg_02_shelf_length,
{ "Length",
"ipmi.picmg02.shelf_length", FT_UINT8, BASE_DEC, NULL, 0x3f, NULL, HFILL }},
{ &hf_ipmi_picmg_03_shelf_address,
{ "Shelf Address",
"ipmi.picmg03.shelf_address", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
{ &hf_ipmi_picmg_03_shelf_type,
{ "Type",
"ipmi.picmg03.shelf_type", FT_UINT8, BASE_DEC, NULL, 0xc0, NULL, HFILL }},
{ &hf_ipmi_picmg_03_shelf_length,
{ "Length",
"ipmi.picmg03.shelf_length", FT_UINT8, BASE_DEC, NULL, 0x3f, NULL, HFILL }},
{ &hf_ipmi_picmg_04_fruid,
{ "FRU ID",
"ipmi.picmg04.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
@ -2900,9 +2933,21 @@ proto_register_ipmi_picmg(void)
{ &hf_ipmi_picmg_09_ipmba,
{ "IPMB-A State",
"ipmi.picmg09.ipmba", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
{ &hf_ipmi_picmg_09_ipmba_link,
{ "Link",
"ipmi.picmg09.ipmba_link", FT_UINT8, BASE_HEX, NULL, 0xFE, NULL, HFILL }},
{ &hf_ipmi_picmg_09_ipmba_state,
{ "State",
"ipmi.picmg09.ipmba_state", FT_BOOLEAN, 8, TFS(&tfs_local_control_override), 0x01, NULL, HFILL }},
{ &hf_ipmi_picmg_09_ipmbb,
{ "IPMB-B State",
"ipmi.picmg09.ipmbb", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
{ &hf_ipmi_picmg_09_ipmbb_link,
{ "Link",
"ipmi.picmg09.ipmbb_link", FT_UINT8, BASE_HEX, NULL, 0xFE, NULL, HFILL }},
{ &hf_ipmi_picmg_09_ipmbb_state,
{ "State",
"ipmi.picmg09.ipmbb_state", FT_BOOLEAN, 8, TFS(&tfs_local_control_override), 0x01, NULL, HFILL }},
{ &hf_ipmi_picmg_0a_fruid,
{ "FRU ID",

View File

@ -97,6 +97,9 @@ static gint ett_ipmi_se_2d_byte2 = -1;
static gint ett_ipmi_se_2d_b1 = -1;
static gint ett_ipmi_se_2d_b2 = -1;
static expert_field ei_ipmi_se_13_request_param_rev = EI_INIT;
static expert_field ei_ipmi_se_13_request_param_data = EI_INIT;
static gint hf_ipmi_se_evt_rev = -1;
static gint hf_ipmi_se_evt_sensor_type = -1;
static gint hf_ipmi_se_evt_sensor_num = -1;
@ -2290,7 +2293,7 @@ rq13(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
s_tree = proto_item_add_subtree(ti, ett_ipmi_se_13_byte1);
proto_tree_add_item(s_tree, hf_ipmi_se_13_getrev, tvb, 0, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_uint_format_value(s_tree, hf_ipmi_se_13_param, tvb, 0, 1,
pno, "Parameter selector: %s (0x%02x)", desc, pno);
pno, "%s (0x%02x)", desc, pno);
proto_tree_add_item(tree, hf_ipmi_se_13_set, tvb, 1, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(tree, hf_ipmi_se_13_block, tvb, 2, 1, ENC_LITTLE_ENDIAN);
@ -2305,7 +2308,7 @@ rs13(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
guint32 pno;
const char *desc;
proto_tree_add_bitmask_text(tree, tvb, 0, 1, "Parameter revision", NULL,
ti = proto_tree_add_bitmask_text(tree, tvb, 0, 1, "Parameter revision", NULL,
ett_ipmi_se_13_rev, byte1, ENC_LITTLE_ENDIAN, 0);
if (!ipmi_get_data(pinfo, 0, &pno)) {
@ -2317,11 +2320,9 @@ rs13(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
if ((pno & 0x80) && tvb_captured_length(tvb) > 1) {
ti = proto_tree_add_text(tree, tvb, 0, 0, "Requested parameter revision; parameter data returned");
PROTO_ITEM_SET_GENERATED(ti);
expert_add_info(pinfo, ti, &ei_ipmi_se_13_request_param_rev);
} else if (!(pno & 0x80) && tvb_captured_length(tvb) == 1) {
ti = proto_tree_add_text(tree, tvb, 0, 0, "Requested parameter data; only parameter version returned");
PROTO_ITEM_SET_GENERATED(ti);
expert_add_info(pinfo, ti, &ei_ipmi_se_13_request_param_data);
}
pno &= 0x7f;
@ -3651,8 +3652,17 @@ proto_register_ipmi_se(void)
&ett_ipmi_se_2d_b2,
};
static ei_register_info ei[] = {
{ &ei_ipmi_se_13_request_param_rev, { "ipmi.se13.request_param_rev", PI_PROTOCOL, PI_NOTE, "Requested parameter revision; parameter data returned", EXPFILL }},
{ &ei_ipmi_se_13_request_param_data, { "ipmi.se13.mrequest_param_data", PI_PROTOCOL, PI_NOTE, "Requested parameter data; only parameter version returned", EXPFILL }},
};
expert_module_t* expert_ipmi_se;
proto_register_field_array(proto_ipmi, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
expert_ipmi_se = expert_register_protocol(proto_ipmi);
expert_register_field_array(expert_ipmi_se, ei, array_length(ei));
ipmi_register_netfn_cmdtab(IPMI_SE_REQ, IPMI_OEM_NONE, NULL, 0, NULL,
cmd_se, array_length(cmd_se));

View File

@ -131,6 +131,7 @@ static gint ett_ipmi_trn_1a_byte1 = -1;
static gint ett_ipmi_trn_1a_byte2 = -1;
static gint ett_ipmi_trn_1b_byte1 = -1;
static gint ett_ipmi_trn_1b_byte2 = -1;
static gint ett_ipmi_trn_parameter = -1;
static gint hf_ipmi_trn_lan00_sip = -1;
@ -196,7 +197,8 @@ static gint hf_ipmi_trn_lan22_num_cs_entries = -1;
static gint hf_ipmi_trn_lan23_cs_entry = -1;
static gint hf_ipmi_trn_lan24_priv = -1;
static gint hf_ipmi_trn_lan24_priv1 = -1;
static gint hf_ipmi_trn_lan24_priv2 = -1;
static gint hf_ipmi_trn_lan25_dst_selector = -1;
static gint hf_ipmi_trn_lan25_addr_format = -1;
@ -476,6 +478,11 @@ static gint hf_ipmi_trn_1a_chan = -1;
static gint hf_ipmi_trn_1b_user = -1;
static gint hf_ipmi_trn_1b_chan = -1;
static expert_field ei_ipmi_trn_02_request_param_rev = EI_INIT;
static expert_field ei_ipmi_trn_02_request_param_data = EI_INIT;
static expert_field ei_ipmi_trn_11_request_param_rev = EI_INIT;
static expert_field ei_ipmi_trn_11_request_param_data = EI_INIT;
static const value_string lan00_sip_vals[] = {
{ 0x00, "Set complete" },
{ 0x01, "Set in progress" },
@ -926,12 +933,10 @@ lan_24(tvbuff_t *tvb, proto_tree *tree)
*ett[i], NULL, "Cipher Suite #%d: %s (0x%02x), Cipher Suite #%d: %s (0x%02x)",
i * 2 + 1, val_to_str_const(v1, lan24_priv_vals, "Reserved"), v1,
i * 2 + 2, val_to_str_const(v2, lan24_priv_vals, "Reserved"), v2);
proto_tree_add_uint_format(s_tree, hf_ipmi_trn_lan24_priv, tvb, i + 1, 1,
v2 << 4, "%sMaximum Privilege Level for Cipher Suite #%d: %s (0x%02x)",
ipmi_dcd8(v, 0xf0), i * 2 + 2, val_to_str_const(v2, lan24_priv_vals, "Reserved"), v2);
proto_tree_add_uint_format(s_tree, hf_ipmi_trn_lan24_priv, tvb, i + 1, 1,
v1, "%sMaximum Privilege Level for Cipher Suite #%d: %s (0x%02x)",
ipmi_dcd8(v, 0x0f), i * 2 + 1, val_to_str_const(v1, lan24_priv_vals, "Reserved"), v1);
proto_tree_add_uint_format_value(s_tree, hf_ipmi_trn_lan24_priv1, tvb, i + 1, 1,
v2 << 4, " #%d: %s (0x%02x)", i * 2 + 2, val_to_str_const(v2, lan24_priv_vals, "Reserved"), v2);
proto_tree_add_uint_format_value(s_tree, hf_ipmi_trn_lan24_priv2, tvb, i + 1, 1,
v1, " #%d: %s (0x%02x)", i * 2 + 1, val_to_str_const(v1, lan24_priv_vals, "Reserved"), v1);
}
}
@ -1069,11 +1074,12 @@ rs02(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
{
static const int *byte1[] = { &hf_ipmi_trn_02_rev_present, &hf_ipmi_trn_02_rev_compat, NULL };
proto_item *ti;
proto_tree *subtree;
tvbuff_t *next;
const char *desc;
guint32 pno, req;
proto_tree_add_bitmask_text(tree, tvb, 0, 1, NULL, NULL,
ti = proto_tree_add_bitmask_text(tree, tvb, 0, 1, NULL, NULL,
ett_ipmi_trn_02_rev, byte1, ENC_LITTLE_ENDIAN, 0);
if (!ipmi_get_data(pinfo, 0, &pno) || !ipmi_get_data(pinfo, 1, &req)) {
@ -1085,11 +1091,9 @@ rs02(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
}
if ((req & 0x80) && tvb_captured_length(tvb) > 1) {
ti = proto_tree_add_text(tree, tvb, 0, 0, "Requested parameter revision; parameter data returned");
PROTO_ITEM_SET_GENERATED(ti);
expert_add_info(pinfo, ti, &ei_ipmi_trn_02_request_param_rev);
} else if (!(req & 0x80) && tvb_captured_length(tvb) == 1) {
ti = proto_tree_add_text(tree, tvb, 0, 0, "Requested parameter data; only parameter version returned");
PROTO_ITEM_SET_GENERATED(ti);
expert_add_info(pinfo, ti, &ei_ipmi_trn_02_request_param_data);
}
if (pno < array_length(lan_options)) {
@ -1100,15 +1104,14 @@ rs02(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
desc = "Reserved";
}
ti = proto_tree_add_text(tree, tvb, 0, 0, "Parameter: %s", desc);
PROTO_ITEM_SET_GENERATED(ti);
subtree = proto_tree_add_subtree_format(tree, tvb, 0, 0, ett_ipmi_trn_parameter, NULL, "Parameter: %s", desc);
if (tvb_captured_length(tvb) > 1) {
if (pno < array_length(lan_options)) {
next = tvb_new_subset_remaining(tvb, 1);
lan_options[pno].intrp(next, tree);
lan_options[pno].intrp(next, subtree);
} else {
proto_tree_add_item(tree, hf_ipmi_trn_02_param_data, tvb, 1, -1, ENC_NA);
proto_tree_add_item(subtree, hf_ipmi_trn_02_param_data, tvb, 1, -1, ENC_NA);
}
}
}
@ -1835,11 +1838,12 @@ rs11(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
{
static const int *byte1[] = { &hf_ipmi_trn_11_rev_present, &hf_ipmi_trn_11_rev_compat, NULL };
proto_item *ti;
proto_tree *subtree;
tvbuff_t *next;
const char *desc;
guint32 pno, req;
proto_tree_add_bitmask_text(tree, tvb, 0, 1, NULL, NULL,
ti = proto_tree_add_bitmask_text(tree, tvb, 0, 1, NULL, NULL,
ett_ipmi_trn_11_rev, byte1, ENC_LITTLE_ENDIAN, 0);
if (!ipmi_get_data(pinfo, 0, &pno) || !ipmi_get_data(pinfo, 1, &req)) {
@ -1859,22 +1863,19 @@ rs11(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
}
if ((req & 0x80) && tvb_captured_length(tvb) > 1) {
ti = proto_tree_add_text(tree, tvb, 0, 0, "Requested parameter revision; parameter data returned");
PROTO_ITEM_SET_GENERATED(ti);
expert_add_info(pinfo, ti, &ei_ipmi_trn_11_request_param_rev);
} else if (!(req & 0x80) && tvb_captured_length(tvb) == 1) {
ti = proto_tree_add_text(tree, tvb, 0, 0, "Requested parameter data; only parameter version returned");
PROTO_ITEM_SET_GENERATED(ti);
expert_add_info(pinfo, ti, &ei_ipmi_trn_11_request_param_data);
}
ti = proto_tree_add_text(tree, tvb, 0, 0, "Parameter: %s", desc);
PROTO_ITEM_SET_GENERATED(ti);
subtree = proto_tree_add_subtree_format(tree, tvb, 0, 0, ett_ipmi_trn_parameter, NULL, "Parameter: %s", desc);
if (tvb_captured_length(tvb) > 1) {
if (pno < array_length(serial_options)) {
next = tvb_new_subset_remaining(tvb, 1);
serial_options[pno].intrp(next, tree);
serial_options[pno].intrp(next, subtree);
} else {
proto_tree_add_item(tree, hf_ipmi_trn_11_param_data, tvb, 1, -1, ENC_NA);
proto_tree_add_item(subtree, hf_ipmi_trn_11_param_data, tvb, 1, -1, ENC_NA);
}
}
}
@ -2317,9 +2318,13 @@ proto_register_ipmi_transport(void)
{ "Cipher Suite ID",
"ipmi.lan23.cs_entry", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
{ &hf_ipmi_trn_lan24_priv,
{ "Maximum Privilege Level",
"ipmi.lan24.priv", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
{ &hf_ipmi_trn_lan24_priv1,
{ "Maximum Privilege Level for Cipher Suite",
"ipmi.lan24.priv", FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL }},
{ &hf_ipmi_trn_lan24_priv2,
{ "Maximum Privilege Level for Cipher Suite",
"ipmi.lan24.priv", FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL }},
{ &hf_ipmi_trn_lan25_dst_selector,
{ "Destination Selector",
@ -3174,10 +3179,22 @@ proto_register_ipmi_transport(void)
&ett_ipmi_trn_1a_byte2,
&ett_ipmi_trn_1b_byte1,
&ett_ipmi_trn_1b_byte2,
&ett_ipmi_trn_parameter
};
static ei_register_info ei[] = {
{ &ei_ipmi_trn_02_request_param_rev, { "ipmi.tr02.request_param_rev", PI_PROTOCOL, PI_NOTE, "Requested parameter revision; parameter data returned", EXPFILL }},
{ &ei_ipmi_trn_02_request_param_data, { "ipmi.tr02.mrequest_param_data", PI_PROTOCOL, PI_NOTE, "Requested parameter data; only parameter version returned", EXPFILL }},
{ &ei_ipmi_trn_11_request_param_rev, { "ipmi.tr11.request_param_rev", PI_PROTOCOL, PI_NOTE, "Requested parameter revision; parameter data returned", EXPFILL }},
{ &ei_ipmi_trn_11_request_param_data, { "ipmi.tr11.mrequest_param_data", PI_PROTOCOL, PI_NOTE, "Requested parameter data; only parameter version returned", EXPFILL }},
};
expert_module_t* expert_ipmi_trn;
proto_register_field_array(proto_ipmi, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
expert_ipmi_trn = expert_register_protocol(proto_ipmi);
expert_register_field_array(expert_ipmi_trn, ei, array_length(ei));
ipmi_register_netfn_cmdtab(IPMI_TRANSPORT_REQ, IPMI_OEM_NONE, NULL, 0, NULL,
cmd_transport, array_length(cmd_transport));
}

View File

@ -57,6 +57,9 @@ static gint hf_vita_site_type = -1;
static gint hf_vita_site_num = -1;
static gint hf_vita_ipmbl_addr = -1;
static gint hf_vita_chassis_identifier = -1;
static gint hf_vita_chassis_identifier_type = -1;
static gint hf_vita_chassis_identifier_length = -1;
static gint hf_vita_ipmc = -1;
static gint hf_vita_tier = -1;
static gint hf_vita_layer = -1;
@ -481,6 +484,15 @@ static hf_register_info hf_ipmi_vita[] = {
{ &hf_vita_ipmbl_addr,
{ "Address on IPMI Channel 7", "ipmi.vita.ipmbl.addr",
FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
{ &hf_vita_chassis_identifier,
{ "Chassis Identifier",
"ipmi.vita.chassis_identifier", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
{ &hf_vita_chassis_identifier_type,
{ "Type",
"ipmi.vita.chassis_identifier_type", FT_UINT8, BASE_DEC, NULL, 0xc0, NULL, HFILL }},
{ &hf_vita_chassis_identifier_length,
{ "Length",
"ipmi.vita.chassis_identifier_length", FT_UINT8, BASE_DEC, NULL, 0x3f, NULL, HFILL }},
{ &hf_vita_reserved,
{ "Reserved", "ipmi.vita.reserved",
FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
@ -840,7 +852,7 @@ cmd01_rs(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
static void
cmd02_rs(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
{
ipmi_add_typelen(tree, "Chassis Identifier", tvb, 0, TRUE);
ipmi_add_typelen(tree, hf_vita_chassis_identifier, hf_vita_chassis_identifier_type, hf_vita_chassis_identifier_length, tvb, 0, TRUE);
}
/* FRU Control (request)

View File

@ -544,6 +544,7 @@ dissect_ipmi_cmd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
/* add parent node */
if (!data->curr_level) {
ti = proto_tree_add_item(tree, hf_parent_item, tvb, 0, -1, ENC_NA);
cmd_tree = proto_item_add_subtree(ti, ett_tree);
} else {
char str[ITEM_LABEL_LENGTH];
@ -553,15 +554,14 @@ dissect_ipmi_cmd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
} else {
g_snprintf(str, ITEM_LABEL_LENGTH, "Req, %s", cmd->desc);
}
if (proto_registrar_get_ftype(hf_parent_item) == FT_STRING)
if (proto_registrar_get_ftype(hf_parent_item) == FT_STRING) {
ti = proto_tree_add_string(tree, hf_parent_item, tvb, 0, -1, str);
cmd_tree = proto_item_add_subtree(ti, ett_tree);
}
else
ti = proto_tree_add_text(tree, tvb, 0, -1, "%s", str);
cmd_tree = proto_tree_add_subtree(tree, tvb, 0, -1, ett_tree, NULL, str);
}
/* add message sub-tree */
cmd_tree = proto_item_add_subtree(ti, ett_tree);
if (data->curr_level < MAX_NEST_LEVEL) {
/* check if response */
if (ctx->hdr.netfn & 1) {
@ -1007,7 +1007,7 @@ static struct ipmi_parse_typelen ptl_unicode = {
};
void
ipmi_add_typelen(proto_tree *tree, const char *desc, tvbuff_t *tvb,
ipmi_add_typelen(proto_tree *tree, int hf_string, int hf_type, int hf_length, tvbuff_t *tvb,
guint offs, gboolean is_fru)
{
static struct ipmi_parse_typelen *fru_eng[4] = {
@ -1046,14 +1046,14 @@ ipmi_add_typelen(proto_tree *tree, const char *desc, tvbuff_t *tvb,
str[clen] = '\0';
s_tree = proto_tree_add_subtree_format(tree, tvb, offs, 1, ett_typelen, NULL,
"%s Type/Length byte: %s, %d %s", desc, ptr->desc, len, unit);
proto_tree_add_text(s_tree, tvb, offs, 1, "%sType: %s (0x%02x)",
ipmi_dcd8(typelen, 0xc0), ptr->desc, type);
proto_tree_add_text(s_tree, tvb, offs, 1, "%sLength: %d %s",
ipmi_dcd8(typelen, msk), len, unit);
"%s Type/Length byte: %s, %d %s", (proto_registrar_get_nth(hf_string))->name, ptr->desc, len, unit);
proto_tree_add_uint_format_value(s_tree, hf_type, tvb, offs, 1, type, "%s (0x%02x)",
ptr->desc, type);
proto_tree_add_uint_format_value(s_tree, hf_length, tvb, offs, 1, len, "%d %s",
len, unit);
proto_tree_add_text(tree, tvb, offs + 1, blen, "%s: [%s] '%s'",
desc, ptr->desc, str);
proto_tree_add_string_format_value(tree, hf_string, tvb, offs + 1, blen, str,
"[%s] '%s'", ptr->desc, str);
}
/* ----------------------------------------------------------------
@ -1215,15 +1215,6 @@ ipmi_notimpl(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
proto_tree_add_expert(tree, pinfo, &ei_impi_parser_not_implemented, tvb, 0, -1);
}
char *
ipmi_dcd8(guint32 val, guint32 mask)
{
static char buf[64];
decode_bitfield_value(buf, val, mask, 8);
return buf;
}
void
ipmi_fmt_10ms_1based(gchar *s, guint32 v)
{

View File

@ -123,16 +123,13 @@ typedef struct ipmi_netfn_handler {
guint32 cmdtablen;
} ipmi_netfn_t;
/* Handy wrapper around decode_bitfield_value() */
char *ipmi_dcd8(guint32 val, guint32 mask);
/* Stub parser. Use this to substitute for not-yet-written subparsers;
NULL in command table means 'no custom data in this request/response' */
void ipmi_notimpl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
#define IPMI_TBD ipmi_notimpl, ipmi_notimpl
/* Add a Type/Length field to tree */
void ipmi_add_typelen(proto_tree *tree, const char *desc, tvbuff_t *tvb,
void ipmi_add_typelen(proto_tree *tree, int hf_string, int hf_type, int hf_length, tvbuff_t *tvb,
guint offs, gboolean is_fru);
/* Add Timestamp in IPMI format */

View File

@ -31,6 +31,10 @@ void proto_register_udpencap(void);
void proto_reg_handoff_udpencap(void);
static int proto_udpencap = -1;
static int hf_nat_keepalive = -1;
static int hf_non_esp_marker = -1;
static gint ett_udpencap = -1;
static dissector_handle_t esp_handle;
@ -44,39 +48,32 @@ static void
dissect_udpencap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
tvbuff_t *next_tvb;
proto_tree *udpencap_tree = NULL;
proto_item *ti = NULL;
proto_tree *udpencap_tree;
proto_item *ti;
guint32 spi;
col_set_str(pinfo->cinfo, COL_PROTOCOL, "UDPENCAP");
col_clear(pinfo->cinfo, COL_INFO);
if (tree) {
ti = proto_tree_add_item(tree, proto_udpencap, tvb, 0, -1, ENC_NA);
udpencap_tree = proto_item_add_subtree(ti, ett_udpencap);
}
ti = proto_tree_add_item(tree, proto_udpencap, tvb, 0, -1, ENC_NA);
udpencap_tree = proto_item_add_subtree(ti, ett_udpencap);
/* 1 byte of 0xFF indicates NAT-keepalive */
if ((tvb_length(tvb) == 1) && (tvb_get_guint8(tvb, 0) == 0xff)) {
col_set_str(pinfo->cinfo, COL_INFO, "NAT-keepalive");
if (tree)
proto_tree_add_text(udpencap_tree, tvb, 0, 1, "NAT-keepalive packet");
proto_tree_add_item(udpencap_tree, hf_nat_keepalive, tvb, 0, 1, ENC_NA);
} else {
/* SPI of zero indicates IKE traffic, otherwise it's ESP */
tvb_memcpy(tvb, (guint8 *)&spi, 0, sizeof(spi));
spi = tvb_get_ntohl(tvb, 0);
if (spi == 0) {
col_set_str(pinfo->cinfo, COL_INFO, "ISAKMP");
if (tree) {
proto_tree_add_text(udpencap_tree, tvb, 0, sizeof(spi),
"Non-ESP Marker");
proto_item_set_len(ti, sizeof(spi));
}
next_tvb = tvb_new_subset_remaining(tvb, sizeof(spi));
proto_tree_add_item(udpencap_tree, hf_non_esp_marker, tvb, 0, 4, ENC_NA);
proto_item_set_len(ti, 4);
next_tvb = tvb_new_subset_remaining(tvb, 4);
call_dissector(isakmp_handle, next_tvb, pinfo, tree);
} else {
col_set_str(pinfo->cinfo, COL_INFO, "ESP");
if (tree)
proto_item_set_len(ti, 0);
proto_item_set_len(ti, 0);
call_dissector(esp_handle, tvb, pinfo, tree);
}
}
@ -85,12 +82,20 @@ dissect_udpencap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
void
proto_register_udpencap(void)
{
static hf_register_info hf[] = {
{ &hf_nat_keepalive, { "NAT-keepalive packet", "udpencap.nat_keepalive",
FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL }},
{ &hf_non_esp_marker, { "Non-ESP Marker", "udpencap.non_esp_marker",
FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL }},
};
static gint *ett[] = {
&ett_udpencap,
};
proto_udpencap = proto_register_protocol(
"UDP Encapsulation of IPsec Packets", "UDPENCAP", "udpencap");
proto_register_field_array(proto_udpencap, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
}

View File

@ -176,12 +176,10 @@ dissect_ipxwan(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
while (num_options != 0) {
option_number = tvb_get_guint8(tvb, offset);
ti = proto_tree_add_text(ipxwan_tree, tvb, offset, -1,
"Option: %s",
option_tree = proto_tree_add_subtree_format(ipxwan_tree, tvb, offset, -1,
ett_ipxwan_option, &ti, "Option: %s",
val_to_str(option_number, ipxwan_option_num_vals,
"Unknown (%u)"));
option_tree = proto_item_add_subtree(ti,
ett_ipxwan_option);
proto_tree_add_uint(option_tree, hf_ipxwan_option_num,
tvb, offset, 1, option_number);

View File

@ -56,6 +56,9 @@ static int hf_isl_src = -1;
static int hf_isl_addr = -1;
static int hf_isl_len = -1;
static int hf_isl_hsa = -1;
static int hf_isl_dsap = -1;
static int hf_isl_ssap = -1;
static int hf_isl_control = -1;
static int hf_isl_vlan_id = -1;
static int hf_isl_bpdu = -1;
static int hf_isl_index = -1;
@ -229,11 +232,10 @@ dissect_isl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int fcs_len)
}
if (tree) {
tvb_ensure_bytes_exist(payload_tvb, 0, 6);
/* This part looks sort of like a SNAP-encapsulated LLC header... */
proto_tree_add_text(fh_tree, payload_tvb, 0, 1, "DSAP: 0x%X", tvb_get_guint8(tvb, 14));
proto_tree_add_text(fh_tree, payload_tvb, 1, 1, "SSAP: 0x%X", tvb_get_guint8(tvb, 15));
proto_tree_add_text(fh_tree, payload_tvb, 2, 1, "Control: 0x%X", tvb_get_guint8(tvb, 16));
proto_tree_add_item(fh_tree, hf_isl_dsap, payload_tvb, 0, 1, ENC_NA);
proto_tree_add_item(fh_tree, hf_isl_ssap, payload_tvb, 1, 1, ENC_NA);
proto_tree_add_item(fh_tree, hf_isl_control, payload_tvb, 2, 1, ENC_NA);
/* ...but this is the manufacturer's ID portion of the source address
field (which is, admittedly, an OUI). */
@ -353,6 +355,15 @@ proto_register_isl(void)
{ &hf_isl_hsa,
{ "HSA", "isl.hsa", FT_UINT24, BASE_HEX, NULL, 0x0,
"High bits of source address", HFILL }},
{ &hf_isl_dsap,
{ "DSAP", "isl.dsap", FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }},
{ &hf_isl_ssap,
{ "SSAP", "isl.ssap", FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }},
{ &hf_isl_control,
{ "Control", "isl.control", FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }},
{ &hf_isl_vlan_id,
{ "VLAN ID", "isl.vlan_id", FT_UINT16, BASE_DEC, NULL,
0xFFFE, "Virtual LAN ID (Color)", HFILL }},

View File

@ -32,6 +32,7 @@
#include <glib.h>
#include <epan/packet.h>
#include <epan/expert.h>
#include <epan/exceptions.h>
#include <epan/conversation.h>
#include <epan/prefs.h>
@ -178,7 +179,8 @@ static int hf_isns_pg_portal_port = -1;
static int hf_isns_pg_index = -1;
static int hf_isns_pg_next_index = -1;
static expert_field ei_isns_portal_ip_addr = EI_INIT;
static expert_field ei_isns_not_first_pdu = EI_INIT;
/* Desegment iSNS over TCP messages */
static gboolean isns_desegment = TRUE;
@ -555,9 +557,17 @@ dissect_isns_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
proto_item *ti;
proto_tree *isns_tree;
guint16 flags;
proto_tree *tt;
proto_item *tflags;
proto_tree *tt = NULL;
proto_item *tpayload;
static const int * isns_flags[] = {
&hf_isns_client,
&hf_isns_server,
&hf_isns_auth,
&hf_isns_replace,
&hf_isns_last_pdu,
&hf_isns_first_pdu,
NULL
};
/* Make entries in Protocol column and Info column on summary display */
col_set_str(pinfo->cinfo, COL_PROTOCOL, "iSNS");
@ -571,9 +581,6 @@ dissect_isns_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
val_to_str_ext(function_id, &isns_function_ids_ext,
"Unknown function ID 0x%04x"));
if (tree == NULL)
return tvb_length(tvb);
/* create display subtree for the protocol */
ti = proto_tree_add_item(tree, proto_isns, tvb, 0, -1, ENC_NA);
isns_tree = proto_item_add_subtree(ti, ett_isns);
@ -583,20 +590,9 @@ dissect_isns_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
proto_tree_add_item(isns_tree, hf_isns_function_id, tvb, offset+2, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(isns_tree, hf_isns_pdu_length, tvb, offset+4, 2, ENC_BIG_ENDIAN);
/*FLAGS*/
flags = tvb_get_ntohs(tvb, offset + 6);
tflags = proto_tree_add_item(isns_tree, hf_isns_flags, tvb, offset+6, 2, ENC_BIG_ENDIAN);
tt = proto_item_add_subtree(tflags, ett_isns_flags);
proto_tree_add_boolean(tt, hf_isns_client, tvb, offset+6, 2, flags);
proto_tree_add_boolean(tt, hf_isns_server, tvb, offset+6, 2, flags);
proto_tree_add_boolean(tt, hf_isns_auth, tvb, offset+6, 2, flags);
proto_tree_add_boolean(tt, hf_isns_replace, tvb, offset+6, 2, flags);
proto_tree_add_boolean(tt, hf_isns_last_pdu, tvb, offset+6, 2, flags);
proto_tree_add_boolean(tt, hf_isns_first_pdu, tvb, offset+6, 2, flags);
proto_tree_add_bitmask(isns_tree, tvb, offset+6, hf_isns_flags, ett_isns_flags, isns_flags, ENC_BIG_ENDIAN);
proto_tree_add_item(isns_tree, hf_isns_transaction_id, tvb, offset+8, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(isns_tree, hf_isns_sequence_id, tvb, offset+10, 2, ENC_BIG_ENDIAN);
tpayload = proto_tree_add_item(isns_tree, hf_isns_payload, tvb, offset+12, -1, ENC_NA);
@ -674,7 +670,7 @@ dissect_isns_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
default:
/* we can only look at the attributes for the first PDU */
if(!(flags&ISNS_FLAGS_FIRST_PDU)){
proto_tree_add_text(tt, tvb, offset, -1, "This is not the first PDU. The attributes are not decoded");
proto_tree_add_expert(tt, pinfo, &ei_isns_not_first_pdu, tvb, offset, -1);
return tvb_length(tvb);
}
@ -819,8 +815,7 @@ dissect_isns_attr_integer(tvbuff_t *tvb, guint offset, proto_tree *parent_tree,
item = proto_tree_add_uint_format_value(parent_tree, hf_isns_portal_group_tag, tvb, offset, 8, 0, "<NULL>");
tree = proto_item_add_subtree(item, ett_isns_attribute);
} else {
item = proto_tree_add_text(parent_tree, tvb, offset, 8, "Oops, you surprised me here. a 0 byte integer.");
tree = proto_item_add_subtree(item, ett_isns_attribute);
tree = proto_tree_add_subtree(parent_tree, tvb, offset, 8, ett_isns_attribute, NULL, "Oops, you surprised me here. a 0 byte integer.");
}
proto_tree_add_uint(tree, hf_isns_attr_tag, tvb, offset, 4, tag);
@ -1075,7 +1070,7 @@ AddAttribute(packet_info *pinfo, tvbuff_t *tvb, proto_tree *tree, guint offset,
case ISNS_ATTR_TAG_PORTAL_IP_ADDRESS:
switch(len){
case 64:
proto_tree_add_text(tree, tvb, offset, -1, "Broken iSNS implementation. The PORTAL_IP_ADDRESS tag should be 16 bytes in length");
proto_tree_add_expert(tree, pinfo, &ei_isns_portal_ip_addr, tvb, offset, -1);
case 16:
dissect_isns_attr_ip_address(tvb, offset, tree, hf_isns_portal_ip_addr, tag, 16);
break;
@ -1084,34 +1079,27 @@ AddAttribute(packet_info *pinfo, tvbuff_t *tvb, proto_tree *tree, guint offset,
}
break;
case ISNS_ATTR_TAG_PORTAL_PORT:
if(len != 4) THROW(ReportedBoundsError);
dissect_isns_attr_port(tvb, offset, tree, hf_isns_portal_port, tag, len, ISNS_OTHER_PORT, pinfo);
break;
case ISNS_ATTR_TAG_PORTAL_SYMBOLIC_NAME:
dissect_isns_attr_string(tvb, offset, tree, hf_isns_portal_symbolic_name, tag, len);
break;
case ISNS_ATTR_TAG_ESI_INTERVAL:
if(len != 4) THROW(ReportedBoundsError);
dissect_isns_attr_integer(tvb, offset, tree, hf_isns_esi_interval, tag, len, function_id);
break;
case ISNS_ATTR_TAG_ESI_PORT:
if(len != 4) THROW(ReportedBoundsError);
dissect_isns_attr_port(tvb, offset, tree, hf_isns_esi_port, tag, len, ISNS_ESI_PORT, pinfo);
break;
case ISNS_ATTR_TAG_PORTAL_INDEX:
if(len != 4) THROW(ReportedBoundsError);
dissect_isns_attr_integer(tvb, offset, tree, hf_isns_portal_index, tag, len, function_id);
break;
case ISNS_ATTR_TAG_SCN_PORT:
if(len != 4) THROW(ReportedBoundsError);
dissect_isns_attr_port(tvb, offset, tree, hf_isns_scn_port, tag, len, ISNS_SCN_PORT, pinfo);
break;
case ISNS_ATTR_TAG_PORTAL_NEXT_INDEX:
if(len != 4) THROW(ReportedBoundsError);
dissect_isns_attr_integer(tvb, offset, tree, hf_isns_portal_next_index, tag, len, function_id);
break;
case ISNS_ATTR_TAG_PORTAL_SECURITY_BITMAP:
if(len != 4) THROW(ReportedBoundsError);
dissect_isns_attr_portal_security_bitmap(tvb, offset, tree, hf_isns_psb, tag, len);
break;
case ISNS_ATTR_TAG_PORTAL_ISAKMP_PHASE_1:
@ -1158,7 +1146,8 @@ AddAttribute(packet_info *pinfo, tvbuff_t *tvb, proto_tree *tree, guint offset,
case ISNS_ATTR_TAG_PG_PORTAL_IP_ADDR:
switch(len){
case 64:
proto_tree_add_text(tree, tvb, offset, -1, "Broken iSNS implementation. The PG_PORTAL_IP_ADDRESS tag should be 16 bytes in length");
proto_tree_add_expert_format(tree, pinfo, &ei_isns_portal_ip_addr, tvb, offset, -1,
"Broken iSNS implementation. The PG_PORTAL_IP_ADDRESS tag should be 16 bytes in length");
case 16:
dissect_isns_attr_ip_address(tvb, offset, tree, hf_isns_pg_portal_ip_addr, tag, 16);
break;
@ -1918,13 +1907,22 @@ void proto_register_isns(void)
&ett_isns_port,
&ett_isns_isnt
};
static ei_register_info ei[] = {
{ &ei_isns_portal_ip_addr, { "isns.portal.ip_address.malformed", PI_MALFORMED, PI_ERROR, "Broken iSNS implementation. The PORTAL_IP_ADDRESS tag should be 16 bytes in length", EXPFILL }},
{ &ei_isns_not_first_pdu, { "isns.not_first_pdu", PI_PROTOCOL, PI_WARN, "This is not the first PDU. The attributes are not decoded", EXPFILL }},
};
module_t *isns_module;
expert_module_t* expert_isns;
/* Register the protocol name and description */
proto_isns = proto_register_protocol("iSNS",
"iSNS", "isns");
proto_register_field_array(proto_isns, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
expert_isns = expert_register_protocol(proto_isns);
expert_register_field_array(expert_isns, ei, array_length(ei));
/* Register preferences */
isns_module = prefs_register_protocol(proto_isns, NULL);

View File

@ -1195,6 +1195,23 @@ proto_tree_add_format_text(proto_tree *tree, tvbuff_t *tvb, gint start, gint len
return pi;
}
proto_item *
proto_tree_add_format_wsp_text(proto_tree *tree, tvbuff_t *tvb, gint start, gint length)
{
proto_item *pi;
header_field_info *hfinfo;
TRY_TO_FAKE_THIS_ITEM(tree, hf_text_only, hfinfo, tvb);
pi = proto_tree_add_text_node(tree, tvb, start, length);
TRY_TO_FAKE_THIS_REPR(pi);
proto_item_set_text(pi, "%s", tvb_format_text_wsp(tvb, start, length));
return pi;
}
void proto_report_dissector_bug(const char *message)
{
if (getenv("WIRESHARK_ABORT_ON_DISSECTOR_BUG") != NULL)

View File

@ -956,6 +956,10 @@ proto_tree_add_subtree_format(proto_tree *tree, tvbuff_t *tvb, gint start, gint
proto_item *
proto_tree_add_format_text(proto_tree *tree, tvbuff_t *tvb, gint start, gint length);
/** Add a text-only node to a proto_tree with tvb_format_text_wsp() string. */
proto_item *
proto_tree_add_format_wsp_text(proto_tree *tree, tvbuff_t *tvb, gint start, gint length);
/** Add a FT_NONE field to a proto_tree.
@param tree the tree to append this item to
@param hfindex field index