1*1285115cSWilliam A. Kennington III // Copyright 2021 Google LLC 2*1285115cSWilliam A. Kennington III // 3*1285115cSWilliam A. Kennington III // Licensed under the Apache License, Version 2.0 (the "License"); 4*1285115cSWilliam A. Kennington III // you may not use this file except in compliance with the License. 5*1285115cSWilliam A. Kennington III // You may obtain a copy of the License at 6*1285115cSWilliam A. Kennington III // 7*1285115cSWilliam A. Kennington III // http://www.apache.org/licenses/LICENSE-2.0 8*1285115cSWilliam A. Kennington III // 9*1285115cSWilliam A. Kennington III // Unless required by applicable law or agreed to in writing, software 10*1285115cSWilliam A. Kennington III // distributed under the License is distributed on an "AS IS" BASIS, 11*1285115cSWilliam A. Kennington III // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*1285115cSWilliam A. Kennington III // See the License for the specific language governing permissions and 13*1285115cSWilliam A. Kennington III // limitations under the License. 14*1285115cSWilliam A. Kennington III 15*1285115cSWilliam A. Kennington III #include "nic_mock.h" 16*1285115cSWilliam A. Kennington III 17*1285115cSWilliam A. Kennington III #include "platforms/nemora/portable/ncsi.h" 18*1285115cSWilliam A. Kennington III 19*1285115cSWilliam A. Kennington III #include <algorithm> 20*1285115cSWilliam A. Kennington III #include <cstddef> 21*1285115cSWilliam A. Kennington III #include <stdexcept> 22*1285115cSWilliam A. Kennington III 23*1285115cSWilliam A. Kennington III namespace mock 24*1285115cSWilliam A. Kennington III { 25*1285115cSWilliam A. Kennington III 26*1285115cSWilliam A. Kennington III bool NCSIFrame::parse_ethernet_frame(const ncsi_buf_t& ncsi_buf) 27*1285115cSWilliam A. Kennington III { 28*1285115cSWilliam A. Kennington III std::memcpy(&dst_mac_, ncsi_buf.data, sizeof(dst_mac_)); 29*1285115cSWilliam A. Kennington III std::memcpy(&src_mac_, ncsi_buf.data + sizeof(dst_mac_), sizeof(src_mac_)); 30*1285115cSWilliam A. Kennington III // The constant defined in a way that assumes big-endian platform, so we are 31*1285115cSWilliam A. Kennington III // just going to calculate it here properly. 32*1285115cSWilliam A. Kennington III const uint8_t et_hi = *(ncsi_buf.data + 2 * sizeof(mac_addr_t)); 33*1285115cSWilliam A. Kennington III const uint8_t et_lo = *(ncsi_buf.data + 2 * sizeof(mac_addr_t) + 1); 34*1285115cSWilliam A. Kennington III ethertype_ = (et_hi << 8) + et_lo; 35*1285115cSWilliam A. Kennington III 36*1285115cSWilliam A. Kennington III if (ethertype_ != NCSI_ETHERTYPE) 37*1285115cSWilliam A. Kennington III { 38*1285115cSWilliam A. Kennington III return false; 39*1285115cSWilliam A. Kennington III } 40*1285115cSWilliam A. Kennington III 41*1285115cSWilliam A. Kennington III // This code parses the NC-SI command, according to spec and 42*1285115cSWilliam A. Kennington III // as defined in platforms/nemora/portable/ncsi.h 43*1285115cSWilliam A. Kennington III // It takes some shortcuts to only retrieve the data we are interested in, 44*1285115cSWilliam A. Kennington III // such as using offsetof ot get to a particular field. 45*1285115cSWilliam A. Kennington III control_packet_type_ = 46*1285115cSWilliam A. Kennington III *(ncsi_buf.data + offsetof(ncsi_header_t, control_packet_type)); 47*1285115cSWilliam A. Kennington III channel_id_ = *(ncsi_buf.data + offsetof(ncsi_header_t, channel_id)); 48*1285115cSWilliam A. Kennington III 49*1285115cSWilliam A. Kennington III size_t payload_offset = sizeof(ncsi_header_t); 50*1285115cSWilliam A. Kennington III if (control_packet_type_ & NCSI_RESPONSE) 51*1285115cSWilliam A. Kennington III { 52*1285115cSWilliam A. Kennington III is_response_ = true; 53*1285115cSWilliam A. Kennington III control_packet_type_ &= ~NCSI_RESPONSE; 54*1285115cSWilliam A. Kennington III std::memcpy(&response_code_, ncsi_buf.data + payload_offset, 55*1285115cSWilliam A. Kennington III sizeof(response_code_)); 56*1285115cSWilliam A. Kennington III response_code_ = ntohs(response_code_); 57*1285115cSWilliam A. Kennington III std::memcpy(&reason_code_, 58*1285115cSWilliam A. Kennington III ncsi_buf.data + payload_offset + sizeof(reason_code_), 59*1285115cSWilliam A. Kennington III sizeof(reason_code_)); 60*1285115cSWilliam A. Kennington III reason_code_ = ntohs(reason_code_); 61*1285115cSWilliam A. Kennington III payload_offset += sizeof(reason_code_) + sizeof(response_code_); 62*1285115cSWilliam A. Kennington III } 63*1285115cSWilliam A. Kennington III 64*1285115cSWilliam A. Kennington III if (control_packet_type_ == NCSI_OEM_COMMAND) 65*1285115cSWilliam A. Kennington III { 66*1285115cSWilliam A. Kennington III std::memcpy(&manufacturer_id_, ncsi_buf.data + payload_offset, 67*1285115cSWilliam A. Kennington III sizeof(manufacturer_id_)); 68*1285115cSWilliam A. Kennington III manufacturer_id_ = ntohl(manufacturer_id_); 69*1285115cSWilliam A. Kennington III // Number of reserved bytes after manufacturer_id_ = 3 70*1285115cSWilliam A. Kennington III oem_command_ = 71*1285115cSWilliam A. Kennington III *(ncsi_buf.data + payload_offset + sizeof(manufacturer_id_) + 3); 72*1285115cSWilliam A. Kennington III payload_offset += sizeof(ncsi_oem_extension_header_t); 73*1285115cSWilliam A. Kennington III } 74*1285115cSWilliam A. Kennington III 75*1285115cSWilliam A. Kennington III packet_raw_ = 76*1285115cSWilliam A. Kennington III std::vector<uint8_t>(ncsi_buf.data, ncsi_buf.data + ncsi_buf.len); 77*1285115cSWilliam A. Kennington III // TODO: Verify payload length. 78*1285115cSWilliam A. Kennington III 79*1285115cSWilliam A. Kennington III return true; 80*1285115cSWilliam A. Kennington III } 81*1285115cSWilliam A. Kennington III 82*1285115cSWilliam A. Kennington III uint32_t NIC::handle_request(const ncsi_buf_t& request_buf, 83*1285115cSWilliam A. Kennington III ncsi_buf_t* response_buf) 84*1285115cSWilliam A. Kennington III { 85*1285115cSWilliam A. Kennington III const ncsi_header_t* ncsi_header = 86*1285115cSWilliam A. Kennington III reinterpret_cast<const ncsi_header_t*>(request_buf.data); 87*1285115cSWilliam A. Kennington III 88*1285115cSWilliam A. Kennington III NCSIFrame request_frame; 89*1285115cSWilliam A. Kennington III request_frame.parse_ethernet_frame(request_buf); 90*1285115cSWilliam A. Kennington III save_frame_to_log(request_frame); 91*1285115cSWilliam A. Kennington III 92*1285115cSWilliam A. Kennington III uint32_t response_size; 93*1285115cSWilliam A. Kennington III if (is_loopback_) 94*1285115cSWilliam A. Kennington III { 95*1285115cSWilliam A. Kennington III std::memcpy(response_buf, &request_buf, sizeof(request_buf)); 96*1285115cSWilliam A. Kennington III response_size = request_buf.len; 97*1285115cSWilliam A. Kennington III } 98*1285115cSWilliam A. Kennington III else if (std::find(simple_commands_.begin(), simple_commands_.end(), 99*1285115cSWilliam A. Kennington III ncsi_header->control_packet_type) != 100*1285115cSWilliam A. Kennington III simple_commands_.end()) 101*1285115cSWilliam A. Kennington III { 102*1285115cSWilliam A. Kennington III // Simple Response 103*1285115cSWilliam A. Kennington III response_size = 104*1285115cSWilliam A. Kennington III ncsi_build_simple_ack(request_buf.data, response_buf->data); 105*1285115cSWilliam A. Kennington III } 106*1285115cSWilliam A. Kennington III else 107*1285115cSWilliam A. Kennington III { 108*1285115cSWilliam A. Kennington III // Not-so-Simple Response 109*1285115cSWilliam A. Kennington III switch (ncsi_header->control_packet_type) 110*1285115cSWilliam A. Kennington III { 111*1285115cSWilliam A. Kennington III case NCSI_GET_VERSION_ID: 112*1285115cSWilliam A. Kennington III response_size = ncsi_build_version_id_ack( 113*1285115cSWilliam A. Kennington III request_buf.data, response_buf->data, &version_); 114*1285115cSWilliam A. Kennington III break; 115*1285115cSWilliam A. Kennington III case NCSI_GET_CAPABILITIES: 116*1285115cSWilliam A. Kennington III response_size = sizeof(ncsi_capabilities_response_t); 117*1285115cSWilliam A. Kennington III { 118*1285115cSWilliam A. Kennington III ncsi_capabilities_response_t response; 119*1285115cSWilliam A. Kennington III ncsi_build_response_header( 120*1285115cSWilliam A. Kennington III request_buf.data, reinterpret_cast<uint8_t*>(&response), 121*1285115cSWilliam A. Kennington III 0, 0, response_size - sizeof(ncsi_header_t)); 122*1285115cSWilliam A. Kennington III response.channel_count = channel_count_; 123*1285115cSWilliam A. Kennington III std::memcpy(response_buf->data, &response, 124*1285115cSWilliam A. Kennington III sizeof(response)); 125*1285115cSWilliam A. Kennington III } 126*1285115cSWilliam A. Kennington III break; 127*1285115cSWilliam A. Kennington III case NCSI_GET_PASSTHROUGH_STATISTICS: 128*1285115cSWilliam A. Kennington III if (is_legacy_) 129*1285115cSWilliam A. Kennington III { 130*1285115cSWilliam A. Kennington III response_size = ncsi_build_pt_stats_legacy_ack( 131*1285115cSWilliam A. Kennington III request_buf.data, response_buf->data, &stats_legacy_); 132*1285115cSWilliam A. Kennington III } 133*1285115cSWilliam A. Kennington III else 134*1285115cSWilliam A. Kennington III { 135*1285115cSWilliam A. Kennington III response_size = ncsi_build_pt_stats_ack( 136*1285115cSWilliam A. Kennington III request_buf.data, response_buf->data, &stats_); 137*1285115cSWilliam A. Kennington III } 138*1285115cSWilliam A. Kennington III break; 139*1285115cSWilliam A. Kennington III case NCSI_GET_LINK_STATUS: 140*1285115cSWilliam A. Kennington III response_size = ncsi_build_link_status_ack( 141*1285115cSWilliam A. Kennington III request_buf.data, response_buf->data, &link_status_); 142*1285115cSWilliam A. Kennington III break; 143*1285115cSWilliam A. Kennington III case NCSI_OEM_COMMAND: 144*1285115cSWilliam A. Kennington III response_size = handle_oem_request(request_buf, response_buf); 145*1285115cSWilliam A. Kennington III break; 146*1285115cSWilliam A. Kennington III default: 147*1285115cSWilliam A. Kennington III response_size = ncsi_build_simple_nack( 148*1285115cSWilliam A. Kennington III request_buf.data, response_buf->data, 1, 1); 149*1285115cSWilliam A. Kennington III break; 150*1285115cSWilliam A. Kennington III } 151*1285115cSWilliam A. Kennington III } 152*1285115cSWilliam A. Kennington III 153*1285115cSWilliam A. Kennington III response_buf->len = response_size; 154*1285115cSWilliam A. Kennington III 155*1285115cSWilliam A. Kennington III return response_size; 156*1285115cSWilliam A. Kennington III } 157*1285115cSWilliam A. Kennington III 158*1285115cSWilliam A. Kennington III uint32_t NIC::handle_oem_request(const ncsi_buf_t& request_buf, 159*1285115cSWilliam A. Kennington III ncsi_buf_t* response_buf) 160*1285115cSWilliam A. Kennington III { 161*1285115cSWilliam A. Kennington III const ncsi_oem_simple_cmd_t* oem_cmd = 162*1285115cSWilliam A. Kennington III reinterpret_cast<const ncsi_oem_simple_cmd_t*>(request_buf.data); 163*1285115cSWilliam A. Kennington III uint32_t response_size; 164*1285115cSWilliam A. Kennington III switch (oem_cmd->oem_header.oem_cmd) 165*1285115cSWilliam A. Kennington III { 166*1285115cSWilliam A. Kennington III case NCSI_OEM_COMMAND_GET_HOST_MAC: 167*1285115cSWilliam A. Kennington III response_size = ncsi_build_oem_get_mac_ack( 168*1285115cSWilliam A. Kennington III request_buf.data, response_buf->data, &mac_); 169*1285115cSWilliam A. Kennington III break; 170*1285115cSWilliam A. Kennington III case NCSI_OEM_COMMAND_SET_FILTER: 171*1285115cSWilliam A. Kennington III { 172*1285115cSWilliam A. Kennington III const ncsi_oem_set_filter_cmd_t* cmd = 173*1285115cSWilliam A. Kennington III reinterpret_cast<const ncsi_oem_set_filter_cmd_t*>( 174*1285115cSWilliam A. Kennington III request_buf.data); 175*1285115cSWilliam A. Kennington III if (set_filter(cmd->hdr.channel_id, cmd->filter)) 176*1285115cSWilliam A. Kennington III { 177*1285115cSWilliam A. Kennington III response_size = ncsi_build_oem_simple_ack(request_buf.data, 178*1285115cSWilliam A. Kennington III response_buf->data); 179*1285115cSWilliam A. Kennington III } 180*1285115cSWilliam A. Kennington III else 181*1285115cSWilliam A. Kennington III { 182*1285115cSWilliam A. Kennington III response_size = ncsi_build_simple_nack( 183*1285115cSWilliam A. Kennington III request_buf.data, response_buf->data, 3, 4); 184*1285115cSWilliam A. Kennington III } 185*1285115cSWilliam A. Kennington III } 186*1285115cSWilliam A. Kennington III break; 187*1285115cSWilliam A. Kennington III case NCSI_OEM_COMMAND_ECHO: 188*1285115cSWilliam A. Kennington III response_size = 189*1285115cSWilliam A. Kennington III ncsi_build_oem_echo_ack(request_buf.data, response_buf->data); 190*1285115cSWilliam A. Kennington III break; 191*1285115cSWilliam A. Kennington III case NCSI_OEM_COMMAND_GET_FILTER: 192*1285115cSWilliam A. Kennington III { 193*1285115cSWilliam A. Kennington III const ncsi_simple_command_t* cmd = 194*1285115cSWilliam A. Kennington III reinterpret_cast<const ncsi_simple_command_t*>( 195*1285115cSWilliam A. Kennington III request_buf.data); 196*1285115cSWilliam A. Kennington III if (cmd->hdr.channel_id == 0) 197*1285115cSWilliam A. Kennington III { 198*1285115cSWilliam A. Kennington III response_size = ncsi_build_oem_get_filter_ack( 199*1285115cSWilliam A. Kennington III request_buf.data, response_buf->data, &ch0_filter_); 200*1285115cSWilliam A. Kennington III } 201*1285115cSWilliam A. Kennington III else if (cmd->hdr.channel_id == 1) 202*1285115cSWilliam A. Kennington III { 203*1285115cSWilliam A. Kennington III response_size = ncsi_build_oem_get_filter_ack( 204*1285115cSWilliam A. Kennington III request_buf.data, response_buf->data, &ch1_filter_); 205*1285115cSWilliam A. Kennington III } 206*1285115cSWilliam A. Kennington III else 207*1285115cSWilliam A. Kennington III { 208*1285115cSWilliam A. Kennington III response_size = ncsi_build_simple_nack( 209*1285115cSWilliam A. Kennington III request_buf.data, response_buf->data, 3, 4); 210*1285115cSWilliam A. Kennington III } 211*1285115cSWilliam A. Kennington III } 212*1285115cSWilliam A. Kennington III break; 213*1285115cSWilliam A. Kennington III default: 214*1285115cSWilliam A. Kennington III response_size = ncsi_build_simple_nack(request_buf.data, 215*1285115cSWilliam A. Kennington III response_buf->data, 1, 2); 216*1285115cSWilliam A. Kennington III break; 217*1285115cSWilliam A. Kennington III } 218*1285115cSWilliam A. Kennington III 219*1285115cSWilliam A. Kennington III return response_size; 220*1285115cSWilliam A. Kennington III } 221*1285115cSWilliam A. Kennington III 222*1285115cSWilliam A. Kennington III bool NIC::is_filter_configured(uint8_t channel) const 223*1285115cSWilliam A. Kennington III { 224*1285115cSWilliam A. Kennington III if (channel == 0) 225*1285115cSWilliam A. Kennington III { 226*1285115cSWilliam A. Kennington III return is_ch0_filter_configured_; 227*1285115cSWilliam A. Kennington III } 228*1285115cSWilliam A. Kennington III else if (channel == 1) 229*1285115cSWilliam A. Kennington III { 230*1285115cSWilliam A. Kennington III return is_ch1_filter_configured_; 231*1285115cSWilliam A. Kennington III } 232*1285115cSWilliam A. Kennington III 233*1285115cSWilliam A. Kennington III throw std::invalid_argument("Unsupported channel"); 234*1285115cSWilliam A. Kennington III } 235*1285115cSWilliam A. Kennington III 236*1285115cSWilliam A. Kennington III bool NIC::set_filter(uint8_t channel, const ncsi_oem_filter_t& filter) 237*1285115cSWilliam A. Kennington III { 238*1285115cSWilliam A. Kennington III ncsi_oem_filter_t* nic_filter; 239*1285115cSWilliam A. Kennington III if (channel == 0) 240*1285115cSWilliam A. Kennington III { 241*1285115cSWilliam A. Kennington III nic_filter = &ch0_filter_; 242*1285115cSWilliam A. Kennington III is_ch0_filter_configured_ = true; 243*1285115cSWilliam A. Kennington III } 244*1285115cSWilliam A. Kennington III else if (channel == 1) 245*1285115cSWilliam A. Kennington III { 246*1285115cSWilliam A. Kennington III nic_filter = &ch1_filter_; 247*1285115cSWilliam A. Kennington III is_ch1_filter_configured_ = true; 248*1285115cSWilliam A. Kennington III } 249*1285115cSWilliam A. Kennington III else 250*1285115cSWilliam A. Kennington III { 251*1285115cSWilliam A. Kennington III throw std::invalid_argument("Unsupported channel"); 252*1285115cSWilliam A. Kennington III } 253*1285115cSWilliam A. Kennington III 254*1285115cSWilliam A. Kennington III std::memcpy(nic_filter->mac, filter.mac, MAC_ADDR_SIZE); 255*1285115cSWilliam A. Kennington III nic_filter->ip = 0; 256*1285115cSWilliam A. Kennington III nic_filter->port = filter.port; 257*1285115cSWilliam A. Kennington III return true; 258*1285115cSWilliam A. Kennington III } 259*1285115cSWilliam A. Kennington III 260*1285115cSWilliam A. Kennington III const ncsi_oem_filter_t& NIC::get_filter(uint8_t channel) const 261*1285115cSWilliam A. Kennington III { 262*1285115cSWilliam A. Kennington III if (channel == 0) 263*1285115cSWilliam A. Kennington III { 264*1285115cSWilliam A. Kennington III return ch0_filter_; 265*1285115cSWilliam A. Kennington III } 266*1285115cSWilliam A. Kennington III else if (channel == 1) 267*1285115cSWilliam A. Kennington III { 268*1285115cSWilliam A. Kennington III return ch1_filter_; 269*1285115cSWilliam A. Kennington III } 270*1285115cSWilliam A. Kennington III 271*1285115cSWilliam A. Kennington III throw std::invalid_argument("Unsupported channel"); 272*1285115cSWilliam A. Kennington III } 273*1285115cSWilliam A. Kennington III 274*1285115cSWilliam A. Kennington III void NIC::set_hostless(bool is_hostless) 275*1285115cSWilliam A. Kennington III { 276*1285115cSWilliam A. Kennington III auto set_flag_op = [](uint8_t lhs, uint8_t rhs) -> auto 277*1285115cSWilliam A. Kennington III { 278*1285115cSWilliam A. Kennington III return lhs | rhs; 279*1285115cSWilliam A. Kennington III }; 280*1285115cSWilliam A. Kennington III 281*1285115cSWilliam A. Kennington III auto clear_flag_op = [](uint8_t lhs, uint8_t rhs) -> auto 282*1285115cSWilliam A. Kennington III { 283*1285115cSWilliam A. Kennington III return lhs & ~rhs; 284*1285115cSWilliam A. Kennington III }; 285*1285115cSWilliam A. Kennington III 286*1285115cSWilliam A. Kennington III auto flag_op = is_hostless ? set_flag_op : clear_flag_op; 287*1285115cSWilliam A. Kennington III 288*1285115cSWilliam A. Kennington III if (channel_count_ > 0) 289*1285115cSWilliam A. Kennington III { 290*1285115cSWilliam A. Kennington III ch0_filter_.flags = 291*1285115cSWilliam A. Kennington III flag_op(ch0_filter_.flags, NCSI_OEM_FILTER_FLAGS_HOSTLESS); 292*1285115cSWilliam A. Kennington III } 293*1285115cSWilliam A. Kennington III 294*1285115cSWilliam A. Kennington III if (channel_count_ > 1) 295*1285115cSWilliam A. Kennington III { 296*1285115cSWilliam A. Kennington III ch1_filter_.flags = 297*1285115cSWilliam A. Kennington III flag_op(ch1_filter_.flags, NCSI_OEM_FILTER_FLAGS_HOSTLESS); 298*1285115cSWilliam A. Kennington III } 299*1285115cSWilliam A. Kennington III } 300*1285115cSWilliam A. Kennington III 301*1285115cSWilliam A. Kennington III void NIC::toggle_hostless() 302*1285115cSWilliam A. Kennington III { 303*1285115cSWilliam A. Kennington III if (channel_count_ > 0) 304*1285115cSWilliam A. Kennington III { 305*1285115cSWilliam A. Kennington III ch0_filter_.flags ^= NCSI_OEM_FILTER_FLAGS_HOSTLESS; 306*1285115cSWilliam A. Kennington III } 307*1285115cSWilliam A. Kennington III 308*1285115cSWilliam A. Kennington III if (channel_count_ > 1) 309*1285115cSWilliam A. Kennington III { 310*1285115cSWilliam A. Kennington III ch1_filter_.flags ^= NCSI_OEM_FILTER_FLAGS_HOSTLESS; 311*1285115cSWilliam A. Kennington III } 312*1285115cSWilliam A. Kennington III } 313*1285115cSWilliam A. Kennington III 314*1285115cSWilliam A. Kennington III bool NIC::is_hostless() 315*1285115cSWilliam A. Kennington III { 316*1285115cSWilliam A. Kennington III return ch0_filter_.flags & NCSI_OEM_FILTER_FLAGS_HOSTLESS; 317*1285115cSWilliam A. Kennington III } 318*1285115cSWilliam A. Kennington III 319*1285115cSWilliam A. Kennington III void NIC::save_frame_to_log(const NCSIFrame& frame) 320*1285115cSWilliam A. Kennington III { 321*1285115cSWilliam A. Kennington III if (cmd_log_.size() >= max_log_size_) 322*1285115cSWilliam A. Kennington III { 323*1285115cSWilliam A. Kennington III cmd_log_.erase(cmd_log_.begin()); 324*1285115cSWilliam A. Kennington III } 325*1285115cSWilliam A. Kennington III 326*1285115cSWilliam A. Kennington III cmd_log_.push_back(frame); 327*1285115cSWilliam A. Kennington III } 328*1285115cSWilliam A. Kennington III 329*1285115cSWilliam A. Kennington III const std::vector<uint8_t> NIC::simple_commands_ = { 330*1285115cSWilliam A. Kennington III NCSI_CLEAR_INITIAL_STATE, 331*1285115cSWilliam A. Kennington III NCSI_SELECT_PACKAGE, 332*1285115cSWilliam A. Kennington III NCSI_DESELECT_PACKAGE, 333*1285115cSWilliam A. Kennington III NCSI_ENABLE_CHANNEL, 334*1285115cSWilliam A. Kennington III NCSI_DISABLE_CHANNEL, 335*1285115cSWilliam A. Kennington III NCSI_RESET_CHANNEL, 336*1285115cSWilliam A. Kennington III NCSI_ENABLE_CHANNEL_NETWORK_TX, 337*1285115cSWilliam A. Kennington III NCSI_DISABLE_CHANNEL_NETWORK_TX, 338*1285115cSWilliam A. Kennington III NCSI_AEN_ENABLE, 339*1285115cSWilliam A. Kennington III NCSI_SET_LINK, 340*1285115cSWilliam A. Kennington III NCSI_SET_VLAN_FILTER, 341*1285115cSWilliam A. Kennington III NCSI_ENABLE_VLAN, 342*1285115cSWilliam A. Kennington III NCSI_DISABLE_VLAN, 343*1285115cSWilliam A. Kennington III NCSI_SET_MAC_ADDRESS, 344*1285115cSWilliam A. Kennington III NCSI_ENABLE_BROADCAST_FILTER, 345*1285115cSWilliam A. Kennington III NCSI_DISABLE_BROADCAST_FILTER, 346*1285115cSWilliam A. Kennington III NCSI_ENABLE_GLOBAL_MULTICAST_FILTER, 347*1285115cSWilliam A. Kennington III NCSI_DISABLE_GLOBAL_MULTICAST_FILTER, 348*1285115cSWilliam A. Kennington III NCSI_SET_NCSI_FLOW_CONTROL, 349*1285115cSWilliam A. Kennington III }; 350*1285115cSWilliam A. Kennington III 351*1285115cSWilliam A. Kennington III } // namespace mock 352