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