1*1285115cSWilliam A. Kennington III /*
2*1285115cSWilliam A. Kennington III  * Copyright 2021 Google LLC
3*1285115cSWilliam A. Kennington III  *
4*1285115cSWilliam A. Kennington III  * Licensed under the Apache License, Version 2.0 (the "License");
5*1285115cSWilliam A. Kennington III  * you may not use this file except in compliance with the License.
6*1285115cSWilliam A. Kennington III  * You may obtain a copy of the License at
7*1285115cSWilliam A. Kennington III  *
8*1285115cSWilliam A. Kennington III  *      http://www.apache.org/licenses/LICENSE-2.0
9*1285115cSWilliam A. Kennington III  *
10*1285115cSWilliam A. Kennington III  * Unless required by applicable law or agreed to in writing, software
11*1285115cSWilliam A. Kennington III  * distributed under the License is distributed on an "AS IS" BASIS,
12*1285115cSWilliam A. Kennington III  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*1285115cSWilliam A. Kennington III  * See the License for the specific language governing permissions and
14*1285115cSWilliam A. Kennington III  * limitations under the License.
15*1285115cSWilliam A. Kennington III  */
16*1285115cSWilliam A. Kennington III 
17*1285115cSWilliam A. Kennington III #ifndef PLATFORMS_NEMORA_PORTABLE_NCSI_H_
18*1285115cSWilliam A. Kennington III #define PLATFORMS_NEMORA_PORTABLE_NCSI_H_
19*1285115cSWilliam A. Kennington III 
20*1285115cSWilliam A. Kennington III /*
21*1285115cSWilliam A. Kennington III  * Module for interacting with NC-SI capable network cards.
22*1285115cSWilliam A. Kennington III  *
23*1285115cSWilliam A. Kennington III  * DMTF v1.0.0 NC-SI specification:
24*1285115cSWilliam A. Kennington III  * http://www.dmtf.org/sites/default/files/standards/documents/DSP0222_1.0.0.pdf
25*1285115cSWilliam A. Kennington III  */
26*1285115cSWilliam A. Kennington III 
27*1285115cSWilliam A. Kennington III #include <stdbool.h>
28*1285115cSWilliam A. Kennington III #include <stdint.h>
29*1285115cSWilliam A. Kennington III 
30*1285115cSWilliam A. Kennington III #include "platforms/nemora/portable/net_types.h"
31*1285115cSWilliam A. Kennington III 
32*1285115cSWilliam A. Kennington III #ifdef __cplusplus
33*1285115cSWilliam A. Kennington III extern "C" {
34*1285115cSWilliam A. Kennington III #endif
35*1285115cSWilliam A. Kennington III 
36*1285115cSWilliam A. Kennington III #ifndef __packed
37*1285115cSWilliam A. Kennington III #define __packed __attribute__((packed))
38*1285115cSWilliam A. Kennington III #endif
39*1285115cSWilliam A. Kennington III 
40*1285115cSWilliam A. Kennington III // Define states for our NC-SI connection to the NIC.
41*1285115cSWilliam A. Kennington III // There is no mapping to the NC-SI specification for these states, but they
42*1285115cSWilliam A. Kennington III // reflect the outcome of NC-SI commands used in our configuration state
43*1285115cSWilliam A. Kennington III // machine.
44*1285115cSWilliam A. Kennington III //
45*1285115cSWilliam A. Kennington III // 'DOWN' - while in this state, periodically restart the configuration state
46*1285115cSWilliam A. Kennington III //   machine until it succeeds.
47*1285115cSWilliam A. Kennington III // 'LOOPBACK' - the response to the first NC-SI command of the configuration
48*1285115cSWilliam A. Kennington III //   state machine was identical to the command: from this we infer we are in
49*1285115cSWilliam A. Kennington III //   loopback. While in this state, periodically restart the configuration state
50*1285115cSWilliam A. Kennington III //   machine.
51*1285115cSWilliam A. Kennington III // 'UP' - all commands were responded successfully, but need DHCP configuration
52*1285115cSWilliam A. Kennington III //   to go to the next state. While in this state, the connection is tested
53*1285115cSWilliam A. Kennington III //   periodically for failures, which can bring back to 'DOWN'.
54*1285115cSWilliam A. Kennington III // 'UP_AND_CONFIGURED' - NC-SI OEM commands for L3/L4 configuration (which
55*1285115cSWilliam A. Kennington III //   depend on DHCP configuration) were responded successfully. While in this
56*1285115cSWilliam A. Kennington III //   state, the connection and configuration are tested periodically for
57*1285115cSWilliam A. Kennington III //   failures, which can bring back to 'DOWN'.
58*1285115cSWilliam A. Kennington III // 'DISABLED' - reset default state. As soon as network is enabled (which
59*1285115cSWilliam A. Kennington III //   noticeably means that ProdID must be disabled), the state goes to DOWN.
60*1285115cSWilliam A. Kennington III // TODO: connection state has nothing to do with ncsi protocol and needs
61*1285115cSWilliam A. Kennington III // to be moved to ncsi_fsm.h. The main problem with the move is that
62*1285115cSWilliam A. Kennington III // ncsi_client.h defines an extern function with this return type, that is used
63*1285115cSWilliam A. Kennington III // in a lot of places that have no business including ncsi_fsm.h
64*1285115cSWilliam A. Kennington III typedef enum {
65*1285115cSWilliam A. Kennington III   NCSI_CONNECTION_DOWN,
66*1285115cSWilliam A. Kennington III   NCSI_CONNECTION_LOOPBACK,
67*1285115cSWilliam A. Kennington III   NCSI_CONNECTION_UP,
68*1285115cSWilliam A. Kennington III   NCSI_CONNECTION_UP_AND_CONFIGURED,
69*1285115cSWilliam A. Kennington III   NCSI_CONNECTION_DISABLED,
70*1285115cSWilliam A. Kennington III } ncsi_connection_state_t;
71*1285115cSWilliam A. Kennington III 
72*1285115cSWilliam A. Kennington III typedef enum {
73*1285115cSWilliam A. Kennington III   NCSI_RESPONSE_NONE,
74*1285115cSWilliam A. Kennington III   NCSI_RESPONSE_ACK,
75*1285115cSWilliam A. Kennington III   NCSI_RESPONSE_NACK,
76*1285115cSWilliam A. Kennington III   NCSI_RESPONSE_UNDERSIZED,
77*1285115cSWilliam A. Kennington III   NCSI_RESPONSE_UNEXPECTED_TYPE,
78*1285115cSWilliam A. Kennington III   NCSI_RESPONSE_UNEXPECTED_SIZE,
79*1285115cSWilliam A. Kennington III   NCSI_RESPONSE_OEM_FORMAT_ERROR,
80*1285115cSWilliam A. Kennington III   NCSI_RESPONSE_TIMEOUT,
81*1285115cSWilliam A. Kennington III   NCSI_RESPONSE_UNEXPECTED_PARAMS,
82*1285115cSWilliam A. Kennington III } ncsi_response_type_t;
83*1285115cSWilliam A. Kennington III 
84*1285115cSWilliam A. Kennington III // For NC-SI Rev 1.0.0, the management controller ID (mc_id) is 0.
85*1285115cSWilliam A. Kennington III #define NCSI_MC_ID 0
86*1285115cSWilliam A. Kennington III // For NC-SI Rev 1.0.0, the header revision is 0x01.
87*1285115cSWilliam A. Kennington III #define NCSI_HEADER_REV 1
88*1285115cSWilliam A. Kennington III #define NCSI_ETHERTYPE 0x88F8
89*1285115cSWilliam A. Kennington III #define NCSI_RESPONSE 0x80
90*1285115cSWilliam A. Kennington III 
91*1285115cSWilliam A. Kennington III // Command IDs
92*1285115cSWilliam A. Kennington III enum {
93*1285115cSWilliam A. Kennington III   NCSI_CLEAR_INITIAL_STATE,
94*1285115cSWilliam A. Kennington III   NCSI_SELECT_PACKAGE,
95*1285115cSWilliam A. Kennington III   NCSI_DESELECT_PACKAGE,
96*1285115cSWilliam A. Kennington III   NCSI_ENABLE_CHANNEL,
97*1285115cSWilliam A. Kennington III   NCSI_DISABLE_CHANNEL,
98*1285115cSWilliam A. Kennington III   NCSI_RESET_CHANNEL,
99*1285115cSWilliam A. Kennington III   NCSI_ENABLE_CHANNEL_NETWORK_TX,
100*1285115cSWilliam A. Kennington III   NCSI_DISABLE_CHANNEL_NETWORK_TX,
101*1285115cSWilliam A. Kennington III   NCSI_AEN_ENABLE,
102*1285115cSWilliam A. Kennington III   NCSI_SET_LINK,
103*1285115cSWilliam A. Kennington III   NCSI_GET_LINK_STATUS,
104*1285115cSWilliam A. Kennington III   NCSI_SET_VLAN_FILTER,
105*1285115cSWilliam A. Kennington III   NCSI_ENABLE_VLAN,
106*1285115cSWilliam A. Kennington III   NCSI_DISABLE_VLAN,
107*1285115cSWilliam A. Kennington III   NCSI_SET_MAC_ADDRESS,
108*1285115cSWilliam A. Kennington III   // 0x0F is not a valid command
109*1285115cSWilliam A. Kennington III   NCSI_ENABLE_BROADCAST_FILTER = 0x10,
110*1285115cSWilliam A. Kennington III   NCSI_DISABLE_BROADCAST_FILTER,
111*1285115cSWilliam A. Kennington III   NCSI_ENABLE_GLOBAL_MULTICAST_FILTER,
112*1285115cSWilliam A. Kennington III   NCSI_DISABLE_GLOBAL_MULTICAST_FILTER,
113*1285115cSWilliam A. Kennington III   NCSI_SET_NCSI_FLOW_CONTROL,
114*1285115cSWilliam A. Kennington III   NCSI_GET_VERSION_ID,
115*1285115cSWilliam A. Kennington III   NCSI_GET_CAPABILITIES,
116*1285115cSWilliam A. Kennington III   NCSI_GET_PARAMETERS,
117*1285115cSWilliam A. Kennington III   NCSI_GET_CONTROLLER_PACKET_STATISTICS,
118*1285115cSWilliam A. Kennington III   NCSI_GET_NCSI_STATISTICS,
119*1285115cSWilliam A. Kennington III   NCSI_GET_PASSTHROUGH_STATISTICS,
120*1285115cSWilliam A. Kennington III   // 0x1B-0x4F are not valid commands
121*1285115cSWilliam A. Kennington III   NCSI_OEM_COMMAND = 0x50,
122*1285115cSWilliam A. Kennington III };
123*1285115cSWilliam A. Kennington III // OEM Command IDs (subtypes of NCSI_OEM_COMMAND)
124*1285115cSWilliam A. Kennington III #define NCSI_OEM_COMMAND_GET_HOST_MAC 0x00
125*1285115cSWilliam A. Kennington III #define NCSI_OEM_COMMAND_SET_FILTER 0x01
126*1285115cSWilliam A. Kennington III #define NCSI_OEM_COMMAND_GET_FILTER 0x02
127*1285115cSWilliam A. Kennington III #define NCSI_OEM_COMMAND_ECHO 0x03
128*1285115cSWilliam A. Kennington III 
129*1285115cSWilliam A. Kennington III #define NCSI_OEM_MANUFACTURER_ID 11129  // IANA Enterprise Number for Google.
130*1285115cSWilliam A. Kennington III #define NCSI_OEM_ECHO_PATTERN_SIZE 64
131*1285115cSWilliam A. Kennington III 
132*1285115cSWilliam A. Kennington III /*
133*1285115cSWilliam A. Kennington III  * NCSI command frame with packet header as described in section 8.2.1.
134*1285115cSWilliam A. Kennington III  * Prepended with an ethernet header.
135*1285115cSWilliam A. Kennington III  */
136*1285115cSWilliam A. Kennington III typedef struct __packed {
137*1285115cSWilliam A. Kennington III   eth_hdr_t ethhdr;
138*1285115cSWilliam A. Kennington III   uint8_t mc_id;
139*1285115cSWilliam A. Kennington III   uint8_t header_revision;
140*1285115cSWilliam A. Kennington III   uint8_t reserved_00;
141*1285115cSWilliam A. Kennington III   uint8_t instance_id;          // Destinguish retried commands from new ones.
142*1285115cSWilliam A. Kennington III   uint8_t control_packet_type;  // See section 8.3, and Table 17.
143*1285115cSWilliam A. Kennington III   uint8_t channel_id;
144*1285115cSWilliam A. Kennington III   uint16_t payload_length;  // In Bytes. Excludes header, checksum, padding.
145*1285115cSWilliam A. Kennington III   uint16_t reserved_01[4];
146*1285115cSWilliam A. Kennington III } ncsi_header_t;
147*1285115cSWilliam A. Kennington III 
148*1285115cSWilliam A. Kennington III /*
149*1285115cSWilliam A. Kennington III  * Simple NCSI response packet.
150*1285115cSWilliam A. Kennington III  */
151*1285115cSWilliam A. Kennington III typedef struct __packed {
152*1285115cSWilliam A. Kennington III   ncsi_header_t hdr;
153*1285115cSWilliam A. Kennington III   uint16_t response_code;
154*1285115cSWilliam A. Kennington III   uint16_t reason_code;
155*1285115cSWilliam A. Kennington III } ncsi_simple_response_t;
156*1285115cSWilliam A. Kennington III 
157*1285115cSWilliam A. Kennington III /*
158*1285115cSWilliam A. Kennington III  * Simple NCSI command packet.
159*1285115cSWilliam A. Kennington III  */
160*1285115cSWilliam A. Kennington III typedef struct {
161*1285115cSWilliam A. Kennington III   ncsi_header_t hdr;
162*1285115cSWilliam A. Kennington III } ncsi_simple_command_t;
163*1285115cSWilliam A. Kennington III 
164*1285115cSWilliam A. Kennington III /*
165*1285115cSWilliam A. Kennington III  * Get Link Status Response. 8.4.24
166*1285115cSWilliam A. Kennington III  */
167*1285115cSWilliam A. Kennington III typedef struct __packed {
168*1285115cSWilliam A. Kennington III   uint32_t link_status;
169*1285115cSWilliam A. Kennington III   uint32_t other_indications;
170*1285115cSWilliam A. Kennington III   uint32_t oem_link_status;
171*1285115cSWilliam A. Kennington III } ncsi_link_status_t;
172*1285115cSWilliam A. Kennington III 
173*1285115cSWilliam A. Kennington III typedef struct __packed {
174*1285115cSWilliam A. Kennington III   ncsi_header_t hdr;
175*1285115cSWilliam A. Kennington III   uint16_t response_code;
176*1285115cSWilliam A. Kennington III   uint16_t reason_code;
177*1285115cSWilliam A. Kennington III   ncsi_link_status_t link_status;
178*1285115cSWilliam A. Kennington III } ncsi_link_status_response_t;
179*1285115cSWilliam A. Kennington III 
180*1285115cSWilliam A. Kennington III #define NCSI_LINK_STATUS_UP (1 << 0)
181*1285115cSWilliam A. Kennington III 
182*1285115cSWilliam A. Kennington III /*
183*1285115cSWilliam A. Kennington III  * Set MAC Address packet. 8.4.31
184*1285115cSWilliam A. Kennington III  */
185*1285115cSWilliam A. Kennington III typedef struct __packed {
186*1285115cSWilliam A. Kennington III   ncsi_header_t hdr;
187*1285115cSWilliam A. Kennington III   mac_addr_t mac_addr;
188*1285115cSWilliam A. Kennington III   uint8_t mac_addr_num;
189*1285115cSWilliam A. Kennington III   uint8_t misc;
190*1285115cSWilliam A. Kennington III } ncsi_set_mac_command_t;
191*1285115cSWilliam A. Kennington III 
192*1285115cSWilliam A. Kennington III /*
193*1285115cSWilliam A. Kennington III  * Enable Broadcast Filter packet. 8.4.33
194*1285115cSWilliam A. Kennington III  */
195*1285115cSWilliam A. Kennington III typedef struct __packed {
196*1285115cSWilliam A. Kennington III   ncsi_header_t hdr;
197*1285115cSWilliam A. Kennington III   uint32_t filter_settings;
198*1285115cSWilliam A. Kennington III } ncsi_enable_broadcast_filter_command_t;
199*1285115cSWilliam A. Kennington III 
200*1285115cSWilliam A. Kennington III #define NCSI_BROADCAST_FILTER_MASK_ARP         (1 << 0)
201*1285115cSWilliam A. Kennington III #define NCSI_BROADCAST_FILTER_MASK_DHCP_CLIENT (1 << 1)
202*1285115cSWilliam A. Kennington III #define NCSI_BROADCAST_FILTER_MASK_DHCP_SERVER (1 << 2)
203*1285115cSWilliam A. Kennington III #define NCSI_BROADCAST_FILTER_MASK_NETBIOS     (1 << 3)
204*1285115cSWilliam A. Kennington III 
205*1285115cSWilliam A. Kennington III /*
206*1285115cSWilliam A. Kennington III  * Get Version ID Response. 8.4.44
207*1285115cSWilliam A. Kennington III  */
208*1285115cSWilliam A. Kennington III typedef struct __packed {
209*1285115cSWilliam A. Kennington III   struct {
210*1285115cSWilliam A. Kennington III     uint8_t major;
211*1285115cSWilliam A. Kennington III     uint8_t minor;
212*1285115cSWilliam A. Kennington III     uint8_t update;
213*1285115cSWilliam A. Kennington III     uint8_t alpha1;
214*1285115cSWilliam A. Kennington III     uint8_t reserved[3];
215*1285115cSWilliam A. Kennington III     uint8_t alpha2;
216*1285115cSWilliam A. Kennington III   } ncsi_version;
217*1285115cSWilliam A. Kennington III   uint8_t firmware_name_string[12];
218*1285115cSWilliam A. Kennington III   uint32_t firmware_version;
219*1285115cSWilliam A. Kennington III   uint16_t pci_did;
220*1285115cSWilliam A. Kennington III   uint16_t pci_vid;
221*1285115cSWilliam A. Kennington III   uint16_t pci_ssid;
222*1285115cSWilliam A. Kennington III   uint16_t pci_svid;
223*1285115cSWilliam A. Kennington III   uint32_t manufacturer_id;
224*1285115cSWilliam A. Kennington III } ncsi_version_id_t;
225*1285115cSWilliam A. Kennington III 
226*1285115cSWilliam A. Kennington III typedef struct __packed {
227*1285115cSWilliam A. Kennington III   ncsi_header_t hdr;
228*1285115cSWilliam A. Kennington III   uint16_t response_code;
229*1285115cSWilliam A. Kennington III   uint16_t reason_code;
230*1285115cSWilliam A. Kennington III   ncsi_version_id_t version;
231*1285115cSWilliam A. Kennington III } ncsi_version_id_response_t;
232*1285115cSWilliam A. Kennington III 
233*1285115cSWilliam A. Kennington III /*
234*1285115cSWilliam A. Kennington III  * Get Capabilities Response 8.4.46
235*1285115cSWilliam A. Kennington III  */
236*1285115cSWilliam A. Kennington III typedef struct __packed {
237*1285115cSWilliam A. Kennington III   ncsi_header_t hdr;
238*1285115cSWilliam A. Kennington III   uint16_t response_code;
239*1285115cSWilliam A. Kennington III   uint16_t reason_code;
240*1285115cSWilliam A. Kennington III   uint32_t capabilities_flags;
241*1285115cSWilliam A. Kennington III   uint32_t broadcast_packet_filter_capabilties;
242*1285115cSWilliam A. Kennington III   uint32_t multicast_packet_filter_capabilties;
243*1285115cSWilliam A. Kennington III   uint32_t buffering_capability;
244*1285115cSWilliam A. Kennington III   uint32_t aen_control_support;
245*1285115cSWilliam A. Kennington III   uint8_t vlan_filter_count;
246*1285115cSWilliam A. Kennington III   uint8_t mixed_filter_count;
247*1285115cSWilliam A. Kennington III   uint8_t multicast_filter_count;
248*1285115cSWilliam A. Kennington III   uint8_t unicast_filter_count;
249*1285115cSWilliam A. Kennington III   uint16_t reserved;
250*1285115cSWilliam A. Kennington III   uint8_t vlan_mode_support;
251*1285115cSWilliam A. Kennington III   uint8_t channel_count;
252*1285115cSWilliam A. Kennington III } ncsi_capabilities_response_t;
253*1285115cSWilliam A. Kennington III 
254*1285115cSWilliam A. Kennington III /*
255*1285115cSWilliam A. Kennington III  * Get Parameters Response 8.4.48
256*1285115cSWilliam A. Kennington III  */
257*1285115cSWilliam A. Kennington III typedef struct __packed {
258*1285115cSWilliam A. Kennington III   ncsi_header_t hdr;
259*1285115cSWilliam A. Kennington III   uint16_t response_code;
260*1285115cSWilliam A. Kennington III   uint16_t reason_code;
261*1285115cSWilliam A. Kennington III   // TODO: Note: Mellanox 1.4 FW has mac count swapped with mac flags.
262*1285115cSWilliam A. Kennington III   uint8_t mac_address_count;
263*1285115cSWilliam A. Kennington III   uint16_t reserved_01;
264*1285115cSWilliam A. Kennington III   uint8_t mac_address_flags;
265*1285115cSWilliam A. Kennington III   uint8_t vlan_tag_count;
266*1285115cSWilliam A. Kennington III   uint8_t reserved_02;
267*1285115cSWilliam A. Kennington III   uint16_t vlan_tag_flags;
268*1285115cSWilliam A. Kennington III   uint32_t link_settings;
269*1285115cSWilliam A. Kennington III   uint32_t broadcast_settings;
270*1285115cSWilliam A. Kennington III   uint32_t configuration_flags;
271*1285115cSWilliam A. Kennington III   uint8_t vlan_mode;
272*1285115cSWilliam A. Kennington III   uint8_t flow_control_enable;
273*1285115cSWilliam A. Kennington III   uint16_t reserved_03;
274*1285115cSWilliam A. Kennington III   uint32_t aen_control;
275*1285115cSWilliam A. Kennington III   mac_addr_t mac_address[2];
276*1285115cSWilliam A. Kennington III   // TODO: Variable number of mac address filters (max 8. See 8.4.48)
277*1285115cSWilliam A. Kennington III   uint16_t vlan_tags[2];
278*1285115cSWilliam A. Kennington III   // TODO: Variable of vlan filters (up to 15 based on 8.4.48)
279*1285115cSWilliam A. Kennington III } ncsi_parameters_response_t;
280*1285115cSWilliam A. Kennington III 
281*1285115cSWilliam A. Kennington III /*
282*1285115cSWilliam A. Kennington III  * Get Passthrough statistics response. 8.4.54
283*1285115cSWilliam A. Kennington III  *
284*1285115cSWilliam A. Kennington III  * The legacy data structure matches MLX implementation up to vX
285*1285115cSWilliam A. Kennington III  * (Google vX), however the standard requires the first field to be
286*1285115cSWilliam A. Kennington III  * 64bits and MLX fixed it in vX (Google vX).
287*1285115cSWilliam A. Kennington III  *
288*1285115cSWilliam A. Kennington III  */
289*1285115cSWilliam A. Kennington III typedef struct __packed {
290*1285115cSWilliam A. Kennington III   uint32_t tx_packets_received;  // EC -> NIC
291*1285115cSWilliam A. Kennington III   uint32_t tx_packets_dropped;
292*1285115cSWilliam A. Kennington III   uint32_t tx_channel_errors;
293*1285115cSWilliam A. Kennington III   uint32_t tx_undersized_errors;
294*1285115cSWilliam A. Kennington III   uint32_t tx_oversized_errors;
295*1285115cSWilliam A. Kennington III   uint32_t rx_packets_received;  // Network -> NIC
296*1285115cSWilliam A. Kennington III   uint32_t rx_packets_dropped;
297*1285115cSWilliam A. Kennington III   uint32_t rx_channel_errors;
298*1285115cSWilliam A. Kennington III   uint32_t rx_undersized_errors;
299*1285115cSWilliam A. Kennington III   uint32_t rx_oversized_errors;
300*1285115cSWilliam A. Kennington III } ncsi_passthrough_stats_legacy_t;
301*1285115cSWilliam A. Kennington III 
302*1285115cSWilliam A. Kennington III typedef struct __packed {
303*1285115cSWilliam A. Kennington III   uint32_t tx_packets_received_hi;  // EC -> NIC (higher 32bit)
304*1285115cSWilliam A. Kennington III   uint32_t tx_packets_received_lo;  // EC -> NIC (lower 32bit)
305*1285115cSWilliam A. Kennington III   uint32_t tx_packets_dropped;
306*1285115cSWilliam A. Kennington III   uint32_t tx_channel_errors;
307*1285115cSWilliam A. Kennington III   uint32_t tx_undersized_errors;
308*1285115cSWilliam A. Kennington III   uint32_t tx_oversized_errors;
309*1285115cSWilliam A. Kennington III   uint32_t rx_packets_received;  // Network -> NIC
310*1285115cSWilliam A. Kennington III   uint32_t rx_packets_dropped;
311*1285115cSWilliam A. Kennington III   uint32_t rx_channel_errors;
312*1285115cSWilliam A. Kennington III   uint32_t rx_undersized_errors;
313*1285115cSWilliam A. Kennington III   uint32_t rx_oversized_errors;
314*1285115cSWilliam A. Kennington III } ncsi_passthrough_stats_t;
315*1285115cSWilliam A. Kennington III 
316*1285115cSWilliam A. Kennington III typedef struct __packed {
317*1285115cSWilliam A. Kennington III   ncsi_header_t hdr;
318*1285115cSWilliam A. Kennington III   uint16_t response_code;
319*1285115cSWilliam A. Kennington III   uint16_t reason_code;
320*1285115cSWilliam A. Kennington III   ncsi_passthrough_stats_legacy_t stats;
321*1285115cSWilliam A. Kennington III } ncsi_passthrough_stats_legacy_response_t;
322*1285115cSWilliam A. Kennington III 
323*1285115cSWilliam A. Kennington III typedef struct __packed {
324*1285115cSWilliam A. Kennington III   ncsi_header_t hdr;
325*1285115cSWilliam A. Kennington III   uint16_t response_code;
326*1285115cSWilliam A. Kennington III   uint16_t reason_code;
327*1285115cSWilliam A. Kennington III   ncsi_passthrough_stats_t stats;
328*1285115cSWilliam A. Kennington III } ncsi_passthrough_stats_response_t;
329*1285115cSWilliam A. Kennington III 
330*1285115cSWilliam A. Kennington III /*
331*1285115cSWilliam A. Kennington III  * OEM extension header for custom commands.
332*1285115cSWilliam A. Kennington III  */
333*1285115cSWilliam A. Kennington III typedef struct __packed {
334*1285115cSWilliam A. Kennington III   uint32_t manufacturer_id;
335*1285115cSWilliam A. Kennington III   uint8_t reserved[3];
336*1285115cSWilliam A. Kennington III   uint8_t oem_cmd;
337*1285115cSWilliam A. Kennington III } ncsi_oem_extension_header_t;
338*1285115cSWilliam A. Kennington III 
339*1285115cSWilliam A. Kennington III /*
340*1285115cSWilliam A. Kennington III  * Response format for simple OEM command.
341*1285115cSWilliam A. Kennington III  */
342*1285115cSWilliam A. Kennington III typedef struct __packed {
343*1285115cSWilliam A. Kennington III   ncsi_header_t hdr;
344*1285115cSWilliam A. Kennington III   uint16_t response_code;
345*1285115cSWilliam A. Kennington III   uint16_t reason_code;
346*1285115cSWilliam A. Kennington III   ncsi_oem_extension_header_t oem_header;
347*1285115cSWilliam A. Kennington III } ncsi_oem_simple_response_t;
348*1285115cSWilliam A. Kennington III 
349*1285115cSWilliam A. Kennington III /*
350*1285115cSWilliam A. Kennington III  * Response format for OEM get MAC command.
351*1285115cSWilliam A. Kennington III  */
352*1285115cSWilliam A. Kennington III typedef struct __packed {
353*1285115cSWilliam A. Kennington III   ncsi_header_t hdr;
354*1285115cSWilliam A. Kennington III   uint16_t response_code;
355*1285115cSWilliam A. Kennington III   uint16_t reason_code;
356*1285115cSWilliam A. Kennington III   ncsi_oem_extension_header_t oem_header;
357*1285115cSWilliam A. Kennington III   uint16_t reserved0;
358*1285115cSWilliam A. Kennington III   uint8_t mac[6];
359*1285115cSWilliam A. Kennington III } ncsi_host_mac_response_t;
360*1285115cSWilliam A. Kennington III 
361*1285115cSWilliam A. Kennington III /*
362*1285115cSWilliam A. Kennington III  * Format for OEM filter.
363*1285115cSWilliam A. Kennington III  */
364*1285115cSWilliam A. Kennington III typedef struct __packed {
365*1285115cSWilliam A. Kennington III   uint16_t reserved0;
366*1285115cSWilliam A. Kennington III   uint8_t mac[6];
367*1285115cSWilliam A. Kennington III   // If ip is set to zero, the filter will match any IP address, including any
368*1285115cSWilliam A. Kennington III   // IPv6 address.
369*1285115cSWilliam A. Kennington III   uint32_t ip;  // Network order
370*1285115cSWilliam A. Kennington III   uint16_t port;  // Network order
371*1285115cSWilliam A. Kennington III   uint8_t reserved1;
372*1285115cSWilliam A. Kennington III   uint8_t flags;
373*1285115cSWilliam A. Kennington III   uint8_t regid[8];
374*1285115cSWilliam A. Kennington III } ncsi_oem_filter_t;
375*1285115cSWilliam A. Kennington III 
376*1285115cSWilliam A. Kennington III // Set flags
377*1285115cSWilliam A. Kennington III #define NCSI_OEM_FILTER_FLAGS_ENABLE      (0x01)
378*1285115cSWilliam A. Kennington III 
379*1285115cSWilliam A. Kennington III // Get flags
380*1285115cSWilliam A. Kennington III #define NCSI_OEM_FILTER_FLAGS_ENABLED     (0x01)
381*1285115cSWilliam A. Kennington III #define NCSI_OEM_FILTER_FLAGS_REGISTERED  (0x02)
382*1285115cSWilliam A. Kennington III #define NCSI_OEM_FILTER_FLAGS_HOSTLESS    (0x04)
383*1285115cSWilliam A. Kennington III 
384*1285115cSWilliam A. Kennington III /*
385*1285115cSWilliam A. Kennington III  * Command format for simple OEM command.
386*1285115cSWilliam A. Kennington III  */
387*1285115cSWilliam A. Kennington III typedef struct __packed {
388*1285115cSWilliam A. Kennington III   ncsi_header_t hdr;
389*1285115cSWilliam A. Kennington III   ncsi_oem_extension_header_t oem_header;
390*1285115cSWilliam A. Kennington III } ncsi_oem_simple_cmd_t;
391*1285115cSWilliam A. Kennington III 
392*1285115cSWilliam A. Kennington III /*
393*1285115cSWilliam A. Kennington III  * Response format for OEM get filter command.
394*1285115cSWilliam A. Kennington III  */
395*1285115cSWilliam A. Kennington III typedef struct __packed {
396*1285115cSWilliam A. Kennington III   ncsi_header_t hdr;
397*1285115cSWilliam A. Kennington III   uint16_t response_code;
398*1285115cSWilliam A. Kennington III   uint16_t reason_code;
399*1285115cSWilliam A. Kennington III   ncsi_oem_extension_header_t oem_header;
400*1285115cSWilliam A. Kennington III   ncsi_oem_filter_t filter;
401*1285115cSWilliam A. Kennington III } ncsi_oem_get_filter_response_t;
402*1285115cSWilliam A. Kennington III 
403*1285115cSWilliam A. Kennington III /*
404*1285115cSWilliam A. Kennington III  * Command format for OEM set filter command.
405*1285115cSWilliam A. Kennington III  */
406*1285115cSWilliam A. Kennington III typedef struct __packed {
407*1285115cSWilliam A. Kennington III   ncsi_header_t hdr;
408*1285115cSWilliam A. Kennington III   ncsi_oem_extension_header_t oem_header;
409*1285115cSWilliam A. Kennington III   ncsi_oem_filter_t filter;
410*1285115cSWilliam A. Kennington III } ncsi_oem_set_filter_cmd_t;
411*1285115cSWilliam A. Kennington III 
412*1285115cSWilliam A. Kennington III /*
413*1285115cSWilliam A. Kennington III  * Command format for OEM echo command.
414*1285115cSWilliam A. Kennington III  */
415*1285115cSWilliam A. Kennington III typedef struct __packed {
416*1285115cSWilliam A. Kennington III   ncsi_header_t hdr;
417*1285115cSWilliam A. Kennington III   ncsi_oem_extension_header_t oem_header;
418*1285115cSWilliam A. Kennington III   uint8_t pattern[NCSI_OEM_ECHO_PATTERN_SIZE];
419*1285115cSWilliam A. Kennington III } ncsi_oem_echo_cmd_t;
420*1285115cSWilliam A. Kennington III 
421*1285115cSWilliam A. Kennington III /*
422*1285115cSWilliam A. Kennington III  * Response format for OEM echo command.
423*1285115cSWilliam A. Kennington III  */
424*1285115cSWilliam A. Kennington III typedef struct __packed {
425*1285115cSWilliam A. Kennington III   ncsi_header_t hdr;
426*1285115cSWilliam A. Kennington III   uint16_t response_code;
427*1285115cSWilliam A. Kennington III   uint16_t reason_code;
428*1285115cSWilliam A. Kennington III   ncsi_oem_extension_header_t oem_header;
429*1285115cSWilliam A. Kennington III   uint8_t pattern[NCSI_OEM_ECHO_PATTERN_SIZE];
430*1285115cSWilliam A. Kennington III } ncsi_oem_echo_response_t;
431*1285115cSWilliam A. Kennington III 
432*1285115cSWilliam A. Kennington III #ifdef __cplusplus
433*1285115cSWilliam A. Kennington III }  /* extern "C" */
434*1285115cSWilliam A. Kennington III #endif
435*1285115cSWilliam A. Kennington III 
436*1285115cSWilliam A. Kennington III #endif  // PLATFORMS_NEMORA_PORTABLE_NCSI_H_
437