aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPantar Ana <ana.pantar@gmail.com>2019-02-01 09:57:20 +0100
committerAnders Broman <a.broman58@gmail.com>2019-02-05 05:02:44 +0000
commit8176b492d8bacfeb5446f441455da5b2e7449fde (patch)
treeb55c3ea8e92d3da7d982dcde5d3ae88f463c3223
parentd36f4fd6767dd697e52ae535e461099012cca66f (diff)
ebhscr: add ebhscr dissector
ElektroBit High Speed Capture and Replay protocol is produced by a PCIe Card for interfacing high speed automotive interfaces. Bug: 15474 Change-Id: Ibb3ea36d9281b2779e2cc13d29b66dc382782ca3 Reviewed-on: https://code.wireshark.org/review/31847 Petri-Dish: Dario Lombardo <lomato@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
-rw-r--r--NEWS35
-rw-r--r--docbook/release-notes.asciidoc1
-rw-r--r--epan/dissectors/CMakeLists.txt1
-rw-r--r--epan/dissectors/packet-ebhscr.c403
4 files changed, 423 insertions, 17 deletions
diff --git a/NEWS b/NEWS
index c12c965449..a632b6e9b1 100644
--- a/NEWS
+++ b/NEWS
@@ -145,23 +145,24 @@ Wireshark 2.9.1 Release Notes
Apple Wireless Direct Link (AWDL), Basic Transport Protocol (BTP),
BLIP Couchbase Mobile (BLIP), CDMA 2000, Circuit Emulation Service
over Ethernet (CESoETH), Cisco Meraki Discovery Protocol (MDP),
- Distributed Ruby (DRb), DXL, E1AP (5G), EVS (3GPP TS 26.445 A.2 EVS
- RTP), Exablaze trailers, General Circuit Services Notification
- Application Protocol (GCSNA), GeoNetworking (GeoNw), GLOW Lawo
- Emberplus Data format, Great Britain Companion Specification (GBCS)
- used in the Smart Metering Equipment Technical Specifications
- (SMETS), GSM-R (User-to-User Information Element usage),
- HI3CCLinkData, Intelligent Transport Systems (ITS) application level,
- ISO 13400-2 Diagnostic communication over Internet Protocol (DoIP),
- ITU-t X.696 Octet Encoding Rules (OER), Local Number Portability
- Database Query Protocol (ANSI), MsgPack, NGAP (5G), NR (5G) PDCP,
- Osmocom Generic Subscriber Update Protocol (GSUP), PCOM protocol,
- PKCS#10 (RFC2986 Certification Request Syntax), PROXY (v2), S101 Lawo
- Emberplus transport frame, Secure Reliable Transport Protocol (SRT),
- Spirent Test Center Signature decoding for Ethernet and FibreChannel
- (STCSIG, disabled by default), Sybase-specific portions of TDS,
- systemd Journal Export, TeamSpeak 3 DNS, TPM 2.0, Ubiquiti Discovery
- Protocol (UBDP), WireGuard, XnAP (5G), and Z39.50 Information
+ Distributed Ruby (DRb), DXL, E1AP (5G), Elektrobit High Speed Capture
+ Replay (EBHSCR), EVS (3GPP TS 26.445 A.2 EVS RTP), Exablaze trailers,
+ General Circuit Services Notification Application Protocol (GCSNA),
+ GeoNetworking (GeoNw), GLOW Lawo Emberplus Data format, Great Britain
+ Companion Specification (GBCS) used in the Smart Metering Equipment
+ Technical Specifications (SMETS), GSM-R (User-to-User Information
+ Element usage), HI3CCLinkData, Intelligent Transport Systems (ITS)
+ application level, ISO 13400-2 Diagnostic communication over Internet
+ Protocol (DoIP), ITU-t X.696 Octet Encoding Rules (OER), Local Number
+ Portability Database Query Protocol (ANSI), MsgPack, NGAP (5G),
+ NR (5G) PDCP, Osmocom Generic Subscriber Update Protocol (GSUP),
+ PCOM protocol, PKCS#10 (RFC2986 Certification Request Syntax),
+ PROXY (v2), S101 Lawo Emberplus transport frame, Secure Reliable
+ Transport Protocol (SRT), Spirent Test Center Signature decoding
+ for Ethernet and FibreChannel (STCSIG, disabled by default),
+ Sybase-specific portions of TDS, systemd Journal Export,
+ TeamSpeak 3 DNS, TPM 2.0, Ubiquiti Discovery Protocol (UBDP),
+ WireGuard, XnAP (5G), and Z39.50 Information
Retrieval Protocol
Updated Protocol Support
diff --git a/docbook/release-notes.asciidoc b/docbook/release-notes.asciidoc
index 0bb8e6a999..19b8933e8a 100644
--- a/docbook/release-notes.asciidoc
+++ b/docbook/release-notes.asciidoc
@@ -126,6 +126,7 @@ Cisco Meraki Discovery Protocol (MDP)
Distributed Ruby (DRb)
DXL
E1AP (5G)
+Elektrobit High Speed Capture Replay (EBHSCR)
EVS (3GPP TS 26.445 A.2 EVS RTP)
Exablaze trailers
Great Britain Companion Specification (GBCS) used in the Smart Metering Equipment Technical Specifications (SMETS)
diff --git a/epan/dissectors/CMakeLists.txt b/epan/dissectors/CMakeLists.txt
index 71665036df..b3d00f8104 100644
--- a/epan/dissectors/CMakeLists.txt
+++ b/epan/dissectors/CMakeLists.txt
@@ -952,6 +952,7 @@ set(DISSECTOR_SRC
${CMAKE_CURRENT_SOURCE_DIR}/packet-e212.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-eap.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-eapol.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/packet-ebhscr.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-echo.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-ecmp.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-ecp.c
diff --git a/epan/dissectors/packet-ebhscr.c b/epan/dissectors/packet-ebhscr.c
new file mode 100644
index 0000000000..02396972c2
--- /dev/null
+++ b/epan/dissectors/packet-ebhscr.c
@@ -0,0 +1,403 @@
+/* packet-ebhscr.c
+ * Routines for EBHSCR dissection
+ * Copyright 2019, Ana Pantar <ana.pantar@gmail.com> for Elektrobit
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * For more information on this protocol see:
+ * https://www.elektrobit.com/ebhscr
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include <config.h>
+#include <epan/packet.h>
+#include <epan/decode_as.h>
+#include <epan/prefs.h>
+#include <wiretap/wtap.h>
+#include <epan/expert.h>
+
+void proto_reg_handoff_ebhscr(void);
+void proto_register_ebhscr(void);
+
+static int proto_ebhscr = -1;
+
+static int hf_ebhscr_packet_header = -1;
+static int hf_ebhscr_major_number = -1;
+static int hf_ebhscr_slot = -1;
+static int hf_ebhscr_channel = -1;
+static int hf_ebhscr_status = -1;
+
+static int hf_eth_link_up_down = -1;
+static int hf_eth_master_slave = -1;
+static int hf_eth_speed = -1;
+static int hf_eth_phy = -1;
+
+static int hf_eth_crc_error = -1;
+static int hf_eth_mii_foe = -1;
+static int hf_eth_payload_foe = -1;
+static int hf_eth_hdr_foe = -1;
+static int hf_eth_rcv_dec_err = -1;
+static int hf_eth_sym_error = -1;
+static int hf_eth_jabber_event = -1;
+static int hf_eth_pol_ch_event = -1;
+
+static int hf_ebhscr_version = -1;
+static int hf_ebhscr_length = -1;
+static int hf_ebhscr_start_timestamp = -1;
+static int hf_ebhscr_stop_timestamp = -1;
+static int hf_ebhscr_mjr_hdr = -1;
+
+static gint ett_ebhscr = -1;
+static gint ett_ebhscr_packet_header = -1;
+static gint ett_ebhscr_status = -1;
+static gint ett_ebhscr_mjr_hdr = -1;
+
+static const int *eth_error_bits[] = {
+ &hf_eth_crc_error,
+ &hf_eth_mii_foe,
+ &hf_eth_payload_foe,
+ &hf_eth_hdr_foe,
+ &hf_eth_rcv_dec_err,
+ &hf_eth_sym_error,
+ &hf_eth_jabber_event,
+ &hf_eth_pol_ch_event,
+ NULL
+};
+
+static const int *eth_mjr_hdr_bits[] = {
+ &hf_eth_link_up_down,
+ &hf_eth_master_slave,
+ &hf_eth_speed,
+ &hf_eth_phy,
+ NULL
+};
+
+static const value_string eth_speed_strings[] = {
+ { 0, "Speed 10M" },
+ { 1, "Speed 100M" },
+ { 2, "Speed 1000M" },
+ { 3, "Speed 2.5G" },
+ { 4, "Speed 5G" },
+ { 5, "Speed 10G" },
+ { 6, "Speed 25G" },
+ { 7, "Speed 40G" },
+ { 8, "Speed 100G" },
+ { 9, "Reserved" },
+ { 10, "Reserved" },
+ { 11, "Reserved" },
+ { 12, "Reserved" },
+ { 13, "Reserved" },
+ { 14, "Reserved" },
+ { 15, "Reserved" },
+ { 0, NULL },
+};
+
+static const value_string eth_phy_strings[] = {
+ { 0, "Base T1" },
+ { 1, "Reserved" },
+ { 2, "Reserved" },
+ { 3, "Reserved" },
+ { 4, "Reserved" },
+ { 5, "Reserved" },
+ { 6, "Reserved" },
+ { 7, "Reserved" },
+ { 8, "Reserved" },
+ { 9, "Reserved" },
+ { 10, "Reserved" },
+ { 11, "Reserved" },
+ { 12, "Reserved" },
+ { 13, "Reserved" },
+ { 14, "Reserved" },
+ { 15, "Reserved" },
+ { 0, NULL },
+};
+
+static expert_field ei_ebhscr_frame_header = EI_INIT;
+static expert_field ei_ebhscr_status_flag = EI_INIT;
+
+static dissector_handle_t eth_withfcs_handle;
+static dissector_handle_t ebhscr_user_handle;
+
+static dissector_table_t subdissector_table;
+
+#define EBHSCR_USER_FIRST 0X43
+#define EBHSCR_USER_LAST 0X4F
+
+#define ETHERNET_FRAME 0x50
+#define EBHSCR_HEADER_LENGTH 32
+
+static int
+dissect_ebhscr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+{
+ proto_item *ti;
+ proto_tree *ebhscr_packet_header_tree = NULL;
+ proto_tree *ebhscr_tree = NULL;
+ tvbuff_t* next_tvb;
+ guint32 ebhscr_frame_length;
+ gint ebhscr_current_payload_length;
+ guint8 ebhscr_major_num, ebhscr_channel;
+ guint16 ebhscr_status = 0;
+
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "EBHSCR");
+ col_clear(pinfo->cinfo, COL_INFO);
+
+ ebhscr_frame_length = tvb_captured_length(tvb);
+
+ ti = proto_tree_add_item(tree, proto_ebhscr, tvb, 0, -1, ENC_NA);
+ ebhscr_tree = proto_item_add_subtree(ti, ett_ebhscr);
+
+ if (ebhscr_frame_length < EBHSCR_HEADER_LENGTH) {
+ expert_add_info(pinfo, ebhscr_tree, &ei_ebhscr_frame_header);
+ return tvb_captured_length(tvb);
+ }
+
+ ebhscr_major_num = tvb_get_guint8(tvb, 0);
+ ebhscr_channel = tvb_get_guint8(tvb, 1) & 0x3F;
+
+ col_add_fstr(pinfo->cinfo, COL_DEF_DST, "%u ", ebhscr_channel);
+
+ ebhscr_status = tvb_get_guint16(tvb, 2, ENC_BIG_ENDIAN) & 0xFFF0;
+ if (ebhscr_status) {
+ expert_add_info(pinfo, ebhscr_tree, &ei_ebhscr_status_flag);
+ }
+
+ ti = proto_tree_add_item(ebhscr_tree, hf_ebhscr_packet_header, tvb, 0, 4, ENC_BIG_ENDIAN);
+ ebhscr_packet_header_tree = proto_item_add_subtree(ti, ett_ebhscr_packet_header);
+ proto_tree_add_item(ebhscr_packet_header_tree, hf_ebhscr_major_number, tvb, 0, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(ebhscr_packet_header_tree, hf_ebhscr_slot, tvb, 1, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(ebhscr_packet_header_tree, hf_ebhscr_channel, tvb, 1, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(ebhscr_packet_header_tree, hf_ebhscr_version, tvb, 2, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(ebhscr_packet_header_tree, hf_ebhscr_length, tvb, 4, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(ebhscr_packet_header_tree, hf_ebhscr_start_timestamp, tvb, 8, 8, ENC_BIG_ENDIAN);
+ proto_tree_add_item(ebhscr_packet_header_tree, hf_ebhscr_stop_timestamp, tvb, 16, 8, ENC_BIG_ENDIAN);
+ proto_tree_add_item(ebhscr_packet_header_tree, hf_ebhscr_mjr_hdr, tvb, 24, 8, ENC_BIG_ENDIAN);
+
+ /* received hdr only and no data */
+ if (ebhscr_frame_length == EBHSCR_HEADER_LENGTH) {
+ return tvb_captured_length(tvb);
+ }
+
+ ebhscr_current_payload_length = ebhscr_frame_length - EBHSCR_HEADER_LENGTH;
+
+ if ((ebhscr_major_num >= EBHSCR_USER_FIRST) && (ebhscr_major_num <= EBHSCR_USER_LAST)) {
+ if (ebhscr_user_handle != NULL) {
+ next_tvb = tvb_new_subset_length(tvb, 0, ebhscr_frame_length);
+ call_dissector(ebhscr_user_handle, next_tvb, pinfo, ebhscr_tree);
+ }
+ else {
+ next_tvb = tvb_new_subset_length(tvb, 32, ebhscr_current_payload_length);
+ call_data_dissector(next_tvb, pinfo, tree);
+ col_append_fstr(pinfo->cinfo, COL_INFO, " %s", tvb_bytes_to_str_punct(wmem_packet_scope(), tvb, 32, ebhscr_current_payload_length, ' '));
+ }
+ }
+
+ if (ebhscr_major_num == ETHERNET_FRAME) {
+ proto_tree_add_bitmask(ebhscr_packet_header_tree, tvb, 2, hf_ebhscr_status, ett_ebhscr_status, eth_error_bits, ENC_BIG_ENDIAN);
+ proto_tree_add_bitmask(ebhscr_packet_header_tree, tvb, 24, hf_ebhscr_mjr_hdr, ett_ebhscr_mjr_hdr, eth_mjr_hdr_bits, ENC_BIG_ENDIAN);
+ /* payload is 802.3 Ethernet frame */
+ next_tvb = tvb_new_subset_length(tvb, 32, ebhscr_current_payload_length);
+ call_dissector(eth_withfcs_handle, next_tvb, pinfo, tree);
+ }
+
+ return tvb_captured_length(tvb);
+}
+
+void
+proto_register_ebhscr(void)
+{
+ expert_module_t *expert_ebhscr;
+
+ static hf_register_info hf[] = {
+ { &hf_ebhscr_packet_header,
+ { "Packet header", "ebhscr.hdr",
+ FT_UINT32, BASE_HEX,
+ NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_ebhscr_major_number,
+ { "Major number", "ebhscr.mjr",
+ FT_UINT8, BASE_HEX,
+ NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_ebhscr_slot,
+ { "Slot", "ebhscr.slot",
+ FT_UINT8, BASE_HEX,
+ NULL, 0xc0,
+ NULL, HFILL }
+ },
+ { &hf_ebhscr_channel,
+ { "Channel", "ebhscr.channel",
+ FT_UINT8, BASE_HEX,
+ NULL, 0x3f,
+ NULL, HFILL }
+ },
+ { &hf_ebhscr_status,
+ { "Status", "ebhscr.sts",
+ FT_UINT16, BASE_HEX,
+ NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_ebhscr_version,
+ { "Version", "ebhscr.ver",
+ FT_UINT16, BASE_HEX,
+ NULL, 0xF000,
+ NULL, HFILL }
+ },
+ { &hf_ebhscr_length,
+ { "Length", "ebhscr.len",
+ FT_UINT32, BASE_DEC,
+ NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_ebhscr_start_timestamp,
+ { "Start timestamp", "ebhscr.strt",
+ FT_UINT64, BASE_HEX,
+ NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_ebhscr_stop_timestamp,
+ { "Stop timestamp", "ebhscr.stpt",
+ FT_UINT64, BASE_HEX,
+ NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_ebhscr_mjr_hdr,
+ { "Major number specific header", "ebhscr.mjrhdr",
+ FT_UINT64, BASE_HEX,
+ NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_eth_link_up_down,
+ { "Ethernet link up down", "ebhscr.elud",
+ FT_BOOLEAN, 64,
+ NULL, 0x0000000000000001,
+ NULL, HFILL }
+ },
+ { &hf_eth_master_slave,
+ { "Ethernet Master Slave (if supported)", "ebhscr.ems",
+ FT_BOOLEAN, 64,
+ NULL, 0x0000000000000002,
+ NULL, HFILL }
+ },
+ { &hf_eth_speed,
+ { "Ethernet speed", "ebhscr.espd",
+ FT_UINT32, BASE_DEC, VALS(eth_speed_strings), 0x000000F0,
+ NULL, HFILL }
+ },
+ { &hf_eth_phy,
+ { "Ethernet phy", "ebhscr.ephy",
+ FT_UINT32, BASE_DEC, VALS(eth_phy_strings), 0x00000F00,
+ NULL, HFILL }
+ },
+ { &hf_eth_crc_error,
+ { "Ethernet CRC Error", "ebhscr.ece",
+ FT_BOOLEAN, 16,
+ NULL, 0x0001,
+ NULL, HFILL }
+ },
+ { &hf_eth_mii_foe,
+ { "Media-independent interface FIFO Overflow Error", "ebhscr.emiifoe",
+ FT_BOOLEAN, 16,
+ NULL, 0x0002,
+ NULL, HFILL }
+ },
+ { &hf_eth_payload_foe,
+ { "Payload FIFO Overflow Error", "ebhscr.epfoe",
+ FT_BOOLEAN, 16,
+ NULL, 0x0004,
+ NULL, HFILL }
+ },
+ { &hf_eth_hdr_foe,
+ { "Header FIFO Overflow Error", "ebhscr.ehfoe",
+ FT_BOOLEAN, 16,
+ NULL, 0x0008,
+ NULL, HFILL }
+ },
+ { &hf_eth_rcv_dec_err,
+ { "Receiver Decoder Error", "ebhscr.erde",
+ FT_BOOLEAN, 16,
+ NULL, 0x0010,
+ NULL, HFILL }
+ },
+ { &hf_eth_sym_error,
+ { "Symbol Error", "ebhscr.ese",
+ FT_BOOLEAN, 16,
+ NULL, 0x0020,
+ NULL, HFILL }
+ },
+ { &hf_eth_jabber_event,
+ { "Jabber", "ebhscr.ejbr",
+ FT_BOOLEAN, 16,
+ NULL, 0x0040,
+ NULL, HFILL }
+ },
+ { &hf_eth_pol_ch_event,
+ { "Polarity Change", "ebhscr.epch",
+ FT_BOOLEAN, 16,
+ NULL, 0x0080,
+ NULL, HFILL }
+ },
+ };
+
+ static gint *ett[] = {
+ &ett_ebhscr,
+ &ett_ebhscr_packet_header,
+ &ett_ebhscr_status,
+ &ett_ebhscr_mjr_hdr,
+ };
+
+ static ei_register_info ei[] = {
+ { &ei_ebhscr_frame_header,
+ { "ebhscr.frame_header", PI_MALFORMED, PI_ERROR,
+ "Frame Header is malformed", EXPFILL }
+ },
+ { &ei_ebhscr_status_flag,
+ { "ebhscr.sts", PI_PROTOCOL, PI_WARN,
+ "Status Error Flag is set", EXPFILL }
+ },
+ };
+
+ proto_ebhscr = proto_register_protocol(
+ "EBHSCR Protocol",
+ "EBHSCR",
+ "ebhscr"
+ );
+
+ proto_register_field_array(proto_ebhscr, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+
+ expert_ebhscr = expert_register_protocol(proto_ebhscr);
+ expert_register_field_array(expert_ebhscr, ei, array_length(ei));
+
+ register_dissector("ebhscr", dissect_ebhscr, proto_ebhscr);
+ subdissector_table = register_decode_as_next_proto(proto_ebhscr, "Network", "ebhscr.subdissector", "ebhscr next level dissector", NULL);
+}
+
+void
+proto_reg_handoff_ebhscr(void)
+{
+ static dissector_handle_t ebhscr_handle;
+
+ eth_withfcs_handle = find_dissector_add_dependency("eth_withfcs", proto_ebhscr);
+ ebhscr_user_handle = find_dissector_add_dependency("ebhscr_user", proto_ebhscr);
+
+ ebhscr_handle = create_dissector_handle( dissect_ebhscr, proto_ebhscr);
+ dissector_add_uint("wtap_encap", WTAP_ENCAP_EBHSCR, ebhscr_handle);
+}
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=false:
+ */