Support AECP vendor unique command and response messages.

Added support for registering custom dissectors for AECP vendor unique command and response message
dissection.

Fixed a minor typo

Change-Id: I7ae363f126d4db513be0529fc6dd7fd189d4f3d8
Reviewed-on: https://code.wireshark.org/review/22438
Petri-Dish: Guy Harris <guy@alum.mit.edu>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Guy Harris <guy@alum.mit.edu>
This commit is contained in:
Daniel McLean 2017-06-28 15:12:10 +10:00 committed by Guy Harris
parent dbcf160c38
commit 8cee782474
1 changed files with 26 additions and 2 deletions

View File

@ -1261,6 +1261,8 @@ void proto_reg_handoff_17221(void);
#define AEM_OFFSET_COMPRESS_MODE 6
#define AEM_OFFSET_COLOR_SPACE 7
/* AECP Vendor Unique Command Specific Offsets */
#define AECP_VUC_OFFSET_PROTOCOL_ID 22
/* AECP Video Cluster Format Offsets */
/* IEEE 1722.1 draft D21 section 7.3.7 */
@ -1734,7 +1736,7 @@ static const value_string aecp_message_type_vals[] = {
{AECP_AVC_COMMAND_MESSAGE, "AVC_COMMAND"},
{AECP_AVC_RESPONSE_MESSAGE, "AVC_RESPONSE"},
{AECP_VENDOR_UNIQUE_COMMAND_MESSAGE, "VENDOR_UNIQUE_COMMAND"},
{AECP_VENDOR_UNIQUE_RESPONSE_MESSAGE, "VENDOR_UNIQUEU_RESPONSE"},
{AECP_VENDOR_UNIQUE_RESPONSE_MESSAGE, "VENDOR_UNIQUE_RESPONSE"},
{AECP_EXTENDED_COMMAND_MESSAGE, "EXTENDED_COMMAND"},
{AECP_EXTENDED_RESPONSE_MESSAGE, "EXTENDED_RESPONSE"},
{0, NULL }
@ -1968,6 +1970,8 @@ static int hf_adp_chan_format_22ch = -1;
static int hf_adp_chan_format_24ch = -1;
#endif
/* AECP Vendor Unique Protocol Dissector table */
static dissector_table_t vendor_unique_protocol_dissector_table;
/* ***************************************************************** */
/* AVDECC Enumeration and Control Protocol Data Unit (AECPDU) */
@ -2130,6 +2134,7 @@ static int hf_aecp_u_flag = -1;
static int hf_aecp_unlock_flag = -1;
/* static int hf_aecp_values = -1; */
/* static int hf_aecp_values_count = -1; */
static int hf_aecp_vendor_unique_protocol_id = -1;
static int hf_aecp_video_format = -1;
static int hf_aecp_status_code = -1;
static int hf_aecp_backup_talker_entity_id_0 = -1;
@ -3810,6 +3815,8 @@ dissect_17221_aecp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *aecp_tree)
proto_item *mr_subtree;
proto_item *mr_item;
int i;
guint64 vendor_unique_protocol_id;
gchar *vendor_unique_protocol_id_string;
/* next tvb for use in subdissection */
tvbuff_t *next_tvb;
proto_tree *flags_tree;
@ -4549,8 +4556,18 @@ dissect_17221_aecp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *aecp_tree)
AECP_AA_OFFSET_TLVS_START, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(aecp_tree, hf_aecp_aa_tlv_address, tvb,
AECP_AA_OFFSET_TLVS_START+2, 8, ENC_BIG_ENDIAN);
}
} /* AECP Vendor Unique Command/Response */
else if ((mess_type == AECP_VENDOR_UNIQUE_COMMAND_MESSAGE) || (mess_type == AECP_VENDOR_UNIQUE_RESPONSE_MESSAGE))
{
proto_tree_add_item(aecp_tree, hf_aecp_vendor_unique_protocol_id, tvb,
AECP_VUC_OFFSET_PROTOCOL_ID, 6, ENC_BIG_ENDIAN);
/* attempt to dissect the payload specific data */
next_tvb = tvb_new_subset_remaining(tvb, AECP_VUC_OFFSET_PROTOCOL_ID);
vendor_unique_protocol_id = tvb_get_guint48(tvb, AECP_VUC_OFFSET_PROTOCOL_ID, ENC_BIG_ENDIAN);
vendor_unique_protocol_id_string = wmem_strdup_printf(wmem_packet_scope(), "%012" G_GINT64_MODIFIER "x", vendor_unique_protocol_id);
dissector_try_string(vendor_unique_protocol_dissector_table, vendor_unique_protocol_id_string, next_tvb, pinfo, aecp_tree, NULL);
}
}
static void
@ -6970,6 +6987,10 @@ proto_register_17221(void)
{ &hf_aecp_backedup_talker_unique_id,
{"Backedup Talker Unique ID", "ieee17221.backedup_talker_unique_id",
FT_UINT16, BASE_DEC, NULL, 0x00, NULL, HFILL }
},
{ &hf_aecp_vendor_unique_protocol_id,
{"Vendor Unique Protocol ID", "ieee17221.protocol_id",
FT_UINT48, BASE_HEX, NULL, 0x00, NULL, HFILL }
}
};
@ -7010,6 +7031,9 @@ proto_register_17221(void)
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array(proto_17221, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
/* Register the custom handler for vendor specific messages */
vendor_unique_protocol_dissector_table = register_dissector_table("ieee17221.protocol_id", "Vendor Unique Protocol ID", proto_17221, FT_STRING, BASE_NONE);
}
void