11285115cSWilliam A. Kennington III // Copyright 2021 Google LLC 21285115cSWilliam A. Kennington III // 31285115cSWilliam A. Kennington III // Licensed under the Apache License, Version 2.0 (the "License"); 41285115cSWilliam A. Kennington III // you may not use this file except in compliance with the License. 51285115cSWilliam A. Kennington III // You may obtain a copy of the License at 61285115cSWilliam A. Kennington III // 71285115cSWilliam A. Kennington III // http://www.apache.org/licenses/LICENSE-2.0 81285115cSWilliam A. Kennington III // 91285115cSWilliam A. Kennington III // Unless required by applicable law or agreed to in writing, software 101285115cSWilliam A. Kennington III // distributed under the License is distributed on an "AS IS" BASIS, 111285115cSWilliam A. Kennington III // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121285115cSWilliam A. Kennington III // See the License for the specific language governing permissions and 131285115cSWilliam A. Kennington III // limitations under the License. 141285115cSWilliam A. Kennington III 151285115cSWilliam A. Kennington III #include "nic_mock.h" 161285115cSWilliam A. Kennington III 171285115cSWilliam A. Kennington III #include "platforms/nemora/portable/ncsi.h" 18adb8ffe4SWilly Tu #include "platforms/nemora/portable/ncsi_server.h" 191285115cSWilliam A. Kennington III 201285115cSWilliam A. Kennington III #include <algorithm> 211285115cSWilliam A. Kennington III #include <cstddef> 22adb8ffe4SWilly Tu #include <cstring> 231285115cSWilliam A. Kennington III #include <stdexcept> 241285115cSWilliam A. Kennington III 251285115cSWilliam A. Kennington III namespace mock 261285115cSWilliam A. Kennington III { 271285115cSWilliam A. Kennington III 281285115cSWilliam A. Kennington III bool NCSIFrame::parse_ethernet_frame(const ncsi_buf_t& ncsi_buf) 291285115cSWilliam A. Kennington III { 301285115cSWilliam A. Kennington III std::memcpy(&dst_mac_, ncsi_buf.data, sizeof(dst_mac_)); 311285115cSWilliam A. Kennington III std::memcpy(&src_mac_, ncsi_buf.data + sizeof(dst_mac_), sizeof(src_mac_)); 321285115cSWilliam A. Kennington III // The constant defined in a way that assumes big-endian platform, so we are 331285115cSWilliam A. Kennington III // just going to calculate it here properly. 341285115cSWilliam A. Kennington III const uint8_t et_hi = *(ncsi_buf.data + 2 * sizeof(mac_addr_t)); 351285115cSWilliam A. Kennington III const uint8_t et_lo = *(ncsi_buf.data + 2 * sizeof(mac_addr_t) + 1); 361285115cSWilliam A. Kennington III ethertype_ = (et_hi << 8) + et_lo; 371285115cSWilliam A. Kennington III 381285115cSWilliam A. Kennington III if (ethertype_ != NCSI_ETHERTYPE) 391285115cSWilliam A. Kennington III { 401285115cSWilliam A. Kennington III return false; 411285115cSWilliam A. Kennington III } 421285115cSWilliam A. Kennington III 431285115cSWilliam A. Kennington III // This code parses the NC-SI command, according to spec and 441285115cSWilliam A. Kennington III // as defined in platforms/nemora/portable/ncsi.h 451285115cSWilliam A. Kennington III // It takes some shortcuts to only retrieve the data we are interested in, 461285115cSWilliam A. Kennington III // such as using offsetof ot get to a particular field. 471285115cSWilliam A. Kennington III control_packet_type_ = 481285115cSWilliam A. Kennington III *(ncsi_buf.data + offsetof(ncsi_header_t, control_packet_type)); 491285115cSWilliam A. Kennington III channel_id_ = *(ncsi_buf.data + offsetof(ncsi_header_t, channel_id)); 501285115cSWilliam A. Kennington III 511285115cSWilliam A. Kennington III size_t payload_offset = sizeof(ncsi_header_t); 521285115cSWilliam A. Kennington III if (control_packet_type_ & NCSI_RESPONSE) 531285115cSWilliam A. Kennington III { 541285115cSWilliam A. Kennington III is_response_ = true; 551285115cSWilliam A. Kennington III control_packet_type_ &= ~NCSI_RESPONSE; 561285115cSWilliam A. Kennington III std::memcpy(&response_code_, ncsi_buf.data + payload_offset, 571285115cSWilliam A. Kennington III sizeof(response_code_)); 581285115cSWilliam A. Kennington III response_code_ = ntohs(response_code_); 591285115cSWilliam A. Kennington III std::memcpy(&reason_code_, 601285115cSWilliam A. Kennington III ncsi_buf.data + payload_offset + sizeof(reason_code_), 611285115cSWilliam A. Kennington III sizeof(reason_code_)); 621285115cSWilliam A. Kennington III reason_code_ = ntohs(reason_code_); 631285115cSWilliam A. Kennington III payload_offset += sizeof(reason_code_) + sizeof(response_code_); 641285115cSWilliam A. Kennington III } 651285115cSWilliam A. Kennington III 661285115cSWilliam A. Kennington III if (control_packet_type_ == NCSI_OEM_COMMAND) 671285115cSWilliam A. Kennington III { 681285115cSWilliam A. Kennington III std::memcpy(&manufacturer_id_, ncsi_buf.data + payload_offset, 691285115cSWilliam A. Kennington III sizeof(manufacturer_id_)); 701285115cSWilliam A. Kennington III manufacturer_id_ = ntohl(manufacturer_id_); 711285115cSWilliam A. Kennington III // Number of reserved bytes after manufacturer_id_ = 3 721285115cSWilliam A. Kennington III oem_command_ = 731285115cSWilliam A. Kennington III *(ncsi_buf.data + payload_offset + sizeof(manufacturer_id_) + 3); 741285115cSWilliam A. Kennington III payload_offset += sizeof(ncsi_oem_extension_header_t); 751285115cSWilliam A. Kennington III } 761285115cSWilliam A. Kennington III 77*c66ebc35SPatrick Williams packet_raw_ = 78*c66ebc35SPatrick Williams std::vector<uint8_t>(ncsi_buf.data, ncsi_buf.data + ncsi_buf.len); 791285115cSWilliam A. Kennington III // TODO: Verify payload length. 801285115cSWilliam A. Kennington III 811285115cSWilliam A. Kennington III return true; 821285115cSWilliam A. Kennington III } 831285115cSWilliam A. Kennington III 841285115cSWilliam A. Kennington III uint32_t NIC::handle_request(const ncsi_buf_t& request_buf, 851285115cSWilliam A. Kennington III ncsi_buf_t* response_buf) 861285115cSWilliam A. Kennington III { 871285115cSWilliam A. Kennington III const ncsi_header_t* ncsi_header = 881285115cSWilliam A. Kennington III reinterpret_cast<const ncsi_header_t*>(request_buf.data); 891285115cSWilliam A. Kennington III 901285115cSWilliam A. Kennington III NCSIFrame request_frame; 911285115cSWilliam A. Kennington III request_frame.parse_ethernet_frame(request_buf); 921285115cSWilliam A. Kennington III save_frame_to_log(request_frame); 931285115cSWilliam A. Kennington III 941285115cSWilliam A. Kennington III uint32_t response_size; 951285115cSWilliam A. Kennington III if (is_loopback_) 961285115cSWilliam A. Kennington III { 971285115cSWilliam A. Kennington III std::memcpy(response_buf, &request_buf, sizeof(request_buf)); 981285115cSWilliam A. Kennington III response_size = request_buf.len; 991285115cSWilliam A. Kennington III } 1001285115cSWilliam A. Kennington III else if (std::find(simple_commands_.begin(), simple_commands_.end(), 1011285115cSWilliam A. Kennington III ncsi_header->control_packet_type) != 1021285115cSWilliam A. Kennington III simple_commands_.end()) 1031285115cSWilliam A. Kennington III { 1041285115cSWilliam A. Kennington III // Simple Response 105*c66ebc35SPatrick Williams response_size = 106*c66ebc35SPatrick Williams ncsi_build_simple_ack(request_buf.data, response_buf->data); 1071285115cSWilliam A. Kennington III } 1081285115cSWilliam A. Kennington III else 1091285115cSWilliam A. Kennington III { 1101285115cSWilliam A. Kennington III // Not-so-Simple Response 1111285115cSWilliam A. Kennington III switch (ncsi_header->control_packet_type) 1121285115cSWilliam A. Kennington III { 1131285115cSWilliam A. Kennington III case NCSI_GET_VERSION_ID: 1141285115cSWilliam A. Kennington III response_size = ncsi_build_version_id_ack( 1151285115cSWilliam A. Kennington III request_buf.data, response_buf->data, &version_); 1161285115cSWilliam A. Kennington III break; 1171285115cSWilliam A. Kennington III case NCSI_GET_CAPABILITIES: 1181285115cSWilliam A. Kennington III response_size = sizeof(ncsi_capabilities_response_t); 1191285115cSWilliam A. Kennington III { 1201285115cSWilliam A. Kennington III ncsi_capabilities_response_t response; 1211285115cSWilliam A. Kennington III ncsi_build_response_header( 1221285115cSWilliam A. Kennington III request_buf.data, reinterpret_cast<uint8_t*>(&response), 1231285115cSWilliam A. Kennington III 0, 0, response_size - sizeof(ncsi_header_t)); 1241285115cSWilliam A. Kennington III response.channel_count = channel_count_; 1251285115cSWilliam A. Kennington III std::memcpy(response_buf->data, &response, 1261285115cSWilliam A. Kennington III sizeof(response)); 1271285115cSWilliam A. Kennington III } 1281285115cSWilliam A. Kennington III break; 1291285115cSWilliam A. Kennington III case NCSI_GET_PASSTHROUGH_STATISTICS: 1301285115cSWilliam A. Kennington III if (is_legacy_) 1311285115cSWilliam A. Kennington III { 1321285115cSWilliam A. Kennington III response_size = ncsi_build_pt_stats_legacy_ack( 1331285115cSWilliam A. Kennington III request_buf.data, response_buf->data, &stats_legacy_); 1341285115cSWilliam A. Kennington III } 1351285115cSWilliam A. Kennington III else 1361285115cSWilliam A. Kennington III { 1371285115cSWilliam A. Kennington III response_size = ncsi_build_pt_stats_ack( 1381285115cSWilliam A. Kennington III request_buf.data, response_buf->data, &stats_); 1391285115cSWilliam A. Kennington III } 1401285115cSWilliam A. Kennington III break; 1411285115cSWilliam A. Kennington III case NCSI_GET_LINK_STATUS: 1421285115cSWilliam A. Kennington III response_size = ncsi_build_link_status_ack( 1431285115cSWilliam A. Kennington III request_buf.data, response_buf->data, &link_status_); 1441285115cSWilliam A. Kennington III break; 1451285115cSWilliam A. Kennington III case NCSI_OEM_COMMAND: 1461285115cSWilliam A. Kennington III response_size = handle_oem_request(request_buf, response_buf); 1471285115cSWilliam A. Kennington III break; 1481285115cSWilliam A. Kennington III default: 1491285115cSWilliam A. Kennington III response_size = ncsi_build_simple_nack( 1501285115cSWilliam A. Kennington III request_buf.data, response_buf->data, 1, 1); 1511285115cSWilliam A. Kennington III break; 1521285115cSWilliam A. Kennington III } 1531285115cSWilliam A. Kennington III } 1541285115cSWilliam A. Kennington III 1551285115cSWilliam A. Kennington III response_buf->len = response_size; 1561285115cSWilliam A. Kennington III 1571285115cSWilliam A. Kennington III return response_size; 1581285115cSWilliam A. Kennington III } 1591285115cSWilliam A. Kennington III 1601285115cSWilliam A. Kennington III uint32_t NIC::handle_oem_request(const ncsi_buf_t& request_buf, 1611285115cSWilliam A. Kennington III ncsi_buf_t* response_buf) 1621285115cSWilliam A. Kennington III { 1631285115cSWilliam A. Kennington III const ncsi_oem_simple_cmd_t* oem_cmd = 1641285115cSWilliam A. Kennington III reinterpret_cast<const ncsi_oem_simple_cmd_t*>(request_buf.data); 1651285115cSWilliam A. Kennington III uint32_t response_size; 1661285115cSWilliam A. Kennington III switch (oem_cmd->oem_header.oem_cmd) 1671285115cSWilliam A. Kennington III { 1681285115cSWilliam A. Kennington III case NCSI_OEM_COMMAND_GET_HOST_MAC: 1691285115cSWilliam A. Kennington III response_size = ncsi_build_oem_get_mac_ack( 1701285115cSWilliam A. Kennington III request_buf.data, response_buf->data, &mac_); 1711285115cSWilliam A. Kennington III break; 1721285115cSWilliam A. Kennington III case NCSI_OEM_COMMAND_SET_FILTER: 1731285115cSWilliam A. Kennington III { 1741285115cSWilliam A. Kennington III const ncsi_oem_set_filter_cmd_t* cmd = 1751285115cSWilliam A. Kennington III reinterpret_cast<const ncsi_oem_set_filter_cmd_t*>( 1761285115cSWilliam A. Kennington III request_buf.data); 1771285115cSWilliam A. Kennington III if (set_filter(cmd->hdr.channel_id, cmd->filter)) 1781285115cSWilliam A. Kennington III { 1791285115cSWilliam A. Kennington III response_size = ncsi_build_oem_simple_ack(request_buf.data, 1801285115cSWilliam A. Kennington III response_buf->data); 1811285115cSWilliam A. Kennington III } 1821285115cSWilliam A. Kennington III else 1831285115cSWilliam A. Kennington III { 1841285115cSWilliam A. Kennington III response_size = ncsi_build_simple_nack( 1851285115cSWilliam A. Kennington III request_buf.data, response_buf->data, 3, 4); 1861285115cSWilliam A. Kennington III } 1871285115cSWilliam A. Kennington III } 1881285115cSWilliam A. Kennington III break; 1891285115cSWilliam A. Kennington III case NCSI_OEM_COMMAND_ECHO: 190*c66ebc35SPatrick Williams response_size = 191*c66ebc35SPatrick Williams ncsi_build_oem_echo_ack(request_buf.data, response_buf->data); 1921285115cSWilliam A. Kennington III break; 1931285115cSWilliam A. Kennington III case NCSI_OEM_COMMAND_GET_FILTER: 1941285115cSWilliam A. Kennington III { 1951285115cSWilliam A. Kennington III const ncsi_simple_command_t* cmd = 1961285115cSWilliam A. Kennington III reinterpret_cast<const ncsi_simple_command_t*>( 1971285115cSWilliam A. Kennington III request_buf.data); 1981285115cSWilliam A. Kennington III if (cmd->hdr.channel_id == 0) 1991285115cSWilliam A. Kennington III { 2001285115cSWilliam A. Kennington III response_size = ncsi_build_oem_get_filter_ack( 2011285115cSWilliam A. Kennington III request_buf.data, response_buf->data, &ch0_filter_); 2021285115cSWilliam A. Kennington III } 2031285115cSWilliam A. Kennington III else if (cmd->hdr.channel_id == 1) 2041285115cSWilliam A. Kennington III { 2051285115cSWilliam A. Kennington III response_size = ncsi_build_oem_get_filter_ack( 2061285115cSWilliam A. Kennington III request_buf.data, response_buf->data, &ch1_filter_); 2071285115cSWilliam A. Kennington III } 2081285115cSWilliam A. Kennington III else 2091285115cSWilliam A. Kennington III { 2101285115cSWilliam A. Kennington III response_size = ncsi_build_simple_nack( 2111285115cSWilliam A. Kennington III request_buf.data, response_buf->data, 3, 4); 2121285115cSWilliam A. Kennington III } 2131285115cSWilliam A. Kennington III } 2141285115cSWilliam A. Kennington III break; 2151285115cSWilliam A. Kennington III default: 2161285115cSWilliam A. Kennington III response_size = ncsi_build_simple_nack(request_buf.data, 2171285115cSWilliam A. Kennington III response_buf->data, 1, 2); 2181285115cSWilliam A. Kennington III break; 2191285115cSWilliam A. Kennington III } 2201285115cSWilliam A. Kennington III 2211285115cSWilliam A. Kennington III return response_size; 2221285115cSWilliam A. Kennington III } 2231285115cSWilliam A. Kennington III 2241285115cSWilliam A. Kennington III bool NIC::is_filter_configured(uint8_t channel) const 2251285115cSWilliam A. Kennington III { 2261285115cSWilliam A. Kennington III if (channel == 0) 2271285115cSWilliam A. Kennington III { 2281285115cSWilliam A. Kennington III return is_ch0_filter_configured_; 2291285115cSWilliam A. Kennington III } 2301285115cSWilliam A. Kennington III else if (channel == 1) 2311285115cSWilliam A. Kennington III { 2321285115cSWilliam A. Kennington III return is_ch1_filter_configured_; 2331285115cSWilliam A. Kennington III } 2341285115cSWilliam A. Kennington III 2351285115cSWilliam A. Kennington III throw std::invalid_argument("Unsupported channel"); 2361285115cSWilliam A. Kennington III } 2371285115cSWilliam A. Kennington III 2381285115cSWilliam A. Kennington III bool NIC::set_filter(uint8_t channel, const ncsi_oem_filter_t& filter) 2391285115cSWilliam A. Kennington III { 2401285115cSWilliam A. Kennington III ncsi_oem_filter_t* nic_filter; 2411285115cSWilliam A. Kennington III if (channel == 0) 2421285115cSWilliam A. Kennington III { 2431285115cSWilliam A. Kennington III nic_filter = &ch0_filter_; 2441285115cSWilliam A. Kennington III is_ch0_filter_configured_ = true; 2451285115cSWilliam A. Kennington III } 2461285115cSWilliam A. Kennington III else if (channel == 1) 2471285115cSWilliam A. Kennington III { 2481285115cSWilliam A. Kennington III nic_filter = &ch1_filter_; 2491285115cSWilliam A. Kennington III is_ch1_filter_configured_ = true; 2501285115cSWilliam A. Kennington III } 2511285115cSWilliam A. Kennington III else 2521285115cSWilliam A. Kennington III { 2531285115cSWilliam A. Kennington III throw std::invalid_argument("Unsupported channel"); 2541285115cSWilliam A. Kennington III } 2551285115cSWilliam A. Kennington III 2561285115cSWilliam A. Kennington III std::memcpy(nic_filter->mac, filter.mac, MAC_ADDR_SIZE); 2571285115cSWilliam A. Kennington III nic_filter->ip = 0; 2581285115cSWilliam A. Kennington III nic_filter->port = filter.port; 2591285115cSWilliam A. Kennington III return true; 2601285115cSWilliam A. Kennington III } 2611285115cSWilliam A. Kennington III 2621285115cSWilliam A. Kennington III const ncsi_oem_filter_t& NIC::get_filter(uint8_t channel) const 2631285115cSWilliam A. Kennington III { 2641285115cSWilliam A. Kennington III if (channel == 0) 2651285115cSWilliam A. Kennington III { 2661285115cSWilliam A. Kennington III return ch0_filter_; 2671285115cSWilliam A. Kennington III } 2681285115cSWilliam A. Kennington III else if (channel == 1) 2691285115cSWilliam A. Kennington III { 2701285115cSWilliam A. Kennington III return ch1_filter_; 2711285115cSWilliam A. Kennington III } 2721285115cSWilliam A. Kennington III 2731285115cSWilliam A. Kennington III throw std::invalid_argument("Unsupported channel"); 2741285115cSWilliam A. Kennington III } 2751285115cSWilliam A. Kennington III 2761285115cSWilliam A. Kennington III void NIC::set_hostless(bool is_hostless) 2771285115cSWilliam A. Kennington III { 2782be45238SPatrick Williams auto set_flag_op = [](uint8_t lhs, uint8_t rhs) -> auto { 2791285115cSWilliam A. Kennington III return lhs | rhs; 2801285115cSWilliam A. Kennington III }; 2811285115cSWilliam A. Kennington III 2822be45238SPatrick Williams auto clear_flag_op = [](uint8_t lhs, uint8_t rhs) -> auto { 2831285115cSWilliam A. Kennington III return lhs & ~rhs; 2841285115cSWilliam A. Kennington III }; 2851285115cSWilliam A. Kennington III 2861285115cSWilliam A. Kennington III auto flag_op = is_hostless ? set_flag_op : clear_flag_op; 2871285115cSWilliam A. Kennington III 2881285115cSWilliam A. Kennington III if (channel_count_ > 0) 2891285115cSWilliam A. Kennington III { 290*c66ebc35SPatrick Williams ch0_filter_.flags = 291*c66ebc35SPatrick Williams flag_op(ch0_filter_.flags, NCSI_OEM_FILTER_FLAGS_HOSTLESS); 2921285115cSWilliam A. Kennington III } 2931285115cSWilliam A. Kennington III 2941285115cSWilliam A. Kennington III if (channel_count_ > 1) 2951285115cSWilliam A. Kennington III { 296*c66ebc35SPatrick Williams ch1_filter_.flags = 297*c66ebc35SPatrick Williams flag_op(ch1_filter_.flags, NCSI_OEM_FILTER_FLAGS_HOSTLESS); 2981285115cSWilliam A. Kennington III } 2991285115cSWilliam A. Kennington III } 3001285115cSWilliam A. Kennington III 3011285115cSWilliam A. Kennington III void NIC::toggle_hostless() 3021285115cSWilliam A. Kennington III { 3031285115cSWilliam A. Kennington III if (channel_count_ > 0) 3041285115cSWilliam A. Kennington III { 3051285115cSWilliam A. Kennington III ch0_filter_.flags ^= NCSI_OEM_FILTER_FLAGS_HOSTLESS; 3061285115cSWilliam A. Kennington III } 3071285115cSWilliam A. Kennington III 3081285115cSWilliam A. Kennington III if (channel_count_ > 1) 3091285115cSWilliam A. Kennington III { 3101285115cSWilliam A. Kennington III ch1_filter_.flags ^= NCSI_OEM_FILTER_FLAGS_HOSTLESS; 3111285115cSWilliam A. Kennington III } 3121285115cSWilliam A. Kennington III } 3131285115cSWilliam A. Kennington III 3141285115cSWilliam A. Kennington III bool NIC::is_hostless() 3151285115cSWilliam A. Kennington III { 3161285115cSWilliam A. Kennington III return ch0_filter_.flags & NCSI_OEM_FILTER_FLAGS_HOSTLESS; 3171285115cSWilliam A. Kennington III } 3181285115cSWilliam A. Kennington III 3191285115cSWilliam A. Kennington III void NIC::save_frame_to_log(const NCSIFrame& frame) 3201285115cSWilliam A. Kennington III { 3211285115cSWilliam A. Kennington III if (cmd_log_.size() >= max_log_size_) 3221285115cSWilliam A. Kennington III { 3231285115cSWilliam A. Kennington III cmd_log_.erase(cmd_log_.begin()); 3241285115cSWilliam A. Kennington III } 3251285115cSWilliam A. Kennington III 3261285115cSWilliam A. Kennington III cmd_log_.push_back(frame); 3271285115cSWilliam A. Kennington III } 3281285115cSWilliam A. Kennington III 3291285115cSWilliam A. Kennington III const std::vector<uint8_t> NIC::simple_commands_ = { 3301285115cSWilliam A. Kennington III NCSI_CLEAR_INITIAL_STATE, 3311285115cSWilliam A. Kennington III NCSI_SELECT_PACKAGE, 3321285115cSWilliam A. Kennington III NCSI_DESELECT_PACKAGE, 3331285115cSWilliam A. Kennington III NCSI_ENABLE_CHANNEL, 3341285115cSWilliam A. Kennington III NCSI_DISABLE_CHANNEL, 3351285115cSWilliam A. Kennington III NCSI_RESET_CHANNEL, 3361285115cSWilliam A. Kennington III NCSI_ENABLE_CHANNEL_NETWORK_TX, 3371285115cSWilliam A. Kennington III NCSI_DISABLE_CHANNEL_NETWORK_TX, 3381285115cSWilliam A. Kennington III NCSI_AEN_ENABLE, 3391285115cSWilliam A. Kennington III NCSI_SET_LINK, 3401285115cSWilliam A. Kennington III NCSI_SET_VLAN_FILTER, 3411285115cSWilliam A. Kennington III NCSI_ENABLE_VLAN, 3421285115cSWilliam A. Kennington III NCSI_DISABLE_VLAN, 3431285115cSWilliam A. Kennington III NCSI_SET_MAC_ADDRESS, 3441285115cSWilliam A. Kennington III NCSI_ENABLE_BROADCAST_FILTER, 3451285115cSWilliam A. Kennington III NCSI_DISABLE_BROADCAST_FILTER, 3461285115cSWilliam A. Kennington III NCSI_ENABLE_GLOBAL_MULTICAST_FILTER, 3471285115cSWilliam A. Kennington III NCSI_DISABLE_GLOBAL_MULTICAST_FILTER, 3481285115cSWilliam A. Kennington III NCSI_SET_NCSI_FLOW_CONTROL, 3491285115cSWilliam A. Kennington III }; 3501285115cSWilliam A. Kennington III 3511285115cSWilliam A. Kennington III } // namespace mock 352