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