aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2017-11-07 08:53:38 +0800
committerAnders Broman <a.broman58@gmail.com>2019-07-03 08:55:02 +0000
commiteae522d9ccacbd08c27d9907d275e94dae131cd4 (patch)
tree7a8c35997b7fca28b0a420a11d9ac5cbbfdec20a
parentbaa22b38290ac6316a50be8fa94b3296056e7b19 (diff)
ncsi: Add NCSI dissector
This change adds a basic dissector for the Network Controller Sideband Interface (NCSI), as described by DMTF specification DSP0222. Change-Id: I4e98361bfb7315c524f9c90db38507892adeeebe Signed-off-by: Jeremy Kerr <jk@ozlabs.org> Reviewed-on: https://code.wireshark.org/review/33818 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
-rw-r--r--docbook/release-notes.adoc1
-rw-r--r--epan/dissectors/CMakeLists.txt1
-rw-r--r--epan/dissectors/packet-ncsi.c640
3 files changed, 642 insertions, 0 deletions
diff --git a/docbook/release-notes.adoc b/docbook/release-notes.adoc
index ad00091800..1bca09c731 100644
--- a/docbook/release-notes.adoc
+++ b/docbook/release-notes.adoc
@@ -69,6 +69,7 @@ FTDI FT USB Bridging Devices (FTDI FT)
CableLabs Layer-3 Protocol IEEE EtherType 0xb4e3 (CL3)
Dual Channel Wi-Fi (CL3DCW)
NR Positioning Protocol A (NRPPa) TS 38.455
+Network Controller Sideband Interface (NCSI)
--
=== Updated Protocol Support
diff --git a/epan/dissectors/CMakeLists.txt b/epan/dissectors/CMakeLists.txt
index c74f3b5bfa..0ca239435e 100644
--- a/epan/dissectors/CMakeLists.txt
+++ b/epan/dissectors/CMakeLists.txt
@@ -1438,6 +1438,7 @@ set(DISSECTOR_SRC
${CMAKE_CURRENT_SOURCE_DIR}/packet-ncp-sss.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-ncp.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-ncs.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/packet-ncsi.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-ndmp.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-ndp.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-ndps.c
diff --git a/epan/dissectors/packet-ncsi.c b/epan/dissectors/packet-ncsi.c
new file mode 100644
index 0000000000..9d0a94f652
--- /dev/null
+++ b/epan/dissectors/packet-ncsi.c
@@ -0,0 +1,640 @@
+/* packet-ncsi.c
+ * Routines for NCSI dissection
+ * Copyright 2017-2019, Jeremy Kerr <jk@ozlabs.org>
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+/*
+ * Network Controller Sideband Interface (NCSI) protocol support.
+ * Specs at http://www.dmtf.org/sites/default/files/standards/documents/DSP0222_1.0.1.pdf
+ */
+
+#include <config.h>
+
+#include <epan/packet.h>
+#include <epan/etypes.h>
+
+void proto_reg_handoff_ncsi(void);
+void proto_register_ncsi(void);
+
+static int proto_ncsi = -1;
+
+/* Common header fields */
+static int hf_ncsi_mc_id = -1;
+static int hf_ncsi_revision = -1;
+static int hf_ncsi_iid = -1;
+static int hf_ncsi_type = -1;
+static int hf_ncsi_type_code = -1;
+static int hf_ncsi_type_resp = -1;
+static int hf_ncsi_chan = -1;
+static int hf_ncsi_plen = -1;
+
+/* Response generics */
+static int hf_ncsi_resp = -1;
+static int hf_ncsi_reason = -1;
+
+/* Select package */
+static int hf_ncsi_sp_hwarb = -1;
+
+/* Disable channel */
+static int hf_ncsi_dc_ald = -1;
+
+/* AEN enable */
+static int hf_ncsi_aene_mc = -1;
+
+/* Set MAC Address */
+static int hf_ncsi_sm_mac = -1;
+static int hf_ncsi_sm_macno = -1;
+static int hf_ncsi_sm_at = -1;
+static int hf_ncsi_sm_e = -1;
+
+/* Broadcast filter */
+static int hf_ncsi_bf = -1;
+static int hf_ncsi_bf_arp = -1;
+static int hf_ncsi_bf_dhcpc = -1;
+static int hf_ncsi_bf_dhcps = -1;
+static int hf_ncsi_bf_netbios = -1;
+
+/* AEN payload fields */
+static int hf_ncsi_aen_type = -1;
+static int hf_ncsi_aen_lsc_stat = -1;
+static int hf_ncsi_aen_lsc_oemstat = -1;
+static int hf_ncsi_aen_lsc_hcstat = -1;
+
+/* generic link status */
+static int hf_ncsi_lstat = -1;
+static int hf_ncsi_lstat_flag = -1;
+static int hf_ncsi_lstat_speed_duplex = -1;
+static int hf_ncsi_lstat_autoneg = -1;
+static int hf_ncsi_lstat_autoneg_complete = -1;
+static int hf_ncsi_lstat_parallel_detection = -1;
+static int hf_ncsi_lstat_1000TFD = -1;
+static int hf_ncsi_lstat_1000THD = -1;
+static int hf_ncsi_lstat_100T4 = -1;
+static int hf_ncsi_lstat_100TXFD = -1;
+static int hf_ncsi_lstat_100TXHD = -1;
+static int hf_ncsi_lstat_10TFD = -1;
+static int hf_ncsi_lstat_10THD = -1;
+static int hf_ncsi_lstat_tx_flow = -1;
+static int hf_ncsi_lstat_rx_flow = -1;
+static int hf_ncsi_lstat_partner_flow = -1;
+static int hf_ncsi_lstat_serdes = -1;
+static int hf_ncsi_lstat_oem_speed_valid = -1;
+
+static gint ett_ncsi = -1;
+static gint ett_ncsi_type = -1;
+static gint ett_ncsi_payload = -1;
+static gint ett_ncsi_lstat = -1;
+
+#define NCSI_MIN_LENGTH 8
+
+enum ncsi_type {
+ NCSI_TYPE_GLS = 0x0a,
+ NCSI_TYPE_AEN = 0x7f,
+};
+
+static const value_string ncsi_type_vals[] = {
+ { 0x00, "Clear initial state" },
+ { 0x01, "Select package" },
+ { 0x02, "Deselect package" },
+ { 0x03, "Enable channel" },
+ { 0x04, "Disable channel" },
+ { 0x05, "Reset channel" },
+ { 0x06, "Enable channel TX" },
+ { 0x07, "Disable channel TX" },
+ { 0x08, "AEN enable" },
+ { NCSI_TYPE_GLS, "Get link status" },
+ { 0x0d, "Disable VLAN" },
+ { 0x0e, "Set MAC address" },
+ { 0x10, "Enable broadcast filter" },
+ { 0x11, "Disable broadcast filter" },
+ { NCSI_TYPE_AEN, "Async Event Notification" },
+ { 0, NULL },
+};
+
+static const value_string ncsi_type_resp_vals[] = {
+ { 0x00, "request" },
+ { 0x01, "response" },
+ { 0, NULL },
+};
+
+static const value_string ncsi_aen_type_vals[] = {
+ { 0x00, "Link status change" },
+ { 0x01, "Configuration required" },
+ { 0x02, "Host NC driver status change" },
+ { 0, NULL },
+};
+
+static const value_string ncsi_lstat_flag_vals[] = {
+ { 0x00, "Link down" },
+ { 0x01, "Link up" },
+ { 0, NULL },
+};
+
+static const value_string ncsi_lstat_speed_duplex_vals[] = {
+ { 0x00, "Auto-negotiate not complete" },
+ { 0x01, "10BaseT half duplex" },
+ { 0x02, "10BaseT full duplex" },
+ { 0x03, "100BaseT half duplex" },
+ { 0x04, "100BaseT4" },
+ { 0x05, "100BaseTX full duplex" },
+ { 0x06, "1000BaseT half duplex" },
+ { 0x07, "1000BaseT full duplex" },
+ { 0x08, "10GBaseT support" },
+ { 0, NULL },
+};
+
+static const value_string ncsi_enable_vals[] = {
+ { 0x00, "disabled" },
+ { 0x01, "enabled" },
+ { 0, NULL },
+};
+
+static const value_string ncsi_valid_vals[] = {
+ { 0x00, "invalid" },
+ { 0x01, "valid" },
+ { 0, NULL },
+};
+
+static const value_string ncsi_autoneg_complete_vals[] = {
+ { 0x00, "disabled/in-progress" },
+ { 0x01, "complete" },
+ { 0, NULL },
+};
+
+static const value_string ncsi_partner_flow_vals[] = {
+ { 0x00, "Not pause capable" },
+ { 0x01, "Symmetric pause" },
+ { 0x02, "Assymmetric pause" },
+ { 0x03, "Symmetric & Assymetric pause" },
+ { 0, NULL },
+};
+
+static const value_string ncsi_used_vals[] = {
+ { 0x00, "unused" },
+ { 0x01, "used" },
+ { 0, NULL },
+};
+
+static const value_string ncsi_capable_vals[] = {
+ { 0x00, "not capable" },
+ { 0x01, "capable" },
+ { 0, NULL },
+};
+
+static const value_string ncsi_aen_hcstat_vals[] = {
+ { 0x00, "not running" },
+ { 0x01, "running" },
+ { 0, NULL },
+};
+
+static const value_string ncsi_sm_at_vals[] = {
+ { 0x00, "unicast" },
+ { 0x01, "multicast" },
+ { 0, NULL },
+};
+
+static const value_string ncsi_bf_filter_vals[] = {
+ { 0x00, "drop" },
+ { 0x01, "forward" },
+ { 0, NULL },
+};
+
+
+static void
+ncsi_proto_tree_add_lstat(tvbuff_t *tvb, proto_tree *tree, int offset)
+{
+ static const int *lstat_fields[] = {
+ &hf_ncsi_lstat_flag,
+ &hf_ncsi_lstat_speed_duplex,
+ &hf_ncsi_lstat_autoneg,
+ &hf_ncsi_lstat_autoneg_complete,
+ &hf_ncsi_lstat_parallel_detection,
+ &hf_ncsi_lstat_1000TFD,
+ &hf_ncsi_lstat_1000THD,
+ &hf_ncsi_lstat_100T4,
+ &hf_ncsi_lstat_100TXFD,
+ &hf_ncsi_lstat_100TXHD,
+ &hf_ncsi_lstat_10TFD,
+ &hf_ncsi_lstat_10THD,
+ &hf_ncsi_lstat_tx_flow,
+ &hf_ncsi_lstat_rx_flow,
+ &hf_ncsi_lstat_partner_flow,
+ &hf_ncsi_lstat_serdes,
+ &hf_ncsi_lstat_oem_speed_valid,
+ NULL,
+ };
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ncsi_lstat,
+ ett_ncsi_lstat, lstat_fields, ENC_BIG_ENDIAN, BMT_NO_APPEND);
+}
+
+static void
+dissect_ncsi_aen(tvbuff_t *tvb, proto_tree *tree)
+{
+ guint8 type = tvb_get_guint8(tvb, 19);
+
+ proto_tree_add_item(tree, hf_ncsi_aen_type, tvb, 19, 1, ENC_NA);
+
+ switch (type) {
+ case 0x00:
+ ncsi_proto_tree_add_lstat(tvb, tree, 20);
+ proto_tree_add_item(tree, hf_ncsi_aen_lsc_oemstat, tvb, 24, 4, ENC_NA);
+ break;
+ case 0x02:
+ proto_tree_add_item(tree, hf_ncsi_aen_lsc_hcstat, tvb, 20, 4, ENC_NA);
+ break;
+ }
+}
+
+/* Code to actually dissect the packets */
+static int
+dissect_ncsi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
+ void *data _U_)
+{
+ proto_tree *ncsi_tree, *ncsi_payload_tree;
+ proto_item *ti, *pti;
+ guint8 type, plen;
+ static const int *type_fields[] = {
+ &hf_ncsi_type_code,
+ &hf_ncsi_type_resp,
+ NULL,
+ };
+
+ /* Check that the packet is long enough for it to belong to us. */
+ if (tvb_reported_length(tvb) < NCSI_MIN_LENGTH)
+ return 0;
+
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "NCSI");
+
+ type = tvb_get_guint8(tvb, 4);
+ plen = tvb_get_guint8(tvb, 7);
+
+ col_clear(pinfo->cinfo, COL_INFO);
+ if (type == 0xff) {
+ col_add_fstr(pinfo->cinfo, COL_INFO,
+ "Async Event Notification, chan %x",
+ tvb_get_guint8(tvb, 5));
+ } else {
+ col_add_fstr(pinfo->cinfo, COL_INFO, "%s %s, id %x, chan %x",
+ val_to_str(type & 0x7f, ncsi_type_vals, "Unknown type %x"),
+ type & 0x80 ? "response" : "request ",
+ tvb_get_guint8(tvb, 3),
+ tvb_get_guint8(tvb, 5));
+ }
+
+
+ /* Top-level NCSI protocol item & tree */
+ ti = proto_tree_add_item(tree, proto_ncsi, tvb, 0, -1, ENC_NA);
+
+ ncsi_tree = proto_item_add_subtree(ti, ett_ncsi);
+
+ /* Standard header fields */
+ proto_tree_add_item(ncsi_tree, hf_ncsi_mc_id, tvb, 0, 1, ENC_NA);
+ proto_tree_add_item(ncsi_tree, hf_ncsi_revision, tvb, 1, 1, ENC_NA);
+ proto_tree_add_item(ncsi_tree, hf_ncsi_iid, tvb, 3, 1, ENC_NA);
+ proto_tree_add_bitmask(ncsi_tree, tvb, 4, hf_ncsi_type,
+ ett_ncsi_type, type_fields, ENC_NA);
+ proto_tree_add_item(ncsi_tree, hf_ncsi_chan, tvb, 5, 1, ENC_NA);
+ proto_tree_add_item(ncsi_tree, hf_ncsi_plen, tvb, 7, 1, ENC_NA);
+
+ if (!plen)
+ return 16;
+
+ /* Payload tree */
+ ncsi_payload_tree = proto_tree_add_subtree(ncsi_tree, tvb, 16,
+ plen, ett_ncsi_payload, &pti, "Payload");
+
+ /* All responses start with response code & reason data */
+ if (type & 0x80) {
+ proto_tree_add_item(ncsi_payload_tree, hf_ncsi_resp, tvb,
+ 16, 2, ENC_NA);
+ proto_tree_add_item(ncsi_payload_tree, hf_ncsi_reason, tvb,
+ 18, 2, ENC_NA);
+ }
+
+ switch (type) {
+ case 0x01:
+ proto_item_set_text(pti, "Select package request");
+ proto_tree_add_item(ncsi_payload_tree, hf_ncsi_sp_hwarb, tvb,
+ 19, 1, ENC_NA);
+ break;
+ case 0x04:
+ proto_item_set_text(pti, "Disable channel request");
+ proto_tree_add_item(ncsi_payload_tree, hf_ncsi_dc_ald, tvb,
+ 19, 1, ENC_NA);
+ break;
+ case 0x08:
+ proto_item_set_text(pti, "AEN enable request");
+ proto_tree_add_item(ncsi_payload_tree, hf_ncsi_aene_mc, tvb,
+ 19, 1, ENC_NA);
+ break;
+ case 0x0e:
+ proto_item_set_text(pti, "Set MAC address request");
+ proto_tree_add_item(ncsi_payload_tree, hf_ncsi_sm_mac, tvb,
+ 16, 6, ENC_NA);
+ proto_tree_add_item(ncsi_payload_tree, hf_ncsi_sm_macno, tvb,
+ 22, 1, ENC_NA);
+ proto_tree_add_item(ncsi_payload_tree, hf_ncsi_sm_at, tvb,
+ 23, 1, ENC_NA);
+ proto_tree_add_item(ncsi_payload_tree, hf_ncsi_sm_e, tvb,
+ 23, 1, ENC_NA);
+ break;
+ case 0x10:
+ proto_item_set_text(pti, "Enable broadcast filter request");
+ proto_tree_add_item(ncsi_payload_tree, hf_ncsi_bf, tvb,
+ 16, 4, ENC_NA);
+ proto_tree_add_item(ncsi_payload_tree, hf_ncsi_bf_arp, tvb,
+ 16, 4, ENC_NA);
+ proto_tree_add_item(ncsi_payload_tree, hf_ncsi_bf_dhcpc, tvb,
+ 16, 4, ENC_NA);
+ proto_tree_add_item(ncsi_payload_tree, hf_ncsi_bf_dhcps, tvb,
+ 16, 4, ENC_NA);
+ proto_tree_add_item(ncsi_payload_tree, hf_ncsi_bf_netbios, tvb,
+ 16, 4, ENC_NA);
+ break;
+ case NCSI_TYPE_GLS | 0x80:
+ proto_item_set_text(pti, "Get Link Status response");
+ ncsi_proto_tree_add_lstat(tvb, ncsi_payload_tree, 20);
+ break;
+ case NCSI_TYPE_AEN | 0x80:
+ proto_item_set_text(pti, "AEN payload");
+ dissect_ncsi_aen(tvb, ncsi_payload_tree);
+ break;
+ }
+
+ return tvb_captured_length(tvb);
+}
+
+void
+proto_register_ncsi(void)
+{
+ /* Field definitions */
+ static hf_register_info hf[] = {
+ { &hf_ncsi_mc_id,
+ { "MC ID", "ncsi.mc_id",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Management controller ID", HFILL },
+ },
+ { &hf_ncsi_revision,
+ { "Revision", "ncsi.revision",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Header revision", HFILL },
+ },
+ { &hf_ncsi_iid,
+ { "IID", "ncsi.iid",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Instance ID", HFILL },
+ },
+ { &hf_ncsi_type,
+ { "Type", "ncsi.type",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Packet type", HFILL },
+ },
+ { &hf_ncsi_type_code,
+ { "Type code", "ncsi.type.code",
+ FT_UINT8, BASE_HEX, VALS(ncsi_type_vals), 0x7f,
+ "Packet type code", HFILL },
+ },
+ { &hf_ncsi_type_resp,
+ { "Type req/resp", "ncsi.type.resp",
+ FT_UINT8, BASE_HEX, VALS(ncsi_type_resp_vals), 0x80,
+ "Packet type request/response", HFILL },
+ },
+ { &hf_ncsi_chan,
+ { "Channel", "ncsi.chan",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "NCSI Channel", HFILL },
+ },
+ { &hf_ncsi_plen,
+ { "Payload Length", "ncsi.plen",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_resp,
+ { "Response", "ncsi.resp",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Response code", HFILL },
+ },
+ { &hf_ncsi_reason,
+ { "Reason", "ncsi.reason",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Reason code", HFILL },
+ },
+ { &hf_ncsi_sp_hwarb,
+ { "Hardware arbitration disable", "ncsi.sp.hwarb",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_dc_ald,
+ { "Allow link down", "ncsi.dc.ald",
+ FT_UINT8, BASE_HEX, NULL, 0x1,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_aene_mc,
+ { "Management controller ID", "ncsi.aene.mc",
+ FT_UINT8, BASE_HEX, NULL, 0x1,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_sm_mac,
+ { "MAC address", "ncsi.sm.mac",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_sm_macno,
+ { "MAC address number", "ncsi.sm.macno",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_sm_at,
+ { "Address type", "ncsi.sm.at",
+ FT_UINT8, BASE_HEX, VALS(ncsi_sm_at_vals), 0xe0,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_sm_e,
+ { "Enabled", "ncsi.sm.e",
+ FT_UINT8, BASE_HEX, VALS(ncsi_enable_vals), 0x1,
+ NULL, HFILL },
+ },
+
+ { &hf_ncsi_aen_type,
+ { "AEN type", "ncsi.aen_type",
+ FT_UINT8, BASE_HEX, VALS(ncsi_aen_type_vals), 0xff,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_aen_lsc_stat,
+ { "AEN link status", "ncsi.aen_lsc_stat",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_aen_lsc_oemstat,
+ { "AEN link OEM status", "ncsi.aen_lsc_oemstat",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_aen_lsc_hcstat,
+ { "AEN link HC status", "ncsi.aen_lsc_hcstat",
+ FT_UINT8, BASE_HEX, VALS(ncsi_aen_hcstat_vals), 0x0,
+ "AEN link host controller status", HFILL },
+ },
+ /* Broadcast filter */
+ { &hf_ncsi_bf,
+ { "Broadcast filter settings", "ncsi.bf.settings",
+ FT_UINT32, BASE_HEX, NULL, 0x0,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_bf_arp,
+ { "ARP", "ncsi.bf.settings.arp",
+ FT_UINT32, BASE_HEX, VALS(ncsi_bf_filter_vals), 1 << 0,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_bf_dhcpc,
+ { "DHCP Client", "ncsi.bf.settings.dhcpc",
+ FT_UINT32, BASE_HEX, VALS(ncsi_bf_filter_vals), 1 << 1,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_bf_dhcps,
+ { "DHCP Server", "ncsi.bf.settings.dhcps",
+ FT_UINT32, BASE_HEX, VALS(ncsi_bf_filter_vals), 1 << 2,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_bf_netbios,
+ { "NetBIOS", "ncsi.bf.settings.netbios",
+ FT_UINT32, BASE_HEX, VALS(ncsi_bf_filter_vals), 1 << 3,
+ NULL, HFILL },
+ },
+
+ /* generic link status */
+ { &hf_ncsi_lstat,
+ { "Link status", "ncsi.lstat",
+ FT_UINT32, BASE_HEX, NULL, 0x0,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_lstat_flag,
+ { "Link flag", "ncsi.lstat.flag",
+ FT_UINT32, BASE_HEX, VALS(ncsi_lstat_flag_vals), 0x1,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_lstat_speed_duplex,
+ { "Speed & duplex", "ncsi.lstat.speed_duplex",
+ FT_UINT32, BASE_HEX, VALS(ncsi_lstat_speed_duplex_vals), 0x1e,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_lstat_autoneg,
+ { "Autonegotiation", "ncsi.lstat.autoneg",
+ FT_UINT32, BASE_HEX, VALS(ncsi_enable_vals), 1<<5,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_lstat_autoneg_complete,
+ { "Autonegotiation complete", "ncsi.lstat.autoneg_complete",
+ FT_UINT32, BASE_HEX, VALS(ncsi_autoneg_complete_vals), 1<<6,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_lstat_parallel_detection,
+ { "Parallel detection", "ncsi.lstat.parallel_detection",
+ FT_UINT32, BASE_HEX, VALS(ncsi_used_vals), 1<<7,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_lstat_1000TFD,
+ { "1000TFD", "ncsi.lstat.1000tfd",
+ FT_UINT32, BASE_HEX, VALS(ncsi_capable_vals), 1<<9,
+ "Partner advertised 1000TFD", HFILL },
+ },
+ { &hf_ncsi_lstat_1000THD,
+ { "1000THD", "ncsi.lstat.1000thd",
+ FT_UINT32, BASE_HEX, VALS(ncsi_capable_vals), 1<<10,
+ "Partner advertised 1000THD", HFILL },
+ },
+ { &hf_ncsi_lstat_100T4,
+ { "100T4", "ncsi.lstat.100t4",
+ FT_UINT32, BASE_HEX, VALS(ncsi_capable_vals), 1<<11,
+ "Partner advertised 100T4", HFILL },
+ },
+ { &hf_ncsi_lstat_100TXFD,
+ { "100TXFD", "ncsi.lstat.100txfd",
+ FT_UINT32, BASE_HEX, VALS(ncsi_capable_vals), 1<<12,
+ "Partner advertised 100TXFD", HFILL },
+ },
+ { &hf_ncsi_lstat_100TXHD,
+ { "100TXHD", "ncsi.lstat.100txhd",
+ FT_UINT32, BASE_HEX, VALS(ncsi_capable_vals), 1<<13,
+ "Partner advertised 100TXHD", HFILL },
+ },
+ { &hf_ncsi_lstat_10TFD,
+ { "10TFD", "ncsi.lstat.10tfd",
+ FT_UINT32, BASE_HEX, VALS(ncsi_capable_vals), 1<<14,
+ "Partner advertised 10TFD", HFILL },
+ },
+ { &hf_ncsi_lstat_10THD,
+ { "10THD", "ncsi.lstat.10thd",
+ FT_UINT32, BASE_HEX, VALS(ncsi_capable_vals), 1<<15,
+ "Partner advertised 10THD", HFILL },
+ },
+ { &hf_ncsi_lstat_tx_flow,
+ { "TX flow", "ncsi.lstat.tx_flow",
+ FT_UINT32, BASE_HEX, VALS(ncsi_enable_vals), 1<<16,
+ "TX flow control", HFILL },
+ },
+ { &hf_ncsi_lstat_rx_flow,
+ { "RX flow", "ncsi.lstat.rx_flow",
+ FT_UINT32, BASE_HEX, VALS(ncsi_enable_vals), 1<<17,
+ "RX flow control", HFILL },
+ },
+ { &hf_ncsi_lstat_partner_flow,
+ { "Partner flow", "ncsi.lstat.partner_flow",
+ FT_UINT32, BASE_HEX, VALS(ncsi_partner_flow_vals), 3<<18,
+ "Partner-advertised flow control", HFILL },
+ },
+ { &hf_ncsi_lstat_serdes,
+ { "SerDes", "ncsi.lstat.serdes",
+ FT_UINT32, BASE_HEX, VALS(ncsi_used_vals), 1<<20,
+ NULL, HFILL },
+ },
+ { &hf_ncsi_lstat_oem_speed_valid,
+ { "OEM Speed", "ncsi.lstat.oem_speed_valid",
+ FT_UINT32, BASE_HEX, VALS(ncsi_valid_vals), 1<<21,
+ NULL, HFILL },
+ },
+ };
+
+ /* Setup protocol subtree array */
+ static gint *ett[] = {
+ &ett_ncsi,
+ &ett_ncsi_type,
+ &ett_ncsi_payload,
+ &ett_ncsi_lstat,
+ };
+
+ /* Register the protocol name and description */
+ proto_ncsi = proto_register_protocol("NCSI", "NCSI", "ncsi");
+
+ /* Required function calls to register the header fields and subtrees */
+ proto_register_field_array(proto_ncsi, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+}
+
+void
+proto_reg_handoff_ncsi(void)
+{
+ dissector_handle_t ncsi_handle;
+ ncsi_handle = create_dissector_handle(dissect_ncsi, proto_ncsi);
+ dissector_add_uint("ethertype", ETHERTYPE_NCSI, ncsi_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=true:
+ */