DoIP: Support UAT for User defined payload types

This patch allows user defined payload types to have names.
This commit is contained in:
Dr. Lars Völker 2022-06-24 17:15:47 +02:00 committed by A Wireshark GitLab Utility
parent 33031c8955
commit 487165dd50
1 changed files with 83 additions and 3 deletions

View File

@ -572,15 +572,69 @@ doip_prototree_add_with_resolv(proto_tree* doip_tree, int hfindex, int hfindex_n
return ti;
}
/*
* UAT DoIP Payload Types
*/
#define DATAFILE_DOIP_PAYLOAD_TYPES "DoIP_payload_types"
static GHashTable *data_doip_payload_types = NULL;
static generic_one_id_string_t* doip_payload_types = NULL;
static guint doip_payload_type_count = 0;
UAT_HEX_CB_DEF(doip_payload_types, id, generic_one_id_string_t)
UAT_CSTRING_CB_DEF(doip_payload_types, name, generic_one_id_string_t)
static void
post_update_doip_payload_types(void) {
/* destroy old hash table, if it exists */
if (data_doip_payload_types) {
g_hash_table_destroy(data_doip_payload_types);
data_doip_payload_types = NULL;
}
/* create new hash table */
data_doip_payload_types = g_hash_table_new_full(g_int_hash, g_int_equal, &doip_uat_free_key, &simple_free);
post_update_one_id_string_template_cb(doip_payload_types, doip_payload_type_count, data_doip_payload_types);
}
static const gchar*
resolve_doip_payload_type(guint16 payload_type, gboolean is_col)
{
const gchar *tmp = ht_lookup_name(data_doip_payload_types, payload_type);
/* lets look at the static values, if nothing is configured */
if (tmp == NULL) {
tmp = try_val_to_str(payload_type, doip_payloads);
}
/* no configured or standardized name known */
if (tmp != NULL) {
if (is_col) {
return tmp;
} else {
return wmem_strdup_printf(wmem_packet_scope(), "%s (0x%04x)", tmp, payload_type);
}
}
/* just give back unknown */
if (is_col) {
return wmem_strdup_printf(wmem_packet_scope(), "0x%04x Unknown Payload", payload_type);
} else {
return wmem_strdup_printf(wmem_packet_scope(), "Unknown (0x%04x)", payload_type);
}
}
static void
add_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *doip_tree)
{
guint32 len;
guint32 payload_type;
proto_tree *subtree = proto_tree_add_subtree(doip_tree, tvb, DOIP_VERSION_OFFSET, DOIP_HEADER_LEN, ett_header, NULL, "Header");
proto_tree_add_item(subtree, hf_doip_version, tvb, DOIP_VERSION_OFFSET, DOIP_VERSION_LEN, ENC_BIG_ENDIAN);
proto_tree_add_item(subtree, hf_doip_inv_version, tvb, DOIP_INV_VERSION_OFFSET, DOIP_INV_VERSION_LEN, ENC_BIG_ENDIAN);
proto_tree_add_item(subtree, hf_doip_type, tvb, DOIP_TYPE_OFFSET, DOIP_TYPE_LEN, ENC_BIG_ENDIAN);
payload_type = tvb_get_guint16(tvb, DOIP_TYPE_OFFSET, ENC_BIG_ENDIAN);
proto_tree_add_uint_format(subtree, hf_doip_type, tvb, DOIP_TYPE_OFFSET, DOIP_TYPE_LEN, payload_type, "Type: %s", resolve_doip_payload_type(payload_type, false));
proto_tree_add_item_ret_uint(subtree, hf_doip_length, tvb, DOIP_LENGTH_OFFSET, DOIP_LENGTH_LEN, ENC_BIG_ENDIAN, &len);
if (tvb_captured_length(tvb) < len) {
@ -752,7 +806,7 @@ dissect_doip_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
version == ISO13400_2019 ||
(version == DEFAULT_VALUE && (payload_type >= DOIP_VEHICLE_IDENTIFICATION_REQ && payload_type <= DOIP_VEHICLE_IDENTIFICATION_REQ_EID))
) {
col_add_fstr(pinfo->cinfo, COL_INFO, "%s", val_to_str(payload_type, doip_payloads, "0x%04x Unknown payload"));
col_add_fstr(pinfo->cinfo, COL_INFO, "%s", resolve_doip_payload_type(payload_type, true));
} else {
col_set_str(pinfo->cinfo, COL_INFO, "Invalid DoIP version");
return;
@ -889,6 +943,7 @@ proto_register_doip(void)
module_t *doip_module = NULL;
expert_module_t *expert_module_doip = NULL;
uat_t *doip_diag_addr_uat = NULL;
uat_t *doip_payload_type_uat = NULL;
static hf_register_info hf[] = {
/* Header */
@ -1189,13 +1244,19 @@ proto_register_doip(void)
&ett_address
};
/* UATs definition */
/* UAT definitions */
static uat_field_t doip_diag_addr_uat_fields[] = {
UAT_FLD_HEX(doip_diag_addresses, id, "Diagnostic Address", "Diagnostic Address (hex uint16 without leading 0x)"),
UAT_FLD_CSTRING(doip_diag_addresses, name, "Name", "Name of the ECU (string)"),
UAT_END_FIELDS
};
static uat_field_t doip_payload_type_uat_fields[] = {
UAT_FLD_HEX(doip_payload_types, id, "Payload Type", "Payload Type (hex uint16 without leading 0x)"),
UAT_FLD_CSTRING(doip_payload_types, name, "Name", "Name of the Payload Type (string)"),
UAT_END_FIELDS
};
proto_doip = proto_register_protocol (
"DoIP (ISO13400) Protocol", /* name */
"DoIP", /* short name */
@ -1228,6 +1289,25 @@ proto_register_doip(void)
prefs_register_uat_preference(doip_module, "_udf_doip_diag_addresses", "Diagnostics Addresses",
"A table to define names of Diagnostics Addresses.", doip_diag_addr_uat);
doip_payload_type_uat = uat_new("Payload Types",
sizeof(generic_one_id_string_t), /* record size */
DATAFILE_DOIP_PAYLOAD_TYPES, /* filename */
TRUE, /* from profile */
(void**)&doip_payload_types, /* data_ptr */
&doip_payload_type_count, /* numitems_ptr */
UAT_AFFECTS_DISSECTION, /* but not fields */
NULL, /* help */
copy_generic_one_id_string_cb, /* copy callback */
update_generic_one_identifier_16bit, /* update callback */
free_generic_one_id_string_cb, /* free callback */
post_update_doip_payload_types, /* post update callback */
NULL, /* reset callback */
doip_payload_type_uat_fields /* UAT field definitions */
);
prefs_register_uat_preference(doip_module, "_udf_doip_payload_types", "Payload Types",
"A table to define names of Payload Types.", doip_payload_type_uat);
prefs_register_bool_preference(doip_module, "hide_address_name_entries",
"Hide Address Name Entries",
"Should the dissector hide the names for addresses?",