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