diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2017-11-07 08:53:38 +0800 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2019-07-03 08:55:02 +0000 |
commit | eae522d9ccacbd08c27d9907d275e94dae131cd4 (patch) | |
tree | 7a8c35997b7fca28b0a420a11d9ac5cbbfdec20a | |
parent | baa22b38290ac6316a50be8fa94b3296056e7b19 (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.adoc | 1 | ||||
-rw-r--r-- | epan/dissectors/CMakeLists.txt | 1 | ||||
-rw-r--r-- | epan/dissectors/packet-ncsi.c | 640 |
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: + */ |