xref: /dpdk/app/test-pmd/cmdline.c (revision 81db321daeccec0c78bbe8bf4492f18f084ba30f)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2016 Intel Corporation.
3  * Copyright(c) 2014 6WIND S.A.
4  */
5 
6 #include <stdarg.h>
7 #include <errno.h>
8 #include <stdio.h>
9 #include <stdint.h>
10 #include <string.h>
11 #include <termios.h>
12 #include <unistd.h>
13 #include <inttypes.h>
14 #include <sys/socket.h>
15 #include <netinet/in.h>
16 
17 #include <sys/queue.h>
18 
19 #include <rte_common.h>
20 #include <rte_byteorder.h>
21 #include <rte_log.h>
22 #include <rte_debug.h>
23 #include <rte_cycles.h>
24 #include <rte_memory.h>
25 #include <rte_memzone.h>
26 #include <rte_malloc.h>
27 #include <rte_launch.h>
28 #include <rte_eal.h>
29 #include <rte_per_lcore.h>
30 #include <rte_lcore.h>
31 #include <rte_atomic.h>
32 #include <rte_branch_prediction.h>
33 #include <rte_ring.h>
34 #include <rte_mempool.h>
35 #include <rte_interrupts.h>
36 #include <rte_pci.h>
37 #include <rte_ether.h>
38 #include <rte_ethdev.h>
39 #include <rte_string_fns.h>
40 #include <rte_devargs.h>
41 #include <rte_flow.h>
42 #include <rte_gro.h>
43 #include <rte_mbuf_dyn.h>
44 
45 #include <cmdline_rdline.h>
46 #include <cmdline_parse.h>
47 #include <cmdline_parse_num.h>
48 #include <cmdline_parse_string.h>
49 #include <cmdline_parse_ipaddr.h>
50 #include <cmdline_parse_etheraddr.h>
51 #include <cmdline_socket.h>
52 #include <cmdline.h>
53 #ifdef RTE_NET_BOND
54 #include <rte_eth_bond.h>
55 #include <rte_eth_bond_8023ad.h>
56 #endif
57 #if defined RTE_BUS_DPAA && defined RTE_NET_DPAA
58 #include <rte_pmd_dpaa.h>
59 #endif
60 #ifdef RTE_NET_IXGBE
61 #include <rte_pmd_ixgbe.h>
62 #endif
63 #ifdef RTE_NET_I40E
64 #include <rte_pmd_i40e.h>
65 #endif
66 #ifdef RTE_NET_BNXT
67 #include <rte_pmd_bnxt.h>
68 #endif
69 #include "testpmd.h"
70 #include "cmdline_mtr.h"
71 #include "cmdline_tm.h"
72 #include "bpf_cmd.h"
73 
74 static struct cmdline *testpmd_cl;
75 
76 static void cmd_reconfig_device_queue(portid_t id, uint8_t dev, uint8_t queue);
77 
78 /* *** Help command with introduction. *** */
79 struct cmd_help_brief_result {
80 	cmdline_fixed_string_t help;
81 };
82 
83 static void cmd_help_brief_parsed(__rte_unused void *parsed_result,
84                                   struct cmdline *cl,
85                                   __rte_unused void *data)
86 {
87 	cmdline_printf(
88 		cl,
89 		"\n"
90 		"Help is available for the following sections:\n\n"
91 		"    help control                    : Start and stop forwarding.\n"
92 		"    help display                    : Displaying port, stats and config "
93 		"information.\n"
94 		"    help config                     : Configuration information.\n"
95 		"    help ports                      : Configuring ports.\n"
96 		"    help registers                  : Reading and setting port registers.\n"
97 		"    help filters                    : Filters configuration help.\n"
98 		"    help traffic_management         : Traffic Management commands.\n"
99 		"    help devices                    : Device related cmds.\n"
100 		"    help all                        : All of the above sections.\n\n"
101 	);
102 
103 }
104 
105 cmdline_parse_token_string_t cmd_help_brief_help =
106 	TOKEN_STRING_INITIALIZER(struct cmd_help_brief_result, help, "help");
107 
108 cmdline_parse_inst_t cmd_help_brief = {
109 	.f = cmd_help_brief_parsed,
110 	.data = NULL,
111 	.help_str = "help: Show help",
112 	.tokens = {
113 		(void *)&cmd_help_brief_help,
114 		NULL,
115 	},
116 };
117 
118 /* *** Help command with help sections. *** */
119 struct cmd_help_long_result {
120 	cmdline_fixed_string_t help;
121 	cmdline_fixed_string_t section;
122 };
123 
124 static void cmd_help_long_parsed(void *parsed_result,
125                                  struct cmdline *cl,
126                                  __rte_unused void *data)
127 {
128 	int show_all = 0;
129 	struct cmd_help_long_result *res = parsed_result;
130 
131 	if (!strcmp(res->section, "all"))
132 		show_all = 1;
133 
134 	if (show_all || !strcmp(res->section, "control")) {
135 
136 		cmdline_printf(
137 			cl,
138 			"\n"
139 			"Control forwarding:\n"
140 			"-------------------\n\n"
141 
142 			"start\n"
143 			"    Start packet forwarding with current configuration.\n\n"
144 
145 			"start tx_first\n"
146 			"    Start packet forwarding with current config"
147 			" after sending one burst of packets.\n\n"
148 
149 			"stop\n"
150 			"    Stop packet forwarding, and display accumulated"
151 			" statistics.\n\n"
152 
153 			"quit\n"
154 			"    Quit to prompt.\n\n"
155 		);
156 	}
157 
158 	if (show_all || !strcmp(res->section, "display")) {
159 
160 		cmdline_printf(
161 			cl,
162 			"\n"
163 			"Display:\n"
164 			"--------\n\n"
165 
166 			"show port (info|stats|summary|xstats|fdir|stat_qmap|dcb_tc|cap) (port_id|all)\n"
167 			"    Display information for port_id, or all.\n\n"
168 
169 			"show port port_id (module_eeprom|eeprom)\n"
170 			"    Display the module EEPROM or EEPROM information for port_id.\n\n"
171 
172 			"show port X rss reta (size) (mask0,mask1,...)\n"
173 			"    Display the rss redirection table entry indicated"
174 			" by masks on port X. size is used to indicate the"
175 			" hardware supported reta size\n\n"
176 
177 			"show port (port_id) rss-hash [key]\n"
178 			"    Display the RSS hash functions and RSS hash key of port\n\n"
179 
180 			"clear port (info|stats|xstats|fdir|stat_qmap) (port_id|all)\n"
181 			"    Clear information for port_id, or all.\n\n"
182 
183 			"show (rxq|txq) info (port_id) (queue_id)\n"
184 			"    Display information for configured RX/TX queue.\n\n"
185 
186 			"show config (rxtx|cores|fwd|rxoffs|rxpkts|txpkts)\n"
187 			"    Display the given configuration.\n\n"
188 
189 			"read rxd (port_id) (queue_id) (rxd_id)\n"
190 			"    Display an RX descriptor of a port RX queue.\n\n"
191 
192 			"read txd (port_id) (queue_id) (txd_id)\n"
193 			"    Display a TX descriptor of a port TX queue.\n\n"
194 
195 			"ddp get list (port_id)\n"
196 			"    Get ddp profile info list\n\n"
197 
198 			"ddp get info (profile_path)\n"
199 			"    Get ddp profile information.\n\n"
200 
201 			"show vf stats (port_id) (vf_id)\n"
202 			"    Display a VF's statistics.\n\n"
203 
204 			"clear vf stats (port_id) (vf_id)\n"
205 			"    Reset a VF's statistics.\n\n"
206 
207 			"show port (port_id) pctype mapping\n"
208 			"    Get flow ptype to pctype mapping on a port\n\n"
209 
210 			"show port meter stats (port_id) (meter_id) (clear)\n"
211 			"    Get meter stats on a port\n\n"
212 
213 			"show fwd stats all\n"
214 			"    Display statistics for all fwd engines.\n\n"
215 
216 			"clear fwd stats all\n"
217 			"    Clear statistics for all fwd engines.\n\n"
218 
219 			"show port (port_id) rx_offload capabilities\n"
220 			"    List all per queue and per port Rx offloading"
221 			" capabilities of a port\n\n"
222 
223 			"show port (port_id) rx_offload configuration\n"
224 			"    List port level and all queue level"
225 			" Rx offloading configuration\n\n"
226 
227 			"show port (port_id) tx_offload capabilities\n"
228 			"    List all per queue and per port"
229 			" Tx offloading capabilities of a port\n\n"
230 
231 			"show port (port_id) tx_offload configuration\n"
232 			"    List port level and all queue level"
233 			" Tx offloading configuration\n\n"
234 
235 			"show port (port_id) tx_metadata\n"
236 			"    Show Tx metadata value set"
237 			" for a specific port\n\n"
238 
239 			"show port (port_id) ptypes\n"
240 			"    Show port supported ptypes"
241 			" for a specific port\n\n"
242 
243 			"show device info (<identifier>|all)"
244 			"       Show general information about devices probed.\n\n"
245 
246 			"show port (port_id) rxq|txq (queue_id) desc (desc_id) status"
247 			"       Show status of rx|tx descriptor.\n\n"
248 
249 			"show port (port_id) macs|mcast_macs"
250 			"       Display list of mac addresses added to port.\n\n"
251 
252 			"show port (port_id) fec capabilities"
253 			"	Show fec capabilities of a port.\n\n"
254 
255 			"show port (port_id) fec_mode"
256 			"	Show fec mode of a port.\n\n"
257 		);
258 	}
259 
260 	if (show_all || !strcmp(res->section, "config")) {
261 		cmdline_printf(
262 			cl,
263 			"\n"
264 			"Configuration:\n"
265 			"--------------\n"
266 			"Configuration changes only become active when"
267 			" forwarding is started/restarted.\n\n"
268 
269 			"set default\n"
270 			"    Reset forwarding to the default configuration.\n\n"
271 
272 			"set verbose (level)\n"
273 			"    Set the debug verbosity level X.\n\n"
274 
275 			"set log global|(type) (level)\n"
276 			"    Set the log level.\n\n"
277 
278 			"set nbport (num)\n"
279 			"    Set number of ports.\n\n"
280 
281 			"set nbcore (num)\n"
282 			"    Set number of cores.\n\n"
283 
284 			"set coremask (mask)\n"
285 			"    Set the forwarding cores hexadecimal mask.\n\n"
286 
287 			"set portmask (mask)\n"
288 			"    Set the forwarding ports hexadecimal mask.\n\n"
289 
290 			"set burst (num)\n"
291 			"    Set number of packets per burst.\n\n"
292 
293 			"set burst tx delay (microseconds) retry (num)\n"
294 			"    Set the transmit delay time and number of retries,"
295 			" effective when retry is enabled.\n\n"
296 
297 			"set rxoffs (x[,y]*)\n"
298 			"    Set the offset of each packet segment on"
299 			" receiving if split feature is engaged."
300 			" Affects only the queues configured with split"
301 			" offloads.\n\n"
302 
303 			"set rxpkts (x[,y]*)\n"
304 			"    Set the length of each segment to scatter"
305 			" packets on receiving if split feature is engaged."
306 			" Affects only the queues configured with split"
307 			" offloads.\n\n"
308 
309 			"set txpkts (x[,y]*)\n"
310 			"    Set the length of each segment of TXONLY"
311 			" and optionally CSUM packets.\n\n"
312 
313 			"set txsplit (off|on|rand)\n"
314 			"    Set the split policy for the TX packets."
315 			" Right now only applicable for CSUM and TXONLY"
316 			" modes\n\n"
317 
318 			"set txtimes (x, y)\n"
319 			"    Set the scheduling on timestamps"
320 			" timings for the TXONLY mode\n\n"
321 
322 			"set corelist (x[,y]*)\n"
323 			"    Set the list of forwarding cores.\n\n"
324 
325 			"set portlist (x[,y]*)\n"
326 			"    Set the list of forwarding ports.\n\n"
327 
328 			"set port setup on (iterator|event)\n"
329 			"    Select how attached port is retrieved for setup.\n\n"
330 
331 			"set tx loopback (port_id) (on|off)\n"
332 			"    Enable or disable tx loopback.\n\n"
333 
334 			"set all queues drop (port_id) (on|off)\n"
335 			"    Set drop enable bit for all queues.\n\n"
336 
337 			"set vf split drop (port_id) (vf_id) (on|off)\n"
338 			"    Set split drop enable bit for a VF from the PF.\n\n"
339 
340 			"set vf mac antispoof (port_id) (vf_id) (on|off).\n"
341 			"    Set MAC antispoof for a VF from the PF.\n\n"
342 
343 			"set macsec offload (port_id) on encrypt (on|off) replay-protect (on|off)\n"
344 			"    Enable MACsec offload.\n\n"
345 
346 			"set macsec offload (port_id) off\n"
347 			"    Disable MACsec offload.\n\n"
348 
349 			"set macsec sc (tx|rx) (port_id) (mac) (pi)\n"
350 			"    Configure MACsec secure connection (SC).\n\n"
351 
352 			"set macsec sa (tx|rx) (port_id) (idx) (an) (pn) (key)\n"
353 			"    Configure MACsec secure association (SA).\n\n"
354 
355 			"set vf broadcast (port_id) (vf_id) (on|off)\n"
356 			"    Set VF broadcast for a VF from the PF.\n\n"
357 
358 			"vlan set stripq (on|off) (port_id,queue_id)\n"
359 			"    Set the VLAN strip for a queue on a port.\n\n"
360 
361 			"set vf vlan stripq (port_id) (vf_id) (on|off)\n"
362 			"    Set the VLAN strip for all queues in a pool for a VF from the PF.\n\n"
363 
364 			"set vf vlan insert (port_id) (vf_id) (vlan_id)\n"
365 			"    Set VLAN insert for a VF from the PF.\n\n"
366 
367 			"set vf vlan antispoof (port_id) (vf_id) (on|off)\n"
368 			"    Set VLAN antispoof for a VF from the PF.\n\n"
369 
370 			"set vf vlan tag (port_id) (vf_id) (on|off)\n"
371 			"    Set VLAN tag for a VF from the PF.\n\n"
372 
373 			"set vf tx max-bandwidth (port_id) (vf_id) (bandwidth)\n"
374 			"    Set a VF's max bandwidth(Mbps).\n\n"
375 
376 			"set vf tc tx min-bandwidth (port_id) (vf_id) (bw1, bw2, ...)\n"
377 			"    Set all TCs' min bandwidth(%%) on a VF.\n\n"
378 
379 			"set vf tc tx max-bandwidth (port_id) (vf_id) (tc_no) (bandwidth)\n"
380 			"    Set a TC's max bandwidth(Mbps) on a VF.\n\n"
381 
382 			"set tx strict-link-priority (port_id) (tc_bitmap)\n"
383 			"    Set some TCs' strict link priority mode on a physical port.\n\n"
384 
385 			"set tc tx min-bandwidth (port_id) (bw1, bw2, ...)\n"
386 			"    Set all TCs' min bandwidth(%%) for all PF and VFs.\n\n"
387 
388 			"vlan set (strip|filter|qinq_strip|extend) (on|off) (port_id)\n"
389 			"    Set the VLAN strip or filter or qinq strip or extend\n\n"
390 
391 			"vlan set (inner|outer) tpid (value) (port_id)\n"
392 			"    Set the VLAN TPID for Packet Filtering on"
393 			" a port\n\n"
394 
395 			"rx_vlan add (vlan_id|all) (port_id)\n"
396 			"    Add a vlan_id, or all identifiers, to the set"
397 			" of VLAN identifiers filtered by port_id.\n\n"
398 
399 			"rx_vlan rm (vlan_id|all) (port_id)\n"
400 			"    Remove a vlan_id, or all identifiers, from the set"
401 			" of VLAN identifiers filtered by port_id.\n\n"
402 
403 			"rx_vlan add (vlan_id) port (port_id) vf (vf_mask)\n"
404 			"    Add a vlan_id, to the set of VLAN identifiers"
405 			"filtered for VF(s) from port_id.\n\n"
406 
407 			"rx_vlan rm (vlan_id) port (port_id) vf (vf_mask)\n"
408 			"    Remove a vlan_id, to the set of VLAN identifiers"
409 			"filtered for VF(s) from port_id.\n\n"
410 
411 			"rx_vxlan_port add (udp_port) (port_id)\n"
412 			"    Add an UDP port for VXLAN packet filter on a port\n\n"
413 
414 			"rx_vxlan_port rm (udp_port) (port_id)\n"
415 			"    Remove an UDP port for VXLAN packet filter on a port\n\n"
416 
417 			"tx_vlan set (port_id) vlan_id[, vlan_id_outer]\n"
418 			"    Set hardware insertion of VLAN IDs (single or double VLAN "
419 			"depends on the number of VLAN IDs) in packets sent on a port.\n\n"
420 
421 			"tx_vlan set pvid port_id vlan_id (on|off)\n"
422 			"    Set port based TX VLAN insertion.\n\n"
423 
424 			"tx_vlan reset (port_id)\n"
425 			"    Disable hardware insertion of a VLAN header in"
426 			" packets sent on a port.\n\n"
427 
428 			"csum set (ip|udp|tcp|sctp|outer-ip|outer-udp) (hw|sw) (port_id)\n"
429 			"    Select hardware or software calculation of the"
430 			" checksum when transmitting a packet using the"
431 			" csum forward engine.\n"
432 			"    ip|udp|tcp|sctp always concern the inner layer.\n"
433 			"    outer-ip concerns the outer IP layer in"
434 			"    outer-udp concerns the outer UDP layer in"
435 			" case the packet is recognized as a tunnel packet by"
436 			" the forward engine (vxlan, gre and ipip are supported)\n"
437 			"    Please check the NIC datasheet for HW limits.\n\n"
438 
439 			"csum parse-tunnel (on|off) (tx_port_id)\n"
440 			"    If disabled, treat tunnel packets as non-tunneled"
441 			" packets (treat inner headers as payload). The port\n"
442 			"    argument is the port used for TX in csum forward"
443 			" engine.\n\n"
444 
445 			"csum show (port_id)\n"
446 			"    Display tx checksum offload configuration\n\n"
447 
448 			"tso set (segsize) (portid)\n"
449 			"    Enable TCP Segmentation Offload in csum forward"
450 			" engine.\n"
451 			"    Please check the NIC datasheet for HW limits.\n\n"
452 
453 			"tso show (portid)"
454 			"    Display the status of TCP Segmentation Offload.\n\n"
455 
456 			"set port (port_id) gro on|off\n"
457 			"    Enable or disable Generic Receive Offload in"
458 			" csum forwarding engine.\n\n"
459 
460 			"show port (port_id) gro\n"
461 			"    Display GRO configuration.\n\n"
462 
463 			"set gro flush (cycles)\n"
464 			"    Set the cycle to flush GROed packets from"
465 			" reassembly tables.\n\n"
466 
467 			"set port (port_id) gso (on|off)"
468 			"    Enable or disable Generic Segmentation Offload in"
469 			" csum forwarding engine.\n\n"
470 
471 			"set gso segsz (length)\n"
472 			"    Set max packet length for output GSO segments,"
473 			" including packet header and payload.\n\n"
474 
475 			"show port (port_id) gso\n"
476 			"    Show GSO configuration.\n\n"
477 
478 			"set fwd (%s)\n"
479 			"    Set packet forwarding mode.\n\n"
480 
481 			"mac_addr add (port_id) (XX:XX:XX:XX:XX:XX)\n"
482 			"    Add a MAC address on port_id.\n\n"
483 
484 			"mac_addr remove (port_id) (XX:XX:XX:XX:XX:XX)\n"
485 			"    Remove a MAC address from port_id.\n\n"
486 
487 			"mac_addr set (port_id) (XX:XX:XX:XX:XX:XX)\n"
488 			"    Set the default MAC address for port_id.\n\n"
489 
490 			"mac_addr add port (port_id) vf (vf_id) (mac_address)\n"
491 			"    Add a MAC address for a VF on the port.\n\n"
492 
493 			"set vf mac addr (port_id) (vf_id) (XX:XX:XX:XX:XX:XX)\n"
494 			"    Set the MAC address for a VF from the PF.\n\n"
495 
496 			"set eth-peer (port_id) (peer_addr)\n"
497 			"    set the peer address for certain port.\n\n"
498 
499 			"set port (port_id) uta (mac_address|all) (on|off)\n"
500 			"    Add/Remove a or all unicast hash filter(s)"
501 			"from port X.\n\n"
502 
503 			"set promisc (port_id|all) (on|off)\n"
504 			"    Set the promiscuous mode on port_id, or all.\n\n"
505 
506 			"set allmulti (port_id|all) (on|off)\n"
507 			"    Set the allmulti mode on port_id, or all.\n\n"
508 
509 			"set vf promisc (port_id) (vf_id) (on|off)\n"
510 			"    Set unicast promiscuous mode for a VF from the PF.\n\n"
511 
512 			"set vf allmulti (port_id) (vf_id) (on|off)\n"
513 			"    Set multicast promiscuous mode for a VF from the PF.\n\n"
514 
515 			"set flow_ctrl rx (on|off) tx (on|off) (high_water)"
516 			" (low_water) (pause_time) (send_xon) mac_ctrl_frame_fwd"
517 			" (on|off) autoneg (on|off) (port_id)\n"
518 			"set flow_ctrl rx (on|off) (portid)\n"
519 			"set flow_ctrl tx (on|off) (portid)\n"
520 			"set flow_ctrl high_water (high_water) (portid)\n"
521 			"set flow_ctrl low_water (low_water) (portid)\n"
522 			"set flow_ctrl pause_time (pause_time) (portid)\n"
523 			"set flow_ctrl send_xon (send_xon) (portid)\n"
524 			"set flow_ctrl mac_ctrl_frame_fwd (on|off) (portid)\n"
525 			"set flow_ctrl autoneg (on|off) (port_id)\n"
526 			"    Set the link flow control parameter on a port.\n\n"
527 
528 			"set pfc_ctrl rx (on|off) tx (on|off) (high_water)"
529 			" (low_water) (pause_time) (priority) (port_id)\n"
530 			"    Set the priority flow control parameter on a"
531 			" port.\n\n"
532 
533 			"set stat_qmap (tx|rx) (port_id) (queue_id) (qmapping)\n"
534 			"    Set statistics mapping (qmapping 0..15) for RX/TX"
535 			" queue on port.\n"
536 			"    e.g., 'set stat_qmap rx 0 2 5' sets rx queue 2"
537 			" on port 0 to mapping 5.\n\n"
538 
539 			"set xstats-hide-zero on|off\n"
540 			"    Set the option to hide the zero values"
541 			" for xstats display.\n"
542 
543 			"set record-core-cycles on|off\n"
544 			"    Set the option to enable measurement of CPU cycles.\n"
545 
546 			"set record-burst-stats on|off\n"
547 			"    Set the option to enable display of RX and TX bursts.\n"
548 
549 			"set port (port_id) vf (vf_id) rx|tx on|off\n"
550 			"    Enable/Disable a VF receive/tranmit from a port\n\n"
551 
552 			"set port (port_id) vf (vf_id) rxmode (AUPE|ROPE|BAM"
553 			"|MPE) (on|off)\n"
554 			"    AUPE:accepts untagged VLAN;"
555 			"ROPE:accept unicast hash\n\n"
556 			"    BAM:accepts broadcast packets;"
557 			"MPE:accepts all multicast packets\n\n"
558 			"    Enable/Disable a VF receive mode of a port\n\n"
559 
560 			"set port (port_id) queue (queue_id) rate (rate_num)\n"
561 			"    Set rate limit for a queue of a port\n\n"
562 
563 			"set port (port_id) vf (vf_id) rate (rate_num) "
564 			"queue_mask (queue_mask_value)\n"
565 			"    Set rate limit for queues in VF of a port\n\n"
566 
567 			"set port (port_id) mirror-rule (rule_id)"
568 			" (pool-mirror-up|pool-mirror-down|vlan-mirror)"
569 			" (poolmask|vlanid[,vlanid]*) dst-pool (pool_id) (on|off)\n"
570 			"   Set pool or vlan type mirror rule on a port.\n"
571 			"   e.g., 'set port 0 mirror-rule 0 vlan-mirror 0,1"
572 			" dst-pool 0 on' enable mirror traffic with vlan 0,1"
573 			" to pool 0.\n\n"
574 
575 			"set port (port_id) mirror-rule (rule_id)"
576 			" (uplink-mirror|downlink-mirror) dst-pool"
577 			" (pool_id) (on|off)\n"
578 			"   Set uplink or downlink type mirror rule on a port.\n"
579 			"   e.g., 'set port 0 mirror-rule 0 uplink-mirror dst-pool"
580 			" 0 on' enable mirror income traffic to pool 0.\n\n"
581 
582 			"reset port (port_id) mirror-rule (rule_id)\n"
583 			"   Reset a mirror rule.\n\n"
584 
585 			"set flush_rx (on|off)\n"
586 			"   Flush (default) or don't flush RX streams before"
587 			" forwarding. Mainly used with PCAP drivers.\n\n"
588 
589 			"set bypass mode (normal|bypass|isolate) (port_id)\n"
590 			"   Set the bypass mode for the lowest port on bypass enabled"
591 			" NIC.\n\n"
592 
593 			"set bypass event (timeout|os_on|os_off|power_on|power_off) "
594 			"mode (normal|bypass|isolate) (port_id)\n"
595 			"   Set the event required to initiate specified bypass mode for"
596 			" the lowest port on a bypass enabled NIC where:\n"
597 			"       timeout   = enable bypass after watchdog timeout.\n"
598 			"       os_on     = enable bypass when OS/board is powered on.\n"
599 			"       os_off    = enable bypass when OS/board is powered off.\n"
600 			"       power_on  = enable bypass when power supply is turned on.\n"
601 			"       power_off = enable bypass when power supply is turned off."
602 			"\n\n"
603 
604 			"set bypass timeout (0|1.5|2|3|4|8|16|32)\n"
605 			"   Set the bypass watchdog timeout to 'n' seconds"
606 			" where 0 = instant.\n\n"
607 
608 			"show bypass config (port_id)\n"
609 			"   Show the bypass configuration for a bypass enabled NIC"
610 			" using the lowest port on the NIC.\n\n"
611 
612 #ifdef RTE_NET_BOND
613 			"create bonded device (mode) (socket)\n"
614 			"	Create a new bonded device with specific bonding mode and socket.\n\n"
615 
616 			"add bonding slave (slave_id) (port_id)\n"
617 			"	Add a slave device to a bonded device.\n\n"
618 
619 			"remove bonding slave (slave_id) (port_id)\n"
620 			"	Remove a slave device from a bonded device.\n\n"
621 
622 			"set bonding mode (value) (port_id)\n"
623 			"	Set the bonding mode on a bonded device.\n\n"
624 
625 			"set bonding primary (slave_id) (port_id)\n"
626 			"	Set the primary slave for a bonded device.\n\n"
627 
628 			"show bonding config (port_id)\n"
629 			"	Show the bonding config for port_id.\n\n"
630 
631 			"set bonding mac_addr (port_id) (address)\n"
632 			"	Set the MAC address of a bonded device.\n\n"
633 
634 			"set bonding mode IEEE802.3AD aggregator policy (port_id) (agg_name)"
635 			"	Set Aggregation mode for IEEE802.3AD (mode 4)"
636 
637 			"set bonding balance_xmit_policy (port_id) (l2|l23|l34)\n"
638 			"	Set the transmit balance policy for bonded device running in balance mode.\n\n"
639 
640 			"set bonding mon_period (port_id) (value)\n"
641 			"	Set the bonding link status monitoring polling period in ms.\n\n"
642 
643 			"set bonding lacp dedicated_queues <port_id> (enable|disable)\n"
644 			"	Enable/disable dedicated queues for LACP control traffic.\n\n"
645 
646 #endif
647 			"set link-up port (port_id)\n"
648 			"	Set link up for a port.\n\n"
649 
650 			"set link-down port (port_id)\n"
651 			"	Set link down for a port.\n\n"
652 
653 			"E-tag set insertion on port-tag-id (value)"
654 			" port (port_id) vf (vf_id)\n"
655 			"    Enable E-tag insertion for a VF on a port\n\n"
656 
657 			"E-tag set insertion off port (port_id) vf (vf_id)\n"
658 			"    Disable E-tag insertion for a VF on a port\n\n"
659 
660 			"E-tag set stripping (on|off) port (port_id)\n"
661 			"    Enable/disable E-tag stripping on a port\n\n"
662 
663 			"E-tag set forwarding (on|off) port (port_id)\n"
664 			"    Enable/disable E-tag based forwarding"
665 			" on a port\n\n"
666 
667 			"E-tag set filter add e-tag-id (value) dst-pool"
668 			" (pool_id) port (port_id)\n"
669 			"    Add an E-tag forwarding filter on a port\n\n"
670 
671 			"E-tag set filter del e-tag-id (value) port (port_id)\n"
672 			"    Delete an E-tag forwarding filter on a port\n\n"
673 
674 			"ddp add (port_id) (profile_path[,backup_profile_path])\n"
675 			"    Load a profile package on a port\n\n"
676 
677 			"ddp del (port_id) (backup_profile_path)\n"
678 			"    Delete a profile package from a port\n\n"
679 
680 			"ptype mapping get (port_id) (valid_only)\n"
681 			"    Get ptype mapping on a port\n\n"
682 
683 			"ptype mapping replace (port_id) (target) (mask) (pky_type)\n"
684 			"    Replace target with the pkt_type in ptype mapping\n\n"
685 
686 			"ptype mapping reset (port_id)\n"
687 			"    Reset ptype mapping on a port\n\n"
688 
689 			"ptype mapping update (port_id) (hw_ptype) (sw_ptype)\n"
690 			"    Update a ptype mapping item on a port\n\n"
691 
692 			"set port (port_id) ptype_mask (ptype_mask)\n"
693 			"    set packet types classification for a specific port\n\n"
694 
695 			"set port (port_id) queue-region region_id (value) "
696 			"queue_start_index (value) queue_num (value)\n"
697 			"    Set a queue region on a port\n\n"
698 
699 			"set port (port_id) queue-region region_id (value) "
700 			"flowtype (value)\n"
701 			"    Set a flowtype region index on a port\n\n"
702 
703 			"set port (port_id) queue-region UP (value) region_id (value)\n"
704 			"    Set the mapping of User Priority to "
705 			"queue region on a port\n\n"
706 
707 			"set port (port_id) queue-region flush (on|off)\n"
708 			"    flush all queue region related configuration\n\n"
709 
710 			"show port meter cap (port_id)\n"
711 			"    Show port meter capability information\n\n"
712 
713 			"add port meter profile srtcm_rfc2697 (port_id) (profile_id) (cir) (cbs) (ebs)\n"
714 			"    meter profile add - srtcm rfc 2697\n\n"
715 
716 			"add port meter profile trtcm_rfc2698 (port_id) (profile_id) (cir) (pir) (cbs) (pbs)\n"
717 			"    meter profile add - trtcm rfc 2698\n\n"
718 
719 			"add port meter profile trtcm_rfc4115 (port_id) (profile_id) (cir) (eir) (cbs) (ebs)\n"
720 			"    meter profile add - trtcm rfc 4115\n\n"
721 
722 			"del port meter profile (port_id) (profile_id)\n"
723 			"    meter profile delete\n\n"
724 
725 			"create port meter (port_id) (mtr_id) (profile_id) (meter_enable)\n"
726 			"(g_action) (y_action) (r_action) (stats_mask) (shared)\n"
727 			"(use_pre_meter_color) [(dscp_tbl_entry0) (dscp_tbl_entry1)...\n"
728 			"(dscp_tbl_entry63)]\n"
729 			"    meter create\n\n"
730 
731 			"enable port meter (port_id) (mtr_id)\n"
732 			"    meter enable\n\n"
733 
734 			"disable port meter (port_id) (mtr_id)\n"
735 			"    meter disable\n\n"
736 
737 			"del port meter (port_id) (mtr_id)\n"
738 			"    meter delete\n\n"
739 
740 			"set port meter profile (port_id) (mtr_id) (profile_id)\n"
741 			"    meter update meter profile\n\n"
742 
743 			"set port meter dscp table (port_id) (mtr_id) [(dscp_tbl_entry0)\n"
744 			"(dscp_tbl_entry1)...(dscp_tbl_entry63)]\n"
745 			"    update meter dscp table entries\n\n"
746 
747 			"set port meter policer action (port_id) (mtr_id) (action_mask)\n"
748 			"(action0) [(action1) (action2)]\n"
749 			"    meter update policer action\n\n"
750 
751 			"set port meter stats mask (port_id) (mtr_id) (stats_mask)\n"
752 			"    meter update stats\n\n"
753 
754 			"show port (port_id) queue-region\n"
755 			"    show all queue region related configuration info\n\n"
756 
757 			"set port (port_id) fec_mode auto|off|rs|baser\n"
758 			"    set fec mode for a specific port\n\n"
759 
760 			, list_pkt_forwarding_modes()
761 		);
762 	}
763 
764 	if (show_all || !strcmp(res->section, "ports")) {
765 
766 		cmdline_printf(
767 			cl,
768 			"\n"
769 			"Port Operations:\n"
770 			"----------------\n\n"
771 
772 			"port start (port_id|all)\n"
773 			"    Start all ports or port_id.\n\n"
774 
775 			"port stop (port_id|all)\n"
776 			"    Stop all ports or port_id.\n\n"
777 
778 			"port close (port_id|all)\n"
779 			"    Close all ports or port_id.\n\n"
780 
781 			"port reset (port_id|all)\n"
782 			"    Reset all ports or port_id.\n\n"
783 
784 			"port attach (ident)\n"
785 			"    Attach physical or virtual dev by pci address or virtual device name\n\n"
786 
787 			"port detach (port_id)\n"
788 			"    Detach physical or virtual dev by port_id\n\n"
789 
790 			"port config (port_id|all)"
791 			" speed (10|100|1000|10000|25000|40000|50000|100000|200000|auto)"
792 			" duplex (half|full|auto)\n"
793 			"    Set speed and duplex for all ports or port_id\n\n"
794 
795 			"port config (port_id|all) loopback (mode)\n"
796 			"    Set loopback mode for all ports or port_id\n\n"
797 
798 			"port config all (rxq|txq|rxd|txd) (value)\n"
799 			"    Set number for rxq/txq/rxd/txd.\n\n"
800 
801 			"port config all max-pkt-len (value)\n"
802 			"    Set the max packet length.\n\n"
803 
804 			"port config all max-lro-pkt-size (value)\n"
805 			"    Set the max LRO aggregated packet size.\n\n"
806 
807 			"port config all drop-en (on|off)\n"
808 			"    Enable or disable packet drop on all RX queues of all ports when no "
809 			"receive buffers available.\n\n"
810 
811 			"port config all rss (all|default|ip|tcp|udp|sctp|"
812 			"ether|port|vxlan|geneve|nvgre|vxlan-gpe|none|level-default|"
813 			"level-outer|level-inner|<flowtype_id>)\n"
814 			"    Set the RSS mode.\n\n"
815 
816 			"port config port-id rss reta (hash,queue)[,(hash,queue)]\n"
817 			"    Set the RSS redirection table.\n\n"
818 
819 			"port config (port_id) dcb vt (on|off) (traffic_class)"
820 			" pfc (on|off)\n"
821 			"    Set the DCB mode.\n\n"
822 
823 			"port config all burst (value)\n"
824 			"    Set the number of packets per burst.\n\n"
825 
826 			"port config all (txpt|txht|txwt|rxpt|rxht|rxwt)"
827 			" (value)\n"
828 			"    Set the ring prefetch/host/writeback threshold"
829 			" for tx/rx queue.\n\n"
830 
831 			"port config all (txfreet|txrst|rxfreet) (value)\n"
832 			"    Set free threshold for rx/tx, or set"
833 			" tx rs bit threshold.\n\n"
834 			"port config mtu X value\n"
835 			"    Set the MTU of port X to a given value\n\n"
836 
837 			"port config (port_id) (rxq|txq) (queue_id) ring_size (value)\n"
838 			"    Set a rx/tx queue's ring size configuration, the new"
839 			" value will take effect after command that (re-)start the port"
840 			" or command that setup the specific queue\n\n"
841 
842 			"port (port_id) (rxq|txq) (queue_id) (start|stop)\n"
843 			"    Start/stop a rx/tx queue of port X. Only take effect"
844 			" when port X is started\n\n"
845 
846 			"port (port_id) (rxq|txq) (queue_id) deferred_start (on|off)\n"
847 			"    Switch on/off a deferred start of port X rx/tx queue. Only"
848 			" take effect when port X is stopped.\n\n"
849 
850 			"port (port_id) (rxq|txq) (queue_id) setup\n"
851 			"    Setup a rx/tx queue of port X.\n\n"
852 
853 			"port config (port_id|all) l2-tunnel E-tag ether-type"
854 			" (value)\n"
855 			"    Set the value of E-tag ether-type.\n\n"
856 
857 			"port config (port_id|all) l2-tunnel E-tag"
858 			" (enable|disable)\n"
859 			"    Enable/disable the E-tag support.\n\n"
860 
861 			"port config (port_id) pctype mapping reset\n"
862 			"    Reset flow type to pctype mapping on a port\n\n"
863 
864 			"port config (port_id) pctype mapping update"
865 			" (pctype_id_0[,pctype_id_1]*) (flow_type_id)\n"
866 			"    Update a flow type to pctype mapping item on a port\n\n"
867 
868 			"port config (port_id) pctype (pctype_id) hash_inset|"
869 			"fdir_inset|fdir_flx_inset get|set|clear field\n"
870 			" (field_idx)\n"
871 			"    Configure RSS|FDIR|FDIR_FLX input set for some pctype\n\n"
872 
873 			"port config (port_id) pctype (pctype_id) hash_inset|"
874 			"fdir_inset|fdir_flx_inset clear all"
875 			"    Clear RSS|FDIR|FDIR_FLX input set completely for some pctype\n\n"
876 
877 			"port config (port_id) udp_tunnel_port add|rm vxlan|geneve (udp_port)\n\n"
878 			"    Add/remove UDP tunnel port for tunneling offload\n\n"
879 
880 			"port config <port_id> rx_offload vlan_strip|"
881 			"ipv4_cksum|udp_cksum|tcp_cksum|tcp_lro|qinq_strip|"
882 			"outer_ipv4_cksum|macsec_strip|header_split|"
883 			"vlan_filter|vlan_extend|jumbo_frame|scatter|"
884 			"buffer_split|timestamp|security|keep_crc on|off\n"
885 			"     Enable or disable a per port Rx offloading"
886 			" on all Rx queues of a port\n\n"
887 
888 			"port (port_id) rxq (queue_id) rx_offload vlan_strip|"
889 			"ipv4_cksum|udp_cksum|tcp_cksum|tcp_lro|qinq_strip|"
890 			"outer_ipv4_cksum|macsec_strip|header_split|"
891 			"vlan_filter|vlan_extend|jumbo_frame|scatter|"
892 			"buffer_split|timestamp|security|keep_crc on|off\n"
893 			"    Enable or disable a per queue Rx offloading"
894 			" only on a specific Rx queue\n\n"
895 
896 			"port config (port_id) tx_offload vlan_insert|"
897 			"ipv4_cksum|udp_cksum|tcp_cksum|sctp_cksum|tcp_tso|"
898 			"udp_tso|outer_ipv4_cksum|qinq_insert|vxlan_tnl_tso|"
899 			"gre_tnl_tso|ipip_tnl_tso|geneve_tnl_tso|"
900 			"macsec_insert|mt_lockfree|multi_segs|mbuf_fast_free|"
901 			"security on|off\n"
902 			"    Enable or disable a per port Tx offloading"
903 			" on all Tx queues of a port\n\n"
904 
905 			"port (port_id) txq (queue_id) tx_offload vlan_insert|"
906 			"ipv4_cksum|udp_cksum|tcp_cksum|sctp_cksum|tcp_tso|"
907 			"udp_tso|outer_ipv4_cksum|qinq_insert|vxlan_tnl_tso|"
908 			"gre_tnl_tso|ipip_tnl_tso|geneve_tnl_tso|macsec_insert"
909 			"|mt_lockfree|multi_segs|mbuf_fast_free|security"
910 			" on|off\n"
911 			"    Enable or disable a per queue Tx offloading"
912 			" only on a specific Tx queue\n\n"
913 
914 			"bpf-load rx|tx (port) (queue) (J|M|B) (file_name)\n"
915 			"    Load an eBPF program as a callback"
916 			" for particular RX/TX queue\n\n"
917 
918 			"bpf-unload rx|tx (port) (queue)\n"
919 			"    Unload previously loaded eBPF program"
920 			" for particular RX/TX queue\n\n"
921 
922 			"port config (port_id) tx_metadata (value)\n"
923 			"    Set Tx metadata value per port. Testpmd will add this value"
924 			" to any Tx packet sent from this port\n\n"
925 
926 			"port config (port_id) dynf (name) set|clear\n"
927 			"    Register a dynf and Set/clear this flag on Tx. "
928 			"Testpmd will set this value to any Tx packet "
929 			"sent from this port\n\n"
930 		);
931 	}
932 
933 	if (show_all || !strcmp(res->section, "registers")) {
934 
935 		cmdline_printf(
936 			cl,
937 			"\n"
938 			"Registers:\n"
939 			"----------\n\n"
940 
941 			"read reg (port_id) (address)\n"
942 			"    Display value of a port register.\n\n"
943 
944 			"read regfield (port_id) (address) (bit_x) (bit_y)\n"
945 			"    Display a port register bit field.\n\n"
946 
947 			"read regbit (port_id) (address) (bit_x)\n"
948 			"    Display a single port register bit.\n\n"
949 
950 			"write reg (port_id) (address) (value)\n"
951 			"    Set value of a port register.\n\n"
952 
953 			"write regfield (port_id) (address) (bit_x) (bit_y)"
954 			" (value)\n"
955 			"    Set bit field of a port register.\n\n"
956 
957 			"write regbit (port_id) (address) (bit_x) (value)\n"
958 			"    Set single bit value of a port register.\n\n"
959 		);
960 	}
961 	if (show_all || !strcmp(res->section, "filters")) {
962 
963 		cmdline_printf(
964 			cl,
965 			"\n"
966 			"filters:\n"
967 			"--------\n\n"
968 
969 			"flow_director_filter (port_id) mode IP (add|del|update)"
970 			" flow (ipv4-other|ipv4-frag|ipv6-other|ipv6-frag)"
971 			" src (src_ip_address) dst (dst_ip_address)"
972 			" tos (tos_value) proto (proto_value) ttl (ttl_value)"
973 			" vlan (vlan_value) flexbytes (flexbytes_value)"
974 			" (drop|fwd) pf|vf(vf_id) queue (queue_id)"
975 			" fd_id (fd_id_value)\n"
976 			"    Add/Del an IP type flow director filter.\n\n"
977 
978 			"flow_director_filter (port_id) mode IP (add|del|update)"
979 			" flow (ipv4-tcp|ipv4-udp|ipv6-tcp|ipv6-udp)"
980 			" src (src_ip_address) (src_port)"
981 			" dst (dst_ip_address) (dst_port)"
982 			" tos (tos_value) ttl (ttl_value)"
983 			" vlan (vlan_value) flexbytes (flexbytes_value)"
984 			" (drop|fwd) pf|vf(vf_id) queue (queue_id)"
985 			" fd_id (fd_id_value)\n"
986 			"    Add/Del an UDP/TCP type flow director filter.\n\n"
987 
988 			"flow_director_filter (port_id) mode IP (add|del|update)"
989 			" flow (ipv4-sctp|ipv6-sctp)"
990 			" src (src_ip_address) (src_port)"
991 			" dst (dst_ip_address) (dst_port)"
992 			" tag (verification_tag) "
993 			" tos (tos_value) ttl (ttl_value)"
994 			" vlan (vlan_value)"
995 			" flexbytes (flexbytes_value) (drop|fwd)"
996 			" pf|vf(vf_id) queue (queue_id) fd_id (fd_id_value)\n"
997 			"    Add/Del a SCTP type flow director filter.\n\n"
998 
999 			"flow_director_filter (port_id) mode IP (add|del|update)"
1000 			" flow l2_payload ether (ethertype)"
1001 			" flexbytes (flexbytes_value) (drop|fwd)"
1002 			" pf|vf(vf_id) queue (queue_id) fd_id (fd_id_value)\n"
1003 			"    Add/Del a l2 payload type flow director filter.\n\n"
1004 
1005 			"flow_director_filter (port_id) mode MAC-VLAN (add|del|update)"
1006 			" mac (mac_address) vlan (vlan_value)"
1007 			" flexbytes (flexbytes_value) (drop|fwd)"
1008 			" queue (queue_id) fd_id (fd_id_value)\n"
1009 			"    Add/Del a MAC-VLAN flow director filter.\n\n"
1010 
1011 			"flow_director_filter (port_id) mode Tunnel (add|del|update)"
1012 			" mac (mac_address) vlan (vlan_value)"
1013 			" tunnel (NVGRE|VxLAN) tunnel-id (tunnel_id_value)"
1014 			" flexbytes (flexbytes_value) (drop|fwd)"
1015 			" queue (queue_id) fd_id (fd_id_value)\n"
1016 			"    Add/Del a Tunnel flow director filter.\n\n"
1017 
1018 			"flow_director_filter (port_id) mode raw (add|del|update)"
1019 			" flow (flow_id) (drop|fwd) queue (queue_id)"
1020 			" fd_id (fd_id_value) packet (packet file name)\n"
1021 			"    Add/Del a raw type flow director filter.\n\n"
1022 
1023 			"flush_flow_director (port_id)\n"
1024 			"    Flush all flow director entries of a device.\n\n"
1025 
1026 			"flow_director_mask (port_id) mode IP vlan (vlan_value)"
1027 			" src_mask (ipv4_src) (ipv6_src) (src_port)"
1028 			" dst_mask (ipv4_dst) (ipv6_dst) (dst_port)\n"
1029 			"    Set flow director IP mask.\n\n"
1030 
1031 			"flow_director_mask (port_id) mode MAC-VLAN"
1032 			" vlan (vlan_value)\n"
1033 			"    Set flow director MAC-VLAN mask.\n\n"
1034 
1035 			"flow_director_mask (port_id) mode Tunnel"
1036 			" vlan (vlan_value) mac (mac_value)"
1037 			" tunnel-type (tunnel_type_value)"
1038 			" tunnel-id (tunnel_id_value)\n"
1039 			"    Set flow director Tunnel mask.\n\n"
1040 
1041 			"flow_director_flex_mask (port_id)"
1042 			" flow (none|ipv4-other|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|"
1043 			"ipv6-other|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|l2_payload|all)"
1044 			" (mask)\n"
1045 			"    Configure mask of flex payload.\n\n"
1046 
1047 			"flow_director_flex_payload (port_id)"
1048 			" (raw|l2|l3|l4) (config)\n"
1049 			"    Configure flex payload selection.\n\n"
1050 
1051 			"set_fdir_input_set (port_id) "
1052 			"(ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|"
1053 			"ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|"
1054 			"l2_payload) (ivlan|ethertype|src-ipv4|dst-ipv4|src-ipv6|"
1055 			"dst-ipv6|ipv4-tos|ipv4-proto|ipv4-ttl|ipv6-tc|"
1056 			"ipv6-next-header|ipv6-hop-limits|udp-src-port|"
1057 			"udp-dst-port|tcp-src-port|tcp-dst-port|"
1058 			"sctp-src-port|sctp-dst-port|sctp-veri-tag|none)"
1059 			" (select|add)\n"
1060 			"    Set the input set for FDir.\n\n"
1061 
1062 			"flow validate {port_id}"
1063 			" [group {group_id}] [priority {level}]"
1064 			" [ingress] [egress]"
1065 			" pattern {item} [/ {item} [...]] / end"
1066 			" actions {action} [/ {action} [...]] / end\n"
1067 			"    Check whether a flow rule can be created.\n\n"
1068 
1069 			"flow create {port_id}"
1070 			" [group {group_id}] [priority {level}]"
1071 			" [ingress] [egress]"
1072 			" pattern {item} [/ {item} [...]] / end"
1073 			" actions {action} [/ {action} [...]] / end\n"
1074 			"    Create a flow rule.\n\n"
1075 
1076 			"flow destroy {port_id} rule {rule_id} [...]\n"
1077 			"    Destroy specific flow rules.\n\n"
1078 
1079 			"flow flush {port_id}\n"
1080 			"    Destroy all flow rules.\n\n"
1081 
1082 			"flow query {port_id} {rule_id} {action}\n"
1083 			"    Query an existing flow rule.\n\n"
1084 
1085 			"flow list {port_id} [group {group_id}] [...]\n"
1086 			"    List existing flow rules sorted by priority,"
1087 			" filtered by group identifiers.\n\n"
1088 
1089 			"flow isolate {port_id} {boolean}\n"
1090 			"    Restrict ingress traffic to the defined"
1091 			" flow rules\n\n"
1092 
1093 			"flow aged {port_id} [destroy]\n"
1094 			"    List and destroy aged flows"
1095 			" flow rules\n\n"
1096 
1097 			"flow shared_action {port_id} create"
1098 			" [action_id {shared_action_id}]"
1099 			" [ingress] [egress]"
1100 			" action {action} / end\n"
1101 			"    Create shared action.\n\n"
1102 
1103 			"flow shared_action {port_id} update"
1104 			" {shared_action_id} action {action} / end\n"
1105 			"    Update shared action.\n\n"
1106 
1107 			"flow shared_action {port_id} destroy"
1108 			" action_id {shared_action_id} [...]\n"
1109 			"    Destroy specific shared actions.\n\n"
1110 
1111 			"flow shared_action {port_id} query"
1112 			" {shared_action_id}\n"
1113 			"    Query an existing shared action.\n\n"
1114 
1115 			"set vxlan ip-version (ipv4|ipv6) vni (vni) udp-src"
1116 			" (udp-src) udp-dst (udp-dst) ip-src (ip-src) ip-dst"
1117 			" (ip-dst) eth-src (eth-src) eth-dst (eth-dst)\n"
1118 			"       Configure the VXLAN encapsulation for flows.\n\n"
1119 
1120 			"set vxlan-with-vlan ip-version (ipv4|ipv6) vni (vni)"
1121 			" udp-src (udp-src) udp-dst (udp-dst) ip-src (ip-src)"
1122 			" ip-dst (ip-dst) vlan-tci (vlan-tci) eth-src (eth-src)"
1123 			" eth-dst (eth-dst)\n"
1124 			"       Configure the VXLAN encapsulation for flows.\n\n"
1125 
1126 			"set vxlan-tos-ttl ip-version (ipv4|ipv6) vni (vni) udp-src"
1127 			" (udp-src) udp-dst (udp-dst) ip-tos (ip-tos) ip-ttl (ip-ttl)"
1128 			" ip-src (ip-src) ip-dst (ip-dst) eth-src (eth-src)"
1129 			" eth-dst (eth-dst)\n"
1130 			"       Configure the VXLAN encapsulation for flows.\n\n"
1131 
1132 			"set nvgre ip-version (ipv4|ipv6) tni (tni) ip-src"
1133 			" (ip-src) ip-dst (ip-dst) eth-src (eth-src) eth-dst"
1134 			" (eth-dst)\n"
1135 			"       Configure the NVGRE encapsulation for flows.\n\n"
1136 
1137 			"set nvgre-with-vlan ip-version (ipv4|ipv6) tni (tni)"
1138 			" ip-src (ip-src) ip-dst (ip-dst) vlan-tci (vlan-tci)"
1139 			" eth-src (eth-src) eth-dst (eth-dst)\n"
1140 			"       Configure the NVGRE encapsulation for flows.\n\n"
1141 
1142 			"set raw_encap {flow items}\n"
1143 			"	Configure the encapsulation with raw data.\n\n"
1144 
1145 			"set raw_decap {flow items}\n"
1146 			"	Configure the decapsulation with raw data.\n\n"
1147 
1148 		);
1149 	}
1150 
1151 	if (show_all || !strcmp(res->section, "traffic_management")) {
1152 		cmdline_printf(
1153 			cl,
1154 			"\n"
1155 			"Traffic Management:\n"
1156 			"--------------\n"
1157 			"show port tm cap (port_id)\n"
1158 			"       Display the port TM capability.\n\n"
1159 
1160 			"show port tm level cap (port_id) (level_id)\n"
1161 			"       Display the port TM hierarchical level capability.\n\n"
1162 
1163 			"show port tm node cap (port_id) (node_id)\n"
1164 			"       Display the port TM node capability.\n\n"
1165 
1166 			"show port tm node type (port_id) (node_id)\n"
1167 			"       Display the port TM node type.\n\n"
1168 
1169 			"show port tm node stats (port_id) (node_id) (clear)\n"
1170 			"       Display the port TM node stats.\n\n"
1171 
1172 			"add port tm node shaper profile (port_id) (shaper_profile_id)"
1173 			" (cmit_tb_rate) (cmit_tb_size) (peak_tb_rate) (peak_tb_size)"
1174 			" (packet_length_adjust) (packet_mode)\n"
1175 			"       Add port tm node private shaper profile.\n\n"
1176 
1177 			"del port tm node shaper profile (port_id) (shaper_profile_id)\n"
1178 			"       Delete port tm node private shaper profile.\n\n"
1179 
1180 			"add port tm node shared shaper (port_id) (shared_shaper_id)"
1181 			" (shaper_profile_id)\n"
1182 			"       Add/update port tm node shared shaper.\n\n"
1183 
1184 			"del port tm node shared shaper (port_id) (shared_shaper_id)\n"
1185 			"       Delete port tm node shared shaper.\n\n"
1186 
1187 			"set port tm node shaper profile (port_id) (node_id)"
1188 			" (shaper_profile_id)\n"
1189 			"       Set port tm node shaper profile.\n\n"
1190 
1191 			"add port tm node wred profile (port_id) (wred_profile_id)"
1192 			" (color_g) (min_th_g) (max_th_g) (maxp_inv_g) (wq_log2_g)"
1193 			" (color_y) (min_th_y) (max_th_y) (maxp_inv_y) (wq_log2_y)"
1194 			" (color_r) (min_th_r) (max_th_r) (maxp_inv_r) (wq_log2_r)\n"
1195 			"       Add port tm node wred profile.\n\n"
1196 
1197 			"del port tm node wred profile (port_id) (wred_profile_id)\n"
1198 			"       Delete port tm node wred profile.\n\n"
1199 
1200 			"add port tm nonleaf node (port_id) (node_id) (parent_node_id)"
1201 			" (priority) (weight) (level_id) (shaper_profile_id)"
1202 			" (n_sp_priorities) (stats_mask) (n_shared_shapers)"
1203 			" [(shared_shaper_id_0) (shared_shaper_id_1)...]\n"
1204 			"       Add port tm nonleaf node.\n\n"
1205 
1206 			"add port tm nonleaf node pktmode (port_id) (node_id) (parent_node_id)"
1207 			" (priority) (weight) (level_id) (shaper_profile_id)"
1208 			" (n_sp_priorities) (stats_mask) (n_shared_shapers)"
1209 			" [(shared_shaper_id_0) (shared_shaper_id_1)...]\n"
1210 			"       Add port tm nonleaf node with pkt mode enabled.\n\n"
1211 
1212 			"add port tm leaf node (port_id) (node_id) (parent_node_id)"
1213 			" (priority) (weight) (level_id) (shaper_profile_id)"
1214 			" (cman_mode) (wred_profile_id) (stats_mask) (n_shared_shapers)"
1215 			" [(shared_shaper_id_0) (shared_shaper_id_1)...]\n"
1216 			"       Add port tm leaf node.\n\n"
1217 
1218 			"del port tm node (port_id) (node_id)\n"
1219 			"       Delete port tm node.\n\n"
1220 
1221 			"set port tm node parent (port_id) (node_id) (parent_node_id)"
1222 			" (priority) (weight)\n"
1223 			"       Set port tm node parent.\n\n"
1224 
1225 			"suspend port tm node (port_id) (node_id)"
1226 			"       Suspend tm node.\n\n"
1227 
1228 			"resume port tm node (port_id) (node_id)"
1229 			"       Resume tm node.\n\n"
1230 
1231 			"port tm hierarchy commit (port_id) (clean_on_fail)\n"
1232 			"       Commit tm hierarchy.\n\n"
1233 
1234 			"set port tm mark ip_ecn (port) (green) (yellow)"
1235 			" (red)\n"
1236 			"    Enables/Disables the traffic management marking"
1237 			" for IP ECN (Explicit Congestion Notification)"
1238 			" packets on a given port\n\n"
1239 
1240 			"set port tm mark ip_dscp (port) (green) (yellow)"
1241 			" (red)\n"
1242 			"    Enables/Disables the traffic management marking"
1243 			" on the port for IP dscp packets\n\n"
1244 
1245 			"set port tm mark vlan_dei (port) (green) (yellow)"
1246 			" (red)\n"
1247 			"    Enables/Disables the traffic management marking"
1248 			" on the port for VLAN packets with DEI enabled\n\n"
1249 		);
1250 	}
1251 
1252 	if (show_all || !strcmp(res->section, "devices")) {
1253 		cmdline_printf(
1254 			cl,
1255 			"\n"
1256 			"Device Operations:\n"
1257 			"--------------\n"
1258 			"device detach (identifier)\n"
1259 			"       Detach device by identifier.\n\n"
1260 		);
1261 	}
1262 
1263 }
1264 
1265 cmdline_parse_token_string_t cmd_help_long_help =
1266 	TOKEN_STRING_INITIALIZER(struct cmd_help_long_result, help, "help");
1267 
1268 cmdline_parse_token_string_t cmd_help_long_section =
1269 	TOKEN_STRING_INITIALIZER(struct cmd_help_long_result, section,
1270 			"all#control#display#config#"
1271 			"ports#registers#filters#traffic_management#devices");
1272 
1273 cmdline_parse_inst_t cmd_help_long = {
1274 	.f = cmd_help_long_parsed,
1275 	.data = NULL,
1276 	.help_str = "help all|control|display|config|ports|register|"
1277 		"filters|traffic_management|devices: "
1278 		"Show help",
1279 	.tokens = {
1280 		(void *)&cmd_help_long_help,
1281 		(void *)&cmd_help_long_section,
1282 		NULL,
1283 	},
1284 };
1285 
1286 
1287 /* *** start/stop/close all ports *** */
1288 struct cmd_operate_port_result {
1289 	cmdline_fixed_string_t keyword;
1290 	cmdline_fixed_string_t name;
1291 	cmdline_fixed_string_t value;
1292 };
1293 
1294 static void cmd_operate_port_parsed(void *parsed_result,
1295 				__rte_unused struct cmdline *cl,
1296 				__rte_unused void *data)
1297 {
1298 	struct cmd_operate_port_result *res = parsed_result;
1299 
1300 	if (!strcmp(res->name, "start"))
1301 		start_port(RTE_PORT_ALL);
1302 	else if (!strcmp(res->name, "stop"))
1303 		stop_port(RTE_PORT_ALL);
1304 	else if (!strcmp(res->name, "close"))
1305 		close_port(RTE_PORT_ALL);
1306 	else if (!strcmp(res->name, "reset"))
1307 		reset_port(RTE_PORT_ALL);
1308 	else
1309 		printf("Unknown parameter\n");
1310 }
1311 
1312 cmdline_parse_token_string_t cmd_operate_port_all_cmd =
1313 	TOKEN_STRING_INITIALIZER(struct cmd_operate_port_result, keyword,
1314 								"port");
1315 cmdline_parse_token_string_t cmd_operate_port_all_port =
1316 	TOKEN_STRING_INITIALIZER(struct cmd_operate_port_result, name,
1317 						"start#stop#close#reset");
1318 cmdline_parse_token_string_t cmd_operate_port_all_all =
1319 	TOKEN_STRING_INITIALIZER(struct cmd_operate_port_result, value, "all");
1320 
1321 cmdline_parse_inst_t cmd_operate_port = {
1322 	.f = cmd_operate_port_parsed,
1323 	.data = NULL,
1324 	.help_str = "port start|stop|close all: Start/Stop/Close/Reset all ports",
1325 	.tokens = {
1326 		(void *)&cmd_operate_port_all_cmd,
1327 		(void *)&cmd_operate_port_all_port,
1328 		(void *)&cmd_operate_port_all_all,
1329 		NULL,
1330 	},
1331 };
1332 
1333 /* *** start/stop/close specific port *** */
1334 struct cmd_operate_specific_port_result {
1335 	cmdline_fixed_string_t keyword;
1336 	cmdline_fixed_string_t name;
1337 	uint8_t value;
1338 };
1339 
1340 static void cmd_operate_specific_port_parsed(void *parsed_result,
1341 			__rte_unused struct cmdline *cl,
1342 				__rte_unused void *data)
1343 {
1344 	struct cmd_operate_specific_port_result *res = parsed_result;
1345 
1346 	if (!strcmp(res->name, "start"))
1347 		start_port(res->value);
1348 	else if (!strcmp(res->name, "stop"))
1349 		stop_port(res->value);
1350 	else if (!strcmp(res->name, "close"))
1351 		close_port(res->value);
1352 	else if (!strcmp(res->name, "reset"))
1353 		reset_port(res->value);
1354 	else
1355 		printf("Unknown parameter\n");
1356 }
1357 
1358 cmdline_parse_token_string_t cmd_operate_specific_port_cmd =
1359 	TOKEN_STRING_INITIALIZER(struct cmd_operate_specific_port_result,
1360 							keyword, "port");
1361 cmdline_parse_token_string_t cmd_operate_specific_port_port =
1362 	TOKEN_STRING_INITIALIZER(struct cmd_operate_specific_port_result,
1363 						name, "start#stop#close#reset");
1364 cmdline_parse_token_num_t cmd_operate_specific_port_id =
1365 	TOKEN_NUM_INITIALIZER(struct cmd_operate_specific_port_result,
1366 							value, UINT8);
1367 
1368 cmdline_parse_inst_t cmd_operate_specific_port = {
1369 	.f = cmd_operate_specific_port_parsed,
1370 	.data = NULL,
1371 	.help_str = "port start|stop|close <port_id>: Start/Stop/Close/Reset port_id",
1372 	.tokens = {
1373 		(void *)&cmd_operate_specific_port_cmd,
1374 		(void *)&cmd_operate_specific_port_port,
1375 		(void *)&cmd_operate_specific_port_id,
1376 		NULL,
1377 	},
1378 };
1379 
1380 /* *** enable port setup (after attach) via iterator or event *** */
1381 struct cmd_set_port_setup_on_result {
1382 	cmdline_fixed_string_t set;
1383 	cmdline_fixed_string_t port;
1384 	cmdline_fixed_string_t setup;
1385 	cmdline_fixed_string_t on;
1386 	cmdline_fixed_string_t mode;
1387 };
1388 
1389 static void cmd_set_port_setup_on_parsed(void *parsed_result,
1390 				__rte_unused struct cmdline *cl,
1391 				__rte_unused void *data)
1392 {
1393 	struct cmd_set_port_setup_on_result *res = parsed_result;
1394 
1395 	if (strcmp(res->mode, "event") == 0)
1396 		setup_on_probe_event = true;
1397 	else if (strcmp(res->mode, "iterator") == 0)
1398 		setup_on_probe_event = false;
1399 	else
1400 		printf("Unknown mode\n");
1401 }
1402 
1403 cmdline_parse_token_string_t cmd_set_port_setup_on_set =
1404 	TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result,
1405 			set, "set");
1406 cmdline_parse_token_string_t cmd_set_port_setup_on_port =
1407 	TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result,
1408 			port, "port");
1409 cmdline_parse_token_string_t cmd_set_port_setup_on_setup =
1410 	TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result,
1411 			setup, "setup");
1412 cmdline_parse_token_string_t cmd_set_port_setup_on_on =
1413 	TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result,
1414 			on, "on");
1415 cmdline_parse_token_string_t cmd_set_port_setup_on_mode =
1416 	TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result,
1417 			mode, "iterator#event");
1418 
1419 cmdline_parse_inst_t cmd_set_port_setup_on = {
1420 	.f = cmd_set_port_setup_on_parsed,
1421 	.data = NULL,
1422 	.help_str = "set port setup on iterator|event",
1423 	.tokens = {
1424 		(void *)&cmd_set_port_setup_on_set,
1425 		(void *)&cmd_set_port_setup_on_port,
1426 		(void *)&cmd_set_port_setup_on_setup,
1427 		(void *)&cmd_set_port_setup_on_on,
1428 		(void *)&cmd_set_port_setup_on_mode,
1429 		NULL,
1430 	},
1431 };
1432 
1433 /* *** attach a specified port *** */
1434 struct cmd_operate_attach_port_result {
1435 	cmdline_fixed_string_t port;
1436 	cmdline_fixed_string_t keyword;
1437 	cmdline_multi_string_t identifier;
1438 };
1439 
1440 static void cmd_operate_attach_port_parsed(void *parsed_result,
1441 				__rte_unused struct cmdline *cl,
1442 				__rte_unused void *data)
1443 {
1444 	struct cmd_operate_attach_port_result *res = parsed_result;
1445 
1446 	if (!strcmp(res->keyword, "attach"))
1447 		attach_port(res->identifier);
1448 	else
1449 		printf("Unknown parameter\n");
1450 }
1451 
1452 cmdline_parse_token_string_t cmd_operate_attach_port_port =
1453 	TOKEN_STRING_INITIALIZER(struct cmd_operate_attach_port_result,
1454 			port, "port");
1455 cmdline_parse_token_string_t cmd_operate_attach_port_keyword =
1456 	TOKEN_STRING_INITIALIZER(struct cmd_operate_attach_port_result,
1457 			keyword, "attach");
1458 cmdline_parse_token_string_t cmd_operate_attach_port_identifier =
1459 	TOKEN_STRING_INITIALIZER(struct cmd_operate_attach_port_result,
1460 			identifier, TOKEN_STRING_MULTI);
1461 
1462 cmdline_parse_inst_t cmd_operate_attach_port = {
1463 	.f = cmd_operate_attach_port_parsed,
1464 	.data = NULL,
1465 	.help_str = "port attach <identifier>: "
1466 		"(identifier: pci address or virtual dev name)",
1467 	.tokens = {
1468 		(void *)&cmd_operate_attach_port_port,
1469 		(void *)&cmd_operate_attach_port_keyword,
1470 		(void *)&cmd_operate_attach_port_identifier,
1471 		NULL,
1472 	},
1473 };
1474 
1475 /* *** detach a specified port *** */
1476 struct cmd_operate_detach_port_result {
1477 	cmdline_fixed_string_t port;
1478 	cmdline_fixed_string_t keyword;
1479 	portid_t port_id;
1480 };
1481 
1482 static void cmd_operate_detach_port_parsed(void *parsed_result,
1483 				__rte_unused struct cmdline *cl,
1484 				__rte_unused void *data)
1485 {
1486 	struct cmd_operate_detach_port_result *res = parsed_result;
1487 
1488 	if (!strcmp(res->keyword, "detach")) {
1489 		RTE_ETH_VALID_PORTID_OR_RET(res->port_id);
1490 		detach_port_device(res->port_id);
1491 	} else {
1492 		printf("Unknown parameter\n");
1493 	}
1494 }
1495 
1496 cmdline_parse_token_string_t cmd_operate_detach_port_port =
1497 	TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_port_result,
1498 			port, "port");
1499 cmdline_parse_token_string_t cmd_operate_detach_port_keyword =
1500 	TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_port_result,
1501 			keyword, "detach");
1502 cmdline_parse_token_num_t cmd_operate_detach_port_port_id =
1503 	TOKEN_NUM_INITIALIZER(struct cmd_operate_detach_port_result,
1504 			port_id, UINT16);
1505 
1506 cmdline_parse_inst_t cmd_operate_detach_port = {
1507 	.f = cmd_operate_detach_port_parsed,
1508 	.data = NULL,
1509 	.help_str = "port detach <port_id>",
1510 	.tokens = {
1511 		(void *)&cmd_operate_detach_port_port,
1512 		(void *)&cmd_operate_detach_port_keyword,
1513 		(void *)&cmd_operate_detach_port_port_id,
1514 		NULL,
1515 	},
1516 };
1517 
1518 /* *** detach device by identifier *** */
1519 struct cmd_operate_detach_device_result {
1520 	cmdline_fixed_string_t device;
1521 	cmdline_fixed_string_t keyword;
1522 	cmdline_fixed_string_t identifier;
1523 };
1524 
1525 static void cmd_operate_detach_device_parsed(void *parsed_result,
1526 				__rte_unused struct cmdline *cl,
1527 				__rte_unused void *data)
1528 {
1529 	struct cmd_operate_detach_device_result *res = parsed_result;
1530 
1531 	if (!strcmp(res->keyword, "detach"))
1532 		detach_devargs(res->identifier);
1533 	else
1534 		printf("Unknown parameter\n");
1535 }
1536 
1537 cmdline_parse_token_string_t cmd_operate_detach_device_device =
1538 	TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_device_result,
1539 			device, "device");
1540 cmdline_parse_token_string_t cmd_operate_detach_device_keyword =
1541 	TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_device_result,
1542 			keyword, "detach");
1543 cmdline_parse_token_string_t cmd_operate_detach_device_identifier =
1544 	TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_device_result,
1545 			identifier, NULL);
1546 
1547 cmdline_parse_inst_t cmd_operate_detach_device = {
1548 	.f = cmd_operate_detach_device_parsed,
1549 	.data = NULL,
1550 	.help_str = "device detach <identifier>:"
1551 		"(identifier: pci address or virtual dev name)",
1552 	.tokens = {
1553 		(void *)&cmd_operate_detach_device_device,
1554 		(void *)&cmd_operate_detach_device_keyword,
1555 		(void *)&cmd_operate_detach_device_identifier,
1556 		NULL,
1557 	},
1558 };
1559 /* *** configure speed for all ports *** */
1560 struct cmd_config_speed_all {
1561 	cmdline_fixed_string_t port;
1562 	cmdline_fixed_string_t keyword;
1563 	cmdline_fixed_string_t all;
1564 	cmdline_fixed_string_t item1;
1565 	cmdline_fixed_string_t item2;
1566 	cmdline_fixed_string_t value1;
1567 	cmdline_fixed_string_t value2;
1568 };
1569 
1570 static int
1571 parse_and_check_speed_duplex(char *speedstr, char *duplexstr, uint32_t *speed)
1572 {
1573 
1574 	int duplex;
1575 
1576 	if (!strcmp(duplexstr, "half")) {
1577 		duplex = ETH_LINK_HALF_DUPLEX;
1578 	} else if (!strcmp(duplexstr, "full")) {
1579 		duplex = ETH_LINK_FULL_DUPLEX;
1580 	} else if (!strcmp(duplexstr, "auto")) {
1581 		duplex = ETH_LINK_FULL_DUPLEX;
1582 	} else {
1583 		printf("Unknown duplex parameter\n");
1584 		return -1;
1585 	}
1586 
1587 	if (!strcmp(speedstr, "10")) {
1588 		*speed = (duplex == ETH_LINK_HALF_DUPLEX) ?
1589 				ETH_LINK_SPEED_10M_HD : ETH_LINK_SPEED_10M;
1590 	} else if (!strcmp(speedstr, "100")) {
1591 		*speed = (duplex == ETH_LINK_HALF_DUPLEX) ?
1592 				ETH_LINK_SPEED_100M_HD : ETH_LINK_SPEED_100M;
1593 	} else {
1594 		if (duplex != ETH_LINK_FULL_DUPLEX) {
1595 			printf("Invalid speed/duplex parameters\n");
1596 			return -1;
1597 		}
1598 		if (!strcmp(speedstr, "1000")) {
1599 			*speed = ETH_LINK_SPEED_1G;
1600 		} else if (!strcmp(speedstr, "10000")) {
1601 			*speed = ETH_LINK_SPEED_10G;
1602 		} else if (!strcmp(speedstr, "25000")) {
1603 			*speed = ETH_LINK_SPEED_25G;
1604 		} else if (!strcmp(speedstr, "40000")) {
1605 			*speed = ETH_LINK_SPEED_40G;
1606 		} else if (!strcmp(speedstr, "50000")) {
1607 			*speed = ETH_LINK_SPEED_50G;
1608 		} else if (!strcmp(speedstr, "100000")) {
1609 			*speed = ETH_LINK_SPEED_100G;
1610 		} else if (!strcmp(speedstr, "200000")) {
1611 			*speed = ETH_LINK_SPEED_200G;
1612 		} else if (!strcmp(speedstr, "auto")) {
1613 			*speed = ETH_LINK_SPEED_AUTONEG;
1614 		} else {
1615 			printf("Unknown speed parameter\n");
1616 			return -1;
1617 		}
1618 	}
1619 
1620 	return 0;
1621 }
1622 
1623 static void
1624 cmd_config_speed_all_parsed(void *parsed_result,
1625 			__rte_unused struct cmdline *cl,
1626 			__rte_unused void *data)
1627 {
1628 	struct cmd_config_speed_all *res = parsed_result;
1629 	uint32_t link_speed;
1630 	portid_t pid;
1631 
1632 	if (!all_ports_stopped()) {
1633 		printf("Please stop all ports first\n");
1634 		return;
1635 	}
1636 
1637 	if (parse_and_check_speed_duplex(res->value1, res->value2,
1638 			&link_speed) < 0)
1639 		return;
1640 
1641 	RTE_ETH_FOREACH_DEV(pid) {
1642 		ports[pid].dev_conf.link_speeds = link_speed;
1643 	}
1644 
1645 	cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
1646 }
1647 
1648 cmdline_parse_token_string_t cmd_config_speed_all_port =
1649 	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, port, "port");
1650 cmdline_parse_token_string_t cmd_config_speed_all_keyword =
1651 	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, keyword,
1652 							"config");
1653 cmdline_parse_token_string_t cmd_config_speed_all_all =
1654 	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, all, "all");
1655 cmdline_parse_token_string_t cmd_config_speed_all_item1 =
1656 	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, item1, "speed");
1657 cmdline_parse_token_string_t cmd_config_speed_all_value1 =
1658 	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, value1,
1659 				"10#100#1000#10000#25000#40000#50000#100000#200000#auto");
1660 cmdline_parse_token_string_t cmd_config_speed_all_item2 =
1661 	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, item2, "duplex");
1662 cmdline_parse_token_string_t cmd_config_speed_all_value2 =
1663 	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, value2,
1664 						"half#full#auto");
1665 
1666 cmdline_parse_inst_t cmd_config_speed_all = {
1667 	.f = cmd_config_speed_all_parsed,
1668 	.data = NULL,
1669 	.help_str = "port config all speed "
1670 		"10|100|1000|10000|25000|40000|50000|100000|200000|auto duplex "
1671 							"half|full|auto",
1672 	.tokens = {
1673 		(void *)&cmd_config_speed_all_port,
1674 		(void *)&cmd_config_speed_all_keyword,
1675 		(void *)&cmd_config_speed_all_all,
1676 		(void *)&cmd_config_speed_all_item1,
1677 		(void *)&cmd_config_speed_all_value1,
1678 		(void *)&cmd_config_speed_all_item2,
1679 		(void *)&cmd_config_speed_all_value2,
1680 		NULL,
1681 	},
1682 };
1683 
1684 /* *** configure speed for specific port *** */
1685 struct cmd_config_speed_specific {
1686 	cmdline_fixed_string_t port;
1687 	cmdline_fixed_string_t keyword;
1688 	portid_t id;
1689 	cmdline_fixed_string_t item1;
1690 	cmdline_fixed_string_t item2;
1691 	cmdline_fixed_string_t value1;
1692 	cmdline_fixed_string_t value2;
1693 };
1694 
1695 static void
1696 cmd_config_speed_specific_parsed(void *parsed_result,
1697 				__rte_unused struct cmdline *cl,
1698 				__rte_unused void *data)
1699 {
1700 	struct cmd_config_speed_specific *res = parsed_result;
1701 	uint32_t link_speed;
1702 
1703 	if (!all_ports_stopped()) {
1704 		printf("Please stop all ports first\n");
1705 		return;
1706 	}
1707 
1708 	if (port_id_is_invalid(res->id, ENABLED_WARN))
1709 		return;
1710 
1711 	if (parse_and_check_speed_duplex(res->value1, res->value2,
1712 			&link_speed) < 0)
1713 		return;
1714 
1715 	ports[res->id].dev_conf.link_speeds = link_speed;
1716 
1717 	cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
1718 }
1719 
1720 
1721 cmdline_parse_token_string_t cmd_config_speed_specific_port =
1722 	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, port,
1723 								"port");
1724 cmdline_parse_token_string_t cmd_config_speed_specific_keyword =
1725 	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, keyword,
1726 								"config");
1727 cmdline_parse_token_num_t cmd_config_speed_specific_id =
1728 	TOKEN_NUM_INITIALIZER(struct cmd_config_speed_specific, id, UINT16);
1729 cmdline_parse_token_string_t cmd_config_speed_specific_item1 =
1730 	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, item1,
1731 								"speed");
1732 cmdline_parse_token_string_t cmd_config_speed_specific_value1 =
1733 	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, value1,
1734 				"10#100#1000#10000#25000#40000#50000#100000#200000#auto");
1735 cmdline_parse_token_string_t cmd_config_speed_specific_item2 =
1736 	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, item2,
1737 								"duplex");
1738 cmdline_parse_token_string_t cmd_config_speed_specific_value2 =
1739 	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, value2,
1740 							"half#full#auto");
1741 
1742 cmdline_parse_inst_t cmd_config_speed_specific = {
1743 	.f = cmd_config_speed_specific_parsed,
1744 	.data = NULL,
1745 	.help_str = "port config <port_id> speed "
1746 		"10|100|1000|10000|25000|40000|50000|100000|200000|auto duplex "
1747 							"half|full|auto",
1748 	.tokens = {
1749 		(void *)&cmd_config_speed_specific_port,
1750 		(void *)&cmd_config_speed_specific_keyword,
1751 		(void *)&cmd_config_speed_specific_id,
1752 		(void *)&cmd_config_speed_specific_item1,
1753 		(void *)&cmd_config_speed_specific_value1,
1754 		(void *)&cmd_config_speed_specific_item2,
1755 		(void *)&cmd_config_speed_specific_value2,
1756 		NULL,
1757 	},
1758 };
1759 
1760 /* *** configure loopback for all ports *** */
1761 struct cmd_config_loopback_all {
1762 	cmdline_fixed_string_t port;
1763 	cmdline_fixed_string_t keyword;
1764 	cmdline_fixed_string_t all;
1765 	cmdline_fixed_string_t item;
1766 	uint32_t mode;
1767 };
1768 
1769 static void
1770 cmd_config_loopback_all_parsed(void *parsed_result,
1771 			__rte_unused struct cmdline *cl,
1772 			__rte_unused void *data)
1773 {
1774 	struct cmd_config_loopback_all *res = parsed_result;
1775 	portid_t pid;
1776 
1777 	if (!all_ports_stopped()) {
1778 		printf("Please stop all ports first\n");
1779 		return;
1780 	}
1781 
1782 	RTE_ETH_FOREACH_DEV(pid) {
1783 		ports[pid].dev_conf.lpbk_mode = res->mode;
1784 	}
1785 
1786 	cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
1787 }
1788 
1789 cmdline_parse_token_string_t cmd_config_loopback_all_port =
1790 	TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_all, port, "port");
1791 cmdline_parse_token_string_t cmd_config_loopback_all_keyword =
1792 	TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_all, keyword,
1793 							"config");
1794 cmdline_parse_token_string_t cmd_config_loopback_all_all =
1795 	TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_all, all, "all");
1796 cmdline_parse_token_string_t cmd_config_loopback_all_item =
1797 	TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_all, item,
1798 							"loopback");
1799 cmdline_parse_token_num_t cmd_config_loopback_all_mode =
1800 	TOKEN_NUM_INITIALIZER(struct cmd_config_loopback_all, mode, UINT32);
1801 
1802 cmdline_parse_inst_t cmd_config_loopback_all = {
1803 	.f = cmd_config_loopback_all_parsed,
1804 	.data = NULL,
1805 	.help_str = "port config all loopback <mode>",
1806 	.tokens = {
1807 		(void *)&cmd_config_loopback_all_port,
1808 		(void *)&cmd_config_loopback_all_keyword,
1809 		(void *)&cmd_config_loopback_all_all,
1810 		(void *)&cmd_config_loopback_all_item,
1811 		(void *)&cmd_config_loopback_all_mode,
1812 		NULL,
1813 	},
1814 };
1815 
1816 /* *** configure loopback for specific port *** */
1817 struct cmd_config_loopback_specific {
1818 	cmdline_fixed_string_t port;
1819 	cmdline_fixed_string_t keyword;
1820 	uint16_t port_id;
1821 	cmdline_fixed_string_t item;
1822 	uint32_t mode;
1823 };
1824 
1825 static void
1826 cmd_config_loopback_specific_parsed(void *parsed_result,
1827 				__rte_unused struct cmdline *cl,
1828 				__rte_unused void *data)
1829 {
1830 	struct cmd_config_loopback_specific *res = parsed_result;
1831 
1832 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
1833 		return;
1834 
1835 	if (!port_is_stopped(res->port_id)) {
1836 		printf("Please stop port %u first\n", res->port_id);
1837 		return;
1838 	}
1839 
1840 	ports[res->port_id].dev_conf.lpbk_mode = res->mode;
1841 
1842 	cmd_reconfig_device_queue(res->port_id, 1, 1);
1843 }
1844 
1845 
1846 cmdline_parse_token_string_t cmd_config_loopback_specific_port =
1847 	TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_specific, port,
1848 								"port");
1849 cmdline_parse_token_string_t cmd_config_loopback_specific_keyword =
1850 	TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_specific, keyword,
1851 								"config");
1852 cmdline_parse_token_num_t cmd_config_loopback_specific_id =
1853 	TOKEN_NUM_INITIALIZER(struct cmd_config_loopback_specific, port_id,
1854 								UINT16);
1855 cmdline_parse_token_string_t cmd_config_loopback_specific_item =
1856 	TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_specific, item,
1857 								"loopback");
1858 cmdline_parse_token_num_t cmd_config_loopback_specific_mode =
1859 	TOKEN_NUM_INITIALIZER(struct cmd_config_loopback_specific, mode,
1860 			      UINT32);
1861 
1862 cmdline_parse_inst_t cmd_config_loopback_specific = {
1863 	.f = cmd_config_loopback_specific_parsed,
1864 	.data = NULL,
1865 	.help_str = "port config <port_id> loopback <mode>",
1866 	.tokens = {
1867 		(void *)&cmd_config_loopback_specific_port,
1868 		(void *)&cmd_config_loopback_specific_keyword,
1869 		(void *)&cmd_config_loopback_specific_id,
1870 		(void *)&cmd_config_loopback_specific_item,
1871 		(void *)&cmd_config_loopback_specific_mode,
1872 		NULL,
1873 	},
1874 };
1875 
1876 /* *** configure txq/rxq, txd/rxd *** */
1877 struct cmd_config_rx_tx {
1878 	cmdline_fixed_string_t port;
1879 	cmdline_fixed_string_t keyword;
1880 	cmdline_fixed_string_t all;
1881 	cmdline_fixed_string_t name;
1882 	uint16_t value;
1883 };
1884 
1885 static void
1886 cmd_config_rx_tx_parsed(void *parsed_result,
1887 			__rte_unused struct cmdline *cl,
1888 			__rte_unused void *data)
1889 {
1890 	struct cmd_config_rx_tx *res = parsed_result;
1891 
1892 	if (!all_ports_stopped()) {
1893 		printf("Please stop all ports first\n");
1894 		return;
1895 	}
1896 	if (!strcmp(res->name, "rxq")) {
1897 		if (!res->value && !nb_txq) {
1898 			printf("Warning: Either rx or tx queues should be non zero\n");
1899 			return;
1900 		}
1901 		if (check_nb_rxq(res->value) != 0)
1902 			return;
1903 		nb_rxq = res->value;
1904 	}
1905 	else if (!strcmp(res->name, "txq")) {
1906 		if (!res->value && !nb_rxq) {
1907 			printf("Warning: Either rx or tx queues should be non zero\n");
1908 			return;
1909 		}
1910 		if (check_nb_txq(res->value) != 0)
1911 			return;
1912 		nb_txq = res->value;
1913 	}
1914 	else if (!strcmp(res->name, "rxd")) {
1915 		if (check_nb_rxd(res->value) != 0)
1916 			return;
1917 		nb_rxd = res->value;
1918 	} else if (!strcmp(res->name, "txd")) {
1919 		if (check_nb_txd(res->value) != 0)
1920 			return;
1921 
1922 		nb_txd = res->value;
1923 	} else {
1924 		printf("Unknown parameter\n");
1925 		return;
1926 	}
1927 
1928 	fwd_config_setup();
1929 
1930 	init_port_config();
1931 
1932 	cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
1933 }
1934 
1935 cmdline_parse_token_string_t cmd_config_rx_tx_port =
1936 	TOKEN_STRING_INITIALIZER(struct cmd_config_rx_tx, port, "port");
1937 cmdline_parse_token_string_t cmd_config_rx_tx_keyword =
1938 	TOKEN_STRING_INITIALIZER(struct cmd_config_rx_tx, keyword, "config");
1939 cmdline_parse_token_string_t cmd_config_rx_tx_all =
1940 	TOKEN_STRING_INITIALIZER(struct cmd_config_rx_tx, all, "all");
1941 cmdline_parse_token_string_t cmd_config_rx_tx_name =
1942 	TOKEN_STRING_INITIALIZER(struct cmd_config_rx_tx, name,
1943 						"rxq#txq#rxd#txd");
1944 cmdline_parse_token_num_t cmd_config_rx_tx_value =
1945 	TOKEN_NUM_INITIALIZER(struct cmd_config_rx_tx, value, UINT16);
1946 
1947 cmdline_parse_inst_t cmd_config_rx_tx = {
1948 	.f = cmd_config_rx_tx_parsed,
1949 	.data = NULL,
1950 	.help_str = "port config all rxq|txq|rxd|txd <value>",
1951 	.tokens = {
1952 		(void *)&cmd_config_rx_tx_port,
1953 		(void *)&cmd_config_rx_tx_keyword,
1954 		(void *)&cmd_config_rx_tx_all,
1955 		(void *)&cmd_config_rx_tx_name,
1956 		(void *)&cmd_config_rx_tx_value,
1957 		NULL,
1958 	},
1959 };
1960 
1961 /* *** config max packet length *** */
1962 struct cmd_config_max_pkt_len_result {
1963 	cmdline_fixed_string_t port;
1964 	cmdline_fixed_string_t keyword;
1965 	cmdline_fixed_string_t all;
1966 	cmdline_fixed_string_t name;
1967 	uint32_t value;
1968 };
1969 
1970 static void
1971 cmd_config_max_pkt_len_parsed(void *parsed_result,
1972 				__rte_unused struct cmdline *cl,
1973 				__rte_unused void *data)
1974 {
1975 	struct cmd_config_max_pkt_len_result *res = parsed_result;
1976 	portid_t pid;
1977 
1978 	if (!all_ports_stopped()) {
1979 		printf("Please stop all ports first\n");
1980 		return;
1981 	}
1982 
1983 	RTE_ETH_FOREACH_DEV(pid) {
1984 		struct rte_port *port = &ports[pid];
1985 		uint64_t rx_offloads = port->dev_conf.rxmode.offloads;
1986 
1987 		if (!strcmp(res->name, "max-pkt-len")) {
1988 			if (res->value < RTE_ETHER_MIN_LEN) {
1989 				printf("max-pkt-len can not be less than %d\n",
1990 						RTE_ETHER_MIN_LEN);
1991 				return;
1992 			}
1993 			if (res->value == port->dev_conf.rxmode.max_rx_pkt_len)
1994 				return;
1995 
1996 			port->dev_conf.rxmode.max_rx_pkt_len = res->value;
1997 			if (res->value > RTE_ETHER_MAX_LEN)
1998 				rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
1999 			else
2000 				rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
2001 			port->dev_conf.rxmode.offloads = rx_offloads;
2002 		} else {
2003 			printf("Unknown parameter\n");
2004 			return;
2005 		}
2006 	}
2007 
2008 	init_port_config();
2009 
2010 	cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
2011 }
2012 
2013 cmdline_parse_token_string_t cmd_config_max_pkt_len_port =
2014 	TOKEN_STRING_INITIALIZER(struct cmd_config_max_pkt_len_result, port,
2015 								"port");
2016 cmdline_parse_token_string_t cmd_config_max_pkt_len_keyword =
2017 	TOKEN_STRING_INITIALIZER(struct cmd_config_max_pkt_len_result, keyword,
2018 								"config");
2019 cmdline_parse_token_string_t cmd_config_max_pkt_len_all =
2020 	TOKEN_STRING_INITIALIZER(struct cmd_config_max_pkt_len_result, all,
2021 								"all");
2022 cmdline_parse_token_string_t cmd_config_max_pkt_len_name =
2023 	TOKEN_STRING_INITIALIZER(struct cmd_config_max_pkt_len_result, name,
2024 								"max-pkt-len");
2025 cmdline_parse_token_num_t cmd_config_max_pkt_len_value =
2026 	TOKEN_NUM_INITIALIZER(struct cmd_config_max_pkt_len_result, value,
2027 								UINT32);
2028 
2029 cmdline_parse_inst_t cmd_config_max_pkt_len = {
2030 	.f = cmd_config_max_pkt_len_parsed,
2031 	.data = NULL,
2032 	.help_str = "port config all max-pkt-len <value>",
2033 	.tokens = {
2034 		(void *)&cmd_config_max_pkt_len_port,
2035 		(void *)&cmd_config_max_pkt_len_keyword,
2036 		(void *)&cmd_config_max_pkt_len_all,
2037 		(void *)&cmd_config_max_pkt_len_name,
2038 		(void *)&cmd_config_max_pkt_len_value,
2039 		NULL,
2040 	},
2041 };
2042 
2043 /* *** config max LRO aggregated packet size *** */
2044 struct cmd_config_max_lro_pkt_size_result {
2045 	cmdline_fixed_string_t port;
2046 	cmdline_fixed_string_t keyword;
2047 	cmdline_fixed_string_t all;
2048 	cmdline_fixed_string_t name;
2049 	uint32_t value;
2050 };
2051 
2052 static void
2053 cmd_config_max_lro_pkt_size_parsed(void *parsed_result,
2054 				__rte_unused struct cmdline *cl,
2055 				__rte_unused void *data)
2056 {
2057 	struct cmd_config_max_lro_pkt_size_result *res = parsed_result;
2058 	portid_t pid;
2059 
2060 	if (!all_ports_stopped()) {
2061 		printf("Please stop all ports first\n");
2062 		return;
2063 	}
2064 
2065 	RTE_ETH_FOREACH_DEV(pid) {
2066 		struct rte_port *port = &ports[pid];
2067 
2068 		if (!strcmp(res->name, "max-lro-pkt-size")) {
2069 			if (res->value ==
2070 					port->dev_conf.rxmode.max_lro_pkt_size)
2071 				return;
2072 
2073 			port->dev_conf.rxmode.max_lro_pkt_size = res->value;
2074 		} else {
2075 			printf("Unknown parameter\n");
2076 			return;
2077 		}
2078 	}
2079 
2080 	init_port_config();
2081 
2082 	cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
2083 }
2084 
2085 cmdline_parse_token_string_t cmd_config_max_lro_pkt_size_port =
2086 	TOKEN_STRING_INITIALIZER(struct cmd_config_max_lro_pkt_size_result,
2087 				 port, "port");
2088 cmdline_parse_token_string_t cmd_config_max_lro_pkt_size_keyword =
2089 	TOKEN_STRING_INITIALIZER(struct cmd_config_max_lro_pkt_size_result,
2090 				 keyword, "config");
2091 cmdline_parse_token_string_t cmd_config_max_lro_pkt_size_all =
2092 	TOKEN_STRING_INITIALIZER(struct cmd_config_max_lro_pkt_size_result,
2093 				 all, "all");
2094 cmdline_parse_token_string_t cmd_config_max_lro_pkt_size_name =
2095 	TOKEN_STRING_INITIALIZER(struct cmd_config_max_lro_pkt_size_result,
2096 				 name, "max-lro-pkt-size");
2097 cmdline_parse_token_num_t cmd_config_max_lro_pkt_size_value =
2098 	TOKEN_NUM_INITIALIZER(struct cmd_config_max_lro_pkt_size_result,
2099 			      value, UINT32);
2100 
2101 cmdline_parse_inst_t cmd_config_max_lro_pkt_size = {
2102 	.f = cmd_config_max_lro_pkt_size_parsed,
2103 	.data = NULL,
2104 	.help_str = "port config all max-lro-pkt-size <value>",
2105 	.tokens = {
2106 		(void *)&cmd_config_max_lro_pkt_size_port,
2107 		(void *)&cmd_config_max_lro_pkt_size_keyword,
2108 		(void *)&cmd_config_max_lro_pkt_size_all,
2109 		(void *)&cmd_config_max_lro_pkt_size_name,
2110 		(void *)&cmd_config_max_lro_pkt_size_value,
2111 		NULL,
2112 	},
2113 };
2114 
2115 /* *** configure port MTU *** */
2116 struct cmd_config_mtu_result {
2117 	cmdline_fixed_string_t port;
2118 	cmdline_fixed_string_t keyword;
2119 	cmdline_fixed_string_t mtu;
2120 	portid_t port_id;
2121 	uint16_t value;
2122 };
2123 
2124 static void
2125 cmd_config_mtu_parsed(void *parsed_result,
2126 		      __rte_unused struct cmdline *cl,
2127 		      __rte_unused void *data)
2128 {
2129 	struct cmd_config_mtu_result *res = parsed_result;
2130 
2131 	if (res->value < RTE_ETHER_MIN_LEN) {
2132 		printf("mtu cannot be less than %d\n", RTE_ETHER_MIN_LEN);
2133 		return;
2134 	}
2135 	port_mtu_set(res->port_id, res->value);
2136 }
2137 
2138 cmdline_parse_token_string_t cmd_config_mtu_port =
2139 	TOKEN_STRING_INITIALIZER(struct cmd_config_mtu_result, port,
2140 				 "port");
2141 cmdline_parse_token_string_t cmd_config_mtu_keyword =
2142 	TOKEN_STRING_INITIALIZER(struct cmd_config_mtu_result, keyword,
2143 				 "config");
2144 cmdline_parse_token_string_t cmd_config_mtu_mtu =
2145 	TOKEN_STRING_INITIALIZER(struct cmd_config_mtu_result, keyword,
2146 				 "mtu");
2147 cmdline_parse_token_num_t cmd_config_mtu_port_id =
2148 	TOKEN_NUM_INITIALIZER(struct cmd_config_mtu_result, port_id, UINT16);
2149 cmdline_parse_token_num_t cmd_config_mtu_value =
2150 	TOKEN_NUM_INITIALIZER(struct cmd_config_mtu_result, value, UINT16);
2151 
2152 cmdline_parse_inst_t cmd_config_mtu = {
2153 	.f = cmd_config_mtu_parsed,
2154 	.data = NULL,
2155 	.help_str = "port config mtu <port_id> <value>",
2156 	.tokens = {
2157 		(void *)&cmd_config_mtu_port,
2158 		(void *)&cmd_config_mtu_keyword,
2159 		(void *)&cmd_config_mtu_mtu,
2160 		(void *)&cmd_config_mtu_port_id,
2161 		(void *)&cmd_config_mtu_value,
2162 		NULL,
2163 	},
2164 };
2165 
2166 /* *** configure rx mode *** */
2167 struct cmd_config_rx_mode_flag {
2168 	cmdline_fixed_string_t port;
2169 	cmdline_fixed_string_t keyword;
2170 	cmdline_fixed_string_t all;
2171 	cmdline_fixed_string_t name;
2172 	cmdline_fixed_string_t value;
2173 };
2174 
2175 static void
2176 cmd_config_rx_mode_flag_parsed(void *parsed_result,
2177 				__rte_unused struct cmdline *cl,
2178 				__rte_unused void *data)
2179 {
2180 	struct cmd_config_rx_mode_flag *res = parsed_result;
2181 
2182 	if (!all_ports_stopped()) {
2183 		printf("Please stop all ports first\n");
2184 		return;
2185 	}
2186 
2187 	if (!strcmp(res->name, "drop-en")) {
2188 		if (!strcmp(res->value, "on"))
2189 			rx_drop_en = 1;
2190 		else if (!strcmp(res->value, "off"))
2191 			rx_drop_en = 0;
2192 		else {
2193 			printf("Unknown parameter\n");
2194 			return;
2195 		}
2196 	} else {
2197 		printf("Unknown parameter\n");
2198 		return;
2199 	}
2200 
2201 	init_port_config();
2202 
2203 	cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
2204 }
2205 
2206 cmdline_parse_token_string_t cmd_config_rx_mode_flag_port =
2207 	TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, port, "port");
2208 cmdline_parse_token_string_t cmd_config_rx_mode_flag_keyword =
2209 	TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, keyword,
2210 								"config");
2211 cmdline_parse_token_string_t cmd_config_rx_mode_flag_all =
2212 	TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, all, "all");
2213 cmdline_parse_token_string_t cmd_config_rx_mode_flag_name =
2214 	TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, name,
2215 					"drop-en");
2216 cmdline_parse_token_string_t cmd_config_rx_mode_flag_value =
2217 	TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, value,
2218 							"on#off");
2219 
2220 cmdline_parse_inst_t cmd_config_rx_mode_flag = {
2221 	.f = cmd_config_rx_mode_flag_parsed,
2222 	.data = NULL,
2223 	.help_str = "port config all drop-en on|off",
2224 	.tokens = {
2225 		(void *)&cmd_config_rx_mode_flag_port,
2226 		(void *)&cmd_config_rx_mode_flag_keyword,
2227 		(void *)&cmd_config_rx_mode_flag_all,
2228 		(void *)&cmd_config_rx_mode_flag_name,
2229 		(void *)&cmd_config_rx_mode_flag_value,
2230 		NULL,
2231 	},
2232 };
2233 
2234 /* *** configure rss *** */
2235 struct cmd_config_rss {
2236 	cmdline_fixed_string_t port;
2237 	cmdline_fixed_string_t keyword;
2238 	cmdline_fixed_string_t all;
2239 	cmdline_fixed_string_t name;
2240 	cmdline_fixed_string_t value;
2241 };
2242 
2243 static void
2244 cmd_config_rss_parsed(void *parsed_result,
2245 			__rte_unused struct cmdline *cl,
2246 			__rte_unused void *data)
2247 {
2248 	struct cmd_config_rss *res = parsed_result;
2249 	struct rte_eth_rss_conf rss_conf = { .rss_key_len = 0, };
2250 	struct rte_eth_dev_info dev_info = { .flow_type_rss_offloads = 0, };
2251 	int use_default = 0;
2252 	int all_updated = 1;
2253 	int diag;
2254 	uint16_t i;
2255 	int ret;
2256 
2257 	if (!strcmp(res->value, "all"))
2258 		rss_conf.rss_hf = ETH_RSS_ETH | ETH_RSS_VLAN | ETH_RSS_IP |
2259 			ETH_RSS_TCP | ETH_RSS_UDP | ETH_RSS_SCTP |
2260 			ETH_RSS_L2_PAYLOAD | ETH_RSS_L2TPV3 | ETH_RSS_ESP |
2261 			ETH_RSS_AH | ETH_RSS_PFCP | ETH_RSS_GTPU;
2262 	else if (!strcmp(res->value, "eth"))
2263 		rss_conf.rss_hf = ETH_RSS_ETH;
2264 	else if (!strcmp(res->value, "vlan"))
2265 		rss_conf.rss_hf = ETH_RSS_VLAN;
2266 	else if (!strcmp(res->value, "ip"))
2267 		rss_conf.rss_hf = ETH_RSS_IP;
2268 	else if (!strcmp(res->value, "udp"))
2269 		rss_conf.rss_hf = ETH_RSS_UDP;
2270 	else if (!strcmp(res->value, "tcp"))
2271 		rss_conf.rss_hf = ETH_RSS_TCP;
2272 	else if (!strcmp(res->value, "sctp"))
2273 		rss_conf.rss_hf = ETH_RSS_SCTP;
2274 	else if (!strcmp(res->value, "ether"))
2275 		rss_conf.rss_hf = ETH_RSS_L2_PAYLOAD;
2276 	else if (!strcmp(res->value, "port"))
2277 		rss_conf.rss_hf = ETH_RSS_PORT;
2278 	else if (!strcmp(res->value, "vxlan"))
2279 		rss_conf.rss_hf = ETH_RSS_VXLAN;
2280 	else if (!strcmp(res->value, "geneve"))
2281 		rss_conf.rss_hf = ETH_RSS_GENEVE;
2282 	else if (!strcmp(res->value, "nvgre"))
2283 		rss_conf.rss_hf = ETH_RSS_NVGRE;
2284 	else if (!strcmp(res->value, "l3-pre32"))
2285 		rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE32;
2286 	else if (!strcmp(res->value, "l3-pre40"))
2287 		rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE40;
2288 	else if (!strcmp(res->value, "l3-pre48"))
2289 		rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE48;
2290 	else if (!strcmp(res->value, "l3-pre56"))
2291 		rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE56;
2292 	else if (!strcmp(res->value, "l3-pre64"))
2293 		rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE64;
2294 	else if (!strcmp(res->value, "l3-pre96"))
2295 		rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE96;
2296 	else if (!strcmp(res->value, "l3-src-only"))
2297 		rss_conf.rss_hf = ETH_RSS_L3_SRC_ONLY;
2298 	else if (!strcmp(res->value, "l3-dst-only"))
2299 		rss_conf.rss_hf = ETH_RSS_L3_DST_ONLY;
2300 	else if (!strcmp(res->value, "l4-src-only"))
2301 		rss_conf.rss_hf = ETH_RSS_L4_SRC_ONLY;
2302 	else if (!strcmp(res->value, "l4-dst-only"))
2303 		rss_conf.rss_hf = ETH_RSS_L4_DST_ONLY;
2304 	else if (!strcmp(res->value, "l2-src-only"))
2305 		rss_conf.rss_hf = ETH_RSS_L2_SRC_ONLY;
2306 	else if (!strcmp(res->value, "l2-dst-only"))
2307 		rss_conf.rss_hf = ETH_RSS_L2_DST_ONLY;
2308 	else if (!strcmp(res->value, "l2tpv3"))
2309 		rss_conf.rss_hf = ETH_RSS_L2TPV3;
2310 	else if (!strcmp(res->value, "esp"))
2311 		rss_conf.rss_hf = ETH_RSS_ESP;
2312 	else if (!strcmp(res->value, "ah"))
2313 		rss_conf.rss_hf = ETH_RSS_AH;
2314 	else if (!strcmp(res->value, "pfcp"))
2315 		rss_conf.rss_hf = ETH_RSS_PFCP;
2316 	else if (!strcmp(res->value, "pppoe"))
2317 		rss_conf.rss_hf = ETH_RSS_PPPOE;
2318 	else if (!strcmp(res->value, "gtpu"))
2319 		rss_conf.rss_hf = ETH_RSS_GTPU;
2320 	else if (!strcmp(res->value, "none"))
2321 		rss_conf.rss_hf = 0;
2322 	else if (!strcmp(res->value, "level-default")) {
2323 		rss_hf &= (~ETH_RSS_LEVEL_MASK);
2324 		rss_conf.rss_hf = (rss_hf | ETH_RSS_LEVEL_PMD_DEFAULT);
2325 	} else if (!strcmp(res->value, "level-outer")) {
2326 		rss_hf &= (~ETH_RSS_LEVEL_MASK);
2327 		rss_conf.rss_hf = (rss_hf | ETH_RSS_LEVEL_OUTERMOST);
2328 	} else if (!strcmp(res->value, "level-inner")) {
2329 		rss_hf &= (~ETH_RSS_LEVEL_MASK);
2330 		rss_conf.rss_hf = (rss_hf | ETH_RSS_LEVEL_INNERMOST);
2331 	} else if (!strcmp(res->value, "default"))
2332 		use_default = 1;
2333 	else if (isdigit(res->value[0]) && atoi(res->value) > 0 &&
2334 						atoi(res->value) < 64)
2335 		rss_conf.rss_hf = 1ULL << atoi(res->value);
2336 	else {
2337 		printf("Unknown parameter\n");
2338 		return;
2339 	}
2340 	rss_conf.rss_key = NULL;
2341 	/* Update global configuration for RSS types. */
2342 	RTE_ETH_FOREACH_DEV(i) {
2343 		struct rte_eth_rss_conf local_rss_conf;
2344 
2345 		ret = eth_dev_info_get_print_err(i, &dev_info);
2346 		if (ret != 0)
2347 			return;
2348 
2349 		if (use_default)
2350 			rss_conf.rss_hf = dev_info.flow_type_rss_offloads;
2351 
2352 		local_rss_conf = rss_conf;
2353 		local_rss_conf.rss_hf = rss_conf.rss_hf &
2354 			dev_info.flow_type_rss_offloads;
2355 		if (local_rss_conf.rss_hf != rss_conf.rss_hf) {
2356 			printf("Port %u modified RSS hash function based on hardware support,"
2357 				"requested:%#"PRIx64" configured:%#"PRIx64"\n",
2358 				i, rss_conf.rss_hf, local_rss_conf.rss_hf);
2359 		}
2360 		diag = rte_eth_dev_rss_hash_update(i, &local_rss_conf);
2361 		if (diag < 0) {
2362 			all_updated = 0;
2363 			printf("Configuration of RSS hash at ethernet port %d "
2364 				"failed with error (%d): %s.\n",
2365 				i, -diag, strerror(-diag));
2366 		}
2367 	}
2368 	if (all_updated && !use_default) {
2369 		rss_hf = rss_conf.rss_hf;
2370 		printf("rss_hf %#"PRIx64"\n", rss_hf);
2371 	}
2372 }
2373 
2374 cmdline_parse_token_string_t cmd_config_rss_port =
2375 	TOKEN_STRING_INITIALIZER(struct cmd_config_rss, port, "port");
2376 cmdline_parse_token_string_t cmd_config_rss_keyword =
2377 	TOKEN_STRING_INITIALIZER(struct cmd_config_rss, keyword, "config");
2378 cmdline_parse_token_string_t cmd_config_rss_all =
2379 	TOKEN_STRING_INITIALIZER(struct cmd_config_rss, all, "all");
2380 cmdline_parse_token_string_t cmd_config_rss_name =
2381 	TOKEN_STRING_INITIALIZER(struct cmd_config_rss, name, "rss");
2382 cmdline_parse_token_string_t cmd_config_rss_value =
2383 	TOKEN_STRING_INITIALIZER(struct cmd_config_rss, value, NULL);
2384 
2385 cmdline_parse_inst_t cmd_config_rss = {
2386 	.f = cmd_config_rss_parsed,
2387 	.data = NULL,
2388 	.help_str = "port config all rss "
2389 		"all|default|eth|vlan|ip|tcp|udp|sctp|ether|port|vxlan|geneve|"
2390 		"nvgre|vxlan-gpe|l2tpv3|esp|ah|pfcp|none|level-default|"
2391 		"level-outer|level-inner|<flowtype_id>",
2392 	.tokens = {
2393 		(void *)&cmd_config_rss_port,
2394 		(void *)&cmd_config_rss_keyword,
2395 		(void *)&cmd_config_rss_all,
2396 		(void *)&cmd_config_rss_name,
2397 		(void *)&cmd_config_rss_value,
2398 		NULL,
2399 	},
2400 };
2401 
2402 /* *** configure rss hash key *** */
2403 struct cmd_config_rss_hash_key {
2404 	cmdline_fixed_string_t port;
2405 	cmdline_fixed_string_t config;
2406 	portid_t port_id;
2407 	cmdline_fixed_string_t rss_hash_key;
2408 	cmdline_fixed_string_t rss_type;
2409 	cmdline_fixed_string_t key;
2410 };
2411 
2412 static uint8_t
2413 hexa_digit_to_value(char hexa_digit)
2414 {
2415 	if ((hexa_digit >= '0') && (hexa_digit <= '9'))
2416 		return (uint8_t) (hexa_digit - '0');
2417 	if ((hexa_digit >= 'a') && (hexa_digit <= 'f'))
2418 		return (uint8_t) ((hexa_digit - 'a') + 10);
2419 	if ((hexa_digit >= 'A') && (hexa_digit <= 'F'))
2420 		return (uint8_t) ((hexa_digit - 'A') + 10);
2421 	/* Invalid hexa digit */
2422 	return 0xFF;
2423 }
2424 
2425 static uint8_t
2426 parse_and_check_key_hexa_digit(char *key, int idx)
2427 {
2428 	uint8_t hexa_v;
2429 
2430 	hexa_v = hexa_digit_to_value(key[idx]);
2431 	if (hexa_v == 0xFF)
2432 		printf("invalid key: character %c at position %d is not a "
2433 		       "valid hexa digit\n", key[idx], idx);
2434 	return hexa_v;
2435 }
2436 
2437 static void
2438 cmd_config_rss_hash_key_parsed(void *parsed_result,
2439 			       __rte_unused struct cmdline *cl,
2440 			       __rte_unused void *data)
2441 {
2442 	struct cmd_config_rss_hash_key *res = parsed_result;
2443 	uint8_t hash_key[RSS_HASH_KEY_LENGTH];
2444 	uint8_t xdgt0;
2445 	uint8_t xdgt1;
2446 	int i;
2447 	struct rte_eth_dev_info dev_info;
2448 	uint8_t hash_key_size;
2449 	uint32_t key_len;
2450 	int ret;
2451 
2452 	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
2453 	if (ret != 0)
2454 		return;
2455 
2456 	if (dev_info.hash_key_size > 0 &&
2457 			dev_info.hash_key_size <= sizeof(hash_key))
2458 		hash_key_size = dev_info.hash_key_size;
2459 	else {
2460 		printf("dev_info did not provide a valid hash key size\n");
2461 		return;
2462 	}
2463 	/* Check the length of the RSS hash key */
2464 	key_len = strlen(res->key);
2465 	if (key_len != (hash_key_size * 2)) {
2466 		printf("key length: %d invalid - key must be a string of %d"
2467 			   " hexa-decimal numbers\n",
2468 			   (int) key_len, hash_key_size * 2);
2469 		return;
2470 	}
2471 	/* Translate RSS hash key into binary representation */
2472 	for (i = 0; i < hash_key_size; i++) {
2473 		xdgt0 = parse_and_check_key_hexa_digit(res->key, (i * 2));
2474 		if (xdgt0 == 0xFF)
2475 			return;
2476 		xdgt1 = parse_and_check_key_hexa_digit(res->key, (i * 2) + 1);
2477 		if (xdgt1 == 0xFF)
2478 			return;
2479 		hash_key[i] = (uint8_t) ((xdgt0 * 16) + xdgt1);
2480 	}
2481 	port_rss_hash_key_update(res->port_id, res->rss_type, hash_key,
2482 			hash_key_size);
2483 }
2484 
2485 cmdline_parse_token_string_t cmd_config_rss_hash_key_port =
2486 	TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, port, "port");
2487 cmdline_parse_token_string_t cmd_config_rss_hash_key_config =
2488 	TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, config,
2489 				 "config");
2490 cmdline_parse_token_num_t cmd_config_rss_hash_key_port_id =
2491 	TOKEN_NUM_INITIALIZER(struct cmd_config_rss_hash_key, port_id, UINT16);
2492 cmdline_parse_token_string_t cmd_config_rss_hash_key_rss_hash_key =
2493 	TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key,
2494 				 rss_hash_key, "rss-hash-key");
2495 cmdline_parse_token_string_t cmd_config_rss_hash_key_rss_type =
2496 	TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, rss_type,
2497 				 "ipv4#ipv4-frag#ipv4-tcp#ipv4-udp#ipv4-sctp#"
2498 				 "ipv4-other#ipv6#ipv6-frag#ipv6-tcp#ipv6-udp#"
2499 				 "ipv6-sctp#ipv6-other#l2-payload#ipv6-ex#"
2500 				 "ipv6-tcp-ex#ipv6-udp-ex#"
2501 				 "l3-src-only#l3-dst-only#l4-src-only#l4-dst-only#"
2502 				 "l2-src-only#l2-dst-only#s-vlan#c-vlan#"
2503 				 "l2tpv3#esp#ah#pfcp#pppoe#gtpu");
2504 cmdline_parse_token_string_t cmd_config_rss_hash_key_value =
2505 	TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, key, NULL);
2506 
2507 cmdline_parse_inst_t cmd_config_rss_hash_key = {
2508 	.f = cmd_config_rss_hash_key_parsed,
2509 	.data = NULL,
2510 	.help_str = "port config <port_id> rss-hash-key "
2511 		"ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|"
2512 		"ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|"
2513 		"l2-payload|ipv6-ex|ipv6-tcp-ex|ipv6-udp-ex|"
2514 		"l3-src-only|l3-dst-only|l4-src-only|l4-dst-only|"
2515 		"l2-src-only|l2-dst-only|s-vlan|c-vlan|"
2516 		"l2tpv3|esp|ah|pfcp|pppoe|gtpu "
2517 		"<string of hex digits (variable length, NIC dependent)>",
2518 	.tokens = {
2519 		(void *)&cmd_config_rss_hash_key_port,
2520 		(void *)&cmd_config_rss_hash_key_config,
2521 		(void *)&cmd_config_rss_hash_key_port_id,
2522 		(void *)&cmd_config_rss_hash_key_rss_hash_key,
2523 		(void *)&cmd_config_rss_hash_key_rss_type,
2524 		(void *)&cmd_config_rss_hash_key_value,
2525 		NULL,
2526 	},
2527 };
2528 
2529 /* *** configure port rxq/txq ring size *** */
2530 struct cmd_config_rxtx_ring_size {
2531 	cmdline_fixed_string_t port;
2532 	cmdline_fixed_string_t config;
2533 	portid_t portid;
2534 	cmdline_fixed_string_t rxtxq;
2535 	uint16_t qid;
2536 	cmdline_fixed_string_t rsize;
2537 	uint16_t size;
2538 };
2539 
2540 static void
2541 cmd_config_rxtx_ring_size_parsed(void *parsed_result,
2542 				 __rte_unused struct cmdline *cl,
2543 				 __rte_unused void *data)
2544 {
2545 	struct cmd_config_rxtx_ring_size *res = parsed_result;
2546 	struct rte_port *port;
2547 	uint8_t isrx;
2548 
2549 	if (port_id_is_invalid(res->portid, ENABLED_WARN))
2550 		return;
2551 
2552 	if (res->portid == (portid_t)RTE_PORT_ALL) {
2553 		printf("Invalid port id\n");
2554 		return;
2555 	}
2556 
2557 	port = &ports[res->portid];
2558 
2559 	if (!strcmp(res->rxtxq, "rxq"))
2560 		isrx = 1;
2561 	else if (!strcmp(res->rxtxq, "txq"))
2562 		isrx = 0;
2563 	else {
2564 		printf("Unknown parameter\n");
2565 		return;
2566 	}
2567 
2568 	if (isrx && rx_queue_id_is_invalid(res->qid))
2569 		return;
2570 	else if (!isrx && tx_queue_id_is_invalid(res->qid))
2571 		return;
2572 
2573 	if (isrx && res->size != 0 && res->size <= rx_free_thresh) {
2574 		printf("Invalid rx ring_size, must > rx_free_thresh: %d\n",
2575 		       rx_free_thresh);
2576 		return;
2577 	}
2578 
2579 	if (isrx)
2580 		port->nb_rx_desc[res->qid] = res->size;
2581 	else
2582 		port->nb_tx_desc[res->qid] = res->size;
2583 
2584 	cmd_reconfig_device_queue(res->portid, 0, 1);
2585 }
2586 
2587 cmdline_parse_token_string_t cmd_config_rxtx_ring_size_port =
2588 	TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_ring_size,
2589 				 port, "port");
2590 cmdline_parse_token_string_t cmd_config_rxtx_ring_size_config =
2591 	TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_ring_size,
2592 				 config, "config");
2593 cmdline_parse_token_num_t cmd_config_rxtx_ring_size_portid =
2594 	TOKEN_NUM_INITIALIZER(struct cmd_config_rxtx_ring_size,
2595 				 portid, UINT16);
2596 cmdline_parse_token_string_t cmd_config_rxtx_ring_size_rxtxq =
2597 	TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_ring_size,
2598 				 rxtxq, "rxq#txq");
2599 cmdline_parse_token_num_t cmd_config_rxtx_ring_size_qid =
2600 	TOKEN_NUM_INITIALIZER(struct cmd_config_rxtx_ring_size,
2601 			      qid, UINT16);
2602 cmdline_parse_token_string_t cmd_config_rxtx_ring_size_rsize =
2603 	TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_ring_size,
2604 				 rsize, "ring_size");
2605 cmdline_parse_token_num_t cmd_config_rxtx_ring_size_size =
2606 	TOKEN_NUM_INITIALIZER(struct cmd_config_rxtx_ring_size,
2607 			      size, UINT16);
2608 
2609 cmdline_parse_inst_t cmd_config_rxtx_ring_size = {
2610 	.f = cmd_config_rxtx_ring_size_parsed,
2611 	.data = NULL,
2612 	.help_str = "port config <port_id> rxq|txq <queue_id> ring_size <value>",
2613 	.tokens = {
2614 		(void *)&cmd_config_rxtx_ring_size_port,
2615 		(void *)&cmd_config_rxtx_ring_size_config,
2616 		(void *)&cmd_config_rxtx_ring_size_portid,
2617 		(void *)&cmd_config_rxtx_ring_size_rxtxq,
2618 		(void *)&cmd_config_rxtx_ring_size_qid,
2619 		(void *)&cmd_config_rxtx_ring_size_rsize,
2620 		(void *)&cmd_config_rxtx_ring_size_size,
2621 		NULL,
2622 	},
2623 };
2624 
2625 /* *** configure port rxq/txq start/stop *** */
2626 struct cmd_config_rxtx_queue {
2627 	cmdline_fixed_string_t port;
2628 	portid_t portid;
2629 	cmdline_fixed_string_t rxtxq;
2630 	uint16_t qid;
2631 	cmdline_fixed_string_t opname;
2632 };
2633 
2634 static void
2635 cmd_config_rxtx_queue_parsed(void *parsed_result,
2636 			__rte_unused struct cmdline *cl,
2637 			__rte_unused void *data)
2638 {
2639 	struct cmd_config_rxtx_queue *res = parsed_result;
2640 	uint8_t isrx;
2641 	uint8_t isstart;
2642 	int ret = 0;
2643 
2644 	if (test_done == 0) {
2645 		printf("Please stop forwarding first\n");
2646 		return;
2647 	}
2648 
2649 	if (port_id_is_invalid(res->portid, ENABLED_WARN))
2650 		return;
2651 
2652 	if (port_is_started(res->portid) != 1) {
2653 		printf("Please start port %u first\n", res->portid);
2654 		return;
2655 	}
2656 
2657 	if (!strcmp(res->rxtxq, "rxq"))
2658 		isrx = 1;
2659 	else if (!strcmp(res->rxtxq, "txq"))
2660 		isrx = 0;
2661 	else {
2662 		printf("Unknown parameter\n");
2663 		return;
2664 	}
2665 
2666 	if (isrx && rx_queue_id_is_invalid(res->qid))
2667 		return;
2668 	else if (!isrx && tx_queue_id_is_invalid(res->qid))
2669 		return;
2670 
2671 	if (!strcmp(res->opname, "start"))
2672 		isstart = 1;
2673 	else if (!strcmp(res->opname, "stop"))
2674 		isstart = 0;
2675 	else {
2676 		printf("Unknown parameter\n");
2677 		return;
2678 	}
2679 
2680 	if (isstart && isrx)
2681 		ret = rte_eth_dev_rx_queue_start(res->portid, res->qid);
2682 	else if (!isstart && isrx)
2683 		ret = rte_eth_dev_rx_queue_stop(res->portid, res->qid);
2684 	else if (isstart && !isrx)
2685 		ret = rte_eth_dev_tx_queue_start(res->portid, res->qid);
2686 	else
2687 		ret = rte_eth_dev_tx_queue_stop(res->portid, res->qid);
2688 
2689 	if (ret == -ENOTSUP)
2690 		printf("Function not supported in PMD driver\n");
2691 }
2692 
2693 cmdline_parse_token_string_t cmd_config_rxtx_queue_port =
2694 	TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_queue, port, "port");
2695 cmdline_parse_token_num_t cmd_config_rxtx_queue_portid =
2696 	TOKEN_NUM_INITIALIZER(struct cmd_config_rxtx_queue, portid, UINT16);
2697 cmdline_parse_token_string_t cmd_config_rxtx_queue_rxtxq =
2698 	TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_queue, rxtxq, "rxq#txq");
2699 cmdline_parse_token_num_t cmd_config_rxtx_queue_qid =
2700 	TOKEN_NUM_INITIALIZER(struct cmd_config_rxtx_queue, qid, UINT16);
2701 cmdline_parse_token_string_t cmd_config_rxtx_queue_opname =
2702 	TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_queue, opname,
2703 						"start#stop");
2704 
2705 cmdline_parse_inst_t cmd_config_rxtx_queue = {
2706 	.f = cmd_config_rxtx_queue_parsed,
2707 	.data = NULL,
2708 	.help_str = "port <port_id> rxq|txq <queue_id> start|stop",
2709 	.tokens = {
2710 		(void *)&cmd_config_rxtx_queue_port,
2711 		(void *)&cmd_config_rxtx_queue_portid,
2712 		(void *)&cmd_config_rxtx_queue_rxtxq,
2713 		(void *)&cmd_config_rxtx_queue_qid,
2714 		(void *)&cmd_config_rxtx_queue_opname,
2715 		NULL,
2716 	},
2717 };
2718 
2719 /* *** configure port rxq/txq deferred start on/off *** */
2720 struct cmd_config_deferred_start_rxtx_queue {
2721 	cmdline_fixed_string_t port;
2722 	portid_t port_id;
2723 	cmdline_fixed_string_t rxtxq;
2724 	uint16_t qid;
2725 	cmdline_fixed_string_t opname;
2726 	cmdline_fixed_string_t state;
2727 };
2728 
2729 static void
2730 cmd_config_deferred_start_rxtx_queue_parsed(void *parsed_result,
2731 			__rte_unused struct cmdline *cl,
2732 			__rte_unused void *data)
2733 {
2734 	struct cmd_config_deferred_start_rxtx_queue *res = parsed_result;
2735 	struct rte_port *port;
2736 	uint8_t isrx;
2737 	uint8_t ison;
2738 	uint8_t needreconfig = 0;
2739 
2740 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
2741 		return;
2742 
2743 	if (port_is_started(res->port_id) != 0) {
2744 		printf("Please stop port %u first\n", res->port_id);
2745 		return;
2746 	}
2747 
2748 	port = &ports[res->port_id];
2749 
2750 	isrx = !strcmp(res->rxtxq, "rxq");
2751 
2752 	if (isrx && rx_queue_id_is_invalid(res->qid))
2753 		return;
2754 	else if (!isrx && tx_queue_id_is_invalid(res->qid))
2755 		return;
2756 
2757 	ison = !strcmp(res->state, "on");
2758 
2759 	if (isrx && port->rx_conf[res->qid].rx_deferred_start != ison) {
2760 		port->rx_conf[res->qid].rx_deferred_start = ison;
2761 		needreconfig = 1;
2762 	} else if (!isrx && port->tx_conf[res->qid].tx_deferred_start != ison) {
2763 		port->tx_conf[res->qid].tx_deferred_start = ison;
2764 		needreconfig = 1;
2765 	}
2766 
2767 	if (needreconfig)
2768 		cmd_reconfig_device_queue(res->port_id, 0, 1);
2769 }
2770 
2771 cmdline_parse_token_string_t cmd_config_deferred_start_rxtx_queue_port =
2772 	TOKEN_STRING_INITIALIZER(struct cmd_config_deferred_start_rxtx_queue,
2773 						port, "port");
2774 cmdline_parse_token_num_t cmd_config_deferred_start_rxtx_queue_port_id =
2775 	TOKEN_NUM_INITIALIZER(struct cmd_config_deferred_start_rxtx_queue,
2776 						port_id, UINT16);
2777 cmdline_parse_token_string_t cmd_config_deferred_start_rxtx_queue_rxtxq =
2778 	TOKEN_STRING_INITIALIZER(struct cmd_config_deferred_start_rxtx_queue,
2779 						rxtxq, "rxq#txq");
2780 cmdline_parse_token_num_t cmd_config_deferred_start_rxtx_queue_qid =
2781 	TOKEN_NUM_INITIALIZER(struct cmd_config_deferred_start_rxtx_queue,
2782 						qid, UINT16);
2783 cmdline_parse_token_string_t cmd_config_deferred_start_rxtx_queue_opname =
2784 	TOKEN_STRING_INITIALIZER(struct cmd_config_deferred_start_rxtx_queue,
2785 						opname, "deferred_start");
2786 cmdline_parse_token_string_t cmd_config_deferred_start_rxtx_queue_state =
2787 	TOKEN_STRING_INITIALIZER(struct cmd_config_deferred_start_rxtx_queue,
2788 						state, "on#off");
2789 
2790 cmdline_parse_inst_t cmd_config_deferred_start_rxtx_queue = {
2791 	.f = cmd_config_deferred_start_rxtx_queue_parsed,
2792 	.data = NULL,
2793 	.help_str = "port <port_id> rxq|txq <queue_id> deferred_start on|off",
2794 	.tokens = {
2795 		(void *)&cmd_config_deferred_start_rxtx_queue_port,
2796 		(void *)&cmd_config_deferred_start_rxtx_queue_port_id,
2797 		(void *)&cmd_config_deferred_start_rxtx_queue_rxtxq,
2798 		(void *)&cmd_config_deferred_start_rxtx_queue_qid,
2799 		(void *)&cmd_config_deferred_start_rxtx_queue_opname,
2800 		(void *)&cmd_config_deferred_start_rxtx_queue_state,
2801 		NULL,
2802 	},
2803 };
2804 
2805 /* *** configure port rxq/txq setup *** */
2806 struct cmd_setup_rxtx_queue {
2807 	cmdline_fixed_string_t port;
2808 	portid_t portid;
2809 	cmdline_fixed_string_t rxtxq;
2810 	uint16_t qid;
2811 	cmdline_fixed_string_t setup;
2812 };
2813 
2814 /* Common CLI fields for queue setup */
2815 cmdline_parse_token_string_t cmd_setup_rxtx_queue_port =
2816 	TOKEN_STRING_INITIALIZER(struct cmd_setup_rxtx_queue, port, "port");
2817 cmdline_parse_token_num_t cmd_setup_rxtx_queue_portid =
2818 	TOKEN_NUM_INITIALIZER(struct cmd_setup_rxtx_queue, portid, UINT16);
2819 cmdline_parse_token_string_t cmd_setup_rxtx_queue_rxtxq =
2820 	TOKEN_STRING_INITIALIZER(struct cmd_setup_rxtx_queue, rxtxq, "rxq#txq");
2821 cmdline_parse_token_num_t cmd_setup_rxtx_queue_qid =
2822 	TOKEN_NUM_INITIALIZER(struct cmd_setup_rxtx_queue, qid, UINT16);
2823 cmdline_parse_token_string_t cmd_setup_rxtx_queue_setup =
2824 	TOKEN_STRING_INITIALIZER(struct cmd_setup_rxtx_queue, setup, "setup");
2825 
2826 static void
2827 cmd_setup_rxtx_queue_parsed(
2828 	void *parsed_result,
2829 	__rte_unused struct cmdline *cl,
2830 	__rte_unused void *data)
2831 {
2832 	struct cmd_setup_rxtx_queue *res = parsed_result;
2833 	struct rte_port *port;
2834 	struct rte_mempool *mp;
2835 	unsigned int socket_id;
2836 	uint8_t isrx = 0;
2837 	int ret;
2838 
2839 	if (port_id_is_invalid(res->portid, ENABLED_WARN))
2840 		return;
2841 
2842 	if (res->portid == (portid_t)RTE_PORT_ALL) {
2843 		printf("Invalid port id\n");
2844 		return;
2845 	}
2846 
2847 	if (!strcmp(res->rxtxq, "rxq"))
2848 		isrx = 1;
2849 	else if (!strcmp(res->rxtxq, "txq"))
2850 		isrx = 0;
2851 	else {
2852 		printf("Unknown parameter\n");
2853 		return;
2854 	}
2855 
2856 	if (isrx && rx_queue_id_is_invalid(res->qid)) {
2857 		printf("Invalid rx queue\n");
2858 		return;
2859 	} else if (!isrx && tx_queue_id_is_invalid(res->qid)) {
2860 		printf("Invalid tx queue\n");
2861 		return;
2862 	}
2863 
2864 	port = &ports[res->portid];
2865 	if (isrx) {
2866 		socket_id = rxring_numa[res->portid];
2867 		if (!numa_support || socket_id == NUMA_NO_CONFIG)
2868 			socket_id = port->socket_id;
2869 
2870 		mp = mbuf_pool_find(socket_id, 0);
2871 		if (mp == NULL) {
2872 			printf("Failed to setup RX queue: "
2873 				"No mempool allocation"
2874 				" on the socket %d\n",
2875 				rxring_numa[res->portid]);
2876 			return;
2877 		}
2878 		ret = rx_queue_setup(res->portid,
2879 				     res->qid,
2880 				     port->nb_rx_desc[res->qid],
2881 				     socket_id,
2882 				     &port->rx_conf[res->qid],
2883 				     mp);
2884 		if (ret)
2885 			printf("Failed to setup RX queue\n");
2886 	} else {
2887 		socket_id = txring_numa[res->portid];
2888 		if (!numa_support || socket_id == NUMA_NO_CONFIG)
2889 			socket_id = port->socket_id;
2890 
2891 		ret = rte_eth_tx_queue_setup(res->portid,
2892 					     res->qid,
2893 					     port->nb_tx_desc[res->qid],
2894 					     socket_id,
2895 					     &port->tx_conf[res->qid]);
2896 		if (ret)
2897 			printf("Failed to setup TX queue\n");
2898 	}
2899 }
2900 
2901 cmdline_parse_inst_t cmd_setup_rxtx_queue = {
2902 	.f = cmd_setup_rxtx_queue_parsed,
2903 	.data = NULL,
2904 	.help_str = "port <port_id> rxq|txq <queue_idx> setup",
2905 	.tokens = {
2906 		(void *)&cmd_setup_rxtx_queue_port,
2907 		(void *)&cmd_setup_rxtx_queue_portid,
2908 		(void *)&cmd_setup_rxtx_queue_rxtxq,
2909 		(void *)&cmd_setup_rxtx_queue_qid,
2910 		(void *)&cmd_setup_rxtx_queue_setup,
2911 		NULL,
2912 	},
2913 };
2914 
2915 
2916 /* *** Configure RSS RETA *** */
2917 struct cmd_config_rss_reta {
2918 	cmdline_fixed_string_t port;
2919 	cmdline_fixed_string_t keyword;
2920 	portid_t port_id;
2921 	cmdline_fixed_string_t name;
2922 	cmdline_fixed_string_t list_name;
2923 	cmdline_fixed_string_t list_of_items;
2924 };
2925 
2926 static int
2927 parse_reta_config(const char *str,
2928 		  struct rte_eth_rss_reta_entry64 *reta_conf,
2929 		  uint16_t nb_entries)
2930 {
2931 	int i;
2932 	unsigned size;
2933 	uint16_t hash_index, idx, shift;
2934 	uint16_t nb_queue;
2935 	char s[256];
2936 	const char *p, *p0 = str;
2937 	char *end;
2938 	enum fieldnames {
2939 		FLD_HASH_INDEX = 0,
2940 		FLD_QUEUE,
2941 		_NUM_FLD
2942 	};
2943 	unsigned long int_fld[_NUM_FLD];
2944 	char *str_fld[_NUM_FLD];
2945 
2946 	while ((p = strchr(p0,'(')) != NULL) {
2947 		++p;
2948 		if((p0 = strchr(p,')')) == NULL)
2949 			return -1;
2950 
2951 		size = p0 - p;
2952 		if(size >= sizeof(s))
2953 			return -1;
2954 
2955 		snprintf(s, sizeof(s), "%.*s", size, p);
2956 		if (rte_strsplit(s, sizeof(s), str_fld, _NUM_FLD, ',') != _NUM_FLD)
2957 			return -1;
2958 		for (i = 0; i < _NUM_FLD; i++) {
2959 			errno = 0;
2960 			int_fld[i] = strtoul(str_fld[i], &end, 0);
2961 			if (errno != 0 || end == str_fld[i] ||
2962 					int_fld[i] > 65535)
2963 				return -1;
2964 		}
2965 
2966 		hash_index = (uint16_t)int_fld[FLD_HASH_INDEX];
2967 		nb_queue = (uint16_t)int_fld[FLD_QUEUE];
2968 
2969 		if (hash_index >= nb_entries) {
2970 			printf("Invalid RETA hash index=%d\n", hash_index);
2971 			return -1;
2972 		}
2973 
2974 		idx = hash_index / RTE_RETA_GROUP_SIZE;
2975 		shift = hash_index % RTE_RETA_GROUP_SIZE;
2976 		reta_conf[idx].mask |= (1ULL << shift);
2977 		reta_conf[idx].reta[shift] = nb_queue;
2978 	}
2979 
2980 	return 0;
2981 }
2982 
2983 static void
2984 cmd_set_rss_reta_parsed(void *parsed_result,
2985 			__rte_unused struct cmdline *cl,
2986 			__rte_unused void *data)
2987 {
2988 	int ret;
2989 	struct rte_eth_dev_info dev_info;
2990 	struct rte_eth_rss_reta_entry64 reta_conf[8];
2991 	struct cmd_config_rss_reta *res = parsed_result;
2992 
2993 	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
2994 	if (ret != 0)
2995 		return;
2996 
2997 	if (dev_info.reta_size == 0) {
2998 		printf("Redirection table size is 0 which is "
2999 					"invalid for RSS\n");
3000 		return;
3001 	} else
3002 		printf("The reta size of port %d is %u\n",
3003 			res->port_id, dev_info.reta_size);
3004 	if (dev_info.reta_size > ETH_RSS_RETA_SIZE_512) {
3005 		printf("Currently do not support more than %u entries of "
3006 			"redirection table\n", ETH_RSS_RETA_SIZE_512);
3007 		return;
3008 	}
3009 
3010 	memset(reta_conf, 0, sizeof(reta_conf));
3011 	if (!strcmp(res->list_name, "reta")) {
3012 		if (parse_reta_config(res->list_of_items, reta_conf,
3013 						dev_info.reta_size)) {
3014 			printf("Invalid RSS Redirection Table "
3015 					"config entered\n");
3016 			return;
3017 		}
3018 		ret = rte_eth_dev_rss_reta_update(res->port_id,
3019 				reta_conf, dev_info.reta_size);
3020 		if (ret != 0)
3021 			printf("Bad redirection table parameter, "
3022 					"return code = %d \n", ret);
3023 	}
3024 }
3025 
3026 cmdline_parse_token_string_t cmd_config_rss_reta_port =
3027 	TOKEN_STRING_INITIALIZER(struct cmd_config_rss_reta, port, "port");
3028 cmdline_parse_token_string_t cmd_config_rss_reta_keyword =
3029 	TOKEN_STRING_INITIALIZER(struct cmd_config_rss_reta, keyword, "config");
3030 cmdline_parse_token_num_t cmd_config_rss_reta_port_id =
3031 	TOKEN_NUM_INITIALIZER(struct cmd_config_rss_reta, port_id, UINT16);
3032 cmdline_parse_token_string_t cmd_config_rss_reta_name =
3033 	TOKEN_STRING_INITIALIZER(struct cmd_config_rss_reta, name, "rss");
3034 cmdline_parse_token_string_t cmd_config_rss_reta_list_name =
3035 	TOKEN_STRING_INITIALIZER(struct cmd_config_rss_reta, list_name, "reta");
3036 cmdline_parse_token_string_t cmd_config_rss_reta_list_of_items =
3037         TOKEN_STRING_INITIALIZER(struct cmd_config_rss_reta, list_of_items,
3038                                  NULL);
3039 cmdline_parse_inst_t cmd_config_rss_reta = {
3040 	.f = cmd_set_rss_reta_parsed,
3041 	.data = NULL,
3042 	.help_str = "port config <port_id> rss reta <hash,queue[,hash,queue]*>",
3043 	.tokens = {
3044 		(void *)&cmd_config_rss_reta_port,
3045 		(void *)&cmd_config_rss_reta_keyword,
3046 		(void *)&cmd_config_rss_reta_port_id,
3047 		(void *)&cmd_config_rss_reta_name,
3048 		(void *)&cmd_config_rss_reta_list_name,
3049 		(void *)&cmd_config_rss_reta_list_of_items,
3050 		NULL,
3051 	},
3052 };
3053 
3054 /* *** SHOW PORT RETA INFO *** */
3055 struct cmd_showport_reta {
3056 	cmdline_fixed_string_t show;
3057 	cmdline_fixed_string_t port;
3058 	portid_t port_id;
3059 	cmdline_fixed_string_t rss;
3060 	cmdline_fixed_string_t reta;
3061 	uint16_t size;
3062 	cmdline_fixed_string_t list_of_items;
3063 };
3064 
3065 static int
3066 showport_parse_reta_config(struct rte_eth_rss_reta_entry64 *conf,
3067 			   uint16_t nb_entries,
3068 			   char *str)
3069 {
3070 	uint32_t size;
3071 	const char *p, *p0 = str;
3072 	char s[256];
3073 	char *end;
3074 	char *str_fld[8];
3075 	uint16_t i;
3076 	uint16_t num = (nb_entries + RTE_RETA_GROUP_SIZE - 1) /
3077 			RTE_RETA_GROUP_SIZE;
3078 	int ret;
3079 
3080 	p = strchr(p0, '(');
3081 	if (p == NULL)
3082 		return -1;
3083 	p++;
3084 	p0 = strchr(p, ')');
3085 	if (p0 == NULL)
3086 		return -1;
3087 	size = p0 - p;
3088 	if (size >= sizeof(s)) {
3089 		printf("The string size exceeds the internal buffer size\n");
3090 		return -1;
3091 	}
3092 	snprintf(s, sizeof(s), "%.*s", size, p);
3093 	ret = rte_strsplit(s, sizeof(s), str_fld, num, ',');
3094 	if (ret <= 0 || ret != num) {
3095 		printf("The bits of masks do not match the number of "
3096 					"reta entries: %u\n", num);
3097 		return -1;
3098 	}
3099 	for (i = 0; i < ret; i++)
3100 		conf[i].mask = (uint64_t)strtoul(str_fld[i], &end, 0);
3101 
3102 	return 0;
3103 }
3104 
3105 static void
3106 cmd_showport_reta_parsed(void *parsed_result,
3107 			 __rte_unused struct cmdline *cl,
3108 			 __rte_unused void *data)
3109 {
3110 	struct cmd_showport_reta *res = parsed_result;
3111 	struct rte_eth_rss_reta_entry64 reta_conf[8];
3112 	struct rte_eth_dev_info dev_info;
3113 	uint16_t max_reta_size;
3114 	int ret;
3115 
3116 	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
3117 	if (ret != 0)
3118 		return;
3119 
3120 	max_reta_size = RTE_MIN(dev_info.reta_size, ETH_RSS_RETA_SIZE_512);
3121 	if (res->size == 0 || res->size > max_reta_size) {
3122 		printf("Invalid redirection table size: %u (1-%u)\n",
3123 			res->size, max_reta_size);
3124 		return;
3125 	}
3126 
3127 	memset(reta_conf, 0, sizeof(reta_conf));
3128 	if (showport_parse_reta_config(reta_conf, res->size,
3129 				res->list_of_items) < 0) {
3130 		printf("Invalid string: %s for reta masks\n",
3131 					res->list_of_items);
3132 		return;
3133 	}
3134 	port_rss_reta_info(res->port_id, reta_conf, res->size);
3135 }
3136 
3137 cmdline_parse_token_string_t cmd_showport_reta_show =
3138 	TOKEN_STRING_INITIALIZER(struct  cmd_showport_reta, show, "show");
3139 cmdline_parse_token_string_t cmd_showport_reta_port =
3140 	TOKEN_STRING_INITIALIZER(struct  cmd_showport_reta, port, "port");
3141 cmdline_parse_token_num_t cmd_showport_reta_port_id =
3142 	TOKEN_NUM_INITIALIZER(struct cmd_showport_reta, port_id, UINT16);
3143 cmdline_parse_token_string_t cmd_showport_reta_rss =
3144 	TOKEN_STRING_INITIALIZER(struct cmd_showport_reta, rss, "rss");
3145 cmdline_parse_token_string_t cmd_showport_reta_reta =
3146 	TOKEN_STRING_INITIALIZER(struct cmd_showport_reta, reta, "reta");
3147 cmdline_parse_token_num_t cmd_showport_reta_size =
3148 	TOKEN_NUM_INITIALIZER(struct cmd_showport_reta, size, UINT16);
3149 cmdline_parse_token_string_t cmd_showport_reta_list_of_items =
3150 	TOKEN_STRING_INITIALIZER(struct cmd_showport_reta,
3151 					list_of_items, NULL);
3152 
3153 cmdline_parse_inst_t cmd_showport_reta = {
3154 	.f = cmd_showport_reta_parsed,
3155 	.data = NULL,
3156 	.help_str = "show port <port_id> rss reta <size> <mask0[,mask1]*>",
3157 	.tokens = {
3158 		(void *)&cmd_showport_reta_show,
3159 		(void *)&cmd_showport_reta_port,
3160 		(void *)&cmd_showport_reta_port_id,
3161 		(void *)&cmd_showport_reta_rss,
3162 		(void *)&cmd_showport_reta_reta,
3163 		(void *)&cmd_showport_reta_size,
3164 		(void *)&cmd_showport_reta_list_of_items,
3165 		NULL,
3166 	},
3167 };
3168 
3169 /* *** Show RSS hash configuration *** */
3170 struct cmd_showport_rss_hash {
3171 	cmdline_fixed_string_t show;
3172 	cmdline_fixed_string_t port;
3173 	portid_t port_id;
3174 	cmdline_fixed_string_t rss_hash;
3175 	cmdline_fixed_string_t rss_type;
3176 	cmdline_fixed_string_t key; /* optional argument */
3177 };
3178 
3179 static void cmd_showport_rss_hash_parsed(void *parsed_result,
3180 				__rte_unused struct cmdline *cl,
3181 				void *show_rss_key)
3182 {
3183 	struct cmd_showport_rss_hash *res = parsed_result;
3184 
3185 	port_rss_hash_conf_show(res->port_id, show_rss_key != NULL);
3186 }
3187 
3188 cmdline_parse_token_string_t cmd_showport_rss_hash_show =
3189 	TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, show, "show");
3190 cmdline_parse_token_string_t cmd_showport_rss_hash_port =
3191 	TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, port, "port");
3192 cmdline_parse_token_num_t cmd_showport_rss_hash_port_id =
3193 	TOKEN_NUM_INITIALIZER(struct cmd_showport_rss_hash, port_id, UINT16);
3194 cmdline_parse_token_string_t cmd_showport_rss_hash_rss_hash =
3195 	TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, rss_hash,
3196 				 "rss-hash");
3197 cmdline_parse_token_string_t cmd_showport_rss_hash_rss_key =
3198 	TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, key, "key");
3199 
3200 cmdline_parse_inst_t cmd_showport_rss_hash = {
3201 	.f = cmd_showport_rss_hash_parsed,
3202 	.data = NULL,
3203 	.help_str = "show port <port_id> rss-hash",
3204 	.tokens = {
3205 		(void *)&cmd_showport_rss_hash_show,
3206 		(void *)&cmd_showport_rss_hash_port,
3207 		(void *)&cmd_showport_rss_hash_port_id,
3208 		(void *)&cmd_showport_rss_hash_rss_hash,
3209 		NULL,
3210 	},
3211 };
3212 
3213 cmdline_parse_inst_t cmd_showport_rss_hash_key = {
3214 	.f = cmd_showport_rss_hash_parsed,
3215 	.data = (void *)1,
3216 	.help_str = "show port <port_id> rss-hash key",
3217 	.tokens = {
3218 		(void *)&cmd_showport_rss_hash_show,
3219 		(void *)&cmd_showport_rss_hash_port,
3220 		(void *)&cmd_showport_rss_hash_port_id,
3221 		(void *)&cmd_showport_rss_hash_rss_hash,
3222 		(void *)&cmd_showport_rss_hash_rss_key,
3223 		NULL,
3224 	},
3225 };
3226 
3227 /* *** Configure DCB *** */
3228 struct cmd_config_dcb {
3229 	cmdline_fixed_string_t port;
3230 	cmdline_fixed_string_t config;
3231 	portid_t port_id;
3232 	cmdline_fixed_string_t dcb;
3233 	cmdline_fixed_string_t vt;
3234 	cmdline_fixed_string_t vt_en;
3235 	uint8_t num_tcs;
3236 	cmdline_fixed_string_t pfc;
3237 	cmdline_fixed_string_t pfc_en;
3238 };
3239 
3240 static void
3241 cmd_config_dcb_parsed(void *parsed_result,
3242                         __rte_unused struct cmdline *cl,
3243                         __rte_unused void *data)
3244 {
3245 	struct cmd_config_dcb *res = parsed_result;
3246 	portid_t port_id = res->port_id;
3247 	struct rte_port *port;
3248 	uint8_t pfc_en;
3249 	int ret;
3250 
3251 	port = &ports[port_id];
3252 	/** Check if the port is not started **/
3253 	if (port->port_status != RTE_PORT_STOPPED) {
3254 		printf("Please stop port %d first\n", port_id);
3255 		return;
3256 	}
3257 
3258 	if ((res->num_tcs != ETH_4_TCS) && (res->num_tcs != ETH_8_TCS)) {
3259 		printf("The invalid number of traffic class,"
3260 			" only 4 or 8 allowed.\n");
3261 		return;
3262 	}
3263 
3264 	if (nb_fwd_lcores < res->num_tcs) {
3265 		printf("nb_cores shouldn't be less than number of TCs.\n");
3266 		return;
3267 	}
3268 	if (!strncmp(res->pfc_en, "on", 2))
3269 		pfc_en = 1;
3270 	else
3271 		pfc_en = 0;
3272 
3273 	/* DCB in VT mode */
3274 	if (!strncmp(res->vt_en, "on", 2))
3275 		ret = init_port_dcb_config(port_id, DCB_VT_ENABLED,
3276 				(enum rte_eth_nb_tcs)res->num_tcs,
3277 				pfc_en);
3278 	else
3279 		ret = init_port_dcb_config(port_id, DCB_ENABLED,
3280 				(enum rte_eth_nb_tcs)res->num_tcs,
3281 				pfc_en);
3282 
3283 
3284 	if (ret != 0) {
3285 		printf("Cannot initialize network ports.\n");
3286 		return;
3287 	}
3288 
3289 	cmd_reconfig_device_queue(port_id, 1, 1);
3290 }
3291 
3292 cmdline_parse_token_string_t cmd_config_dcb_port =
3293         TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, port, "port");
3294 cmdline_parse_token_string_t cmd_config_dcb_config =
3295         TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, config, "config");
3296 cmdline_parse_token_num_t cmd_config_dcb_port_id =
3297 	TOKEN_NUM_INITIALIZER(struct cmd_config_dcb, port_id, UINT16);
3298 cmdline_parse_token_string_t cmd_config_dcb_dcb =
3299         TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, dcb, "dcb");
3300 cmdline_parse_token_string_t cmd_config_dcb_vt =
3301         TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, vt, "vt");
3302 cmdline_parse_token_string_t cmd_config_dcb_vt_en =
3303         TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, vt_en, "on#off");
3304 cmdline_parse_token_num_t cmd_config_dcb_num_tcs =
3305         TOKEN_NUM_INITIALIZER(struct cmd_config_dcb, num_tcs, UINT8);
3306 cmdline_parse_token_string_t cmd_config_dcb_pfc=
3307         TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, pfc, "pfc");
3308 cmdline_parse_token_string_t cmd_config_dcb_pfc_en =
3309         TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, pfc_en, "on#off");
3310 
3311 cmdline_parse_inst_t cmd_config_dcb = {
3312 	.f = cmd_config_dcb_parsed,
3313 	.data = NULL,
3314 	.help_str = "port config <port-id> dcb vt on|off <num_tcs> pfc on|off",
3315 	.tokens = {
3316 		(void *)&cmd_config_dcb_port,
3317 		(void *)&cmd_config_dcb_config,
3318 		(void *)&cmd_config_dcb_port_id,
3319 		(void *)&cmd_config_dcb_dcb,
3320 		(void *)&cmd_config_dcb_vt,
3321 		(void *)&cmd_config_dcb_vt_en,
3322 		(void *)&cmd_config_dcb_num_tcs,
3323 		(void *)&cmd_config_dcb_pfc,
3324 		(void *)&cmd_config_dcb_pfc_en,
3325                 NULL,
3326         },
3327 };
3328 
3329 /* *** configure number of packets per burst *** */
3330 struct cmd_config_burst {
3331 	cmdline_fixed_string_t port;
3332 	cmdline_fixed_string_t keyword;
3333 	cmdline_fixed_string_t all;
3334 	cmdline_fixed_string_t name;
3335 	uint16_t value;
3336 };
3337 
3338 static void
3339 cmd_config_burst_parsed(void *parsed_result,
3340 			__rte_unused struct cmdline *cl,
3341 			__rte_unused void *data)
3342 {
3343 	struct cmd_config_burst *res = parsed_result;
3344 	struct rte_eth_dev_info dev_info;
3345 	uint16_t rec_nb_pkts;
3346 	int ret;
3347 
3348 	if (!all_ports_stopped()) {
3349 		printf("Please stop all ports first\n");
3350 		return;
3351 	}
3352 
3353 	if (!strcmp(res->name, "burst")) {
3354 		if (res->value == 0) {
3355 			/* If user gives a value of zero, query the PMD for
3356 			 * its recommended Rx burst size. Testpmd uses a single
3357 			 * size for all ports, so assume all ports are the same
3358 			 * NIC model and use the values from Port 0.
3359 			 */
3360 			ret = eth_dev_info_get_print_err(0, &dev_info);
3361 			if (ret != 0)
3362 				return;
3363 
3364 			rec_nb_pkts = dev_info.default_rxportconf.burst_size;
3365 
3366 			if (rec_nb_pkts == 0) {
3367 				printf("PMD does not recommend a burst size.\n"
3368 					"User provided value must be between"
3369 					" 1 and %d\n", MAX_PKT_BURST);
3370 				return;
3371 			} else if (rec_nb_pkts > MAX_PKT_BURST) {
3372 				printf("PMD recommended burst size of %d"
3373 					" exceeds maximum value of %d\n",
3374 					rec_nb_pkts, MAX_PKT_BURST);
3375 				return;
3376 			}
3377 			printf("Using PMD-provided burst value of %d\n",
3378 				rec_nb_pkts);
3379 			nb_pkt_per_burst = rec_nb_pkts;
3380 		} else if (res->value > MAX_PKT_BURST) {
3381 			printf("burst must be >= 1 && <= %d\n", MAX_PKT_BURST);
3382 			return;
3383 		} else
3384 			nb_pkt_per_burst = res->value;
3385 	} else {
3386 		printf("Unknown parameter\n");
3387 		return;
3388 	}
3389 
3390 	init_port_config();
3391 
3392 	cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
3393 }
3394 
3395 cmdline_parse_token_string_t cmd_config_burst_port =
3396 	TOKEN_STRING_INITIALIZER(struct cmd_config_burst, port, "port");
3397 cmdline_parse_token_string_t cmd_config_burst_keyword =
3398 	TOKEN_STRING_INITIALIZER(struct cmd_config_burst, keyword, "config");
3399 cmdline_parse_token_string_t cmd_config_burst_all =
3400 	TOKEN_STRING_INITIALIZER(struct cmd_config_burst, all, "all");
3401 cmdline_parse_token_string_t cmd_config_burst_name =
3402 	TOKEN_STRING_INITIALIZER(struct cmd_config_burst, name, "burst");
3403 cmdline_parse_token_num_t cmd_config_burst_value =
3404 	TOKEN_NUM_INITIALIZER(struct cmd_config_burst, value, UINT16);
3405 
3406 cmdline_parse_inst_t cmd_config_burst = {
3407 	.f = cmd_config_burst_parsed,
3408 	.data = NULL,
3409 	.help_str = "port config all burst <value>",
3410 	.tokens = {
3411 		(void *)&cmd_config_burst_port,
3412 		(void *)&cmd_config_burst_keyword,
3413 		(void *)&cmd_config_burst_all,
3414 		(void *)&cmd_config_burst_name,
3415 		(void *)&cmd_config_burst_value,
3416 		NULL,
3417 	},
3418 };
3419 
3420 /* *** configure rx/tx queues *** */
3421 struct cmd_config_thresh {
3422 	cmdline_fixed_string_t port;
3423 	cmdline_fixed_string_t keyword;
3424 	cmdline_fixed_string_t all;
3425 	cmdline_fixed_string_t name;
3426 	uint8_t value;
3427 };
3428 
3429 static void
3430 cmd_config_thresh_parsed(void *parsed_result,
3431 			__rte_unused struct cmdline *cl,
3432 			__rte_unused void *data)
3433 {
3434 	struct cmd_config_thresh *res = parsed_result;
3435 
3436 	if (!all_ports_stopped()) {
3437 		printf("Please stop all ports first\n");
3438 		return;
3439 	}
3440 
3441 	if (!strcmp(res->name, "txpt"))
3442 		tx_pthresh = res->value;
3443 	else if(!strcmp(res->name, "txht"))
3444 		tx_hthresh = res->value;
3445 	else if(!strcmp(res->name, "txwt"))
3446 		tx_wthresh = res->value;
3447 	else if(!strcmp(res->name, "rxpt"))
3448 		rx_pthresh = res->value;
3449 	else if(!strcmp(res->name, "rxht"))
3450 		rx_hthresh = res->value;
3451 	else if(!strcmp(res->name, "rxwt"))
3452 		rx_wthresh = res->value;
3453 	else {
3454 		printf("Unknown parameter\n");
3455 		return;
3456 	}
3457 
3458 	init_port_config();
3459 
3460 	cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
3461 }
3462 
3463 cmdline_parse_token_string_t cmd_config_thresh_port =
3464 	TOKEN_STRING_INITIALIZER(struct cmd_config_thresh, port, "port");
3465 cmdline_parse_token_string_t cmd_config_thresh_keyword =
3466 	TOKEN_STRING_INITIALIZER(struct cmd_config_thresh, keyword, "config");
3467 cmdline_parse_token_string_t cmd_config_thresh_all =
3468 	TOKEN_STRING_INITIALIZER(struct cmd_config_thresh, all, "all");
3469 cmdline_parse_token_string_t cmd_config_thresh_name =
3470 	TOKEN_STRING_INITIALIZER(struct cmd_config_thresh, name,
3471 				"txpt#txht#txwt#rxpt#rxht#rxwt");
3472 cmdline_parse_token_num_t cmd_config_thresh_value =
3473 	TOKEN_NUM_INITIALIZER(struct cmd_config_thresh, value, UINT8);
3474 
3475 cmdline_parse_inst_t cmd_config_thresh = {
3476 	.f = cmd_config_thresh_parsed,
3477 	.data = NULL,
3478 	.help_str = "port config all txpt|txht|txwt|rxpt|rxht|rxwt <value>",
3479 	.tokens = {
3480 		(void *)&cmd_config_thresh_port,
3481 		(void *)&cmd_config_thresh_keyword,
3482 		(void *)&cmd_config_thresh_all,
3483 		(void *)&cmd_config_thresh_name,
3484 		(void *)&cmd_config_thresh_value,
3485 		NULL,
3486 	},
3487 };
3488 
3489 /* *** configure free/rs threshold *** */
3490 struct cmd_config_threshold {
3491 	cmdline_fixed_string_t port;
3492 	cmdline_fixed_string_t keyword;
3493 	cmdline_fixed_string_t all;
3494 	cmdline_fixed_string_t name;
3495 	uint16_t value;
3496 };
3497 
3498 static void
3499 cmd_config_threshold_parsed(void *parsed_result,
3500 			__rte_unused struct cmdline *cl,
3501 			__rte_unused void *data)
3502 {
3503 	struct cmd_config_threshold *res = parsed_result;
3504 
3505 	if (!all_ports_stopped()) {
3506 		printf("Please stop all ports first\n");
3507 		return;
3508 	}
3509 
3510 	if (!strcmp(res->name, "txfreet"))
3511 		tx_free_thresh = res->value;
3512 	else if (!strcmp(res->name, "txrst"))
3513 		tx_rs_thresh = res->value;
3514 	else if (!strcmp(res->name, "rxfreet"))
3515 		rx_free_thresh = res->value;
3516 	else {
3517 		printf("Unknown parameter\n");
3518 		return;
3519 	}
3520 
3521 	init_port_config();
3522 
3523 	cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
3524 }
3525 
3526 cmdline_parse_token_string_t cmd_config_threshold_port =
3527 	TOKEN_STRING_INITIALIZER(struct cmd_config_threshold, port, "port");
3528 cmdline_parse_token_string_t cmd_config_threshold_keyword =
3529 	TOKEN_STRING_INITIALIZER(struct cmd_config_threshold, keyword,
3530 								"config");
3531 cmdline_parse_token_string_t cmd_config_threshold_all =
3532 	TOKEN_STRING_INITIALIZER(struct cmd_config_threshold, all, "all");
3533 cmdline_parse_token_string_t cmd_config_threshold_name =
3534 	TOKEN_STRING_INITIALIZER(struct cmd_config_threshold, name,
3535 						"txfreet#txrst#rxfreet");
3536 cmdline_parse_token_num_t cmd_config_threshold_value =
3537 	TOKEN_NUM_INITIALIZER(struct cmd_config_threshold, value, UINT16);
3538 
3539 cmdline_parse_inst_t cmd_config_threshold = {
3540 	.f = cmd_config_threshold_parsed,
3541 	.data = NULL,
3542 	.help_str = "port config all txfreet|txrst|rxfreet <value>",
3543 	.tokens = {
3544 		(void *)&cmd_config_threshold_port,
3545 		(void *)&cmd_config_threshold_keyword,
3546 		(void *)&cmd_config_threshold_all,
3547 		(void *)&cmd_config_threshold_name,
3548 		(void *)&cmd_config_threshold_value,
3549 		NULL,
3550 	},
3551 };
3552 
3553 /* *** stop *** */
3554 struct cmd_stop_result {
3555 	cmdline_fixed_string_t stop;
3556 };
3557 
3558 static void cmd_stop_parsed(__rte_unused void *parsed_result,
3559 			    __rte_unused struct cmdline *cl,
3560 			    __rte_unused void *data)
3561 {
3562 	stop_packet_forwarding();
3563 }
3564 
3565 cmdline_parse_token_string_t cmd_stop_stop =
3566 	TOKEN_STRING_INITIALIZER(struct cmd_stop_result, stop, "stop");
3567 
3568 cmdline_parse_inst_t cmd_stop = {
3569 	.f = cmd_stop_parsed,
3570 	.data = NULL,
3571 	.help_str = "stop: Stop packet forwarding",
3572 	.tokens = {
3573 		(void *)&cmd_stop_stop,
3574 		NULL,
3575 	},
3576 };
3577 
3578 /* *** SET CORELIST and PORTLIST CONFIGURATION *** */
3579 
3580 unsigned int
3581 parse_item_list(char* str, const char* item_name, unsigned int max_items,
3582 		unsigned int *parsed_items, int check_unique_values)
3583 {
3584 	unsigned int nb_item;
3585 	unsigned int value;
3586 	unsigned int i;
3587 	unsigned int j;
3588 	int value_ok;
3589 	char c;
3590 
3591 	/*
3592 	 * First parse all items in the list and store their value.
3593 	 */
3594 	value = 0;
3595 	nb_item = 0;
3596 	value_ok = 0;
3597 	for (i = 0; i < strnlen(str, STR_TOKEN_SIZE); i++) {
3598 		c = str[i];
3599 		if ((c >= '0') && (c <= '9')) {
3600 			value = (unsigned int) (value * 10 + (c - '0'));
3601 			value_ok = 1;
3602 			continue;
3603 		}
3604 		if (c != ',') {
3605 			printf("character %c is not a decimal digit\n", c);
3606 			return 0;
3607 		}
3608 		if (! value_ok) {
3609 			printf("No valid value before comma\n");
3610 			return 0;
3611 		}
3612 		if (nb_item < max_items) {
3613 			parsed_items[nb_item] = value;
3614 			value_ok = 0;
3615 			value = 0;
3616 		}
3617 		nb_item++;
3618 	}
3619 	if (nb_item >= max_items) {
3620 		printf("Number of %s = %u > %u (maximum items)\n",
3621 		       item_name, nb_item + 1, max_items);
3622 		return 0;
3623 	}
3624 	parsed_items[nb_item++] = value;
3625 	if (! check_unique_values)
3626 		return nb_item;
3627 
3628 	/*
3629 	 * Then, check that all values in the list are differents.
3630 	 * No optimization here...
3631 	 */
3632 	for (i = 0; i < nb_item; i++) {
3633 		for (j = i + 1; j < nb_item; j++) {
3634 			if (parsed_items[j] == parsed_items[i]) {
3635 				printf("duplicated %s %u at index %u and %u\n",
3636 				       item_name, parsed_items[i], i, j);
3637 				return 0;
3638 			}
3639 		}
3640 	}
3641 	return nb_item;
3642 }
3643 
3644 struct cmd_set_list_result {
3645 	cmdline_fixed_string_t cmd_keyword;
3646 	cmdline_fixed_string_t list_name;
3647 	cmdline_fixed_string_t list_of_items;
3648 };
3649 
3650 static void cmd_set_list_parsed(void *parsed_result,
3651 				__rte_unused struct cmdline *cl,
3652 				__rte_unused void *data)
3653 {
3654 	struct cmd_set_list_result *res;
3655 	union {
3656 		unsigned int lcorelist[RTE_MAX_LCORE];
3657 		unsigned int portlist[RTE_MAX_ETHPORTS];
3658 	} parsed_items;
3659 	unsigned int nb_item;
3660 
3661 	if (test_done == 0) {
3662 		printf("Please stop forwarding first\n");
3663 		return;
3664 	}
3665 
3666 	res = parsed_result;
3667 	if (!strcmp(res->list_name, "corelist")) {
3668 		nb_item = parse_item_list(res->list_of_items, "core",
3669 					  RTE_MAX_LCORE,
3670 					  parsed_items.lcorelist, 1);
3671 		if (nb_item > 0) {
3672 			set_fwd_lcores_list(parsed_items.lcorelist, nb_item);
3673 			fwd_config_setup();
3674 		}
3675 		return;
3676 	}
3677 	if (!strcmp(res->list_name, "portlist")) {
3678 		nb_item = parse_item_list(res->list_of_items, "port",
3679 					  RTE_MAX_ETHPORTS,
3680 					  parsed_items.portlist, 1);
3681 		if (nb_item > 0) {
3682 			set_fwd_ports_list(parsed_items.portlist, nb_item);
3683 			fwd_config_setup();
3684 		}
3685 	}
3686 }
3687 
3688 cmdline_parse_token_string_t cmd_set_list_keyword =
3689 	TOKEN_STRING_INITIALIZER(struct cmd_set_list_result, cmd_keyword,
3690 				 "set");
3691 cmdline_parse_token_string_t cmd_set_list_name =
3692 	TOKEN_STRING_INITIALIZER(struct cmd_set_list_result, list_name,
3693 				 "corelist#portlist");
3694 cmdline_parse_token_string_t cmd_set_list_of_items =
3695 	TOKEN_STRING_INITIALIZER(struct cmd_set_list_result, list_of_items,
3696 				 NULL);
3697 
3698 cmdline_parse_inst_t cmd_set_fwd_list = {
3699 	.f = cmd_set_list_parsed,
3700 	.data = NULL,
3701 	.help_str = "set corelist|portlist <list0[,list1]*>",
3702 	.tokens = {
3703 		(void *)&cmd_set_list_keyword,
3704 		(void *)&cmd_set_list_name,
3705 		(void *)&cmd_set_list_of_items,
3706 		NULL,
3707 	},
3708 };
3709 
3710 /* *** SET COREMASK and PORTMASK CONFIGURATION *** */
3711 
3712 struct cmd_setmask_result {
3713 	cmdline_fixed_string_t set;
3714 	cmdline_fixed_string_t mask;
3715 	uint64_t hexavalue;
3716 };
3717 
3718 static void cmd_set_mask_parsed(void *parsed_result,
3719 				__rte_unused struct cmdline *cl,
3720 				__rte_unused void *data)
3721 {
3722 	struct cmd_setmask_result *res = parsed_result;
3723 
3724 	if (test_done == 0) {
3725 		printf("Please stop forwarding first\n");
3726 		return;
3727 	}
3728 	if (!strcmp(res->mask, "coremask")) {
3729 		set_fwd_lcores_mask(res->hexavalue);
3730 		fwd_config_setup();
3731 	} else if (!strcmp(res->mask, "portmask")) {
3732 		set_fwd_ports_mask(res->hexavalue);
3733 		fwd_config_setup();
3734 	}
3735 }
3736 
3737 cmdline_parse_token_string_t cmd_setmask_set =
3738 	TOKEN_STRING_INITIALIZER(struct cmd_setmask_result, set, "set");
3739 cmdline_parse_token_string_t cmd_setmask_mask =
3740 	TOKEN_STRING_INITIALIZER(struct cmd_setmask_result, mask,
3741 				 "coremask#portmask");
3742 cmdline_parse_token_num_t cmd_setmask_value =
3743 	TOKEN_NUM_INITIALIZER(struct cmd_setmask_result, hexavalue, UINT64);
3744 
3745 cmdline_parse_inst_t cmd_set_fwd_mask = {
3746 	.f = cmd_set_mask_parsed,
3747 	.data = NULL,
3748 	.help_str = "set coremask|portmask <hexadecimal value>",
3749 	.tokens = {
3750 		(void *)&cmd_setmask_set,
3751 		(void *)&cmd_setmask_mask,
3752 		(void *)&cmd_setmask_value,
3753 		NULL,
3754 	},
3755 };
3756 
3757 /*
3758  * SET NBPORT, NBCORE, PACKET BURST, and VERBOSE LEVEL CONFIGURATION
3759  */
3760 struct cmd_set_result {
3761 	cmdline_fixed_string_t set;
3762 	cmdline_fixed_string_t what;
3763 	uint16_t value;
3764 };
3765 
3766 static void cmd_set_parsed(void *parsed_result,
3767 			   __rte_unused struct cmdline *cl,
3768 			   __rte_unused void *data)
3769 {
3770 	struct cmd_set_result *res = parsed_result;
3771 	if (!strcmp(res->what, "nbport")) {
3772 		set_fwd_ports_number(res->value);
3773 		fwd_config_setup();
3774 	} else if (!strcmp(res->what, "nbcore")) {
3775 		set_fwd_lcores_number(res->value);
3776 		fwd_config_setup();
3777 	} else if (!strcmp(res->what, "burst"))
3778 		set_nb_pkt_per_burst(res->value);
3779 	else if (!strcmp(res->what, "verbose"))
3780 		set_verbose_level(res->value);
3781 }
3782 
3783 cmdline_parse_token_string_t cmd_set_set =
3784 	TOKEN_STRING_INITIALIZER(struct cmd_set_result, set, "set");
3785 cmdline_parse_token_string_t cmd_set_what =
3786 	TOKEN_STRING_INITIALIZER(struct cmd_set_result, what,
3787 				 "nbport#nbcore#burst#verbose");
3788 cmdline_parse_token_num_t cmd_set_value =
3789 	TOKEN_NUM_INITIALIZER(struct cmd_set_result, value, UINT16);
3790 
3791 cmdline_parse_inst_t cmd_set_numbers = {
3792 	.f = cmd_set_parsed,
3793 	.data = NULL,
3794 	.help_str = "set nbport|nbcore|burst|verbose <value>",
3795 	.tokens = {
3796 		(void *)&cmd_set_set,
3797 		(void *)&cmd_set_what,
3798 		(void *)&cmd_set_value,
3799 		NULL,
3800 	},
3801 };
3802 
3803 /* *** SET LOG LEVEL CONFIGURATION *** */
3804 
3805 struct cmd_set_log_result {
3806 	cmdline_fixed_string_t set;
3807 	cmdline_fixed_string_t log;
3808 	cmdline_fixed_string_t type;
3809 	uint32_t level;
3810 };
3811 
3812 static void
3813 cmd_set_log_parsed(void *parsed_result,
3814 		   __rte_unused struct cmdline *cl,
3815 		   __rte_unused void *data)
3816 {
3817 	struct cmd_set_log_result *res;
3818 	int ret;
3819 
3820 	res = parsed_result;
3821 	if (!strcmp(res->type, "global"))
3822 		rte_log_set_global_level(res->level);
3823 	else {
3824 		ret = rte_log_set_level_regexp(res->type, res->level);
3825 		if (ret < 0)
3826 			printf("Unable to set log level\n");
3827 	}
3828 }
3829 
3830 cmdline_parse_token_string_t cmd_set_log_set =
3831 	TOKEN_STRING_INITIALIZER(struct cmd_set_log_result, set, "set");
3832 cmdline_parse_token_string_t cmd_set_log_log =
3833 	TOKEN_STRING_INITIALIZER(struct cmd_set_log_result, log, "log");
3834 cmdline_parse_token_string_t cmd_set_log_type =
3835 	TOKEN_STRING_INITIALIZER(struct cmd_set_log_result, type, NULL);
3836 cmdline_parse_token_num_t cmd_set_log_level =
3837 	TOKEN_NUM_INITIALIZER(struct cmd_set_log_result, level, UINT32);
3838 
3839 cmdline_parse_inst_t cmd_set_log = {
3840 	.f = cmd_set_log_parsed,
3841 	.data = NULL,
3842 	.help_str = "set log global|<type> <level>",
3843 	.tokens = {
3844 		(void *)&cmd_set_log_set,
3845 		(void *)&cmd_set_log_log,
3846 		(void *)&cmd_set_log_type,
3847 		(void *)&cmd_set_log_level,
3848 		NULL,
3849 	},
3850 };
3851 
3852 /* *** SET SEGMENT OFFSETS OF RX PACKETS SPLIT *** */
3853 
3854 struct cmd_set_rxoffs_result {
3855 	cmdline_fixed_string_t cmd_keyword;
3856 	cmdline_fixed_string_t rxoffs;
3857 	cmdline_fixed_string_t seg_offsets;
3858 };
3859 
3860 static void
3861 cmd_set_rxoffs_parsed(void *parsed_result,
3862 		      __rte_unused struct cmdline *cl,
3863 		      __rte_unused void *data)
3864 {
3865 	struct cmd_set_rxoffs_result *res;
3866 	unsigned int seg_offsets[MAX_SEGS_BUFFER_SPLIT];
3867 	unsigned int nb_segs;
3868 
3869 	res = parsed_result;
3870 	nb_segs = parse_item_list(res->seg_offsets, "segment offsets",
3871 				  MAX_SEGS_BUFFER_SPLIT, seg_offsets, 0);
3872 	if (nb_segs > 0)
3873 		set_rx_pkt_offsets(seg_offsets, nb_segs);
3874 }
3875 
3876 cmdline_parse_token_string_t cmd_set_rxoffs_keyword =
3877 	TOKEN_STRING_INITIALIZER(struct cmd_set_rxoffs_result,
3878 				 cmd_keyword, "set");
3879 cmdline_parse_token_string_t cmd_set_rxoffs_name =
3880 	TOKEN_STRING_INITIALIZER(struct cmd_set_rxoffs_result,
3881 				 rxoffs, "rxoffs");
3882 cmdline_parse_token_string_t cmd_set_rxoffs_offsets =
3883 	TOKEN_STRING_INITIALIZER(struct cmd_set_rxoffs_result,
3884 				 seg_offsets, NULL);
3885 
3886 cmdline_parse_inst_t cmd_set_rxoffs = {
3887 	.f = cmd_set_rxoffs_parsed,
3888 	.data = NULL,
3889 	.help_str = "set rxoffs <len0[,len1]*>",
3890 	.tokens = {
3891 		(void *)&cmd_set_rxoffs_keyword,
3892 		(void *)&cmd_set_rxoffs_name,
3893 		(void *)&cmd_set_rxoffs_offsets,
3894 		NULL,
3895 	},
3896 };
3897 
3898 /* *** SET SEGMENT LENGTHS OF RX PACKETS SPLIT *** */
3899 
3900 struct cmd_set_rxpkts_result {
3901 	cmdline_fixed_string_t cmd_keyword;
3902 	cmdline_fixed_string_t rxpkts;
3903 	cmdline_fixed_string_t seg_lengths;
3904 };
3905 
3906 static void
3907 cmd_set_rxpkts_parsed(void *parsed_result,
3908 		      __rte_unused struct cmdline *cl,
3909 		      __rte_unused void *data)
3910 {
3911 	struct cmd_set_rxpkts_result *res;
3912 	unsigned int seg_lengths[MAX_SEGS_BUFFER_SPLIT];
3913 	unsigned int nb_segs;
3914 
3915 	res = parsed_result;
3916 	nb_segs = parse_item_list(res->seg_lengths, "segment lengths",
3917 				  MAX_SEGS_BUFFER_SPLIT, seg_lengths, 0);
3918 	if (nb_segs > 0)
3919 		set_rx_pkt_segments(seg_lengths, nb_segs);
3920 }
3921 
3922 cmdline_parse_token_string_t cmd_set_rxpkts_keyword =
3923 	TOKEN_STRING_INITIALIZER(struct cmd_set_rxpkts_result,
3924 				 cmd_keyword, "set");
3925 cmdline_parse_token_string_t cmd_set_rxpkts_name =
3926 	TOKEN_STRING_INITIALIZER(struct cmd_set_rxpkts_result,
3927 				 rxpkts, "rxpkts");
3928 cmdline_parse_token_string_t cmd_set_rxpkts_lengths =
3929 	TOKEN_STRING_INITIALIZER(struct cmd_set_rxpkts_result,
3930 				 seg_lengths, NULL);
3931 
3932 cmdline_parse_inst_t cmd_set_rxpkts = {
3933 	.f = cmd_set_rxpkts_parsed,
3934 	.data = NULL,
3935 	.help_str = "set rxpkts <len0[,len1]*>",
3936 	.tokens = {
3937 		(void *)&cmd_set_rxpkts_keyword,
3938 		(void *)&cmd_set_rxpkts_name,
3939 		(void *)&cmd_set_rxpkts_lengths,
3940 		NULL,
3941 	},
3942 };
3943 
3944 /* *** SET SEGMENT LENGTHS OF TXONLY PACKETS *** */
3945 
3946 struct cmd_set_txpkts_result {
3947 	cmdline_fixed_string_t cmd_keyword;
3948 	cmdline_fixed_string_t txpkts;
3949 	cmdline_fixed_string_t seg_lengths;
3950 };
3951 
3952 static void
3953 cmd_set_txpkts_parsed(void *parsed_result,
3954 		      __rte_unused struct cmdline *cl,
3955 		      __rte_unused void *data)
3956 {
3957 	struct cmd_set_txpkts_result *res;
3958 	unsigned seg_lengths[RTE_MAX_SEGS_PER_PKT];
3959 	unsigned int nb_segs;
3960 
3961 	res = parsed_result;
3962 	nb_segs = parse_item_list(res->seg_lengths, "segment lengths",
3963 				  RTE_MAX_SEGS_PER_PKT, seg_lengths, 0);
3964 	if (nb_segs > 0)
3965 		set_tx_pkt_segments(seg_lengths, nb_segs);
3966 }
3967 
3968 cmdline_parse_token_string_t cmd_set_txpkts_keyword =
3969 	TOKEN_STRING_INITIALIZER(struct cmd_set_txpkts_result,
3970 				 cmd_keyword, "set");
3971 cmdline_parse_token_string_t cmd_set_txpkts_name =
3972 	TOKEN_STRING_INITIALIZER(struct cmd_set_txpkts_result,
3973 				 txpkts, "txpkts");
3974 cmdline_parse_token_string_t cmd_set_txpkts_lengths =
3975 	TOKEN_STRING_INITIALIZER(struct cmd_set_txpkts_result,
3976 				 seg_lengths, NULL);
3977 
3978 cmdline_parse_inst_t cmd_set_txpkts = {
3979 	.f = cmd_set_txpkts_parsed,
3980 	.data = NULL,
3981 	.help_str = "set txpkts <len0[,len1]*>",
3982 	.tokens = {
3983 		(void *)&cmd_set_txpkts_keyword,
3984 		(void *)&cmd_set_txpkts_name,
3985 		(void *)&cmd_set_txpkts_lengths,
3986 		NULL,
3987 	},
3988 };
3989 
3990 /* *** SET COPY AND SPLIT POLICY ON TX PACKETS *** */
3991 
3992 struct cmd_set_txsplit_result {
3993 	cmdline_fixed_string_t cmd_keyword;
3994 	cmdline_fixed_string_t txsplit;
3995 	cmdline_fixed_string_t mode;
3996 };
3997 
3998 static void
3999 cmd_set_txsplit_parsed(void *parsed_result,
4000 		      __rte_unused struct cmdline *cl,
4001 		      __rte_unused void *data)
4002 {
4003 	struct cmd_set_txsplit_result *res;
4004 
4005 	res = parsed_result;
4006 	set_tx_pkt_split(res->mode);
4007 }
4008 
4009 cmdline_parse_token_string_t cmd_set_txsplit_keyword =
4010 	TOKEN_STRING_INITIALIZER(struct cmd_set_txsplit_result,
4011 				 cmd_keyword, "set");
4012 cmdline_parse_token_string_t cmd_set_txsplit_name =
4013 	TOKEN_STRING_INITIALIZER(struct cmd_set_txsplit_result,
4014 				 txsplit, "txsplit");
4015 cmdline_parse_token_string_t cmd_set_txsplit_mode =
4016 	TOKEN_STRING_INITIALIZER(struct cmd_set_txsplit_result,
4017 				 mode, NULL);
4018 
4019 cmdline_parse_inst_t cmd_set_txsplit = {
4020 	.f = cmd_set_txsplit_parsed,
4021 	.data = NULL,
4022 	.help_str = "set txsplit on|off|rand",
4023 	.tokens = {
4024 		(void *)&cmd_set_txsplit_keyword,
4025 		(void *)&cmd_set_txsplit_name,
4026 		(void *)&cmd_set_txsplit_mode,
4027 		NULL,
4028 	},
4029 };
4030 
4031 /* *** SET TIMES FOR TXONLY PACKETS SCHEDULING ON TIMESTAMPS *** */
4032 
4033 struct cmd_set_txtimes_result {
4034 	cmdline_fixed_string_t cmd_keyword;
4035 	cmdline_fixed_string_t txtimes;
4036 	cmdline_fixed_string_t tx_times;
4037 };
4038 
4039 static void
4040 cmd_set_txtimes_parsed(void *parsed_result,
4041 		       __rte_unused struct cmdline *cl,
4042 		       __rte_unused void *data)
4043 {
4044 	struct cmd_set_txtimes_result *res;
4045 	unsigned int tx_times[2] = {0, 0};
4046 	unsigned int n_times;
4047 
4048 	res = parsed_result;
4049 	n_times = parse_item_list(res->tx_times, "tx times",
4050 				  2, tx_times, 0);
4051 	if (n_times == 2)
4052 		set_tx_pkt_times(tx_times);
4053 }
4054 
4055 cmdline_parse_token_string_t cmd_set_txtimes_keyword =
4056 	TOKEN_STRING_INITIALIZER(struct cmd_set_txtimes_result,
4057 				 cmd_keyword, "set");
4058 cmdline_parse_token_string_t cmd_set_txtimes_name =
4059 	TOKEN_STRING_INITIALIZER(struct cmd_set_txtimes_result,
4060 				 txtimes, "txtimes");
4061 cmdline_parse_token_string_t cmd_set_txtimes_value =
4062 	TOKEN_STRING_INITIALIZER(struct cmd_set_txtimes_result,
4063 				 tx_times, NULL);
4064 
4065 cmdline_parse_inst_t cmd_set_txtimes = {
4066 	.f = cmd_set_txtimes_parsed,
4067 	.data = NULL,
4068 	.help_str = "set txtimes <inter_burst>,<intra_burst>",
4069 	.tokens = {
4070 		(void *)&cmd_set_txtimes_keyword,
4071 		(void *)&cmd_set_txtimes_name,
4072 		(void *)&cmd_set_txtimes_value,
4073 		NULL,
4074 	},
4075 };
4076 
4077 /* *** ADD/REMOVE ALL VLAN IDENTIFIERS TO/FROM A PORT VLAN RX FILTER *** */
4078 struct cmd_rx_vlan_filter_all_result {
4079 	cmdline_fixed_string_t rx_vlan;
4080 	cmdline_fixed_string_t what;
4081 	cmdline_fixed_string_t all;
4082 	portid_t port_id;
4083 };
4084 
4085 static void
4086 cmd_rx_vlan_filter_all_parsed(void *parsed_result,
4087 			      __rte_unused struct cmdline *cl,
4088 			      __rte_unused void *data)
4089 {
4090 	struct cmd_rx_vlan_filter_all_result *res = parsed_result;
4091 
4092 	if (!strcmp(res->what, "add"))
4093 		rx_vlan_all_filter_set(res->port_id, 1);
4094 	else
4095 		rx_vlan_all_filter_set(res->port_id, 0);
4096 }
4097 
4098 cmdline_parse_token_string_t cmd_rx_vlan_filter_all_rx_vlan =
4099 	TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_all_result,
4100 				 rx_vlan, "rx_vlan");
4101 cmdline_parse_token_string_t cmd_rx_vlan_filter_all_what =
4102 	TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_all_result,
4103 				 what, "add#rm");
4104 cmdline_parse_token_string_t cmd_rx_vlan_filter_all_all =
4105 	TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_all_result,
4106 				 all, "all");
4107 cmdline_parse_token_num_t cmd_rx_vlan_filter_all_portid =
4108 	TOKEN_NUM_INITIALIZER(struct cmd_rx_vlan_filter_all_result,
4109 			      port_id, UINT16);
4110 
4111 cmdline_parse_inst_t cmd_rx_vlan_filter_all = {
4112 	.f = cmd_rx_vlan_filter_all_parsed,
4113 	.data = NULL,
4114 	.help_str = "rx_vlan add|rm all <port_id>: "
4115 		"Add/Remove all identifiers to/from the set of VLAN "
4116 		"identifiers filtered by a port",
4117 	.tokens = {
4118 		(void *)&cmd_rx_vlan_filter_all_rx_vlan,
4119 		(void *)&cmd_rx_vlan_filter_all_what,
4120 		(void *)&cmd_rx_vlan_filter_all_all,
4121 		(void *)&cmd_rx_vlan_filter_all_portid,
4122 		NULL,
4123 	},
4124 };
4125 
4126 /* *** VLAN OFFLOAD SET ON A PORT *** */
4127 struct cmd_vlan_offload_result {
4128 	cmdline_fixed_string_t vlan;
4129 	cmdline_fixed_string_t set;
4130 	cmdline_fixed_string_t vlan_type;
4131 	cmdline_fixed_string_t what;
4132 	cmdline_fixed_string_t on;
4133 	cmdline_fixed_string_t port_id;
4134 };
4135 
4136 static void
4137 cmd_vlan_offload_parsed(void *parsed_result,
4138 			  __rte_unused struct cmdline *cl,
4139 			  __rte_unused void *data)
4140 {
4141 	int on;
4142 	struct cmd_vlan_offload_result *res = parsed_result;
4143 	char *str;
4144 	int i, len = 0;
4145 	portid_t port_id = 0;
4146 	unsigned int tmp;
4147 
4148 	str = res->port_id;
4149 	len = strnlen(str, STR_TOKEN_SIZE);
4150 	i = 0;
4151 	/* Get port_id first */
4152 	while(i < len){
4153 		if(str[i] == ',')
4154 			break;
4155 
4156 		i++;
4157 	}
4158 	str[i]='\0';
4159 	tmp = strtoul(str, NULL, 0);
4160 	/* If port_id greater that what portid_t can represent, return */
4161 	if(tmp >= RTE_MAX_ETHPORTS)
4162 		return;
4163 	port_id = (portid_t)tmp;
4164 
4165 	if (!strcmp(res->on, "on"))
4166 		on = 1;
4167 	else
4168 		on = 0;
4169 
4170 	if (!strcmp(res->what, "strip"))
4171 		rx_vlan_strip_set(port_id,  on);
4172 	else if(!strcmp(res->what, "stripq")){
4173 		uint16_t queue_id = 0;
4174 
4175 		/* No queue_id, return */
4176 		if(i + 1 >= len) {
4177 			printf("must specify (port,queue_id)\n");
4178 			return;
4179 		}
4180 		tmp = strtoul(str + i + 1, NULL, 0);
4181 		/* If queue_id greater that what 16-bits can represent, return */
4182 		if(tmp > 0xffff)
4183 			return;
4184 
4185 		queue_id = (uint16_t)tmp;
4186 		rx_vlan_strip_set_on_queue(port_id, queue_id, on);
4187 	}
4188 	else if (!strcmp(res->what, "filter"))
4189 		rx_vlan_filter_set(port_id, on);
4190 	else if (!strcmp(res->what, "qinq_strip"))
4191 		rx_vlan_qinq_strip_set(port_id, on);
4192 	else
4193 		vlan_extend_set(port_id, on);
4194 
4195 	return;
4196 }
4197 
4198 cmdline_parse_token_string_t cmd_vlan_offload_vlan =
4199 	TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result,
4200 				 vlan, "vlan");
4201 cmdline_parse_token_string_t cmd_vlan_offload_set =
4202 	TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result,
4203 				 set, "set");
4204 cmdline_parse_token_string_t cmd_vlan_offload_what =
4205 	TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result,
4206 				what, "strip#filter#qinq_strip#extend#stripq");
4207 cmdline_parse_token_string_t cmd_vlan_offload_on =
4208 	TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result,
4209 			      on, "on#off");
4210 cmdline_parse_token_string_t cmd_vlan_offload_portid =
4211 	TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result,
4212 			      port_id, NULL);
4213 
4214 cmdline_parse_inst_t cmd_vlan_offload = {
4215 	.f = cmd_vlan_offload_parsed,
4216 	.data = NULL,
4217 	.help_str = "vlan set strip|filter|qinq_strip|extend|stripq on|off "
4218 		"<port_id[,queue_id]>: "
4219 		"Strip/Filter/QinQ for rx side Extend for both rx/tx sides",
4220 	.tokens = {
4221 		(void *)&cmd_vlan_offload_vlan,
4222 		(void *)&cmd_vlan_offload_set,
4223 		(void *)&cmd_vlan_offload_what,
4224 		(void *)&cmd_vlan_offload_on,
4225 		(void *)&cmd_vlan_offload_portid,
4226 		NULL,
4227 	},
4228 };
4229 
4230 /* *** VLAN TPID SET ON A PORT *** */
4231 struct cmd_vlan_tpid_result {
4232 	cmdline_fixed_string_t vlan;
4233 	cmdline_fixed_string_t set;
4234 	cmdline_fixed_string_t vlan_type;
4235 	cmdline_fixed_string_t what;
4236 	uint16_t tp_id;
4237 	portid_t port_id;
4238 };
4239 
4240 static void
4241 cmd_vlan_tpid_parsed(void *parsed_result,
4242 			  __rte_unused struct cmdline *cl,
4243 			  __rte_unused void *data)
4244 {
4245 	struct cmd_vlan_tpid_result *res = parsed_result;
4246 	enum rte_vlan_type vlan_type;
4247 
4248 	if (!strcmp(res->vlan_type, "inner"))
4249 		vlan_type = ETH_VLAN_TYPE_INNER;
4250 	else if (!strcmp(res->vlan_type, "outer"))
4251 		vlan_type = ETH_VLAN_TYPE_OUTER;
4252 	else {
4253 		printf("Unknown vlan type\n");
4254 		return;
4255 	}
4256 	vlan_tpid_set(res->port_id, vlan_type, res->tp_id);
4257 }
4258 
4259 cmdline_parse_token_string_t cmd_vlan_tpid_vlan =
4260 	TOKEN_STRING_INITIALIZER(struct cmd_vlan_tpid_result,
4261 				 vlan, "vlan");
4262 cmdline_parse_token_string_t cmd_vlan_tpid_set =
4263 	TOKEN_STRING_INITIALIZER(struct cmd_vlan_tpid_result,
4264 				 set, "set");
4265 cmdline_parse_token_string_t cmd_vlan_type =
4266 	TOKEN_STRING_INITIALIZER(struct cmd_vlan_tpid_result,
4267 				 vlan_type, "inner#outer");
4268 cmdline_parse_token_string_t cmd_vlan_tpid_what =
4269 	TOKEN_STRING_INITIALIZER(struct cmd_vlan_tpid_result,
4270 				 what, "tpid");
4271 cmdline_parse_token_num_t cmd_vlan_tpid_tpid =
4272 	TOKEN_NUM_INITIALIZER(struct cmd_vlan_tpid_result,
4273 			      tp_id, UINT16);
4274 cmdline_parse_token_num_t cmd_vlan_tpid_portid =
4275 	TOKEN_NUM_INITIALIZER(struct cmd_vlan_tpid_result,
4276 			      port_id, UINT16);
4277 
4278 cmdline_parse_inst_t cmd_vlan_tpid = {
4279 	.f = cmd_vlan_tpid_parsed,
4280 	.data = NULL,
4281 	.help_str = "vlan set inner|outer tpid <tp_id> <port_id>: "
4282 		"Set the VLAN Ether type",
4283 	.tokens = {
4284 		(void *)&cmd_vlan_tpid_vlan,
4285 		(void *)&cmd_vlan_tpid_set,
4286 		(void *)&cmd_vlan_type,
4287 		(void *)&cmd_vlan_tpid_what,
4288 		(void *)&cmd_vlan_tpid_tpid,
4289 		(void *)&cmd_vlan_tpid_portid,
4290 		NULL,
4291 	},
4292 };
4293 
4294 /* *** ADD/REMOVE A VLAN IDENTIFIER TO/FROM A PORT VLAN RX FILTER *** */
4295 struct cmd_rx_vlan_filter_result {
4296 	cmdline_fixed_string_t rx_vlan;
4297 	cmdline_fixed_string_t what;
4298 	uint16_t vlan_id;
4299 	portid_t port_id;
4300 };
4301 
4302 static void
4303 cmd_rx_vlan_filter_parsed(void *parsed_result,
4304 			  __rte_unused struct cmdline *cl,
4305 			  __rte_unused void *data)
4306 {
4307 	struct cmd_rx_vlan_filter_result *res = parsed_result;
4308 
4309 	if (!strcmp(res->what, "add"))
4310 		rx_vft_set(res->port_id, res->vlan_id, 1);
4311 	else
4312 		rx_vft_set(res->port_id, res->vlan_id, 0);
4313 }
4314 
4315 cmdline_parse_token_string_t cmd_rx_vlan_filter_rx_vlan =
4316 	TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_result,
4317 				 rx_vlan, "rx_vlan");
4318 cmdline_parse_token_string_t cmd_rx_vlan_filter_what =
4319 	TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_result,
4320 				 what, "add#rm");
4321 cmdline_parse_token_num_t cmd_rx_vlan_filter_vlanid =
4322 	TOKEN_NUM_INITIALIZER(struct cmd_rx_vlan_filter_result,
4323 			      vlan_id, UINT16);
4324 cmdline_parse_token_num_t cmd_rx_vlan_filter_portid =
4325 	TOKEN_NUM_INITIALIZER(struct cmd_rx_vlan_filter_result,
4326 			      port_id, UINT16);
4327 
4328 cmdline_parse_inst_t cmd_rx_vlan_filter = {
4329 	.f = cmd_rx_vlan_filter_parsed,
4330 	.data = NULL,
4331 	.help_str = "rx_vlan add|rm <vlan_id> <port_id>: "
4332 		"Add/Remove a VLAN identifier to/from the set of VLAN "
4333 		"identifiers filtered by a port",
4334 	.tokens = {
4335 		(void *)&cmd_rx_vlan_filter_rx_vlan,
4336 		(void *)&cmd_rx_vlan_filter_what,
4337 		(void *)&cmd_rx_vlan_filter_vlanid,
4338 		(void *)&cmd_rx_vlan_filter_portid,
4339 		NULL,
4340 	},
4341 };
4342 
4343 /* *** ENABLE HARDWARE INSERTION OF VLAN HEADER IN TX PACKETS *** */
4344 struct cmd_tx_vlan_set_result {
4345 	cmdline_fixed_string_t tx_vlan;
4346 	cmdline_fixed_string_t set;
4347 	portid_t port_id;
4348 	uint16_t vlan_id;
4349 };
4350 
4351 static void
4352 cmd_tx_vlan_set_parsed(void *parsed_result,
4353 		       __rte_unused struct cmdline *cl,
4354 		       __rte_unused void *data)
4355 {
4356 	struct cmd_tx_vlan_set_result *res = parsed_result;
4357 
4358 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
4359 		return;
4360 
4361 	if (!port_is_stopped(res->port_id)) {
4362 		printf("Please stop port %d first\n", res->port_id);
4363 		return;
4364 	}
4365 
4366 	tx_vlan_set(res->port_id, res->vlan_id);
4367 
4368 	cmd_reconfig_device_queue(res->port_id, 1, 1);
4369 }
4370 
4371 cmdline_parse_token_string_t cmd_tx_vlan_set_tx_vlan =
4372 	TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_result,
4373 				 tx_vlan, "tx_vlan");
4374 cmdline_parse_token_string_t cmd_tx_vlan_set_set =
4375 	TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_result,
4376 				 set, "set");
4377 cmdline_parse_token_num_t cmd_tx_vlan_set_portid =
4378 	TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_result,
4379 			      port_id, UINT16);
4380 cmdline_parse_token_num_t cmd_tx_vlan_set_vlanid =
4381 	TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_result,
4382 			      vlan_id, UINT16);
4383 
4384 cmdline_parse_inst_t cmd_tx_vlan_set = {
4385 	.f = cmd_tx_vlan_set_parsed,
4386 	.data = NULL,
4387 	.help_str = "tx_vlan set <port_id> <vlan_id>: "
4388 		"Enable hardware insertion of a single VLAN header "
4389 		"with a given TAG Identifier in packets sent on a port",
4390 	.tokens = {
4391 		(void *)&cmd_tx_vlan_set_tx_vlan,
4392 		(void *)&cmd_tx_vlan_set_set,
4393 		(void *)&cmd_tx_vlan_set_portid,
4394 		(void *)&cmd_tx_vlan_set_vlanid,
4395 		NULL,
4396 	},
4397 };
4398 
4399 /* *** ENABLE HARDWARE INSERTION OF Double VLAN HEADER IN TX PACKETS *** */
4400 struct cmd_tx_vlan_set_qinq_result {
4401 	cmdline_fixed_string_t tx_vlan;
4402 	cmdline_fixed_string_t set;
4403 	portid_t port_id;
4404 	uint16_t vlan_id;
4405 	uint16_t vlan_id_outer;
4406 };
4407 
4408 static void
4409 cmd_tx_vlan_set_qinq_parsed(void *parsed_result,
4410 			    __rte_unused struct cmdline *cl,
4411 			    __rte_unused void *data)
4412 {
4413 	struct cmd_tx_vlan_set_qinq_result *res = parsed_result;
4414 
4415 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
4416 		return;
4417 
4418 	if (!port_is_stopped(res->port_id)) {
4419 		printf("Please stop port %d first\n", res->port_id);
4420 		return;
4421 	}
4422 
4423 	tx_qinq_set(res->port_id, res->vlan_id, res->vlan_id_outer);
4424 
4425 	cmd_reconfig_device_queue(res->port_id, 1, 1);
4426 }
4427 
4428 cmdline_parse_token_string_t cmd_tx_vlan_set_qinq_tx_vlan =
4429 	TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_qinq_result,
4430 		tx_vlan, "tx_vlan");
4431 cmdline_parse_token_string_t cmd_tx_vlan_set_qinq_set =
4432 	TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_qinq_result,
4433 		set, "set");
4434 cmdline_parse_token_num_t cmd_tx_vlan_set_qinq_portid =
4435 	TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_qinq_result,
4436 		port_id, UINT16);
4437 cmdline_parse_token_num_t cmd_tx_vlan_set_qinq_vlanid =
4438 	TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_qinq_result,
4439 		vlan_id, UINT16);
4440 cmdline_parse_token_num_t cmd_tx_vlan_set_qinq_vlanid_outer =
4441 	TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_qinq_result,
4442 		vlan_id_outer, UINT16);
4443 
4444 cmdline_parse_inst_t cmd_tx_vlan_set_qinq = {
4445 	.f = cmd_tx_vlan_set_qinq_parsed,
4446 	.data = NULL,
4447 	.help_str = "tx_vlan set <port_id> <vlan_id> <outer_vlan_id>: "
4448 		"Enable hardware insertion of double VLAN header "
4449 		"with given TAG Identifiers in packets sent on a port",
4450 	.tokens = {
4451 		(void *)&cmd_tx_vlan_set_qinq_tx_vlan,
4452 		(void *)&cmd_tx_vlan_set_qinq_set,
4453 		(void *)&cmd_tx_vlan_set_qinq_portid,
4454 		(void *)&cmd_tx_vlan_set_qinq_vlanid,
4455 		(void *)&cmd_tx_vlan_set_qinq_vlanid_outer,
4456 		NULL,
4457 	},
4458 };
4459 
4460 /* *** ENABLE/DISABLE PORT BASED TX VLAN INSERTION *** */
4461 struct cmd_tx_vlan_set_pvid_result {
4462 	cmdline_fixed_string_t tx_vlan;
4463 	cmdline_fixed_string_t set;
4464 	cmdline_fixed_string_t pvid;
4465 	portid_t port_id;
4466 	uint16_t vlan_id;
4467 	cmdline_fixed_string_t mode;
4468 };
4469 
4470 static void
4471 cmd_tx_vlan_set_pvid_parsed(void *parsed_result,
4472 			    __rte_unused struct cmdline *cl,
4473 			    __rte_unused void *data)
4474 {
4475 	struct cmd_tx_vlan_set_pvid_result *res = parsed_result;
4476 
4477 	if (strcmp(res->mode, "on") == 0)
4478 		tx_vlan_pvid_set(res->port_id, res->vlan_id, 1);
4479 	else
4480 		tx_vlan_pvid_set(res->port_id, res->vlan_id, 0);
4481 }
4482 
4483 cmdline_parse_token_string_t cmd_tx_vlan_set_pvid_tx_vlan =
4484 	TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_pvid_result,
4485 				 tx_vlan, "tx_vlan");
4486 cmdline_parse_token_string_t cmd_tx_vlan_set_pvid_set =
4487 	TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_pvid_result,
4488 				 set, "set");
4489 cmdline_parse_token_string_t cmd_tx_vlan_set_pvid_pvid =
4490 	TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_pvid_result,
4491 				 pvid, "pvid");
4492 cmdline_parse_token_num_t cmd_tx_vlan_set_pvid_port_id =
4493 	TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_pvid_result,
4494 			     port_id, UINT16);
4495 cmdline_parse_token_num_t cmd_tx_vlan_set_pvid_vlan_id =
4496 	TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_pvid_result,
4497 			      vlan_id, UINT16);
4498 cmdline_parse_token_string_t cmd_tx_vlan_set_pvid_mode =
4499 	TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_pvid_result,
4500 				 mode, "on#off");
4501 
4502 cmdline_parse_inst_t cmd_tx_vlan_set_pvid = {
4503 	.f = cmd_tx_vlan_set_pvid_parsed,
4504 	.data = NULL,
4505 	.help_str = "tx_vlan set pvid <port_id> <vlan_id> on|off",
4506 	.tokens = {
4507 		(void *)&cmd_tx_vlan_set_pvid_tx_vlan,
4508 		(void *)&cmd_tx_vlan_set_pvid_set,
4509 		(void *)&cmd_tx_vlan_set_pvid_pvid,
4510 		(void *)&cmd_tx_vlan_set_pvid_port_id,
4511 		(void *)&cmd_tx_vlan_set_pvid_vlan_id,
4512 		(void *)&cmd_tx_vlan_set_pvid_mode,
4513 		NULL,
4514 	},
4515 };
4516 
4517 /* *** DISABLE HARDWARE INSERTION OF VLAN HEADER IN TX PACKETS *** */
4518 struct cmd_tx_vlan_reset_result {
4519 	cmdline_fixed_string_t tx_vlan;
4520 	cmdline_fixed_string_t reset;
4521 	portid_t port_id;
4522 };
4523 
4524 static void
4525 cmd_tx_vlan_reset_parsed(void *parsed_result,
4526 			 __rte_unused struct cmdline *cl,
4527 			 __rte_unused void *data)
4528 {
4529 	struct cmd_tx_vlan_reset_result *res = parsed_result;
4530 
4531 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
4532 		return;
4533 
4534 	if (!port_is_stopped(res->port_id)) {
4535 		printf("Please stop port %d first\n", res->port_id);
4536 		return;
4537 	}
4538 
4539 	tx_vlan_reset(res->port_id);
4540 
4541 	cmd_reconfig_device_queue(res->port_id, 1, 1);
4542 }
4543 
4544 cmdline_parse_token_string_t cmd_tx_vlan_reset_tx_vlan =
4545 	TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_reset_result,
4546 				 tx_vlan, "tx_vlan");
4547 cmdline_parse_token_string_t cmd_tx_vlan_reset_reset =
4548 	TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_reset_result,
4549 				 reset, "reset");
4550 cmdline_parse_token_num_t cmd_tx_vlan_reset_portid =
4551 	TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_reset_result,
4552 			      port_id, UINT16);
4553 
4554 cmdline_parse_inst_t cmd_tx_vlan_reset = {
4555 	.f = cmd_tx_vlan_reset_parsed,
4556 	.data = NULL,
4557 	.help_str = "tx_vlan reset <port_id>: Disable hardware insertion of a "
4558 		"VLAN header in packets sent on a port",
4559 	.tokens = {
4560 		(void *)&cmd_tx_vlan_reset_tx_vlan,
4561 		(void *)&cmd_tx_vlan_reset_reset,
4562 		(void *)&cmd_tx_vlan_reset_portid,
4563 		NULL,
4564 	},
4565 };
4566 
4567 
4568 /* *** ENABLE HARDWARE INSERTION OF CHECKSUM IN TX PACKETS *** */
4569 struct cmd_csum_result {
4570 	cmdline_fixed_string_t csum;
4571 	cmdline_fixed_string_t mode;
4572 	cmdline_fixed_string_t proto;
4573 	cmdline_fixed_string_t hwsw;
4574 	portid_t port_id;
4575 };
4576 
4577 static void
4578 csum_show(int port_id)
4579 {
4580 	struct rte_eth_dev_info dev_info;
4581 	uint64_t tx_offloads;
4582 	int ret;
4583 
4584 	tx_offloads = ports[port_id].dev_conf.txmode.offloads;
4585 	printf("Parse tunnel is %s\n",
4586 		(ports[port_id].parse_tunnel) ? "on" : "off");
4587 	printf("IP checksum offload is %s\n",
4588 		(tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) ? "hw" : "sw");
4589 	printf("UDP checksum offload is %s\n",
4590 		(tx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM) ? "hw" : "sw");
4591 	printf("TCP checksum offload is %s\n",
4592 		(tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM) ? "hw" : "sw");
4593 	printf("SCTP checksum offload is %s\n",
4594 		(tx_offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) ? "hw" : "sw");
4595 	printf("Outer-Ip checksum offload is %s\n",
4596 		(tx_offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) ? "hw" : "sw");
4597 	printf("Outer-Udp checksum offload is %s\n",
4598 		(tx_offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM) ? "hw" : "sw");
4599 
4600 	/* display warnings if configuration is not supported by the NIC */
4601 	ret = eth_dev_info_get_print_err(port_id, &dev_info);
4602 	if (ret != 0)
4603 		return;
4604 
4605 	if ((tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) &&
4606 		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) == 0) {
4607 		printf("Warning: hardware IP checksum enabled but not "
4608 			"supported by port %d\n", port_id);
4609 	}
4610 	if ((tx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM) &&
4611 		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) == 0) {
4612 		printf("Warning: hardware UDP checksum enabled but not "
4613 			"supported by port %d\n", port_id);
4614 	}
4615 	if ((tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM) &&
4616 		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) == 0) {
4617 		printf("Warning: hardware TCP checksum enabled but not "
4618 			"supported by port %d\n", port_id);
4619 	}
4620 	if ((tx_offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) &&
4621 		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) == 0) {
4622 		printf("Warning: hardware SCTP checksum enabled but not "
4623 			"supported by port %d\n", port_id);
4624 	}
4625 	if ((tx_offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) &&
4626 		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) == 0) {
4627 		printf("Warning: hardware outer IP checksum enabled but not "
4628 			"supported by port %d\n", port_id);
4629 	}
4630 	if ((tx_offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM) &&
4631 		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM)
4632 			== 0) {
4633 		printf("Warning: hardware outer UDP checksum enabled but not "
4634 			"supported by port %d\n", port_id);
4635 	}
4636 }
4637 
4638 static void
4639 cmd_config_queue_tx_offloads(struct rte_port *port)
4640 {
4641 	int k;
4642 
4643 	/* Apply queue tx offloads configuration */
4644 	for (k = 0; k < port->dev_info.max_rx_queues; k++)
4645 		port->tx_conf[k].offloads =
4646 			port->dev_conf.txmode.offloads;
4647 }
4648 
4649 static void
4650 cmd_csum_parsed(void *parsed_result,
4651 		       __rte_unused struct cmdline *cl,
4652 		       __rte_unused void *data)
4653 {
4654 	struct cmd_csum_result *res = parsed_result;
4655 	int hw = 0;
4656 	uint64_t csum_offloads = 0;
4657 	struct rte_eth_dev_info dev_info;
4658 	int ret;
4659 
4660 	if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
4661 		printf("invalid port %d\n", res->port_id);
4662 		return;
4663 	}
4664 	if (!port_is_stopped(res->port_id)) {
4665 		printf("Please stop port %d first\n", res->port_id);
4666 		return;
4667 	}
4668 
4669 	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
4670 	if (ret != 0)
4671 		return;
4672 
4673 	if (!strcmp(res->mode, "set")) {
4674 
4675 		if (!strcmp(res->hwsw, "hw"))
4676 			hw = 1;
4677 
4678 		if (!strcmp(res->proto, "ip")) {
4679 			if (hw == 0 || (dev_info.tx_offload_capa &
4680 						DEV_TX_OFFLOAD_IPV4_CKSUM)) {
4681 				csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
4682 			} else {
4683 				printf("IP checksum offload is not supported "
4684 				       "by port %u\n", res->port_id);
4685 			}
4686 		} else if (!strcmp(res->proto, "udp")) {
4687 			if (hw == 0 || (dev_info.tx_offload_capa &
4688 						DEV_TX_OFFLOAD_UDP_CKSUM)) {
4689 				csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
4690 			} else {
4691 				printf("UDP checksum offload is not supported "
4692 				       "by port %u\n", res->port_id);
4693 			}
4694 		} else if (!strcmp(res->proto, "tcp")) {
4695 			if (hw == 0 || (dev_info.tx_offload_capa &
4696 						DEV_TX_OFFLOAD_TCP_CKSUM)) {
4697 				csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
4698 			} else {
4699 				printf("TCP checksum offload is not supported "
4700 				       "by port %u\n", res->port_id);
4701 			}
4702 		} else if (!strcmp(res->proto, "sctp")) {
4703 			if (hw == 0 || (dev_info.tx_offload_capa &
4704 						DEV_TX_OFFLOAD_SCTP_CKSUM)) {
4705 				csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
4706 			} else {
4707 				printf("SCTP checksum offload is not supported "
4708 				       "by port %u\n", res->port_id);
4709 			}
4710 		} else if (!strcmp(res->proto, "outer-ip")) {
4711 			if (hw == 0 || (dev_info.tx_offload_capa &
4712 					DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)) {
4713 				csum_offloads |=
4714 						DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
4715 			} else {
4716 				printf("Outer IP checksum offload is not "
4717 				       "supported by port %u\n", res->port_id);
4718 			}
4719 		} else if (!strcmp(res->proto, "outer-udp")) {
4720 			if (hw == 0 || (dev_info.tx_offload_capa &
4721 					DEV_TX_OFFLOAD_OUTER_UDP_CKSUM)) {
4722 				csum_offloads |=
4723 						DEV_TX_OFFLOAD_OUTER_UDP_CKSUM;
4724 			} else {
4725 				printf("Outer UDP checksum offload is not "
4726 				       "supported by port %u\n", res->port_id);
4727 			}
4728 		}
4729 
4730 		if (hw) {
4731 			ports[res->port_id].dev_conf.txmode.offloads |=
4732 							csum_offloads;
4733 		} else {
4734 			ports[res->port_id].dev_conf.txmode.offloads &=
4735 							(~csum_offloads);
4736 		}
4737 		cmd_config_queue_tx_offloads(&ports[res->port_id]);
4738 	}
4739 	csum_show(res->port_id);
4740 
4741 	cmd_reconfig_device_queue(res->port_id, 1, 1);
4742 }
4743 
4744 cmdline_parse_token_string_t cmd_csum_csum =
4745 	TOKEN_STRING_INITIALIZER(struct cmd_csum_result,
4746 				csum, "csum");
4747 cmdline_parse_token_string_t cmd_csum_mode =
4748 	TOKEN_STRING_INITIALIZER(struct cmd_csum_result,
4749 				mode, "set");
4750 cmdline_parse_token_string_t cmd_csum_proto =
4751 	TOKEN_STRING_INITIALIZER(struct cmd_csum_result,
4752 				proto, "ip#tcp#udp#sctp#outer-ip#outer-udp");
4753 cmdline_parse_token_string_t cmd_csum_hwsw =
4754 	TOKEN_STRING_INITIALIZER(struct cmd_csum_result,
4755 				hwsw, "hw#sw");
4756 cmdline_parse_token_num_t cmd_csum_portid =
4757 	TOKEN_NUM_INITIALIZER(struct cmd_csum_result,
4758 				port_id, UINT16);
4759 
4760 cmdline_parse_inst_t cmd_csum_set = {
4761 	.f = cmd_csum_parsed,
4762 	.data = NULL,
4763 	.help_str = "csum set ip|tcp|udp|sctp|outer-ip|outer-udp hw|sw <port_id>: "
4764 		"Enable/Disable hardware calculation of L3/L4 checksum when "
4765 		"using csum forward engine",
4766 	.tokens = {
4767 		(void *)&cmd_csum_csum,
4768 		(void *)&cmd_csum_mode,
4769 		(void *)&cmd_csum_proto,
4770 		(void *)&cmd_csum_hwsw,
4771 		(void *)&cmd_csum_portid,
4772 		NULL,
4773 	},
4774 };
4775 
4776 cmdline_parse_token_string_t cmd_csum_mode_show =
4777 	TOKEN_STRING_INITIALIZER(struct cmd_csum_result,
4778 				mode, "show");
4779 
4780 cmdline_parse_inst_t cmd_csum_show = {
4781 	.f = cmd_csum_parsed,
4782 	.data = NULL,
4783 	.help_str = "csum show <port_id>: Show checksum offload configuration",
4784 	.tokens = {
4785 		(void *)&cmd_csum_csum,
4786 		(void *)&cmd_csum_mode_show,
4787 		(void *)&cmd_csum_portid,
4788 		NULL,
4789 	},
4790 };
4791 
4792 /* Enable/disable tunnel parsing */
4793 struct cmd_csum_tunnel_result {
4794 	cmdline_fixed_string_t csum;
4795 	cmdline_fixed_string_t parse;
4796 	cmdline_fixed_string_t onoff;
4797 	portid_t port_id;
4798 };
4799 
4800 static void
4801 cmd_csum_tunnel_parsed(void *parsed_result,
4802 		       __rte_unused struct cmdline *cl,
4803 		       __rte_unused void *data)
4804 {
4805 	struct cmd_csum_tunnel_result *res = parsed_result;
4806 
4807 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
4808 		return;
4809 
4810 	if (!strcmp(res->onoff, "on"))
4811 		ports[res->port_id].parse_tunnel = 1;
4812 	else
4813 		ports[res->port_id].parse_tunnel = 0;
4814 
4815 	csum_show(res->port_id);
4816 }
4817 
4818 cmdline_parse_token_string_t cmd_csum_tunnel_csum =
4819 	TOKEN_STRING_INITIALIZER(struct cmd_csum_tunnel_result,
4820 				csum, "csum");
4821 cmdline_parse_token_string_t cmd_csum_tunnel_parse =
4822 	TOKEN_STRING_INITIALIZER(struct cmd_csum_tunnel_result,
4823 				parse, "parse-tunnel");
4824 cmdline_parse_token_string_t cmd_csum_tunnel_onoff =
4825 	TOKEN_STRING_INITIALIZER(struct cmd_csum_tunnel_result,
4826 				onoff, "on#off");
4827 cmdline_parse_token_num_t cmd_csum_tunnel_portid =
4828 	TOKEN_NUM_INITIALIZER(struct cmd_csum_tunnel_result,
4829 				port_id, UINT16);
4830 
4831 cmdline_parse_inst_t cmd_csum_tunnel = {
4832 	.f = cmd_csum_tunnel_parsed,
4833 	.data = NULL,
4834 	.help_str = "csum parse-tunnel on|off <port_id>: "
4835 		"Enable/Disable parsing of tunnels for csum engine",
4836 	.tokens = {
4837 		(void *)&cmd_csum_tunnel_csum,
4838 		(void *)&cmd_csum_tunnel_parse,
4839 		(void *)&cmd_csum_tunnel_onoff,
4840 		(void *)&cmd_csum_tunnel_portid,
4841 		NULL,
4842 	},
4843 };
4844 
4845 /* *** ENABLE HARDWARE SEGMENTATION IN TX NON-TUNNELED PACKETS *** */
4846 struct cmd_tso_set_result {
4847 	cmdline_fixed_string_t tso;
4848 	cmdline_fixed_string_t mode;
4849 	uint16_t tso_segsz;
4850 	portid_t port_id;
4851 };
4852 
4853 static void
4854 cmd_tso_set_parsed(void *parsed_result,
4855 		       __rte_unused struct cmdline *cl,
4856 		       __rte_unused void *data)
4857 {
4858 	struct cmd_tso_set_result *res = parsed_result;
4859 	struct rte_eth_dev_info dev_info;
4860 	int ret;
4861 
4862 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
4863 		return;
4864 	if (!port_is_stopped(res->port_id)) {
4865 		printf("Please stop port %d first\n", res->port_id);
4866 		return;
4867 	}
4868 
4869 	if (!strcmp(res->mode, "set"))
4870 		ports[res->port_id].tso_segsz = res->tso_segsz;
4871 
4872 	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
4873 	if (ret != 0)
4874 		return;
4875 
4876 	if ((ports[res->port_id].tso_segsz != 0) &&
4877 		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) {
4878 		printf("Error: TSO is not supported by port %d\n",
4879 		       res->port_id);
4880 		return;
4881 	}
4882 
4883 	if (ports[res->port_id].tso_segsz == 0) {
4884 		ports[res->port_id].dev_conf.txmode.offloads &=
4885 						~DEV_TX_OFFLOAD_TCP_TSO;
4886 		printf("TSO for non-tunneled packets is disabled\n");
4887 	} else {
4888 		ports[res->port_id].dev_conf.txmode.offloads |=
4889 						DEV_TX_OFFLOAD_TCP_TSO;
4890 		printf("TSO segment size for non-tunneled packets is %d\n",
4891 			ports[res->port_id].tso_segsz);
4892 	}
4893 	cmd_config_queue_tx_offloads(&ports[res->port_id]);
4894 
4895 	/* display warnings if configuration is not supported by the NIC */
4896 	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
4897 	if (ret != 0)
4898 		return;
4899 
4900 	if ((ports[res->port_id].tso_segsz != 0) &&
4901 		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) {
4902 		printf("Warning: TSO enabled but not "
4903 			"supported by port %d\n", res->port_id);
4904 	}
4905 
4906 	cmd_reconfig_device_queue(res->port_id, 1, 1);
4907 }
4908 
4909 cmdline_parse_token_string_t cmd_tso_set_tso =
4910 	TOKEN_STRING_INITIALIZER(struct cmd_tso_set_result,
4911 				tso, "tso");
4912 cmdline_parse_token_string_t cmd_tso_set_mode =
4913 	TOKEN_STRING_INITIALIZER(struct cmd_tso_set_result,
4914 				mode, "set");
4915 cmdline_parse_token_num_t cmd_tso_set_tso_segsz =
4916 	TOKEN_NUM_INITIALIZER(struct cmd_tso_set_result,
4917 				tso_segsz, UINT16);
4918 cmdline_parse_token_num_t cmd_tso_set_portid =
4919 	TOKEN_NUM_INITIALIZER(struct cmd_tso_set_result,
4920 				port_id, UINT16);
4921 
4922 cmdline_parse_inst_t cmd_tso_set = {
4923 	.f = cmd_tso_set_parsed,
4924 	.data = NULL,
4925 	.help_str = "tso set <tso_segsz> <port_id>: "
4926 		"Set TSO segment size of non-tunneled packets for csum engine "
4927 		"(0 to disable)",
4928 	.tokens = {
4929 		(void *)&cmd_tso_set_tso,
4930 		(void *)&cmd_tso_set_mode,
4931 		(void *)&cmd_tso_set_tso_segsz,
4932 		(void *)&cmd_tso_set_portid,
4933 		NULL,
4934 	},
4935 };
4936 
4937 cmdline_parse_token_string_t cmd_tso_show_mode =
4938 	TOKEN_STRING_INITIALIZER(struct cmd_tso_set_result,
4939 				mode, "show");
4940 
4941 
4942 cmdline_parse_inst_t cmd_tso_show = {
4943 	.f = cmd_tso_set_parsed,
4944 	.data = NULL,
4945 	.help_str = "tso show <port_id>: "
4946 		"Show TSO segment size of non-tunneled packets for csum engine",
4947 	.tokens = {
4948 		(void *)&cmd_tso_set_tso,
4949 		(void *)&cmd_tso_show_mode,
4950 		(void *)&cmd_tso_set_portid,
4951 		NULL,
4952 	},
4953 };
4954 
4955 /* *** ENABLE HARDWARE SEGMENTATION IN TX TUNNELED PACKETS *** */
4956 struct cmd_tunnel_tso_set_result {
4957 	cmdline_fixed_string_t tso;
4958 	cmdline_fixed_string_t mode;
4959 	uint16_t tso_segsz;
4960 	portid_t port_id;
4961 };
4962 
4963 static struct rte_eth_dev_info
4964 check_tunnel_tso_nic_support(portid_t port_id)
4965 {
4966 	struct rte_eth_dev_info dev_info;
4967 
4968 	if (eth_dev_info_get_print_err(port_id, &dev_info) != 0)
4969 		return dev_info;
4970 
4971 	if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO))
4972 		printf("Warning: VXLAN TUNNEL TSO not supported therefore "
4973 		       "not enabled for port %d\n", port_id);
4974 	if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO))
4975 		printf("Warning: GRE TUNNEL TSO	not supported therefore "
4976 		       "not enabled for port %d\n", port_id);
4977 	if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO))
4978 		printf("Warning: IPIP TUNNEL TSO not supported therefore "
4979 		       "not enabled for port %d\n", port_id);
4980 	if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO))
4981 		printf("Warning: GENEVE TUNNEL TSO not supported therefore "
4982 		       "not enabled for port %d\n", port_id);
4983 	if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IP_TNL_TSO))
4984 		printf("Warning: IP TUNNEL TSO not supported therefore "
4985 		       "not enabled for port %d\n", port_id);
4986 	if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_TNL_TSO))
4987 		printf("Warning: UDP TUNNEL TSO not supported therefore "
4988 		       "not enabled for port %d\n", port_id);
4989 	return dev_info;
4990 }
4991 
4992 static void
4993 cmd_tunnel_tso_set_parsed(void *parsed_result,
4994 			  __rte_unused struct cmdline *cl,
4995 			  __rte_unused void *data)
4996 {
4997 	struct cmd_tunnel_tso_set_result *res = parsed_result;
4998 	struct rte_eth_dev_info dev_info;
4999 
5000 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
5001 		return;
5002 	if (!port_is_stopped(res->port_id)) {
5003 		printf("Please stop port %d first\n", res->port_id);
5004 		return;
5005 	}
5006 
5007 	if (!strcmp(res->mode, "set"))
5008 		ports[res->port_id].tunnel_tso_segsz = res->tso_segsz;
5009 
5010 	dev_info = check_tunnel_tso_nic_support(res->port_id);
5011 	if (ports[res->port_id].tunnel_tso_segsz == 0) {
5012 		ports[res->port_id].dev_conf.txmode.offloads &=
5013 			~(DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
5014 			  DEV_TX_OFFLOAD_GRE_TNL_TSO |
5015 			  DEV_TX_OFFLOAD_IPIP_TNL_TSO |
5016 			  DEV_TX_OFFLOAD_GENEVE_TNL_TSO |
5017 			  DEV_TX_OFFLOAD_IP_TNL_TSO |
5018 			  DEV_TX_OFFLOAD_UDP_TNL_TSO);
5019 		printf("TSO for tunneled packets is disabled\n");
5020 	} else {
5021 		uint64_t tso_offloads = (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
5022 					 DEV_TX_OFFLOAD_GRE_TNL_TSO |
5023 					 DEV_TX_OFFLOAD_IPIP_TNL_TSO |
5024 					 DEV_TX_OFFLOAD_GENEVE_TNL_TSO |
5025 					 DEV_TX_OFFLOAD_IP_TNL_TSO |
5026 					 DEV_TX_OFFLOAD_UDP_TNL_TSO);
5027 
5028 		ports[res->port_id].dev_conf.txmode.offloads |=
5029 			(tso_offloads & dev_info.tx_offload_capa);
5030 		printf("TSO segment size for tunneled packets is %d\n",
5031 			ports[res->port_id].tunnel_tso_segsz);
5032 
5033 		/* Below conditions are needed to make it work:
5034 		 * (1) tunnel TSO is supported by the NIC;
5035 		 * (2) "csum parse_tunnel" must be set so that tunneled pkts
5036 		 * are recognized;
5037 		 * (3) for tunneled pkts with outer L3 of IPv4,
5038 		 * "csum set outer-ip" must be set to hw, because after tso,
5039 		 * total_len of outer IP header is changed, and the checksum
5040 		 * of outer IP header calculated by sw should be wrong; that
5041 		 * is not necessary for IPv6 tunneled pkts because there's no
5042 		 * checksum in IP header anymore.
5043 		 */
5044 
5045 		if (!ports[res->port_id].parse_tunnel)
5046 			printf("Warning: csum parse_tunnel must be set "
5047 				"so that tunneled packets are recognized\n");
5048 		if (!(ports[res->port_id].dev_conf.txmode.offloads &
5049 		      DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM))
5050 			printf("Warning: csum set outer-ip must be set to hw "
5051 				"if outer L3 is IPv4; not necessary for IPv6\n");
5052 	}
5053 
5054 	cmd_config_queue_tx_offloads(&ports[res->port_id]);
5055 	cmd_reconfig_device_queue(res->port_id, 1, 1);
5056 }
5057 
5058 cmdline_parse_token_string_t cmd_tunnel_tso_set_tso =
5059 	TOKEN_STRING_INITIALIZER(struct cmd_tunnel_tso_set_result,
5060 				tso, "tunnel_tso");
5061 cmdline_parse_token_string_t cmd_tunnel_tso_set_mode =
5062 	TOKEN_STRING_INITIALIZER(struct cmd_tunnel_tso_set_result,
5063 				mode, "set");
5064 cmdline_parse_token_num_t cmd_tunnel_tso_set_tso_segsz =
5065 	TOKEN_NUM_INITIALIZER(struct cmd_tunnel_tso_set_result,
5066 				tso_segsz, UINT16);
5067 cmdline_parse_token_num_t cmd_tunnel_tso_set_portid =
5068 	TOKEN_NUM_INITIALIZER(struct cmd_tunnel_tso_set_result,
5069 				port_id, UINT16);
5070 
5071 cmdline_parse_inst_t cmd_tunnel_tso_set = {
5072 	.f = cmd_tunnel_tso_set_parsed,
5073 	.data = NULL,
5074 	.help_str = "tunnel_tso set <tso_segsz> <port_id>: "
5075 		"Set TSO segment size of tunneled packets for csum engine "
5076 		"(0 to disable)",
5077 	.tokens = {
5078 		(void *)&cmd_tunnel_tso_set_tso,
5079 		(void *)&cmd_tunnel_tso_set_mode,
5080 		(void *)&cmd_tunnel_tso_set_tso_segsz,
5081 		(void *)&cmd_tunnel_tso_set_portid,
5082 		NULL,
5083 	},
5084 };
5085 
5086 cmdline_parse_token_string_t cmd_tunnel_tso_show_mode =
5087 	TOKEN_STRING_INITIALIZER(struct cmd_tunnel_tso_set_result,
5088 				mode, "show");
5089 
5090 
5091 cmdline_parse_inst_t cmd_tunnel_tso_show = {
5092 	.f = cmd_tunnel_tso_set_parsed,
5093 	.data = NULL,
5094 	.help_str = "tunnel_tso show <port_id> "
5095 		"Show TSO segment size of tunneled packets for csum engine",
5096 	.tokens = {
5097 		(void *)&cmd_tunnel_tso_set_tso,
5098 		(void *)&cmd_tunnel_tso_show_mode,
5099 		(void *)&cmd_tunnel_tso_set_portid,
5100 		NULL,
5101 	},
5102 };
5103 
5104 /* *** SET GRO FOR A PORT *** */
5105 struct cmd_gro_enable_result {
5106 	cmdline_fixed_string_t cmd_set;
5107 	cmdline_fixed_string_t cmd_port;
5108 	cmdline_fixed_string_t cmd_keyword;
5109 	cmdline_fixed_string_t cmd_onoff;
5110 	portid_t cmd_pid;
5111 };
5112 
5113 static void
5114 cmd_gro_enable_parsed(void *parsed_result,
5115 		__rte_unused struct cmdline *cl,
5116 		__rte_unused void *data)
5117 {
5118 	struct cmd_gro_enable_result *res;
5119 
5120 	res = parsed_result;
5121 	if (!strcmp(res->cmd_keyword, "gro"))
5122 		setup_gro(res->cmd_onoff, res->cmd_pid);
5123 }
5124 
5125 cmdline_parse_token_string_t cmd_gro_enable_set =
5126 	TOKEN_STRING_INITIALIZER(struct cmd_gro_enable_result,
5127 			cmd_set, "set");
5128 cmdline_parse_token_string_t cmd_gro_enable_port =
5129 	TOKEN_STRING_INITIALIZER(struct cmd_gro_enable_result,
5130 			cmd_keyword, "port");
5131 cmdline_parse_token_num_t cmd_gro_enable_pid =
5132 	TOKEN_NUM_INITIALIZER(struct cmd_gro_enable_result,
5133 			cmd_pid, UINT16);
5134 cmdline_parse_token_string_t cmd_gro_enable_keyword =
5135 	TOKEN_STRING_INITIALIZER(struct cmd_gro_enable_result,
5136 			cmd_keyword, "gro");
5137 cmdline_parse_token_string_t cmd_gro_enable_onoff =
5138 	TOKEN_STRING_INITIALIZER(struct cmd_gro_enable_result,
5139 			cmd_onoff, "on#off");
5140 
5141 cmdline_parse_inst_t cmd_gro_enable = {
5142 	.f = cmd_gro_enable_parsed,
5143 	.data = NULL,
5144 	.help_str = "set port <port_id> gro on|off",
5145 	.tokens = {
5146 		(void *)&cmd_gro_enable_set,
5147 		(void *)&cmd_gro_enable_port,
5148 		(void *)&cmd_gro_enable_pid,
5149 		(void *)&cmd_gro_enable_keyword,
5150 		(void *)&cmd_gro_enable_onoff,
5151 		NULL,
5152 	},
5153 };
5154 
5155 /* *** DISPLAY GRO CONFIGURATION *** */
5156 struct cmd_gro_show_result {
5157 	cmdline_fixed_string_t cmd_show;
5158 	cmdline_fixed_string_t cmd_port;
5159 	cmdline_fixed_string_t cmd_keyword;
5160 	portid_t cmd_pid;
5161 };
5162 
5163 static void
5164 cmd_gro_show_parsed(void *parsed_result,
5165 		__rte_unused struct cmdline *cl,
5166 		__rte_unused void *data)
5167 {
5168 	struct cmd_gro_show_result *res;
5169 
5170 	res = parsed_result;
5171 	if (!strcmp(res->cmd_keyword, "gro"))
5172 		show_gro(res->cmd_pid);
5173 }
5174 
5175 cmdline_parse_token_string_t cmd_gro_show_show =
5176 	TOKEN_STRING_INITIALIZER(struct cmd_gro_show_result,
5177 			cmd_show, "show");
5178 cmdline_parse_token_string_t cmd_gro_show_port =
5179 	TOKEN_STRING_INITIALIZER(struct cmd_gro_show_result,
5180 			cmd_port, "port");
5181 cmdline_parse_token_num_t cmd_gro_show_pid =
5182 	TOKEN_NUM_INITIALIZER(struct cmd_gro_show_result,
5183 			cmd_pid, UINT16);
5184 cmdline_parse_token_string_t cmd_gro_show_keyword =
5185 	TOKEN_STRING_INITIALIZER(struct cmd_gro_show_result,
5186 			cmd_keyword, "gro");
5187 
5188 cmdline_parse_inst_t cmd_gro_show = {
5189 	.f = cmd_gro_show_parsed,
5190 	.data = NULL,
5191 	.help_str = "show port <port_id> gro",
5192 	.tokens = {
5193 		(void *)&cmd_gro_show_show,
5194 		(void *)&cmd_gro_show_port,
5195 		(void *)&cmd_gro_show_pid,
5196 		(void *)&cmd_gro_show_keyword,
5197 		NULL,
5198 	},
5199 };
5200 
5201 /* *** SET FLUSH CYCLES FOR GRO *** */
5202 struct cmd_gro_flush_result {
5203 	cmdline_fixed_string_t cmd_set;
5204 	cmdline_fixed_string_t cmd_keyword;
5205 	cmdline_fixed_string_t cmd_flush;
5206 	uint8_t cmd_cycles;
5207 };
5208 
5209 static void
5210 cmd_gro_flush_parsed(void *parsed_result,
5211 		__rte_unused struct cmdline *cl,
5212 		__rte_unused void *data)
5213 {
5214 	struct cmd_gro_flush_result *res;
5215 
5216 	res = parsed_result;
5217 	if ((!strcmp(res->cmd_keyword, "gro")) &&
5218 			(!strcmp(res->cmd_flush, "flush")))
5219 		setup_gro_flush_cycles(res->cmd_cycles);
5220 }
5221 
5222 cmdline_parse_token_string_t cmd_gro_flush_set =
5223 	TOKEN_STRING_INITIALIZER(struct cmd_gro_flush_result,
5224 			cmd_set, "set");
5225 cmdline_parse_token_string_t cmd_gro_flush_keyword =
5226 	TOKEN_STRING_INITIALIZER(struct cmd_gro_flush_result,
5227 			cmd_keyword, "gro");
5228 cmdline_parse_token_string_t cmd_gro_flush_flush =
5229 	TOKEN_STRING_INITIALIZER(struct cmd_gro_flush_result,
5230 			cmd_flush, "flush");
5231 cmdline_parse_token_num_t cmd_gro_flush_cycles =
5232 	TOKEN_NUM_INITIALIZER(struct cmd_gro_flush_result,
5233 			cmd_cycles, UINT8);
5234 
5235 cmdline_parse_inst_t cmd_gro_flush = {
5236 	.f = cmd_gro_flush_parsed,
5237 	.data = NULL,
5238 	.help_str = "set gro flush <cycles>",
5239 	.tokens = {
5240 		(void *)&cmd_gro_flush_set,
5241 		(void *)&cmd_gro_flush_keyword,
5242 		(void *)&cmd_gro_flush_flush,
5243 		(void *)&cmd_gro_flush_cycles,
5244 		NULL,
5245 	},
5246 };
5247 
5248 /* *** ENABLE/DISABLE GSO *** */
5249 struct cmd_gso_enable_result {
5250 	cmdline_fixed_string_t cmd_set;
5251 	cmdline_fixed_string_t cmd_port;
5252 	cmdline_fixed_string_t cmd_keyword;
5253 	cmdline_fixed_string_t cmd_mode;
5254 	portid_t cmd_pid;
5255 };
5256 
5257 static void
5258 cmd_gso_enable_parsed(void *parsed_result,
5259 		__rte_unused struct cmdline *cl,
5260 		__rte_unused void *data)
5261 {
5262 	struct cmd_gso_enable_result *res;
5263 
5264 	res = parsed_result;
5265 	if (!strcmp(res->cmd_keyword, "gso"))
5266 		setup_gso(res->cmd_mode, res->cmd_pid);
5267 }
5268 
5269 cmdline_parse_token_string_t cmd_gso_enable_set =
5270 	TOKEN_STRING_INITIALIZER(struct cmd_gso_enable_result,
5271 			cmd_set, "set");
5272 cmdline_parse_token_string_t cmd_gso_enable_port =
5273 	TOKEN_STRING_INITIALIZER(struct cmd_gso_enable_result,
5274 			cmd_port, "port");
5275 cmdline_parse_token_string_t cmd_gso_enable_keyword =
5276 	TOKEN_STRING_INITIALIZER(struct cmd_gso_enable_result,
5277 			cmd_keyword, "gso");
5278 cmdline_parse_token_string_t cmd_gso_enable_mode =
5279 	TOKEN_STRING_INITIALIZER(struct cmd_gso_enable_result,
5280 			cmd_mode, "on#off");
5281 cmdline_parse_token_num_t cmd_gso_enable_pid =
5282 	TOKEN_NUM_INITIALIZER(struct cmd_gso_enable_result,
5283 			cmd_pid, UINT16);
5284 
5285 cmdline_parse_inst_t cmd_gso_enable = {
5286 	.f = cmd_gso_enable_parsed,
5287 	.data = NULL,
5288 	.help_str = "set port <port_id> gso on|off",
5289 	.tokens = {
5290 		(void *)&cmd_gso_enable_set,
5291 		(void *)&cmd_gso_enable_port,
5292 		(void *)&cmd_gso_enable_pid,
5293 		(void *)&cmd_gso_enable_keyword,
5294 		(void *)&cmd_gso_enable_mode,
5295 		NULL,
5296 	},
5297 };
5298 
5299 /* *** SET MAX PACKET LENGTH FOR GSO SEGMENTS *** */
5300 struct cmd_gso_size_result {
5301 	cmdline_fixed_string_t cmd_set;
5302 	cmdline_fixed_string_t cmd_keyword;
5303 	cmdline_fixed_string_t cmd_segsz;
5304 	uint16_t cmd_size;
5305 };
5306 
5307 static void
5308 cmd_gso_size_parsed(void *parsed_result,
5309 		       __rte_unused struct cmdline *cl,
5310 		       __rte_unused void *data)
5311 {
5312 	struct cmd_gso_size_result *res = parsed_result;
5313 
5314 	if (test_done == 0) {
5315 		printf("Before setting GSO segsz, please first"
5316 				" stop forwarding\n");
5317 		return;
5318 	}
5319 
5320 	if (!strcmp(res->cmd_keyword, "gso") &&
5321 			!strcmp(res->cmd_segsz, "segsz")) {
5322 		if (res->cmd_size < RTE_GSO_SEG_SIZE_MIN)
5323 			printf("gso_size should be larger than %zu."
5324 					" Please input a legal value\n",
5325 					RTE_GSO_SEG_SIZE_MIN);
5326 		else
5327 			gso_max_segment_size = res->cmd_size;
5328 	}
5329 }
5330 
5331 cmdline_parse_token_string_t cmd_gso_size_set =
5332 	TOKEN_STRING_INITIALIZER(struct cmd_gso_size_result,
5333 				cmd_set, "set");
5334 cmdline_parse_token_string_t cmd_gso_size_keyword =
5335 	TOKEN_STRING_INITIALIZER(struct cmd_gso_size_result,
5336 				cmd_keyword, "gso");
5337 cmdline_parse_token_string_t cmd_gso_size_segsz =
5338 	TOKEN_STRING_INITIALIZER(struct cmd_gso_size_result,
5339 				cmd_segsz, "segsz");
5340 cmdline_parse_token_num_t cmd_gso_size_size =
5341 	TOKEN_NUM_INITIALIZER(struct cmd_gso_size_result,
5342 				cmd_size, UINT16);
5343 
5344 cmdline_parse_inst_t cmd_gso_size = {
5345 	.f = cmd_gso_size_parsed,
5346 	.data = NULL,
5347 	.help_str = "set gso segsz <length>",
5348 	.tokens = {
5349 		(void *)&cmd_gso_size_set,
5350 		(void *)&cmd_gso_size_keyword,
5351 		(void *)&cmd_gso_size_segsz,
5352 		(void *)&cmd_gso_size_size,
5353 		NULL,
5354 	},
5355 };
5356 
5357 /* *** SHOW GSO CONFIGURATION *** */
5358 struct cmd_gso_show_result {
5359 	cmdline_fixed_string_t cmd_show;
5360 	cmdline_fixed_string_t cmd_port;
5361 	cmdline_fixed_string_t cmd_keyword;
5362 	portid_t cmd_pid;
5363 };
5364 
5365 static void
5366 cmd_gso_show_parsed(void *parsed_result,
5367 		       __rte_unused struct cmdline *cl,
5368 		       __rte_unused void *data)
5369 {
5370 	struct cmd_gso_show_result *res = parsed_result;
5371 
5372 	if (!rte_eth_dev_is_valid_port(res->cmd_pid)) {
5373 		printf("invalid port id %u\n", res->cmd_pid);
5374 		return;
5375 	}
5376 	if (!strcmp(res->cmd_keyword, "gso")) {
5377 		if (gso_ports[res->cmd_pid].enable) {
5378 			printf("Max GSO'd packet size: %uB\n"
5379 					"Supported GSO types: TCP/IPv4, "
5380 					"UDP/IPv4, VxLAN with inner "
5381 					"TCP/IPv4 packet, GRE with inner "
5382 					"TCP/IPv4 packet\n",
5383 					gso_max_segment_size);
5384 		} else
5385 			printf("GSO is not enabled on Port %u\n", res->cmd_pid);
5386 	}
5387 }
5388 
5389 cmdline_parse_token_string_t cmd_gso_show_show =
5390 TOKEN_STRING_INITIALIZER(struct cmd_gso_show_result,
5391 		cmd_show, "show");
5392 cmdline_parse_token_string_t cmd_gso_show_port =
5393 TOKEN_STRING_INITIALIZER(struct cmd_gso_show_result,
5394 		cmd_port, "port");
5395 cmdline_parse_token_string_t cmd_gso_show_keyword =
5396 	TOKEN_STRING_INITIALIZER(struct cmd_gso_show_result,
5397 				cmd_keyword, "gso");
5398 cmdline_parse_token_num_t cmd_gso_show_pid =
5399 	TOKEN_NUM_INITIALIZER(struct cmd_gso_show_result,
5400 				cmd_pid, UINT16);
5401 
5402 cmdline_parse_inst_t cmd_gso_show = {
5403 	.f = cmd_gso_show_parsed,
5404 	.data = NULL,
5405 	.help_str = "show port <port_id> gso",
5406 	.tokens = {
5407 		(void *)&cmd_gso_show_show,
5408 		(void *)&cmd_gso_show_port,
5409 		(void *)&cmd_gso_show_pid,
5410 		(void *)&cmd_gso_show_keyword,
5411 		NULL,
5412 	},
5413 };
5414 
5415 /* *** ENABLE/DISABLE FLUSH ON RX STREAMS *** */
5416 struct cmd_set_flush_rx {
5417 	cmdline_fixed_string_t set;
5418 	cmdline_fixed_string_t flush_rx;
5419 	cmdline_fixed_string_t mode;
5420 };
5421 
5422 static void
5423 cmd_set_flush_rx_parsed(void *parsed_result,
5424 		__rte_unused struct cmdline *cl,
5425 		__rte_unused void *data)
5426 {
5427 	struct cmd_set_flush_rx *res = parsed_result;
5428 	no_flush_rx = (uint8_t)((strcmp(res->mode, "on") == 0) ? 0 : 1);
5429 }
5430 
5431 cmdline_parse_token_string_t cmd_setflushrx_set =
5432 	TOKEN_STRING_INITIALIZER(struct cmd_set_flush_rx,
5433 			set, "set");
5434 cmdline_parse_token_string_t cmd_setflushrx_flush_rx =
5435 	TOKEN_STRING_INITIALIZER(struct cmd_set_flush_rx,
5436 			flush_rx, "flush_rx");
5437 cmdline_parse_token_string_t cmd_setflushrx_mode =
5438 	TOKEN_STRING_INITIALIZER(struct cmd_set_flush_rx,
5439 			mode, "on#off");
5440 
5441 
5442 cmdline_parse_inst_t cmd_set_flush_rx = {
5443 	.f = cmd_set_flush_rx_parsed,
5444 	.help_str = "set flush_rx on|off: Enable/Disable flush on rx streams",
5445 	.data = NULL,
5446 	.tokens = {
5447 		(void *)&cmd_setflushrx_set,
5448 		(void *)&cmd_setflushrx_flush_rx,
5449 		(void *)&cmd_setflushrx_mode,
5450 		NULL,
5451 	},
5452 };
5453 
5454 /* *** ENABLE/DISABLE LINK STATUS CHECK *** */
5455 struct cmd_set_link_check {
5456 	cmdline_fixed_string_t set;
5457 	cmdline_fixed_string_t link_check;
5458 	cmdline_fixed_string_t mode;
5459 };
5460 
5461 static void
5462 cmd_set_link_check_parsed(void *parsed_result,
5463 		__rte_unused struct cmdline *cl,
5464 		__rte_unused void *data)
5465 {
5466 	struct cmd_set_link_check *res = parsed_result;
5467 	no_link_check = (uint8_t)((strcmp(res->mode, "on") == 0) ? 0 : 1);
5468 }
5469 
5470 cmdline_parse_token_string_t cmd_setlinkcheck_set =
5471 	TOKEN_STRING_INITIALIZER(struct cmd_set_link_check,
5472 			set, "set");
5473 cmdline_parse_token_string_t cmd_setlinkcheck_link_check =
5474 	TOKEN_STRING_INITIALIZER(struct cmd_set_link_check,
5475 			link_check, "link_check");
5476 cmdline_parse_token_string_t cmd_setlinkcheck_mode =
5477 	TOKEN_STRING_INITIALIZER(struct cmd_set_link_check,
5478 			mode, "on#off");
5479 
5480 
5481 cmdline_parse_inst_t cmd_set_link_check = {
5482 	.f = cmd_set_link_check_parsed,
5483 	.help_str = "set link_check on|off: Enable/Disable link status check "
5484 	            "when starting/stopping a port",
5485 	.data = NULL,
5486 	.tokens = {
5487 		(void *)&cmd_setlinkcheck_set,
5488 		(void *)&cmd_setlinkcheck_link_check,
5489 		(void *)&cmd_setlinkcheck_mode,
5490 		NULL,
5491 	},
5492 };
5493 
5494 /* *** SET NIC BYPASS MODE *** */
5495 struct cmd_set_bypass_mode_result {
5496 	cmdline_fixed_string_t set;
5497 	cmdline_fixed_string_t bypass;
5498 	cmdline_fixed_string_t mode;
5499 	cmdline_fixed_string_t value;
5500 	portid_t port_id;
5501 };
5502 
5503 static void
5504 cmd_set_bypass_mode_parsed(void *parsed_result,
5505 		__rte_unused struct cmdline *cl,
5506 		__rte_unused void *data)
5507 {
5508 	struct cmd_set_bypass_mode_result *res = parsed_result;
5509 	portid_t port_id = res->port_id;
5510 	int32_t rc = -EINVAL;
5511 
5512 #if defined RTE_NET_IXGBE && defined RTE_LIBRTE_IXGBE_BYPASS
5513 	uint32_t bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NORMAL;
5514 
5515 	if (!strcmp(res->value, "bypass"))
5516 		bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_BYPASS;
5517 	else if (!strcmp(res->value, "isolate"))
5518 		bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_ISOLATE;
5519 	else
5520 		bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NORMAL;
5521 
5522 	/* Set the bypass mode for the relevant port. */
5523 	rc = rte_pmd_ixgbe_bypass_state_set(port_id, &bypass_mode);
5524 #endif
5525 	if (rc != 0)
5526 		printf("\t Failed to set bypass mode for port = %d.\n", port_id);
5527 }
5528 
5529 cmdline_parse_token_string_t cmd_setbypass_mode_set =
5530 	TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_mode_result,
5531 			set, "set");
5532 cmdline_parse_token_string_t cmd_setbypass_mode_bypass =
5533 	TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_mode_result,
5534 			bypass, "bypass");
5535 cmdline_parse_token_string_t cmd_setbypass_mode_mode =
5536 	TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_mode_result,
5537 			mode, "mode");
5538 cmdline_parse_token_string_t cmd_setbypass_mode_value =
5539 	TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_mode_result,
5540 			value, "normal#bypass#isolate");
5541 cmdline_parse_token_num_t cmd_setbypass_mode_port =
5542 	TOKEN_NUM_INITIALIZER(struct cmd_set_bypass_mode_result,
5543 				port_id, UINT16);
5544 
5545 cmdline_parse_inst_t cmd_set_bypass_mode = {
5546 	.f = cmd_set_bypass_mode_parsed,
5547 	.help_str = "set bypass mode normal|bypass|isolate <port_id>: "
5548 	            "Set the NIC bypass mode for port_id",
5549 	.data = NULL,
5550 	.tokens = {
5551 		(void *)&cmd_setbypass_mode_set,
5552 		(void *)&cmd_setbypass_mode_bypass,
5553 		(void *)&cmd_setbypass_mode_mode,
5554 		(void *)&cmd_setbypass_mode_value,
5555 		(void *)&cmd_setbypass_mode_port,
5556 		NULL,
5557 	},
5558 };
5559 
5560 /* *** SET NIC BYPASS EVENT *** */
5561 struct cmd_set_bypass_event_result {
5562 	cmdline_fixed_string_t set;
5563 	cmdline_fixed_string_t bypass;
5564 	cmdline_fixed_string_t event;
5565 	cmdline_fixed_string_t event_value;
5566 	cmdline_fixed_string_t mode;
5567 	cmdline_fixed_string_t mode_value;
5568 	portid_t port_id;
5569 };
5570 
5571 static void
5572 cmd_set_bypass_event_parsed(void *parsed_result,
5573 		__rte_unused struct cmdline *cl,
5574 		__rte_unused void *data)
5575 {
5576 	int32_t rc = -EINVAL;
5577 	struct cmd_set_bypass_event_result *res = parsed_result;
5578 	portid_t port_id = res->port_id;
5579 
5580 #if defined RTE_NET_IXGBE && defined RTE_LIBRTE_IXGBE_BYPASS
5581 	uint32_t bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_NONE;
5582 	uint32_t bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NORMAL;
5583 
5584 	if (!strcmp(res->event_value, "timeout"))
5585 		bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_TIMEOUT;
5586 	else if (!strcmp(res->event_value, "os_on"))
5587 		bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_OS_ON;
5588 	else if (!strcmp(res->event_value, "os_off"))
5589 		bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_OS_OFF;
5590 	else if (!strcmp(res->event_value, "power_on"))
5591 		bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_POWER_ON;
5592 	else if (!strcmp(res->event_value, "power_off"))
5593 		bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_POWER_OFF;
5594 	else
5595 		bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_NONE;
5596 
5597 	if (!strcmp(res->mode_value, "bypass"))
5598 		bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_BYPASS;
5599 	else if (!strcmp(res->mode_value, "isolate"))
5600 		bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_ISOLATE;
5601 	else
5602 		bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NORMAL;
5603 
5604 	/* Set the watchdog timeout. */
5605 	if (bypass_event == RTE_PMD_IXGBE_BYPASS_EVENT_TIMEOUT) {
5606 
5607 		rc = -EINVAL;
5608 		if (RTE_PMD_IXGBE_BYPASS_TMT_VALID(bypass_timeout)) {
5609 			rc = rte_pmd_ixgbe_bypass_wd_timeout_store(port_id,
5610 							   bypass_timeout);
5611 		}
5612 		if (rc != 0) {
5613 			printf("Failed to set timeout value %u "
5614 			"for port %d, errto code: %d.\n",
5615 			bypass_timeout, port_id, rc);
5616 		}
5617 	}
5618 
5619 	/* Set the bypass event to transition to bypass mode. */
5620 	rc = rte_pmd_ixgbe_bypass_event_store(port_id, bypass_event,
5621 					      bypass_mode);
5622 #endif
5623 
5624 	if (rc != 0)
5625 		printf("\t Failed to set bypass event for port = %d.\n",
5626 		       port_id);
5627 }
5628 
5629 cmdline_parse_token_string_t cmd_setbypass_event_set =
5630 	TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result,
5631 			set, "set");
5632 cmdline_parse_token_string_t cmd_setbypass_event_bypass =
5633 	TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result,
5634 			bypass, "bypass");
5635 cmdline_parse_token_string_t cmd_setbypass_event_event =
5636 	TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result,
5637 			event, "event");
5638 cmdline_parse_token_string_t cmd_setbypass_event_event_value =
5639 	TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result,
5640 			event_value, "none#timeout#os_off#os_on#power_on#power_off");
5641 cmdline_parse_token_string_t cmd_setbypass_event_mode =
5642 	TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result,
5643 			mode, "mode");
5644 cmdline_parse_token_string_t cmd_setbypass_event_mode_value =
5645 	TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result,
5646 			mode_value, "normal#bypass#isolate");
5647 cmdline_parse_token_num_t cmd_setbypass_event_port =
5648 	TOKEN_NUM_INITIALIZER(struct cmd_set_bypass_event_result,
5649 				port_id, UINT16);
5650 
5651 cmdline_parse_inst_t cmd_set_bypass_event = {
5652 	.f = cmd_set_bypass_event_parsed,
5653 	.help_str = "set bypass event none|timeout|os_on|os_off|power_on|"
5654 		"power_off mode normal|bypass|isolate <port_id>: "
5655 		"Set the NIC bypass event mode for port_id",
5656 	.data = NULL,
5657 	.tokens = {
5658 		(void *)&cmd_setbypass_event_set,
5659 		(void *)&cmd_setbypass_event_bypass,
5660 		(void *)&cmd_setbypass_event_event,
5661 		(void *)&cmd_setbypass_event_event_value,
5662 		(void *)&cmd_setbypass_event_mode,
5663 		(void *)&cmd_setbypass_event_mode_value,
5664 		(void *)&cmd_setbypass_event_port,
5665 		NULL,
5666 	},
5667 };
5668 
5669 
5670 /* *** SET NIC BYPASS TIMEOUT *** */
5671 struct cmd_set_bypass_timeout_result {
5672 	cmdline_fixed_string_t set;
5673 	cmdline_fixed_string_t bypass;
5674 	cmdline_fixed_string_t timeout;
5675 	cmdline_fixed_string_t value;
5676 };
5677 
5678 static void
5679 cmd_set_bypass_timeout_parsed(void *parsed_result,
5680 		__rte_unused struct cmdline *cl,
5681 		__rte_unused void *data)
5682 {
5683 	__rte_unused struct cmd_set_bypass_timeout_result *res = parsed_result;
5684 
5685 #if defined RTE_NET_IXGBE && defined RTE_LIBRTE_IXGBE_BYPASS
5686 	if (!strcmp(res->value, "1.5"))
5687 		bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_1_5_SEC;
5688 	else if (!strcmp(res->value, "2"))
5689 		bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_2_SEC;
5690 	else if (!strcmp(res->value, "3"))
5691 		bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_3_SEC;
5692 	else if (!strcmp(res->value, "4"))
5693 		bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_4_SEC;
5694 	else if (!strcmp(res->value, "8"))
5695 		bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_8_SEC;
5696 	else if (!strcmp(res->value, "16"))
5697 		bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_16_SEC;
5698 	else if (!strcmp(res->value, "32"))
5699 		bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_32_SEC;
5700 	else
5701 		bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_OFF;
5702 #endif
5703 }
5704 
5705 cmdline_parse_token_string_t cmd_setbypass_timeout_set =
5706 	TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_timeout_result,
5707 			set, "set");
5708 cmdline_parse_token_string_t cmd_setbypass_timeout_bypass =
5709 	TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_timeout_result,
5710 			bypass, "bypass");
5711 cmdline_parse_token_string_t cmd_setbypass_timeout_timeout =
5712 	TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_timeout_result,
5713 			timeout, "timeout");
5714 cmdline_parse_token_string_t cmd_setbypass_timeout_value =
5715 	TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_timeout_result,
5716 			value, "0#1.5#2#3#4#8#16#32");
5717 
5718 cmdline_parse_inst_t cmd_set_bypass_timeout = {
5719 	.f = cmd_set_bypass_timeout_parsed,
5720 	.help_str = "set bypass timeout 0|1.5|2|3|4|8|16|32: "
5721 		"Set the NIC bypass watchdog timeout in seconds",
5722 	.data = NULL,
5723 	.tokens = {
5724 		(void *)&cmd_setbypass_timeout_set,
5725 		(void *)&cmd_setbypass_timeout_bypass,
5726 		(void *)&cmd_setbypass_timeout_timeout,
5727 		(void *)&cmd_setbypass_timeout_value,
5728 		NULL,
5729 	},
5730 };
5731 
5732 /* *** SHOW NIC BYPASS MODE *** */
5733 struct cmd_show_bypass_config_result {
5734 	cmdline_fixed_string_t show;
5735 	cmdline_fixed_string_t bypass;
5736 	cmdline_fixed_string_t config;
5737 	portid_t port_id;
5738 };
5739 
5740 static void
5741 cmd_show_bypass_config_parsed(void *parsed_result,
5742 		__rte_unused struct cmdline *cl,
5743 		__rte_unused void *data)
5744 {
5745 	struct cmd_show_bypass_config_result *res = parsed_result;
5746 	portid_t port_id = res->port_id;
5747 	int rc = -EINVAL;
5748 #if defined RTE_NET_IXGBE && defined RTE_LIBRTE_IXGBE_BYPASS
5749 	uint32_t event_mode;
5750 	uint32_t bypass_mode;
5751 	uint32_t timeout = bypass_timeout;
5752 	unsigned int i;
5753 
5754 	static const char * const timeouts[RTE_PMD_IXGBE_BYPASS_TMT_NUM] =
5755 		{"off", "1.5", "2", "3", "4", "8", "16", "32"};
5756 	static const char * const modes[RTE_PMD_IXGBE_BYPASS_MODE_NUM] =
5757 		{"UNKNOWN", "normal", "bypass", "isolate"};
5758 	static const char * const events[RTE_PMD_IXGBE_BYPASS_EVENT_NUM] = {
5759 		"NONE",
5760 		"OS/board on",
5761 		"power supply on",
5762 		"OS/board off",
5763 		"power supply off",
5764 		"timeout"};
5765 
5766 	/* Display the bypass mode.*/
5767 	if (rte_pmd_ixgbe_bypass_state_show(port_id, &bypass_mode) != 0) {
5768 		printf("\tFailed to get bypass mode for port = %d\n", port_id);
5769 		return;
5770 	}
5771 	else {
5772 		if (!RTE_PMD_IXGBE_BYPASS_MODE_VALID(bypass_mode))
5773 			bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NONE;
5774 
5775 		printf("\tbypass mode    = %s\n",  modes[bypass_mode]);
5776 	}
5777 
5778 	/* Display the bypass timeout.*/
5779 	if (!RTE_PMD_IXGBE_BYPASS_TMT_VALID(timeout))
5780 		timeout = RTE_PMD_IXGBE_BYPASS_TMT_OFF;
5781 
5782 	printf("\tbypass timeout = %s\n", timeouts[timeout]);
5783 
5784 	/* Display the bypass events and associated modes. */
5785 	for (i = RTE_PMD_IXGBE_BYPASS_EVENT_START; i < RTE_DIM(events); i++) {
5786 
5787 		if (rte_pmd_ixgbe_bypass_event_show(port_id, i, &event_mode)) {
5788 			printf("\tFailed to get bypass mode for event = %s\n",
5789 				events[i]);
5790 		} else {
5791 			if (!RTE_PMD_IXGBE_BYPASS_MODE_VALID(event_mode))
5792 				event_mode = RTE_PMD_IXGBE_BYPASS_MODE_NONE;
5793 
5794 			printf("\tbypass event: %-16s = %s\n", events[i],
5795 				modes[event_mode]);
5796 		}
5797 	}
5798 #endif
5799 	if (rc != 0)
5800 		printf("\tFailed to get bypass configuration for port = %d\n",
5801 		       port_id);
5802 }
5803 
5804 cmdline_parse_token_string_t cmd_showbypass_config_show =
5805 	TOKEN_STRING_INITIALIZER(struct cmd_show_bypass_config_result,
5806 			show, "show");
5807 cmdline_parse_token_string_t cmd_showbypass_config_bypass =
5808 	TOKEN_STRING_INITIALIZER(struct cmd_show_bypass_config_result,
5809 			bypass, "bypass");
5810 cmdline_parse_token_string_t cmd_showbypass_config_config =
5811 	TOKEN_STRING_INITIALIZER(struct cmd_show_bypass_config_result,
5812 			config, "config");
5813 cmdline_parse_token_num_t cmd_showbypass_config_port =
5814 	TOKEN_NUM_INITIALIZER(struct cmd_show_bypass_config_result,
5815 				port_id, UINT16);
5816 
5817 cmdline_parse_inst_t cmd_show_bypass_config = {
5818 	.f = cmd_show_bypass_config_parsed,
5819 	.help_str = "show bypass config <port_id>: "
5820 	            "Show the NIC bypass config for port_id",
5821 	.data = NULL,
5822 	.tokens = {
5823 		(void *)&cmd_showbypass_config_show,
5824 		(void *)&cmd_showbypass_config_bypass,
5825 		(void *)&cmd_showbypass_config_config,
5826 		(void *)&cmd_showbypass_config_port,
5827 		NULL,
5828 	},
5829 };
5830 
5831 #ifdef RTE_NET_BOND
5832 /* *** SET BONDING MODE *** */
5833 struct cmd_set_bonding_mode_result {
5834 	cmdline_fixed_string_t set;
5835 	cmdline_fixed_string_t bonding;
5836 	cmdline_fixed_string_t mode;
5837 	uint8_t value;
5838 	portid_t port_id;
5839 };
5840 
5841 static void cmd_set_bonding_mode_parsed(void *parsed_result,
5842 		__rte_unused  struct cmdline *cl,
5843 		__rte_unused void *data)
5844 {
5845 	struct cmd_set_bonding_mode_result *res = parsed_result;
5846 	portid_t port_id = res->port_id;
5847 
5848 	/* Set the bonding mode for the relevant port. */
5849 	if (0 != rte_eth_bond_mode_set(port_id, res->value))
5850 		printf("\t Failed to set bonding mode for port = %d.\n", port_id);
5851 }
5852 
5853 cmdline_parse_token_string_t cmd_setbonding_mode_set =
5854 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result,
5855 		set, "set");
5856 cmdline_parse_token_string_t cmd_setbonding_mode_bonding =
5857 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result,
5858 		bonding, "bonding");
5859 cmdline_parse_token_string_t cmd_setbonding_mode_mode =
5860 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result,
5861 		mode, "mode");
5862 cmdline_parse_token_num_t cmd_setbonding_mode_value =
5863 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_mode_result,
5864 		value, UINT8);
5865 cmdline_parse_token_num_t cmd_setbonding_mode_port =
5866 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_mode_result,
5867 		port_id, UINT16);
5868 
5869 cmdline_parse_inst_t cmd_set_bonding_mode = {
5870 		.f = cmd_set_bonding_mode_parsed,
5871 		.help_str = "set bonding mode <mode_value> <port_id>: "
5872 			"Set the bonding mode for port_id",
5873 		.data = NULL,
5874 		.tokens = {
5875 				(void *) &cmd_setbonding_mode_set,
5876 				(void *) &cmd_setbonding_mode_bonding,
5877 				(void *) &cmd_setbonding_mode_mode,
5878 				(void *) &cmd_setbonding_mode_value,
5879 				(void *) &cmd_setbonding_mode_port,
5880 				NULL
5881 		}
5882 };
5883 
5884 /* *** SET BONDING SLOW_QUEUE SW/HW *** */
5885 struct cmd_set_bonding_lacp_dedicated_queues_result {
5886 	cmdline_fixed_string_t set;
5887 	cmdline_fixed_string_t bonding;
5888 	cmdline_fixed_string_t lacp;
5889 	cmdline_fixed_string_t dedicated_queues;
5890 	portid_t port_id;
5891 	cmdline_fixed_string_t mode;
5892 };
5893 
5894 static void cmd_set_bonding_lacp_dedicated_queues_parsed(void *parsed_result,
5895 		__rte_unused  struct cmdline *cl,
5896 		__rte_unused void *data)
5897 {
5898 	struct cmd_set_bonding_lacp_dedicated_queues_result *res = parsed_result;
5899 	portid_t port_id = res->port_id;
5900 	struct rte_port *port;
5901 
5902 	port = &ports[port_id];
5903 
5904 	/** Check if the port is not started **/
5905 	if (port->port_status != RTE_PORT_STOPPED) {
5906 		printf("Please stop port %d first\n", port_id);
5907 		return;
5908 	}
5909 
5910 	if (!strcmp(res->mode, "enable")) {
5911 		if (rte_eth_bond_8023ad_dedicated_queues_enable(port_id) == 0)
5912 			printf("Dedicate queues for LACP control packets"
5913 					" enabled\n");
5914 		else
5915 			printf("Enabling dedicate queues for LACP control "
5916 					"packets on port %d failed\n", port_id);
5917 	} else if (!strcmp(res->mode, "disable")) {
5918 		if (rte_eth_bond_8023ad_dedicated_queues_disable(port_id) == 0)
5919 			printf("Dedicated queues for LACP control packets "
5920 					"disabled\n");
5921 		else
5922 			printf("Disabling dedicated queues for LACP control "
5923 					"traffic on port %d failed\n", port_id);
5924 	}
5925 }
5926 
5927 cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_set =
5928 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
5929 		set, "set");
5930 cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_bonding =
5931 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
5932 		bonding, "bonding");
5933 cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_lacp =
5934 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
5935 		lacp, "lacp");
5936 cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_dedicated_queues =
5937 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
5938 		dedicated_queues, "dedicated_queues");
5939 cmdline_parse_token_num_t cmd_setbonding_lacp_dedicated_queues_port_id =
5940 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
5941 		port_id, UINT16);
5942 cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_mode =
5943 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
5944 		mode, "enable#disable");
5945 
5946 cmdline_parse_inst_t cmd_set_lacp_dedicated_queues = {
5947 		.f = cmd_set_bonding_lacp_dedicated_queues_parsed,
5948 		.help_str = "set bonding lacp dedicated_queues <port_id> "
5949 			"enable|disable: "
5950 			"Enable/disable dedicated queues for LACP control traffic for port_id",
5951 		.data = NULL,
5952 		.tokens = {
5953 			(void *)&cmd_setbonding_lacp_dedicated_queues_set,
5954 			(void *)&cmd_setbonding_lacp_dedicated_queues_bonding,
5955 			(void *)&cmd_setbonding_lacp_dedicated_queues_lacp,
5956 			(void *)&cmd_setbonding_lacp_dedicated_queues_dedicated_queues,
5957 			(void *)&cmd_setbonding_lacp_dedicated_queues_port_id,
5958 			(void *)&cmd_setbonding_lacp_dedicated_queues_mode,
5959 			NULL
5960 		}
5961 };
5962 
5963 /* *** SET BALANCE XMIT POLICY *** */
5964 struct cmd_set_bonding_balance_xmit_policy_result {
5965 	cmdline_fixed_string_t set;
5966 	cmdline_fixed_string_t bonding;
5967 	cmdline_fixed_string_t balance_xmit_policy;
5968 	portid_t port_id;
5969 	cmdline_fixed_string_t policy;
5970 };
5971 
5972 static void cmd_set_bonding_balance_xmit_policy_parsed(void *parsed_result,
5973 		__rte_unused  struct cmdline *cl,
5974 		__rte_unused void *data)
5975 {
5976 	struct cmd_set_bonding_balance_xmit_policy_result *res = parsed_result;
5977 	portid_t port_id = res->port_id;
5978 	uint8_t policy;
5979 
5980 	if (!strcmp(res->policy, "l2")) {
5981 		policy = BALANCE_XMIT_POLICY_LAYER2;
5982 	} else if (!strcmp(res->policy, "l23")) {
5983 		policy = BALANCE_XMIT_POLICY_LAYER23;
5984 	} else if (!strcmp(res->policy, "l34")) {
5985 		policy = BALANCE_XMIT_POLICY_LAYER34;
5986 	} else {
5987 		printf("\t Invalid xmit policy selection");
5988 		return;
5989 	}
5990 
5991 	/* Set the bonding mode for the relevant port. */
5992 	if (0 != rte_eth_bond_xmit_policy_set(port_id, policy)) {
5993 		printf("\t Failed to set bonding balance xmit policy for port = %d.\n",
5994 				port_id);
5995 	}
5996 }
5997 
5998 cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_set =
5999 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
6000 		set, "set");
6001 cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_bonding =
6002 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
6003 		bonding, "bonding");
6004 cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_balance_xmit_policy =
6005 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
6006 		balance_xmit_policy, "balance_xmit_policy");
6007 cmdline_parse_token_num_t cmd_setbonding_balance_xmit_policy_port =
6008 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
6009 		port_id, UINT16);
6010 cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_policy =
6011 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
6012 		policy, "l2#l23#l34");
6013 
6014 cmdline_parse_inst_t cmd_set_balance_xmit_policy = {
6015 		.f = cmd_set_bonding_balance_xmit_policy_parsed,
6016 		.help_str = "set bonding balance_xmit_policy <port_id> "
6017 			"l2|l23|l34: "
6018 			"Set the bonding balance_xmit_policy for port_id",
6019 		.data = NULL,
6020 		.tokens = {
6021 				(void *)&cmd_setbonding_balance_xmit_policy_set,
6022 				(void *)&cmd_setbonding_balance_xmit_policy_bonding,
6023 				(void *)&cmd_setbonding_balance_xmit_policy_balance_xmit_policy,
6024 				(void *)&cmd_setbonding_balance_xmit_policy_port,
6025 				(void *)&cmd_setbonding_balance_xmit_policy_policy,
6026 				NULL
6027 		}
6028 };
6029 
6030 /* *** SHOW NIC BONDING CONFIGURATION *** */
6031 struct cmd_show_bonding_config_result {
6032 	cmdline_fixed_string_t show;
6033 	cmdline_fixed_string_t bonding;
6034 	cmdline_fixed_string_t config;
6035 	portid_t port_id;
6036 };
6037 
6038 static void cmd_show_bonding_config_parsed(void *parsed_result,
6039 		__rte_unused  struct cmdline *cl,
6040 		__rte_unused void *data)
6041 {
6042 	struct cmd_show_bonding_config_result *res = parsed_result;
6043 	int bonding_mode, agg_mode;
6044 	portid_t slaves[RTE_MAX_ETHPORTS];
6045 	int num_slaves, num_active_slaves;
6046 	int primary_id;
6047 	int i;
6048 	portid_t port_id = res->port_id;
6049 
6050 	/* Display the bonding mode.*/
6051 	bonding_mode = rte_eth_bond_mode_get(port_id);
6052 	if (bonding_mode < 0) {
6053 		printf("\tFailed to get bonding mode for port = %d\n", port_id);
6054 		return;
6055 	} else
6056 		printf("\tBonding mode: %d\n", bonding_mode);
6057 
6058 	if (bonding_mode == BONDING_MODE_BALANCE) {
6059 		int balance_xmit_policy;
6060 
6061 		balance_xmit_policy = rte_eth_bond_xmit_policy_get(port_id);
6062 		if (balance_xmit_policy < 0) {
6063 			printf("\tFailed to get balance xmit policy for port = %d\n",
6064 					port_id);
6065 			return;
6066 		} else {
6067 			printf("\tBalance Xmit Policy: ");
6068 
6069 			switch (balance_xmit_policy) {
6070 			case BALANCE_XMIT_POLICY_LAYER2:
6071 				printf("BALANCE_XMIT_POLICY_LAYER2");
6072 				break;
6073 			case BALANCE_XMIT_POLICY_LAYER23:
6074 				printf("BALANCE_XMIT_POLICY_LAYER23");
6075 				break;
6076 			case BALANCE_XMIT_POLICY_LAYER34:
6077 				printf("BALANCE_XMIT_POLICY_LAYER34");
6078 				break;
6079 			}
6080 			printf("\n");
6081 		}
6082 	}
6083 
6084 	if (bonding_mode == BONDING_MODE_8023AD) {
6085 		agg_mode = rte_eth_bond_8023ad_agg_selection_get(port_id);
6086 		printf("\tIEEE802.3AD Aggregator Mode: ");
6087 		switch (agg_mode) {
6088 		case AGG_BANDWIDTH:
6089 			printf("bandwidth");
6090 			break;
6091 		case AGG_STABLE:
6092 			printf("stable");
6093 			break;
6094 		case AGG_COUNT:
6095 			printf("count");
6096 			break;
6097 		}
6098 		printf("\n");
6099 	}
6100 
6101 	num_slaves = rte_eth_bond_slaves_get(port_id, slaves, RTE_MAX_ETHPORTS);
6102 
6103 	if (num_slaves < 0) {
6104 		printf("\tFailed to get slave list for port = %d\n", port_id);
6105 		return;
6106 	}
6107 	if (num_slaves > 0) {
6108 		printf("\tSlaves (%d): [", num_slaves);
6109 		for (i = 0; i < num_slaves - 1; i++)
6110 			printf("%d ", slaves[i]);
6111 
6112 		printf("%d]\n", slaves[num_slaves - 1]);
6113 	} else {
6114 		printf("\tSlaves: []\n");
6115 
6116 	}
6117 
6118 	num_active_slaves = rte_eth_bond_active_slaves_get(port_id, slaves,
6119 			RTE_MAX_ETHPORTS);
6120 
6121 	if (num_active_slaves < 0) {
6122 		printf("\tFailed to get active slave list for port = %d\n", port_id);
6123 		return;
6124 	}
6125 	if (num_active_slaves > 0) {
6126 		printf("\tActive Slaves (%d): [", num_active_slaves);
6127 		for (i = 0; i < num_active_slaves - 1; i++)
6128 			printf("%d ", slaves[i]);
6129 
6130 		printf("%d]\n", slaves[num_active_slaves - 1]);
6131 
6132 	} else {
6133 		printf("\tActive Slaves: []\n");
6134 
6135 	}
6136 
6137 	primary_id = rte_eth_bond_primary_get(port_id);
6138 	if (primary_id < 0) {
6139 		printf("\tFailed to get primary slave for port = %d\n", port_id);
6140 		return;
6141 	} else
6142 		printf("\tPrimary: [%d]\n", primary_id);
6143 
6144 }
6145 
6146 cmdline_parse_token_string_t cmd_showbonding_config_show =
6147 TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result,
6148 		show, "show");
6149 cmdline_parse_token_string_t cmd_showbonding_config_bonding =
6150 TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result,
6151 		bonding, "bonding");
6152 cmdline_parse_token_string_t cmd_showbonding_config_config =
6153 TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result,
6154 		config, "config");
6155 cmdline_parse_token_num_t cmd_showbonding_config_port =
6156 TOKEN_NUM_INITIALIZER(struct cmd_show_bonding_config_result,
6157 		port_id, UINT16);
6158 
6159 cmdline_parse_inst_t cmd_show_bonding_config = {
6160 		.f = cmd_show_bonding_config_parsed,
6161 		.help_str = "show bonding config <port_id>: "
6162 			"Show the bonding config for port_id",
6163 		.data = NULL,
6164 		.tokens = {
6165 				(void *)&cmd_showbonding_config_show,
6166 				(void *)&cmd_showbonding_config_bonding,
6167 				(void *)&cmd_showbonding_config_config,
6168 				(void *)&cmd_showbonding_config_port,
6169 				NULL
6170 		}
6171 };
6172 
6173 /* *** SET BONDING PRIMARY *** */
6174 struct cmd_set_bonding_primary_result {
6175 	cmdline_fixed_string_t set;
6176 	cmdline_fixed_string_t bonding;
6177 	cmdline_fixed_string_t primary;
6178 	portid_t slave_id;
6179 	portid_t port_id;
6180 };
6181 
6182 static void cmd_set_bonding_primary_parsed(void *parsed_result,
6183 		__rte_unused  struct cmdline *cl,
6184 		__rte_unused void *data)
6185 {
6186 	struct cmd_set_bonding_primary_result *res = parsed_result;
6187 	portid_t master_port_id = res->port_id;
6188 	portid_t slave_port_id = res->slave_id;
6189 
6190 	/* Set the primary slave for a bonded device. */
6191 	if (0 != rte_eth_bond_primary_set(master_port_id, slave_port_id)) {
6192 		printf("\t Failed to set primary slave for port = %d.\n",
6193 				master_port_id);
6194 		return;
6195 	}
6196 	init_port_config();
6197 }
6198 
6199 cmdline_parse_token_string_t cmd_setbonding_primary_set =
6200 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result,
6201 		set, "set");
6202 cmdline_parse_token_string_t cmd_setbonding_primary_bonding =
6203 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result,
6204 		bonding, "bonding");
6205 cmdline_parse_token_string_t cmd_setbonding_primary_primary =
6206 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result,
6207 		primary, "primary");
6208 cmdline_parse_token_num_t cmd_setbonding_primary_slave =
6209 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_primary_result,
6210 		slave_id, UINT16);
6211 cmdline_parse_token_num_t cmd_setbonding_primary_port =
6212 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_primary_result,
6213 		port_id, UINT16);
6214 
6215 cmdline_parse_inst_t cmd_set_bonding_primary = {
6216 		.f = cmd_set_bonding_primary_parsed,
6217 		.help_str = "set bonding primary <slave_id> <port_id>: "
6218 			"Set the primary slave for port_id",
6219 		.data = NULL,
6220 		.tokens = {
6221 				(void *)&cmd_setbonding_primary_set,
6222 				(void *)&cmd_setbonding_primary_bonding,
6223 				(void *)&cmd_setbonding_primary_primary,
6224 				(void *)&cmd_setbonding_primary_slave,
6225 				(void *)&cmd_setbonding_primary_port,
6226 				NULL
6227 		}
6228 };
6229 
6230 /* *** ADD SLAVE *** */
6231 struct cmd_add_bonding_slave_result {
6232 	cmdline_fixed_string_t add;
6233 	cmdline_fixed_string_t bonding;
6234 	cmdline_fixed_string_t slave;
6235 	portid_t slave_id;
6236 	portid_t port_id;
6237 };
6238 
6239 static void cmd_add_bonding_slave_parsed(void *parsed_result,
6240 		__rte_unused  struct cmdline *cl,
6241 		__rte_unused void *data)
6242 {
6243 	struct cmd_add_bonding_slave_result *res = parsed_result;
6244 	portid_t master_port_id = res->port_id;
6245 	portid_t slave_port_id = res->slave_id;
6246 
6247 	/* add the slave for a bonded device. */
6248 	if (0 != rte_eth_bond_slave_add(master_port_id, slave_port_id)) {
6249 		printf("\t Failed to add slave %d to master port = %d.\n",
6250 				slave_port_id, master_port_id);
6251 		return;
6252 	}
6253 	init_port_config();
6254 	set_port_slave_flag(slave_port_id);
6255 }
6256 
6257 cmdline_parse_token_string_t cmd_addbonding_slave_add =
6258 TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result,
6259 		add, "add");
6260 cmdline_parse_token_string_t cmd_addbonding_slave_bonding =
6261 TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result,
6262 		bonding, "bonding");
6263 cmdline_parse_token_string_t cmd_addbonding_slave_slave =
6264 TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result,
6265 		slave, "slave");
6266 cmdline_parse_token_num_t cmd_addbonding_slave_slaveid =
6267 TOKEN_NUM_INITIALIZER(struct cmd_add_bonding_slave_result,
6268 		slave_id, UINT16);
6269 cmdline_parse_token_num_t cmd_addbonding_slave_port =
6270 TOKEN_NUM_INITIALIZER(struct cmd_add_bonding_slave_result,
6271 		port_id, UINT16);
6272 
6273 cmdline_parse_inst_t cmd_add_bonding_slave = {
6274 		.f = cmd_add_bonding_slave_parsed,
6275 		.help_str = "add bonding slave <slave_id> <port_id>: "
6276 			"Add a slave device to a bonded device",
6277 		.data = NULL,
6278 		.tokens = {
6279 				(void *)&cmd_addbonding_slave_add,
6280 				(void *)&cmd_addbonding_slave_bonding,
6281 				(void *)&cmd_addbonding_slave_slave,
6282 				(void *)&cmd_addbonding_slave_slaveid,
6283 				(void *)&cmd_addbonding_slave_port,
6284 				NULL
6285 		}
6286 };
6287 
6288 /* *** REMOVE SLAVE *** */
6289 struct cmd_remove_bonding_slave_result {
6290 	cmdline_fixed_string_t remove;
6291 	cmdline_fixed_string_t bonding;
6292 	cmdline_fixed_string_t slave;
6293 	portid_t slave_id;
6294 	portid_t port_id;
6295 };
6296 
6297 static void cmd_remove_bonding_slave_parsed(void *parsed_result,
6298 		__rte_unused  struct cmdline *cl,
6299 		__rte_unused void *data)
6300 {
6301 	struct cmd_remove_bonding_slave_result *res = parsed_result;
6302 	portid_t master_port_id = res->port_id;
6303 	portid_t slave_port_id = res->slave_id;
6304 
6305 	/* remove the slave from a bonded device. */
6306 	if (0 != rte_eth_bond_slave_remove(master_port_id, slave_port_id)) {
6307 		printf("\t Failed to remove slave %d from master port = %d.\n",
6308 				slave_port_id, master_port_id);
6309 		return;
6310 	}
6311 	init_port_config();
6312 	clear_port_slave_flag(slave_port_id);
6313 }
6314 
6315 cmdline_parse_token_string_t cmd_removebonding_slave_remove =
6316 		TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result,
6317 				remove, "remove");
6318 cmdline_parse_token_string_t cmd_removebonding_slave_bonding =
6319 		TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result,
6320 				bonding, "bonding");
6321 cmdline_parse_token_string_t cmd_removebonding_slave_slave =
6322 		TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result,
6323 				slave, "slave");
6324 cmdline_parse_token_num_t cmd_removebonding_slave_slaveid =
6325 		TOKEN_NUM_INITIALIZER(struct cmd_remove_bonding_slave_result,
6326 				slave_id, UINT16);
6327 cmdline_parse_token_num_t cmd_removebonding_slave_port =
6328 		TOKEN_NUM_INITIALIZER(struct cmd_remove_bonding_slave_result,
6329 				port_id, UINT16);
6330 
6331 cmdline_parse_inst_t cmd_remove_bonding_slave = {
6332 		.f = cmd_remove_bonding_slave_parsed,
6333 		.help_str = "remove bonding slave <slave_id> <port_id>: "
6334 			"Remove a slave device from a bonded device",
6335 		.data = NULL,
6336 		.tokens = {
6337 				(void *)&cmd_removebonding_slave_remove,
6338 				(void *)&cmd_removebonding_slave_bonding,
6339 				(void *)&cmd_removebonding_slave_slave,
6340 				(void *)&cmd_removebonding_slave_slaveid,
6341 				(void *)&cmd_removebonding_slave_port,
6342 				NULL
6343 		}
6344 };
6345 
6346 /* *** CREATE BONDED DEVICE *** */
6347 struct cmd_create_bonded_device_result {
6348 	cmdline_fixed_string_t create;
6349 	cmdline_fixed_string_t bonded;
6350 	cmdline_fixed_string_t device;
6351 	uint8_t mode;
6352 	uint8_t socket;
6353 };
6354 
6355 static int bond_dev_num = 0;
6356 
6357 static void cmd_create_bonded_device_parsed(void *parsed_result,
6358 		__rte_unused  struct cmdline *cl,
6359 		__rte_unused void *data)
6360 {
6361 	struct cmd_create_bonded_device_result *res = parsed_result;
6362 	char ethdev_name[RTE_ETH_NAME_MAX_LEN];
6363 	int port_id;
6364 	int ret;
6365 
6366 	if (test_done == 0) {
6367 		printf("Please stop forwarding first\n");
6368 		return;
6369 	}
6370 
6371 	snprintf(ethdev_name, RTE_ETH_NAME_MAX_LEN, "net_bonding_testpmd_%d",
6372 			bond_dev_num++);
6373 
6374 	/* Create a new bonded device. */
6375 	port_id = rte_eth_bond_create(ethdev_name, res->mode, res->socket);
6376 	if (port_id < 0) {
6377 		printf("\t Failed to create bonded device.\n");
6378 		return;
6379 	} else {
6380 		printf("Created new bonded device %s on (port %d).\n", ethdev_name,
6381 				port_id);
6382 
6383 		/* Update number of ports */
6384 		nb_ports = rte_eth_dev_count_avail();
6385 		reconfig(port_id, res->socket);
6386 		ret = rte_eth_promiscuous_enable(port_id);
6387 		if (ret != 0)
6388 			printf("Failed to enable promiscuous mode for port %u: %s - ignore\n",
6389 				port_id, rte_strerror(-ret));
6390 
6391 		ports[port_id].need_setup = 0;
6392 		ports[port_id].port_status = RTE_PORT_STOPPED;
6393 	}
6394 
6395 }
6396 
6397 cmdline_parse_token_string_t cmd_createbonded_device_create =
6398 		TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result,
6399 				create, "create");
6400 cmdline_parse_token_string_t cmd_createbonded_device_bonded =
6401 		TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result,
6402 				bonded, "bonded");
6403 cmdline_parse_token_string_t cmd_createbonded_device_device =
6404 		TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result,
6405 				device, "device");
6406 cmdline_parse_token_num_t cmd_createbonded_device_mode =
6407 		TOKEN_NUM_INITIALIZER(struct cmd_create_bonded_device_result,
6408 				mode, UINT8);
6409 cmdline_parse_token_num_t cmd_createbonded_device_socket =
6410 		TOKEN_NUM_INITIALIZER(struct cmd_create_bonded_device_result,
6411 				socket, UINT8);
6412 
6413 cmdline_parse_inst_t cmd_create_bonded_device = {
6414 		.f = cmd_create_bonded_device_parsed,
6415 		.help_str = "create bonded device <mode> <socket>: "
6416 			"Create a new bonded device with specific bonding mode and socket",
6417 		.data = NULL,
6418 		.tokens = {
6419 				(void *)&cmd_createbonded_device_create,
6420 				(void *)&cmd_createbonded_device_bonded,
6421 				(void *)&cmd_createbonded_device_device,
6422 				(void *)&cmd_createbonded_device_mode,
6423 				(void *)&cmd_createbonded_device_socket,
6424 				NULL
6425 		}
6426 };
6427 
6428 /* *** SET MAC ADDRESS IN BONDED DEVICE *** */
6429 struct cmd_set_bond_mac_addr_result {
6430 	cmdline_fixed_string_t set;
6431 	cmdline_fixed_string_t bonding;
6432 	cmdline_fixed_string_t mac_addr;
6433 	uint16_t port_num;
6434 	struct rte_ether_addr address;
6435 };
6436 
6437 static void cmd_set_bond_mac_addr_parsed(void *parsed_result,
6438 		__rte_unused  struct cmdline *cl,
6439 		__rte_unused void *data)
6440 {
6441 	struct cmd_set_bond_mac_addr_result *res = parsed_result;
6442 	int ret;
6443 
6444 	if (port_id_is_invalid(res->port_num, ENABLED_WARN))
6445 		return;
6446 
6447 	ret = rte_eth_bond_mac_address_set(res->port_num, &res->address);
6448 
6449 	/* check the return value and print it if is < 0 */
6450 	if (ret < 0)
6451 		printf("set_bond_mac_addr error: (%s)\n", strerror(-ret));
6452 }
6453 
6454 cmdline_parse_token_string_t cmd_set_bond_mac_addr_set =
6455 		TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, set, "set");
6456 cmdline_parse_token_string_t cmd_set_bond_mac_addr_bonding =
6457 		TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, bonding,
6458 				"bonding");
6459 cmdline_parse_token_string_t cmd_set_bond_mac_addr_mac =
6460 		TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, mac_addr,
6461 				"mac_addr");
6462 cmdline_parse_token_num_t cmd_set_bond_mac_addr_portnum =
6463 		TOKEN_NUM_INITIALIZER(struct cmd_set_bond_mac_addr_result,
6464 				port_num, UINT16);
6465 cmdline_parse_token_etheraddr_t cmd_set_bond_mac_addr_addr =
6466 		TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_bond_mac_addr_result, address);
6467 
6468 cmdline_parse_inst_t cmd_set_bond_mac_addr = {
6469 		.f = cmd_set_bond_mac_addr_parsed,
6470 		.data = (void *) 0,
6471 		.help_str = "set bonding mac_addr <port_id> <mac_addr>",
6472 		.tokens = {
6473 				(void *)&cmd_set_bond_mac_addr_set,
6474 				(void *)&cmd_set_bond_mac_addr_bonding,
6475 				(void *)&cmd_set_bond_mac_addr_mac,
6476 				(void *)&cmd_set_bond_mac_addr_portnum,
6477 				(void *)&cmd_set_bond_mac_addr_addr,
6478 				NULL
6479 		}
6480 };
6481 
6482 
6483 /* *** SET LINK STATUS MONITORING POLLING PERIOD ON BONDED DEVICE *** */
6484 struct cmd_set_bond_mon_period_result {
6485 	cmdline_fixed_string_t set;
6486 	cmdline_fixed_string_t bonding;
6487 	cmdline_fixed_string_t mon_period;
6488 	uint16_t port_num;
6489 	uint32_t period_ms;
6490 };
6491 
6492 static void cmd_set_bond_mon_period_parsed(void *parsed_result,
6493 		__rte_unused  struct cmdline *cl,
6494 		__rte_unused void *data)
6495 {
6496 	struct cmd_set_bond_mon_period_result *res = parsed_result;
6497 	int ret;
6498 
6499 	ret = rte_eth_bond_link_monitoring_set(res->port_num, res->period_ms);
6500 
6501 	/* check the return value and print it if is < 0 */
6502 	if (ret < 0)
6503 		printf("set_bond_mac_addr error: (%s)\n", strerror(-ret));
6504 }
6505 
6506 cmdline_parse_token_string_t cmd_set_bond_mon_period_set =
6507 		TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mon_period_result,
6508 				set, "set");
6509 cmdline_parse_token_string_t cmd_set_bond_mon_period_bonding =
6510 		TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mon_period_result,
6511 				bonding, "bonding");
6512 cmdline_parse_token_string_t cmd_set_bond_mon_period_mon_period =
6513 		TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mon_period_result,
6514 				mon_period,	"mon_period");
6515 cmdline_parse_token_num_t cmd_set_bond_mon_period_portnum =
6516 		TOKEN_NUM_INITIALIZER(struct cmd_set_bond_mon_period_result,
6517 				port_num, UINT16);
6518 cmdline_parse_token_num_t cmd_set_bond_mon_period_period_ms =
6519 		TOKEN_NUM_INITIALIZER(struct cmd_set_bond_mon_period_result,
6520 				period_ms, UINT32);
6521 
6522 cmdline_parse_inst_t cmd_set_bond_mon_period = {
6523 		.f = cmd_set_bond_mon_period_parsed,
6524 		.data = (void *) 0,
6525 		.help_str = "set bonding mon_period <port_id> <period_ms>",
6526 		.tokens = {
6527 				(void *)&cmd_set_bond_mon_period_set,
6528 				(void *)&cmd_set_bond_mon_period_bonding,
6529 				(void *)&cmd_set_bond_mon_period_mon_period,
6530 				(void *)&cmd_set_bond_mon_period_portnum,
6531 				(void *)&cmd_set_bond_mon_period_period_ms,
6532 				NULL
6533 		}
6534 };
6535 
6536 
6537 
6538 struct cmd_set_bonding_agg_mode_policy_result {
6539 	cmdline_fixed_string_t set;
6540 	cmdline_fixed_string_t bonding;
6541 	cmdline_fixed_string_t agg_mode;
6542 	uint16_t port_num;
6543 	cmdline_fixed_string_t policy;
6544 };
6545 
6546 
6547 static void
6548 cmd_set_bonding_agg_mode(void *parsed_result,
6549 		__rte_unused struct cmdline *cl,
6550 		__rte_unused void *data)
6551 {
6552 	struct cmd_set_bonding_agg_mode_policy_result *res = parsed_result;
6553 	uint8_t policy = AGG_BANDWIDTH;
6554 
6555 	if (!strcmp(res->policy, "bandwidth"))
6556 		policy = AGG_BANDWIDTH;
6557 	else if (!strcmp(res->policy, "stable"))
6558 		policy = AGG_STABLE;
6559 	else if (!strcmp(res->policy, "count"))
6560 		policy = AGG_COUNT;
6561 
6562 	rte_eth_bond_8023ad_agg_selection_set(res->port_num, policy);
6563 }
6564 
6565 
6566 cmdline_parse_token_string_t cmd_set_bonding_agg_mode_set =
6567 	TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result,
6568 				set, "set");
6569 cmdline_parse_token_string_t cmd_set_bonding_agg_mode_bonding =
6570 	TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result,
6571 				bonding, "bonding");
6572 
6573 cmdline_parse_token_string_t cmd_set_bonding_agg_mode_agg_mode =
6574 	TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result,
6575 				agg_mode, "agg_mode");
6576 
6577 cmdline_parse_token_num_t cmd_set_bonding_agg_mode_portnum =
6578 	TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result,
6579 				port_num, UINT16);
6580 
6581 cmdline_parse_token_string_t cmd_set_bonding_agg_mode_policy_string =
6582 	TOKEN_STRING_INITIALIZER(
6583 			struct cmd_set_bonding_balance_xmit_policy_result,
6584 		policy, "stable#bandwidth#count");
6585 
6586 cmdline_parse_inst_t cmd_set_bonding_agg_mode_policy = {
6587 	.f = cmd_set_bonding_agg_mode,
6588 	.data = (void *) 0,
6589 	.help_str = "set bonding mode IEEE802.3AD aggregator policy <port_id> <agg_name>",
6590 	.tokens = {
6591 			(void *)&cmd_set_bonding_agg_mode_set,
6592 			(void *)&cmd_set_bonding_agg_mode_bonding,
6593 			(void *)&cmd_set_bonding_agg_mode_agg_mode,
6594 			(void *)&cmd_set_bonding_agg_mode_portnum,
6595 			(void *)&cmd_set_bonding_agg_mode_policy_string,
6596 			NULL
6597 		}
6598 };
6599 
6600 
6601 #endif /* RTE_NET_BOND */
6602 
6603 /* *** SET FORWARDING MODE *** */
6604 struct cmd_set_fwd_mode_result {
6605 	cmdline_fixed_string_t set;
6606 	cmdline_fixed_string_t fwd;
6607 	cmdline_fixed_string_t mode;
6608 };
6609 
6610 static void cmd_set_fwd_mode_parsed(void *parsed_result,
6611 				    __rte_unused struct cmdline *cl,
6612 				    __rte_unused void *data)
6613 {
6614 	struct cmd_set_fwd_mode_result *res = parsed_result;
6615 
6616 	retry_enabled = 0;
6617 	set_pkt_forwarding_mode(res->mode);
6618 }
6619 
6620 cmdline_parse_token_string_t cmd_setfwd_set =
6621 	TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_mode_result, set, "set");
6622 cmdline_parse_token_string_t cmd_setfwd_fwd =
6623 	TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_mode_result, fwd, "fwd");
6624 cmdline_parse_token_string_t cmd_setfwd_mode =
6625 	TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_mode_result, mode,
6626 		"" /* defined at init */);
6627 
6628 cmdline_parse_inst_t cmd_set_fwd_mode = {
6629 	.f = cmd_set_fwd_mode_parsed,
6630 	.data = NULL,
6631 	.help_str = NULL, /* defined at init */
6632 	.tokens = {
6633 		(void *)&cmd_setfwd_set,
6634 		(void *)&cmd_setfwd_fwd,
6635 		(void *)&cmd_setfwd_mode,
6636 		NULL,
6637 	},
6638 };
6639 
6640 static void cmd_set_fwd_mode_init(void)
6641 {
6642 	char *modes, *c;
6643 	static char token[128];
6644 	static char help[256];
6645 	cmdline_parse_token_string_t *token_struct;
6646 
6647 	modes = list_pkt_forwarding_modes();
6648 	snprintf(help, sizeof(help), "set fwd %s: "
6649 		"Set packet forwarding mode", modes);
6650 	cmd_set_fwd_mode.help_str = help;
6651 
6652 	/* string token separator is # */
6653 	for (c = token; *modes != '\0'; modes++)
6654 		if (*modes == '|')
6655 			*c++ = '#';
6656 		else
6657 			*c++ = *modes;
6658 	token_struct = (cmdline_parse_token_string_t*)cmd_set_fwd_mode.tokens[2];
6659 	token_struct->string_data.str = token;
6660 }
6661 
6662 /* *** SET RETRY FORWARDING MODE *** */
6663 struct cmd_set_fwd_retry_mode_result {
6664 	cmdline_fixed_string_t set;
6665 	cmdline_fixed_string_t fwd;
6666 	cmdline_fixed_string_t mode;
6667 	cmdline_fixed_string_t retry;
6668 };
6669 
6670 static void cmd_set_fwd_retry_mode_parsed(void *parsed_result,
6671 			    __rte_unused struct cmdline *cl,
6672 			    __rte_unused void *data)
6673 {
6674 	struct cmd_set_fwd_retry_mode_result *res = parsed_result;
6675 
6676 	retry_enabled = 1;
6677 	set_pkt_forwarding_mode(res->mode);
6678 }
6679 
6680 cmdline_parse_token_string_t cmd_setfwd_retry_set =
6681 	TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_retry_mode_result,
6682 			set, "set");
6683 cmdline_parse_token_string_t cmd_setfwd_retry_fwd =
6684 	TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_retry_mode_result,
6685 			fwd, "fwd");
6686 cmdline_parse_token_string_t cmd_setfwd_retry_mode =
6687 	TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_retry_mode_result,
6688 			mode,
6689 		"" /* defined at init */);
6690 cmdline_parse_token_string_t cmd_setfwd_retry_retry =
6691 	TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_retry_mode_result,
6692 			retry, "retry");
6693 
6694 cmdline_parse_inst_t cmd_set_fwd_retry_mode = {
6695 	.f = cmd_set_fwd_retry_mode_parsed,
6696 	.data = NULL,
6697 	.help_str = NULL, /* defined at init */
6698 	.tokens = {
6699 		(void *)&cmd_setfwd_retry_set,
6700 		(void *)&cmd_setfwd_retry_fwd,
6701 		(void *)&cmd_setfwd_retry_mode,
6702 		(void *)&cmd_setfwd_retry_retry,
6703 		NULL,
6704 	},
6705 };
6706 
6707 static void cmd_set_fwd_retry_mode_init(void)
6708 {
6709 	char *modes, *c;
6710 	static char token[128];
6711 	static char help[256];
6712 	cmdline_parse_token_string_t *token_struct;
6713 
6714 	modes = list_pkt_forwarding_retry_modes();
6715 	snprintf(help, sizeof(help), "set fwd %s retry: "
6716 		"Set packet forwarding mode with retry", modes);
6717 	cmd_set_fwd_retry_mode.help_str = help;
6718 
6719 	/* string token separator is # */
6720 	for (c = token; *modes != '\0'; modes++)
6721 		if (*modes == '|')
6722 			*c++ = '#';
6723 		else
6724 			*c++ = *modes;
6725 	token_struct = (cmdline_parse_token_string_t *)
6726 		cmd_set_fwd_retry_mode.tokens[2];
6727 	token_struct->string_data.str = token;
6728 }
6729 
6730 /* *** SET BURST TX DELAY TIME RETRY NUMBER *** */
6731 struct cmd_set_burst_tx_retry_result {
6732 	cmdline_fixed_string_t set;
6733 	cmdline_fixed_string_t burst;
6734 	cmdline_fixed_string_t tx;
6735 	cmdline_fixed_string_t delay;
6736 	uint32_t time;
6737 	cmdline_fixed_string_t retry;
6738 	uint32_t retry_num;
6739 };
6740 
6741 static void cmd_set_burst_tx_retry_parsed(void *parsed_result,
6742 					__rte_unused struct cmdline *cl,
6743 					__rte_unused void *data)
6744 {
6745 	struct cmd_set_burst_tx_retry_result *res = parsed_result;
6746 
6747 	if (!strcmp(res->set, "set") && !strcmp(res->burst, "burst")
6748 		&& !strcmp(res->tx, "tx")) {
6749 		if (!strcmp(res->delay, "delay"))
6750 			burst_tx_delay_time = res->time;
6751 		if (!strcmp(res->retry, "retry"))
6752 			burst_tx_retry_num = res->retry_num;
6753 	}
6754 
6755 }
6756 
6757 cmdline_parse_token_string_t cmd_set_burst_tx_retry_set =
6758 	TOKEN_STRING_INITIALIZER(struct cmd_set_burst_tx_retry_result, set, "set");
6759 cmdline_parse_token_string_t cmd_set_burst_tx_retry_burst =
6760 	TOKEN_STRING_INITIALIZER(struct cmd_set_burst_tx_retry_result, burst,
6761 				 "burst");
6762 cmdline_parse_token_string_t cmd_set_burst_tx_retry_tx =
6763 	TOKEN_STRING_INITIALIZER(struct cmd_set_burst_tx_retry_result, tx, "tx");
6764 cmdline_parse_token_string_t cmd_set_burst_tx_retry_delay =
6765 	TOKEN_STRING_INITIALIZER(struct cmd_set_burst_tx_retry_result, delay, "delay");
6766 cmdline_parse_token_num_t cmd_set_burst_tx_retry_time =
6767 	TOKEN_NUM_INITIALIZER(struct cmd_set_burst_tx_retry_result, time, UINT32);
6768 cmdline_parse_token_string_t cmd_set_burst_tx_retry_retry =
6769 	TOKEN_STRING_INITIALIZER(struct cmd_set_burst_tx_retry_result, retry, "retry");
6770 cmdline_parse_token_num_t cmd_set_burst_tx_retry_retry_num =
6771 	TOKEN_NUM_INITIALIZER(struct cmd_set_burst_tx_retry_result, retry_num, UINT32);
6772 
6773 cmdline_parse_inst_t cmd_set_burst_tx_retry = {
6774 	.f = cmd_set_burst_tx_retry_parsed,
6775 	.help_str = "set burst tx delay <delay_usec> retry <num_retry>",
6776 	.tokens = {
6777 		(void *)&cmd_set_burst_tx_retry_set,
6778 		(void *)&cmd_set_burst_tx_retry_burst,
6779 		(void *)&cmd_set_burst_tx_retry_tx,
6780 		(void *)&cmd_set_burst_tx_retry_delay,
6781 		(void *)&cmd_set_burst_tx_retry_time,
6782 		(void *)&cmd_set_burst_tx_retry_retry,
6783 		(void *)&cmd_set_burst_tx_retry_retry_num,
6784 		NULL,
6785 	},
6786 };
6787 
6788 /* *** SET PROMISC MODE *** */
6789 struct cmd_set_promisc_mode_result {
6790 	cmdline_fixed_string_t set;
6791 	cmdline_fixed_string_t promisc;
6792 	cmdline_fixed_string_t port_all; /* valid if "allports" argument == 1 */
6793 	uint16_t port_num;               /* valid if "allports" argument == 0 */
6794 	cmdline_fixed_string_t mode;
6795 };
6796 
6797 static void cmd_set_promisc_mode_parsed(void *parsed_result,
6798 					__rte_unused struct cmdline *cl,
6799 					void *allports)
6800 {
6801 	struct cmd_set_promisc_mode_result *res = parsed_result;
6802 	int enable;
6803 	portid_t i;
6804 
6805 	if (!strcmp(res->mode, "on"))
6806 		enable = 1;
6807 	else
6808 		enable = 0;
6809 
6810 	/* all ports */
6811 	if (allports) {
6812 		RTE_ETH_FOREACH_DEV(i)
6813 			eth_set_promisc_mode(i, enable);
6814 	} else {
6815 		eth_set_promisc_mode(res->port_num, enable);
6816 	}
6817 }
6818 
6819 cmdline_parse_token_string_t cmd_setpromisc_set =
6820 	TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, set, "set");
6821 cmdline_parse_token_string_t cmd_setpromisc_promisc =
6822 	TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, promisc,
6823 				 "promisc");
6824 cmdline_parse_token_string_t cmd_setpromisc_portall =
6825 	TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, port_all,
6826 				 "all");
6827 cmdline_parse_token_num_t cmd_setpromisc_portnum =
6828 	TOKEN_NUM_INITIALIZER(struct cmd_set_promisc_mode_result, port_num,
6829 			      UINT16);
6830 cmdline_parse_token_string_t cmd_setpromisc_mode =
6831 	TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, mode,
6832 				 "on#off");
6833 
6834 cmdline_parse_inst_t cmd_set_promisc_mode_all = {
6835 	.f = cmd_set_promisc_mode_parsed,
6836 	.data = (void *)1,
6837 	.help_str = "set promisc all on|off: Set promisc mode for all ports",
6838 	.tokens = {
6839 		(void *)&cmd_setpromisc_set,
6840 		(void *)&cmd_setpromisc_promisc,
6841 		(void *)&cmd_setpromisc_portall,
6842 		(void *)&cmd_setpromisc_mode,
6843 		NULL,
6844 	},
6845 };
6846 
6847 cmdline_parse_inst_t cmd_set_promisc_mode_one = {
6848 	.f = cmd_set_promisc_mode_parsed,
6849 	.data = (void *)0,
6850 	.help_str = "set promisc <port_id> on|off: Set promisc mode on port_id",
6851 	.tokens = {
6852 		(void *)&cmd_setpromisc_set,
6853 		(void *)&cmd_setpromisc_promisc,
6854 		(void *)&cmd_setpromisc_portnum,
6855 		(void *)&cmd_setpromisc_mode,
6856 		NULL,
6857 	},
6858 };
6859 
6860 /* *** SET ALLMULTI MODE *** */
6861 struct cmd_set_allmulti_mode_result {
6862 	cmdline_fixed_string_t set;
6863 	cmdline_fixed_string_t allmulti;
6864 	cmdline_fixed_string_t port_all; /* valid if "allports" argument == 1 */
6865 	uint16_t port_num;               /* valid if "allports" argument == 0 */
6866 	cmdline_fixed_string_t mode;
6867 };
6868 
6869 static void cmd_set_allmulti_mode_parsed(void *parsed_result,
6870 					__rte_unused struct cmdline *cl,
6871 					void *allports)
6872 {
6873 	struct cmd_set_allmulti_mode_result *res = parsed_result;
6874 	int enable;
6875 	portid_t i;
6876 
6877 	if (!strcmp(res->mode, "on"))
6878 		enable = 1;
6879 	else
6880 		enable = 0;
6881 
6882 	/* all ports */
6883 	if (allports) {
6884 		RTE_ETH_FOREACH_DEV(i) {
6885 			eth_set_allmulticast_mode(i, enable);
6886 		}
6887 	}
6888 	else {
6889 		eth_set_allmulticast_mode(res->port_num, enable);
6890 	}
6891 }
6892 
6893 cmdline_parse_token_string_t cmd_setallmulti_set =
6894 	TOKEN_STRING_INITIALIZER(struct cmd_set_allmulti_mode_result, set, "set");
6895 cmdline_parse_token_string_t cmd_setallmulti_allmulti =
6896 	TOKEN_STRING_INITIALIZER(struct cmd_set_allmulti_mode_result, allmulti,
6897 				 "allmulti");
6898 cmdline_parse_token_string_t cmd_setallmulti_portall =
6899 	TOKEN_STRING_INITIALIZER(struct cmd_set_allmulti_mode_result, port_all,
6900 				 "all");
6901 cmdline_parse_token_num_t cmd_setallmulti_portnum =
6902 	TOKEN_NUM_INITIALIZER(struct cmd_set_allmulti_mode_result, port_num,
6903 			      UINT16);
6904 cmdline_parse_token_string_t cmd_setallmulti_mode =
6905 	TOKEN_STRING_INITIALIZER(struct cmd_set_allmulti_mode_result, mode,
6906 				 "on#off");
6907 
6908 cmdline_parse_inst_t cmd_set_allmulti_mode_all = {
6909 	.f = cmd_set_allmulti_mode_parsed,
6910 	.data = (void *)1,
6911 	.help_str = "set allmulti all on|off: Set allmulti mode for all ports",
6912 	.tokens = {
6913 		(void *)&cmd_setallmulti_set,
6914 		(void *)&cmd_setallmulti_allmulti,
6915 		(void *)&cmd_setallmulti_portall,
6916 		(void *)&cmd_setallmulti_mode,
6917 		NULL,
6918 	},
6919 };
6920 
6921 cmdline_parse_inst_t cmd_set_allmulti_mode_one = {
6922 	.f = cmd_set_allmulti_mode_parsed,
6923 	.data = (void *)0,
6924 	.help_str = "set allmulti <port_id> on|off: "
6925 		"Set allmulti mode on port_id",
6926 	.tokens = {
6927 		(void *)&cmd_setallmulti_set,
6928 		(void *)&cmd_setallmulti_allmulti,
6929 		(void *)&cmd_setallmulti_portnum,
6930 		(void *)&cmd_setallmulti_mode,
6931 		NULL,
6932 	},
6933 };
6934 
6935 /* *** SETUP ETHERNET LINK FLOW CONTROL *** */
6936 struct cmd_link_flow_ctrl_set_result {
6937 	cmdline_fixed_string_t set;
6938 	cmdline_fixed_string_t flow_ctrl;
6939 	cmdline_fixed_string_t rx;
6940 	cmdline_fixed_string_t rx_lfc_mode;
6941 	cmdline_fixed_string_t tx;
6942 	cmdline_fixed_string_t tx_lfc_mode;
6943 	cmdline_fixed_string_t mac_ctrl_frame_fwd;
6944 	cmdline_fixed_string_t mac_ctrl_frame_fwd_mode;
6945 	cmdline_fixed_string_t autoneg_str;
6946 	cmdline_fixed_string_t autoneg;
6947 	cmdline_fixed_string_t hw_str;
6948 	uint32_t high_water;
6949 	cmdline_fixed_string_t lw_str;
6950 	uint32_t low_water;
6951 	cmdline_fixed_string_t pt_str;
6952 	uint16_t pause_time;
6953 	cmdline_fixed_string_t xon_str;
6954 	uint16_t send_xon;
6955 	portid_t port_id;
6956 };
6957 
6958 cmdline_parse_token_string_t cmd_lfc_set_set =
6959 	TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
6960 				set, "set");
6961 cmdline_parse_token_string_t cmd_lfc_set_flow_ctrl =
6962 	TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
6963 				flow_ctrl, "flow_ctrl");
6964 cmdline_parse_token_string_t cmd_lfc_set_rx =
6965 	TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
6966 				rx, "rx");
6967 cmdline_parse_token_string_t cmd_lfc_set_rx_mode =
6968 	TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
6969 				rx_lfc_mode, "on#off");
6970 cmdline_parse_token_string_t cmd_lfc_set_tx =
6971 	TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
6972 				tx, "tx");
6973 cmdline_parse_token_string_t cmd_lfc_set_tx_mode =
6974 	TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
6975 				tx_lfc_mode, "on#off");
6976 cmdline_parse_token_string_t cmd_lfc_set_high_water_str =
6977 	TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
6978 				hw_str, "high_water");
6979 cmdline_parse_token_num_t cmd_lfc_set_high_water =
6980 	TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
6981 				high_water, UINT32);
6982 cmdline_parse_token_string_t cmd_lfc_set_low_water_str =
6983 	TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
6984 				lw_str, "low_water");
6985 cmdline_parse_token_num_t cmd_lfc_set_low_water =
6986 	TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
6987 				low_water, UINT32);
6988 cmdline_parse_token_string_t cmd_lfc_set_pause_time_str =
6989 	TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
6990 				pt_str, "pause_time");
6991 cmdline_parse_token_num_t cmd_lfc_set_pause_time =
6992 	TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
6993 				pause_time, UINT16);
6994 cmdline_parse_token_string_t cmd_lfc_set_send_xon_str =
6995 	TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
6996 				xon_str, "send_xon");
6997 cmdline_parse_token_num_t cmd_lfc_set_send_xon =
6998 	TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
6999 				send_xon, UINT16);
7000 cmdline_parse_token_string_t cmd_lfc_set_mac_ctrl_frame_fwd_mode =
7001 	TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
7002 				mac_ctrl_frame_fwd, "mac_ctrl_frame_fwd");
7003 cmdline_parse_token_string_t cmd_lfc_set_mac_ctrl_frame_fwd =
7004 	TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
7005 				mac_ctrl_frame_fwd_mode, "on#off");
7006 cmdline_parse_token_string_t cmd_lfc_set_autoneg_str =
7007 	TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
7008 				autoneg_str, "autoneg");
7009 cmdline_parse_token_string_t cmd_lfc_set_autoneg =
7010 	TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
7011 				autoneg, "on#off");
7012 cmdline_parse_token_num_t cmd_lfc_set_portid =
7013 	TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result,
7014 				port_id, UINT16);
7015 
7016 /* forward declaration */
7017 static void
7018 cmd_link_flow_ctrl_set_parsed(void *parsed_result, struct cmdline *cl,
7019 			      void *data);
7020 
7021 cmdline_parse_inst_t cmd_link_flow_control_set = {
7022 	.f = cmd_link_flow_ctrl_set_parsed,
7023 	.data = NULL,
7024 	.help_str = "set flow_ctrl rx on|off tx on|off <high_water> "
7025 		"<low_water> <pause_time> <send_xon> mac_ctrl_frame_fwd on|off "
7026 		"autoneg on|off <port_id>: Configure the Ethernet flow control",
7027 	.tokens = {
7028 		(void *)&cmd_lfc_set_set,
7029 		(void *)&cmd_lfc_set_flow_ctrl,
7030 		(void *)&cmd_lfc_set_rx,
7031 		(void *)&cmd_lfc_set_rx_mode,
7032 		(void *)&cmd_lfc_set_tx,
7033 		(void *)&cmd_lfc_set_tx_mode,
7034 		(void *)&cmd_lfc_set_high_water,
7035 		(void *)&cmd_lfc_set_low_water,
7036 		(void *)&cmd_lfc_set_pause_time,
7037 		(void *)&cmd_lfc_set_send_xon,
7038 		(void *)&cmd_lfc_set_mac_ctrl_frame_fwd_mode,
7039 		(void *)&cmd_lfc_set_mac_ctrl_frame_fwd,
7040 		(void *)&cmd_lfc_set_autoneg_str,
7041 		(void *)&cmd_lfc_set_autoneg,
7042 		(void *)&cmd_lfc_set_portid,
7043 		NULL,
7044 	},
7045 };
7046 
7047 cmdline_parse_inst_t cmd_link_flow_control_set_rx = {
7048 	.f = cmd_link_flow_ctrl_set_parsed,
7049 	.data = (void *)&cmd_link_flow_control_set_rx,
7050 	.help_str = "set flow_ctrl rx on|off <port_id>: "
7051 		"Change rx flow control parameter",
7052 	.tokens = {
7053 		(void *)&cmd_lfc_set_set,
7054 		(void *)&cmd_lfc_set_flow_ctrl,
7055 		(void *)&cmd_lfc_set_rx,
7056 		(void *)&cmd_lfc_set_rx_mode,
7057 		(void *)&cmd_lfc_set_portid,
7058 		NULL,
7059 	},
7060 };
7061 
7062 cmdline_parse_inst_t cmd_link_flow_control_set_tx = {
7063 	.f = cmd_link_flow_ctrl_set_parsed,
7064 	.data = (void *)&cmd_link_flow_control_set_tx,
7065 	.help_str = "set flow_ctrl tx on|off <port_id>: "
7066 		"Change tx flow control parameter",
7067 	.tokens = {
7068 		(void *)&cmd_lfc_set_set,
7069 		(void *)&cmd_lfc_set_flow_ctrl,
7070 		(void *)&cmd_lfc_set_tx,
7071 		(void *)&cmd_lfc_set_tx_mode,
7072 		(void *)&cmd_lfc_set_portid,
7073 		NULL,
7074 	},
7075 };
7076 
7077 cmdline_parse_inst_t cmd_link_flow_control_set_hw = {
7078 	.f = cmd_link_flow_ctrl_set_parsed,
7079 	.data = (void *)&cmd_link_flow_control_set_hw,
7080 	.help_str = "set flow_ctrl high_water <value> <port_id>: "
7081 		"Change high water flow control parameter",
7082 	.tokens = {
7083 		(void *)&cmd_lfc_set_set,
7084 		(void *)&cmd_lfc_set_flow_ctrl,
7085 		(void *)&cmd_lfc_set_high_water_str,
7086 		(void *)&cmd_lfc_set_high_water,
7087 		(void *)&cmd_lfc_set_portid,
7088 		NULL,
7089 	},
7090 };
7091 
7092 cmdline_parse_inst_t cmd_link_flow_control_set_lw = {
7093 	.f = cmd_link_flow_ctrl_set_parsed,
7094 	.data = (void *)&cmd_link_flow_control_set_lw,
7095 	.help_str = "set flow_ctrl low_water <value> <port_id>: "
7096 		"Change low water flow control parameter",
7097 	.tokens = {
7098 		(void *)&cmd_lfc_set_set,
7099 		(void *)&cmd_lfc_set_flow_ctrl,
7100 		(void *)&cmd_lfc_set_low_water_str,
7101 		(void *)&cmd_lfc_set_low_water,
7102 		(void *)&cmd_lfc_set_portid,
7103 		NULL,
7104 	},
7105 };
7106 
7107 cmdline_parse_inst_t cmd_link_flow_control_set_pt = {
7108 	.f = cmd_link_flow_ctrl_set_parsed,
7109 	.data = (void *)&cmd_link_flow_control_set_pt,
7110 	.help_str = "set flow_ctrl pause_time <value> <port_id>: "
7111 		"Change pause time flow control parameter",
7112 	.tokens = {
7113 		(void *)&cmd_lfc_set_set,
7114 		(void *)&cmd_lfc_set_flow_ctrl,
7115 		(void *)&cmd_lfc_set_pause_time_str,
7116 		(void *)&cmd_lfc_set_pause_time,
7117 		(void *)&cmd_lfc_set_portid,
7118 		NULL,
7119 	},
7120 };
7121 
7122 cmdline_parse_inst_t cmd_link_flow_control_set_xon = {
7123 	.f = cmd_link_flow_ctrl_set_parsed,
7124 	.data = (void *)&cmd_link_flow_control_set_xon,
7125 	.help_str = "set flow_ctrl send_xon <value> <port_id>: "
7126 		"Change send_xon flow control parameter",
7127 	.tokens = {
7128 		(void *)&cmd_lfc_set_set,
7129 		(void *)&cmd_lfc_set_flow_ctrl,
7130 		(void *)&cmd_lfc_set_send_xon_str,
7131 		(void *)&cmd_lfc_set_send_xon,
7132 		(void *)&cmd_lfc_set_portid,
7133 		NULL,
7134 	},
7135 };
7136 
7137 cmdline_parse_inst_t cmd_link_flow_control_set_macfwd = {
7138 	.f = cmd_link_flow_ctrl_set_parsed,
7139 	.data = (void *)&cmd_link_flow_control_set_macfwd,
7140 	.help_str = "set flow_ctrl mac_ctrl_frame_fwd on|off <port_id>: "
7141 		"Change mac ctrl fwd flow control parameter",
7142 	.tokens = {
7143 		(void *)&cmd_lfc_set_set,
7144 		(void *)&cmd_lfc_set_flow_ctrl,
7145 		(void *)&cmd_lfc_set_mac_ctrl_frame_fwd_mode,
7146 		(void *)&cmd_lfc_set_mac_ctrl_frame_fwd,
7147 		(void *)&cmd_lfc_set_portid,
7148 		NULL,
7149 	},
7150 };
7151 
7152 cmdline_parse_inst_t cmd_link_flow_control_set_autoneg = {
7153 	.f = cmd_link_flow_ctrl_set_parsed,
7154 	.data = (void *)&cmd_link_flow_control_set_autoneg,
7155 	.help_str = "set flow_ctrl autoneg on|off <port_id>: "
7156 		"Change autoneg flow control parameter",
7157 	.tokens = {
7158 		(void *)&cmd_lfc_set_set,
7159 		(void *)&cmd_lfc_set_flow_ctrl,
7160 		(void *)&cmd_lfc_set_autoneg_str,
7161 		(void *)&cmd_lfc_set_autoneg,
7162 		(void *)&cmd_lfc_set_portid,
7163 		NULL,
7164 	},
7165 };
7166 
7167 static void
7168 cmd_link_flow_ctrl_set_parsed(void *parsed_result,
7169 			      __rte_unused struct cmdline *cl,
7170 			      void *data)
7171 {
7172 	struct cmd_link_flow_ctrl_set_result *res = parsed_result;
7173 	cmdline_parse_inst_t *cmd = data;
7174 	struct rte_eth_fc_conf fc_conf;
7175 	int rx_fc_en = 0;
7176 	int tx_fc_en = 0;
7177 	int ret;
7178 
7179 	/*
7180 	 * Rx on/off, flow control is enabled/disabled on RX side. This can indicate
7181 	 * the RTE_FC_TX_PAUSE, Transmit pause frame at the Rx side.
7182 	 * Tx on/off, flow control is enabled/disabled on TX side. This can indicate
7183 	 * the RTE_FC_RX_PAUSE, Respond to the pause frame at the Tx side.
7184 	 */
7185 	static enum rte_eth_fc_mode rx_tx_onoff_2_lfc_mode[2][2] = {
7186 			{RTE_FC_NONE, RTE_FC_TX_PAUSE}, {RTE_FC_RX_PAUSE, RTE_FC_FULL}
7187 	};
7188 
7189 	/* Partial command line, retrieve current configuration */
7190 	if (cmd) {
7191 		ret = rte_eth_dev_flow_ctrl_get(res->port_id, &fc_conf);
7192 		if (ret != 0) {
7193 			printf("cannot get current flow ctrl parameters, return"
7194 			       "code = %d\n", ret);
7195 			return;
7196 		}
7197 
7198 		if ((fc_conf.mode == RTE_FC_RX_PAUSE) ||
7199 		    (fc_conf.mode == RTE_FC_FULL))
7200 			rx_fc_en = 1;
7201 		if ((fc_conf.mode == RTE_FC_TX_PAUSE) ||
7202 		    (fc_conf.mode == RTE_FC_FULL))
7203 			tx_fc_en = 1;
7204 	}
7205 
7206 	if (!cmd || cmd == &cmd_link_flow_control_set_rx)
7207 		rx_fc_en = (!strcmp(res->rx_lfc_mode, "on")) ? 1 : 0;
7208 
7209 	if (!cmd || cmd == &cmd_link_flow_control_set_tx)
7210 		tx_fc_en = (!strcmp(res->tx_lfc_mode, "on")) ? 1 : 0;
7211 
7212 	fc_conf.mode = rx_tx_onoff_2_lfc_mode[rx_fc_en][tx_fc_en];
7213 
7214 	if (!cmd || cmd == &cmd_link_flow_control_set_hw)
7215 		fc_conf.high_water = res->high_water;
7216 
7217 	if (!cmd || cmd == &cmd_link_flow_control_set_lw)
7218 		fc_conf.low_water = res->low_water;
7219 
7220 	if (!cmd || cmd == &cmd_link_flow_control_set_pt)
7221 		fc_conf.pause_time = res->pause_time;
7222 
7223 	if (!cmd || cmd == &cmd_link_flow_control_set_xon)
7224 		fc_conf.send_xon = res->send_xon;
7225 
7226 	if (!cmd || cmd == &cmd_link_flow_control_set_macfwd) {
7227 		if (!strcmp(res->mac_ctrl_frame_fwd_mode, "on"))
7228 			fc_conf.mac_ctrl_frame_fwd = 1;
7229 		else
7230 			fc_conf.mac_ctrl_frame_fwd = 0;
7231 	}
7232 
7233 	if (!cmd || cmd == &cmd_link_flow_control_set_autoneg)
7234 		fc_conf.autoneg = (!strcmp(res->autoneg, "on")) ? 1 : 0;
7235 
7236 	ret = rte_eth_dev_flow_ctrl_set(res->port_id, &fc_conf);
7237 	if (ret != 0)
7238 		printf("bad flow contrl parameter, return code = %d \n", ret);
7239 }
7240 
7241 /* *** SETUP ETHERNET PRIORITY FLOW CONTROL *** */
7242 struct cmd_priority_flow_ctrl_set_result {
7243 	cmdline_fixed_string_t set;
7244 	cmdline_fixed_string_t pfc_ctrl;
7245 	cmdline_fixed_string_t rx;
7246 	cmdline_fixed_string_t rx_pfc_mode;
7247 	cmdline_fixed_string_t tx;
7248 	cmdline_fixed_string_t tx_pfc_mode;
7249 	uint32_t high_water;
7250 	uint32_t low_water;
7251 	uint16_t pause_time;
7252 	uint8_t  priority;
7253 	portid_t port_id;
7254 };
7255 
7256 static void
7257 cmd_priority_flow_ctrl_set_parsed(void *parsed_result,
7258 		       __rte_unused struct cmdline *cl,
7259 		       __rte_unused void *data)
7260 {
7261 	struct cmd_priority_flow_ctrl_set_result *res = parsed_result;
7262 	struct rte_eth_pfc_conf pfc_conf;
7263 	int rx_fc_enable, tx_fc_enable;
7264 	int ret;
7265 
7266 	/*
7267 	 * Rx on/off, flow control is enabled/disabled on RX side. This can indicate
7268 	 * the RTE_FC_TX_PAUSE, Transmit pause frame at the Rx side.
7269 	 * Tx on/off, flow control is enabled/disabled on TX side. This can indicate
7270 	 * the RTE_FC_RX_PAUSE, Respond to the pause frame at the Tx side.
7271 	 */
7272 	static enum rte_eth_fc_mode rx_tx_onoff_2_pfc_mode[2][2] = {
7273 		{RTE_FC_NONE, RTE_FC_TX_PAUSE}, {RTE_FC_RX_PAUSE, RTE_FC_FULL}
7274 	};
7275 
7276 	memset(&pfc_conf, 0, sizeof(struct rte_eth_pfc_conf));
7277 	rx_fc_enable = (!strncmp(res->rx_pfc_mode, "on",2)) ? 1 : 0;
7278 	tx_fc_enable = (!strncmp(res->tx_pfc_mode, "on",2)) ? 1 : 0;
7279 	pfc_conf.fc.mode       = rx_tx_onoff_2_pfc_mode[rx_fc_enable][tx_fc_enable];
7280 	pfc_conf.fc.high_water = res->high_water;
7281 	pfc_conf.fc.low_water  = res->low_water;
7282 	pfc_conf.fc.pause_time = res->pause_time;
7283 	pfc_conf.priority      = res->priority;
7284 
7285 	ret = rte_eth_dev_priority_flow_ctrl_set(res->port_id, &pfc_conf);
7286 	if (ret != 0)
7287 		printf("bad priority flow contrl parameter, return code = %d \n", ret);
7288 }
7289 
7290 cmdline_parse_token_string_t cmd_pfc_set_set =
7291 	TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result,
7292 				set, "set");
7293 cmdline_parse_token_string_t cmd_pfc_set_flow_ctrl =
7294 	TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result,
7295 				pfc_ctrl, "pfc_ctrl");
7296 cmdline_parse_token_string_t cmd_pfc_set_rx =
7297 	TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result,
7298 				rx, "rx");
7299 cmdline_parse_token_string_t cmd_pfc_set_rx_mode =
7300 	TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result,
7301 				rx_pfc_mode, "on#off");
7302 cmdline_parse_token_string_t cmd_pfc_set_tx =
7303 	TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result,
7304 				tx, "tx");
7305 cmdline_parse_token_string_t cmd_pfc_set_tx_mode =
7306 	TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result,
7307 				tx_pfc_mode, "on#off");
7308 cmdline_parse_token_num_t cmd_pfc_set_high_water =
7309 	TOKEN_NUM_INITIALIZER(struct cmd_priority_flow_ctrl_set_result,
7310 				high_water, UINT32);
7311 cmdline_parse_token_num_t cmd_pfc_set_low_water =
7312 	TOKEN_NUM_INITIALIZER(struct cmd_priority_flow_ctrl_set_result,
7313 				low_water, UINT32);
7314 cmdline_parse_token_num_t cmd_pfc_set_pause_time =
7315 	TOKEN_NUM_INITIALIZER(struct cmd_priority_flow_ctrl_set_result,
7316 				pause_time, UINT16);
7317 cmdline_parse_token_num_t cmd_pfc_set_priority =
7318 	TOKEN_NUM_INITIALIZER(struct cmd_priority_flow_ctrl_set_result,
7319 				priority, UINT8);
7320 cmdline_parse_token_num_t cmd_pfc_set_portid =
7321 	TOKEN_NUM_INITIALIZER(struct cmd_priority_flow_ctrl_set_result,
7322 				port_id, UINT16);
7323 
7324 cmdline_parse_inst_t cmd_priority_flow_control_set = {
7325 	.f = cmd_priority_flow_ctrl_set_parsed,
7326 	.data = NULL,
7327 	.help_str = "set pfc_ctrl rx on|off tx on|off <high_water> <low_water> "
7328 		"<pause_time> <priority> <port_id>: "
7329 		"Configure the Ethernet priority flow control",
7330 	.tokens = {
7331 		(void *)&cmd_pfc_set_set,
7332 		(void *)&cmd_pfc_set_flow_ctrl,
7333 		(void *)&cmd_pfc_set_rx,
7334 		(void *)&cmd_pfc_set_rx_mode,
7335 		(void *)&cmd_pfc_set_tx,
7336 		(void *)&cmd_pfc_set_tx_mode,
7337 		(void *)&cmd_pfc_set_high_water,
7338 		(void *)&cmd_pfc_set_low_water,
7339 		(void *)&cmd_pfc_set_pause_time,
7340 		(void *)&cmd_pfc_set_priority,
7341 		(void *)&cmd_pfc_set_portid,
7342 		NULL,
7343 	},
7344 };
7345 
7346 /* *** RESET CONFIGURATION *** */
7347 struct cmd_reset_result {
7348 	cmdline_fixed_string_t reset;
7349 	cmdline_fixed_string_t def;
7350 };
7351 
7352 static void cmd_reset_parsed(__rte_unused void *parsed_result,
7353 			     struct cmdline *cl,
7354 			     __rte_unused void *data)
7355 {
7356 	cmdline_printf(cl, "Reset to default forwarding configuration...\n");
7357 	set_def_fwd_config();
7358 }
7359 
7360 cmdline_parse_token_string_t cmd_reset_set =
7361 	TOKEN_STRING_INITIALIZER(struct cmd_reset_result, reset, "set");
7362 cmdline_parse_token_string_t cmd_reset_def =
7363 	TOKEN_STRING_INITIALIZER(struct cmd_reset_result, def,
7364 				 "default");
7365 
7366 cmdline_parse_inst_t cmd_reset = {
7367 	.f = cmd_reset_parsed,
7368 	.data = NULL,
7369 	.help_str = "set default: Reset default forwarding configuration",
7370 	.tokens = {
7371 		(void *)&cmd_reset_set,
7372 		(void *)&cmd_reset_def,
7373 		NULL,
7374 	},
7375 };
7376 
7377 /* *** START FORWARDING *** */
7378 struct cmd_start_result {
7379 	cmdline_fixed_string_t start;
7380 };
7381 
7382 cmdline_parse_token_string_t cmd_start_start =
7383 	TOKEN_STRING_INITIALIZER(struct cmd_start_result, start, "start");
7384 
7385 static void cmd_start_parsed(__rte_unused void *parsed_result,
7386 			     __rte_unused struct cmdline *cl,
7387 			     __rte_unused void *data)
7388 {
7389 	start_packet_forwarding(0);
7390 }
7391 
7392 cmdline_parse_inst_t cmd_start = {
7393 	.f = cmd_start_parsed,
7394 	.data = NULL,
7395 	.help_str = "start: Start packet forwarding",
7396 	.tokens = {
7397 		(void *)&cmd_start_start,
7398 		NULL,
7399 	},
7400 };
7401 
7402 /* *** START FORWARDING WITH ONE TX BURST FIRST *** */
7403 struct cmd_start_tx_first_result {
7404 	cmdline_fixed_string_t start;
7405 	cmdline_fixed_string_t tx_first;
7406 };
7407 
7408 static void
7409 cmd_start_tx_first_parsed(__rte_unused void *parsed_result,
7410 			  __rte_unused struct cmdline *cl,
7411 			  __rte_unused void *data)
7412 {
7413 	start_packet_forwarding(1);
7414 }
7415 
7416 cmdline_parse_token_string_t cmd_start_tx_first_start =
7417 	TOKEN_STRING_INITIALIZER(struct cmd_start_tx_first_result, start,
7418 				 "start");
7419 cmdline_parse_token_string_t cmd_start_tx_first_tx_first =
7420 	TOKEN_STRING_INITIALIZER(struct cmd_start_tx_first_result,
7421 				 tx_first, "tx_first");
7422 
7423 cmdline_parse_inst_t cmd_start_tx_first = {
7424 	.f = cmd_start_tx_first_parsed,
7425 	.data = NULL,
7426 	.help_str = "start tx_first: Start packet forwarding, "
7427 		"after sending 1 burst of packets",
7428 	.tokens = {
7429 		(void *)&cmd_start_tx_first_start,
7430 		(void *)&cmd_start_tx_first_tx_first,
7431 		NULL,
7432 	},
7433 };
7434 
7435 /* *** START FORWARDING WITH N TX BURST FIRST *** */
7436 struct cmd_start_tx_first_n_result {
7437 	cmdline_fixed_string_t start;
7438 	cmdline_fixed_string_t tx_first;
7439 	uint32_t tx_num;
7440 };
7441 
7442 static void
7443 cmd_start_tx_first_n_parsed(void *parsed_result,
7444 			  __rte_unused struct cmdline *cl,
7445 			  __rte_unused void *data)
7446 {
7447 	struct cmd_start_tx_first_n_result *res = parsed_result;
7448 
7449 	start_packet_forwarding(res->tx_num);
7450 }
7451 
7452 cmdline_parse_token_string_t cmd_start_tx_first_n_start =
7453 	TOKEN_STRING_INITIALIZER(struct cmd_start_tx_first_n_result,
7454 			start, "start");
7455 cmdline_parse_token_string_t cmd_start_tx_first_n_tx_first =
7456 	TOKEN_STRING_INITIALIZER(struct cmd_start_tx_first_n_result,
7457 			tx_first, "tx_first");
7458 cmdline_parse_token_num_t cmd_start_tx_first_n_tx_num =
7459 	TOKEN_NUM_INITIALIZER(struct cmd_start_tx_first_n_result,
7460 			tx_num, UINT32);
7461 
7462 cmdline_parse_inst_t cmd_start_tx_first_n = {
7463 	.f = cmd_start_tx_first_n_parsed,
7464 	.data = NULL,
7465 	.help_str = "start tx_first <num>: "
7466 		"packet forwarding, after sending <num> bursts of packets",
7467 	.tokens = {
7468 		(void *)&cmd_start_tx_first_n_start,
7469 		(void *)&cmd_start_tx_first_n_tx_first,
7470 		(void *)&cmd_start_tx_first_n_tx_num,
7471 		NULL,
7472 	},
7473 };
7474 
7475 /* *** SET LINK UP *** */
7476 struct cmd_set_link_up_result {
7477 	cmdline_fixed_string_t set;
7478 	cmdline_fixed_string_t link_up;
7479 	cmdline_fixed_string_t port;
7480 	portid_t port_id;
7481 };
7482 
7483 cmdline_parse_token_string_t cmd_set_link_up_set =
7484 	TOKEN_STRING_INITIALIZER(struct cmd_set_link_up_result, set, "set");
7485 cmdline_parse_token_string_t cmd_set_link_up_link_up =
7486 	TOKEN_STRING_INITIALIZER(struct cmd_set_link_up_result, link_up,
7487 				"link-up");
7488 cmdline_parse_token_string_t cmd_set_link_up_port =
7489 	TOKEN_STRING_INITIALIZER(struct cmd_set_link_up_result, port, "port");
7490 cmdline_parse_token_num_t cmd_set_link_up_port_id =
7491 	TOKEN_NUM_INITIALIZER(struct cmd_set_link_up_result, port_id, UINT16);
7492 
7493 static void cmd_set_link_up_parsed(__rte_unused void *parsed_result,
7494 			     __rte_unused struct cmdline *cl,
7495 			     __rte_unused void *data)
7496 {
7497 	struct cmd_set_link_up_result *res = parsed_result;
7498 	dev_set_link_up(res->port_id);
7499 }
7500 
7501 cmdline_parse_inst_t cmd_set_link_up = {
7502 	.f = cmd_set_link_up_parsed,
7503 	.data = NULL,
7504 	.help_str = "set link-up port <port id>",
7505 	.tokens = {
7506 		(void *)&cmd_set_link_up_set,
7507 		(void *)&cmd_set_link_up_link_up,
7508 		(void *)&cmd_set_link_up_port,
7509 		(void *)&cmd_set_link_up_port_id,
7510 		NULL,
7511 	},
7512 };
7513 
7514 /* *** SET LINK DOWN *** */
7515 struct cmd_set_link_down_result {
7516 	cmdline_fixed_string_t set;
7517 	cmdline_fixed_string_t link_down;
7518 	cmdline_fixed_string_t port;
7519 	portid_t port_id;
7520 };
7521 
7522 cmdline_parse_token_string_t cmd_set_link_down_set =
7523 	TOKEN_STRING_INITIALIZER(struct cmd_set_link_down_result, set, "set");
7524 cmdline_parse_token_string_t cmd_set_link_down_link_down =
7525 	TOKEN_STRING_INITIALIZER(struct cmd_set_link_down_result, link_down,
7526 				"link-down");
7527 cmdline_parse_token_string_t cmd_set_link_down_port =
7528 	TOKEN_STRING_INITIALIZER(struct cmd_set_link_down_result, port, "port");
7529 cmdline_parse_token_num_t cmd_set_link_down_port_id =
7530 	TOKEN_NUM_INITIALIZER(struct cmd_set_link_down_result, port_id, UINT16);
7531 
7532 static void cmd_set_link_down_parsed(
7533 				__rte_unused void *parsed_result,
7534 				__rte_unused struct cmdline *cl,
7535 				__rte_unused void *data)
7536 {
7537 	struct cmd_set_link_down_result *res = parsed_result;
7538 	dev_set_link_down(res->port_id);
7539 }
7540 
7541 cmdline_parse_inst_t cmd_set_link_down = {
7542 	.f = cmd_set_link_down_parsed,
7543 	.data = NULL,
7544 	.help_str = "set link-down port <port id>",
7545 	.tokens = {
7546 		(void *)&cmd_set_link_down_set,
7547 		(void *)&cmd_set_link_down_link_down,
7548 		(void *)&cmd_set_link_down_port,
7549 		(void *)&cmd_set_link_down_port_id,
7550 		NULL,
7551 	},
7552 };
7553 
7554 /* *** SHOW CFG *** */
7555 struct cmd_showcfg_result {
7556 	cmdline_fixed_string_t show;
7557 	cmdline_fixed_string_t cfg;
7558 	cmdline_fixed_string_t what;
7559 };
7560 
7561 static void cmd_showcfg_parsed(void *parsed_result,
7562 			       __rte_unused struct cmdline *cl,
7563 			       __rte_unused void *data)
7564 {
7565 	struct cmd_showcfg_result *res = parsed_result;
7566 	if (!strcmp(res->what, "rxtx"))
7567 		rxtx_config_display();
7568 	else if (!strcmp(res->what, "cores"))
7569 		fwd_lcores_config_display();
7570 	else if (!strcmp(res->what, "fwd"))
7571 		pkt_fwd_config_display(&cur_fwd_config);
7572 	else if (!strcmp(res->what, "rxoffs"))
7573 		show_rx_pkt_offsets();
7574 	else if (!strcmp(res->what, "rxpkts"))
7575 		show_rx_pkt_segments();
7576 	else if (!strcmp(res->what, "txpkts"))
7577 		show_tx_pkt_segments();
7578 	else if (!strcmp(res->what, "txtimes"))
7579 		show_tx_pkt_times();
7580 }
7581 
7582 cmdline_parse_token_string_t cmd_showcfg_show =
7583 	TOKEN_STRING_INITIALIZER(struct cmd_showcfg_result, show, "show");
7584 cmdline_parse_token_string_t cmd_showcfg_port =
7585 	TOKEN_STRING_INITIALIZER(struct cmd_showcfg_result, cfg, "config");
7586 cmdline_parse_token_string_t cmd_showcfg_what =
7587 	TOKEN_STRING_INITIALIZER(struct cmd_showcfg_result, what,
7588 				 "rxtx#cores#fwd#rxoffs#rxpkts#txpkts#txtimes");
7589 
7590 cmdline_parse_inst_t cmd_showcfg = {
7591 	.f = cmd_showcfg_parsed,
7592 	.data = NULL,
7593 	.help_str = "show config rxtx|cores|fwd|rxoffs|rxpkts|txpkts|txtimes",
7594 	.tokens = {
7595 		(void *)&cmd_showcfg_show,
7596 		(void *)&cmd_showcfg_port,
7597 		(void *)&cmd_showcfg_what,
7598 		NULL,
7599 	},
7600 };
7601 
7602 /* *** SHOW ALL PORT INFO *** */
7603 struct cmd_showportall_result {
7604 	cmdline_fixed_string_t show;
7605 	cmdline_fixed_string_t port;
7606 	cmdline_fixed_string_t what;
7607 	cmdline_fixed_string_t all;
7608 };
7609 
7610 static void cmd_showportall_parsed(void *parsed_result,
7611 				__rte_unused struct cmdline *cl,
7612 				__rte_unused void *data)
7613 {
7614 	portid_t i;
7615 
7616 	struct cmd_showportall_result *res = parsed_result;
7617 	if (!strcmp(res->show, "clear")) {
7618 		if (!strcmp(res->what, "stats"))
7619 			RTE_ETH_FOREACH_DEV(i)
7620 				nic_stats_clear(i);
7621 		else if (!strcmp(res->what, "xstats"))
7622 			RTE_ETH_FOREACH_DEV(i)
7623 				nic_xstats_clear(i);
7624 	} else if (!strcmp(res->what, "info"))
7625 		RTE_ETH_FOREACH_DEV(i)
7626 			port_infos_display(i);
7627 	else if (!strcmp(res->what, "summary")) {
7628 		port_summary_header_display();
7629 		RTE_ETH_FOREACH_DEV(i)
7630 			port_summary_display(i);
7631 	}
7632 	else if (!strcmp(res->what, "stats"))
7633 		RTE_ETH_FOREACH_DEV(i)
7634 			nic_stats_display(i);
7635 	else if (!strcmp(res->what, "xstats"))
7636 		RTE_ETH_FOREACH_DEV(i)
7637 			nic_xstats_display(i);
7638 	else if (!strcmp(res->what, "fdir"))
7639 		RTE_ETH_FOREACH_DEV(i)
7640 			fdir_get_infos(i);
7641 	else if (!strcmp(res->what, "stat_qmap"))
7642 		RTE_ETH_FOREACH_DEV(i)
7643 			nic_stats_mapping_display(i);
7644 	else if (!strcmp(res->what, "dcb_tc"))
7645 		RTE_ETH_FOREACH_DEV(i)
7646 			port_dcb_info_display(i);
7647 	else if (!strcmp(res->what, "cap"))
7648 		RTE_ETH_FOREACH_DEV(i)
7649 			port_offload_cap_display(i);
7650 }
7651 
7652 cmdline_parse_token_string_t cmd_showportall_show =
7653 	TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, show,
7654 				 "show#clear");
7655 cmdline_parse_token_string_t cmd_showportall_port =
7656 	TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, port, "port");
7657 cmdline_parse_token_string_t cmd_showportall_what =
7658 	TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, what,
7659 				 "info#summary#stats#xstats#fdir#stat_qmap#dcb_tc#cap");
7660 cmdline_parse_token_string_t cmd_showportall_all =
7661 	TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, all, "all");
7662 cmdline_parse_inst_t cmd_showportall = {
7663 	.f = cmd_showportall_parsed,
7664 	.data = NULL,
7665 	.help_str = "show|clear port "
7666 		"info|summary|stats|xstats|fdir|stat_qmap|dcb_tc|cap all",
7667 	.tokens = {
7668 		(void *)&cmd_showportall_show,
7669 		(void *)&cmd_showportall_port,
7670 		(void *)&cmd_showportall_what,
7671 		(void *)&cmd_showportall_all,
7672 		NULL,
7673 	},
7674 };
7675 
7676 /* *** SHOW PORT INFO *** */
7677 struct cmd_showport_result {
7678 	cmdline_fixed_string_t show;
7679 	cmdline_fixed_string_t port;
7680 	cmdline_fixed_string_t what;
7681 	uint16_t portnum;
7682 };
7683 
7684 static void cmd_showport_parsed(void *parsed_result,
7685 				__rte_unused struct cmdline *cl,
7686 				__rte_unused void *data)
7687 {
7688 	struct cmd_showport_result *res = parsed_result;
7689 	if (!strcmp(res->show, "clear")) {
7690 		if (!strcmp(res->what, "stats"))
7691 			nic_stats_clear(res->portnum);
7692 		else if (!strcmp(res->what, "xstats"))
7693 			nic_xstats_clear(res->portnum);
7694 	} else if (!strcmp(res->what, "info"))
7695 		port_infos_display(res->portnum);
7696 	else if (!strcmp(res->what, "summary")) {
7697 		port_summary_header_display();
7698 		port_summary_display(res->portnum);
7699 	}
7700 	else if (!strcmp(res->what, "stats"))
7701 		nic_stats_display(res->portnum);
7702 	else if (!strcmp(res->what, "xstats"))
7703 		nic_xstats_display(res->portnum);
7704 	else if (!strcmp(res->what, "fdir"))
7705 		 fdir_get_infos(res->portnum);
7706 	else if (!strcmp(res->what, "stat_qmap"))
7707 		nic_stats_mapping_display(res->portnum);
7708 	else if (!strcmp(res->what, "dcb_tc"))
7709 		port_dcb_info_display(res->portnum);
7710 	else if (!strcmp(res->what, "cap"))
7711 		port_offload_cap_display(res->portnum);
7712 }
7713 
7714 cmdline_parse_token_string_t cmd_showport_show =
7715 	TOKEN_STRING_INITIALIZER(struct cmd_showport_result, show,
7716 				 "show#clear");
7717 cmdline_parse_token_string_t cmd_showport_port =
7718 	TOKEN_STRING_INITIALIZER(struct cmd_showport_result, port, "port");
7719 cmdline_parse_token_string_t cmd_showport_what =
7720 	TOKEN_STRING_INITIALIZER(struct cmd_showport_result, what,
7721 				 "info#summary#stats#xstats#fdir#stat_qmap#dcb_tc#cap");
7722 cmdline_parse_token_num_t cmd_showport_portnum =
7723 	TOKEN_NUM_INITIALIZER(struct cmd_showport_result, portnum, UINT16);
7724 
7725 cmdline_parse_inst_t cmd_showport = {
7726 	.f = cmd_showport_parsed,
7727 	.data = NULL,
7728 	.help_str = "show|clear port "
7729 		"info|summary|stats|xstats|fdir|stat_qmap|dcb_tc|cap "
7730 		"<port_id>",
7731 	.tokens = {
7732 		(void *)&cmd_showport_show,
7733 		(void *)&cmd_showport_port,
7734 		(void *)&cmd_showport_what,
7735 		(void *)&cmd_showport_portnum,
7736 		NULL,
7737 	},
7738 };
7739 
7740 /* *** SHOW DEVICE INFO *** */
7741 struct cmd_showdevice_result {
7742 	cmdline_fixed_string_t show;
7743 	cmdline_fixed_string_t device;
7744 	cmdline_fixed_string_t what;
7745 	cmdline_fixed_string_t identifier;
7746 };
7747 
7748 static void cmd_showdevice_parsed(void *parsed_result,
7749 				__rte_unused struct cmdline *cl,
7750 				__rte_unused void *data)
7751 {
7752 	struct cmd_showdevice_result *res = parsed_result;
7753 	if (!strcmp(res->what, "info")) {
7754 		if (!strcmp(res->identifier, "all"))
7755 			device_infos_display(NULL);
7756 		else
7757 			device_infos_display(res->identifier);
7758 	}
7759 }
7760 
7761 cmdline_parse_token_string_t cmd_showdevice_show =
7762 	TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result, show,
7763 				 "show");
7764 cmdline_parse_token_string_t cmd_showdevice_device =
7765 	TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result, device, "device");
7766 cmdline_parse_token_string_t cmd_showdevice_what =
7767 	TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result, what,
7768 				 "info");
7769 cmdline_parse_token_string_t cmd_showdevice_identifier =
7770 	TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result,
7771 			identifier, NULL);
7772 
7773 cmdline_parse_inst_t cmd_showdevice = {
7774 	.f = cmd_showdevice_parsed,
7775 	.data = NULL,
7776 	.help_str = "show device info <identifier>|all",
7777 	.tokens = {
7778 		(void *)&cmd_showdevice_show,
7779 		(void *)&cmd_showdevice_device,
7780 		(void *)&cmd_showdevice_what,
7781 		(void *)&cmd_showdevice_identifier,
7782 		NULL,
7783 	},
7784 };
7785 
7786 /* *** SHOW MODULE EEPROM/EEPROM port INFO *** */
7787 struct cmd_showeeprom_result {
7788 	cmdline_fixed_string_t show;
7789 	cmdline_fixed_string_t port;
7790 	uint16_t portnum;
7791 	cmdline_fixed_string_t type;
7792 };
7793 
7794 static void cmd_showeeprom_parsed(void *parsed_result,
7795 		__rte_unused struct cmdline *cl,
7796 		__rte_unused void *data)
7797 {
7798 	struct cmd_showeeprom_result *res = parsed_result;
7799 
7800 	if (!strcmp(res->type, "eeprom"))
7801 		port_eeprom_display(res->portnum);
7802 	else if (!strcmp(res->type, "module_eeprom"))
7803 		port_module_eeprom_display(res->portnum);
7804 	else
7805 		printf("Unknown argument\n");
7806 }
7807 
7808 cmdline_parse_token_string_t cmd_showeeprom_show =
7809 	TOKEN_STRING_INITIALIZER(struct cmd_showeeprom_result, show, "show");
7810 cmdline_parse_token_string_t cmd_showeeprom_port =
7811 	TOKEN_STRING_INITIALIZER(struct cmd_showeeprom_result, port, "port");
7812 cmdline_parse_token_num_t cmd_showeeprom_portnum =
7813 	TOKEN_NUM_INITIALIZER(struct cmd_showeeprom_result, portnum, UINT16);
7814 cmdline_parse_token_string_t cmd_showeeprom_type =
7815 	TOKEN_STRING_INITIALIZER(struct cmd_showeeprom_result, type, "module_eeprom#eeprom");
7816 
7817 cmdline_parse_inst_t cmd_showeeprom = {
7818 	.f = cmd_showeeprom_parsed,
7819 	.data = NULL,
7820 	.help_str = "show port <port_id> module_eeprom|eeprom",
7821 	.tokens = {
7822 		(void *)&cmd_showeeprom_show,
7823 		(void *)&cmd_showeeprom_port,
7824 		(void *)&cmd_showeeprom_portnum,
7825 		(void *)&cmd_showeeprom_type,
7826 		NULL,
7827 	},
7828 };
7829 
7830 /* *** SHOW QUEUE INFO *** */
7831 struct cmd_showqueue_result {
7832 	cmdline_fixed_string_t show;
7833 	cmdline_fixed_string_t type;
7834 	cmdline_fixed_string_t what;
7835 	uint16_t portnum;
7836 	uint16_t queuenum;
7837 };
7838 
7839 static void
7840 cmd_showqueue_parsed(void *parsed_result,
7841 	__rte_unused struct cmdline *cl,
7842 	__rte_unused void *data)
7843 {
7844 	struct cmd_showqueue_result *res = parsed_result;
7845 
7846 	if (!strcmp(res->type, "rxq"))
7847 		rx_queue_infos_display(res->portnum, res->queuenum);
7848 	else if (!strcmp(res->type, "txq"))
7849 		tx_queue_infos_display(res->portnum, res->queuenum);
7850 }
7851 
7852 cmdline_parse_token_string_t cmd_showqueue_show =
7853 	TOKEN_STRING_INITIALIZER(struct cmd_showqueue_result, show, "show");
7854 cmdline_parse_token_string_t cmd_showqueue_type =
7855 	TOKEN_STRING_INITIALIZER(struct cmd_showqueue_result, type, "rxq#txq");
7856 cmdline_parse_token_string_t cmd_showqueue_what =
7857 	TOKEN_STRING_INITIALIZER(struct cmd_showqueue_result, what, "info");
7858 cmdline_parse_token_num_t cmd_showqueue_portnum =
7859 	TOKEN_NUM_INITIALIZER(struct cmd_showqueue_result, portnum, UINT16);
7860 cmdline_parse_token_num_t cmd_showqueue_queuenum =
7861 	TOKEN_NUM_INITIALIZER(struct cmd_showqueue_result, queuenum, UINT16);
7862 
7863 cmdline_parse_inst_t cmd_showqueue = {
7864 	.f = cmd_showqueue_parsed,
7865 	.data = NULL,
7866 	.help_str = "show rxq|txq info <port_id> <queue_id>",
7867 	.tokens = {
7868 		(void *)&cmd_showqueue_show,
7869 		(void *)&cmd_showqueue_type,
7870 		(void *)&cmd_showqueue_what,
7871 		(void *)&cmd_showqueue_portnum,
7872 		(void *)&cmd_showqueue_queuenum,
7873 		NULL,
7874 	},
7875 };
7876 
7877 /* show/clear fwd engine statistics */
7878 struct fwd_result {
7879 	cmdline_fixed_string_t action;
7880 	cmdline_fixed_string_t fwd;
7881 	cmdline_fixed_string_t stats;
7882 	cmdline_fixed_string_t all;
7883 };
7884 
7885 cmdline_parse_token_string_t cmd_fwd_action =
7886 	TOKEN_STRING_INITIALIZER(struct fwd_result, action, "show#clear");
7887 cmdline_parse_token_string_t cmd_fwd_fwd =
7888 	TOKEN_STRING_INITIALIZER(struct fwd_result, fwd, "fwd");
7889 cmdline_parse_token_string_t cmd_fwd_stats =
7890 	TOKEN_STRING_INITIALIZER(struct fwd_result, stats, "stats");
7891 cmdline_parse_token_string_t cmd_fwd_all =
7892 	TOKEN_STRING_INITIALIZER(struct fwd_result, all, "all");
7893 
7894 static void
7895 cmd_showfwdall_parsed(void *parsed_result,
7896 		      __rte_unused struct cmdline *cl,
7897 		      __rte_unused void *data)
7898 {
7899 	struct fwd_result *res = parsed_result;
7900 
7901 	if (!strcmp(res->action, "show"))
7902 		fwd_stats_display();
7903 	else
7904 		fwd_stats_reset();
7905 }
7906 
7907 static cmdline_parse_inst_t cmd_showfwdall = {
7908 	.f = cmd_showfwdall_parsed,
7909 	.data = NULL,
7910 	.help_str = "show|clear fwd stats all",
7911 	.tokens = {
7912 		(void *)&cmd_fwd_action,
7913 		(void *)&cmd_fwd_fwd,
7914 		(void *)&cmd_fwd_stats,
7915 		(void *)&cmd_fwd_all,
7916 		NULL,
7917 	},
7918 };
7919 
7920 /* *** READ PORT REGISTER *** */
7921 struct cmd_read_reg_result {
7922 	cmdline_fixed_string_t read;
7923 	cmdline_fixed_string_t reg;
7924 	portid_t port_id;
7925 	uint32_t reg_off;
7926 };
7927 
7928 static void
7929 cmd_read_reg_parsed(void *parsed_result,
7930 		    __rte_unused struct cmdline *cl,
7931 		    __rte_unused void *data)
7932 {
7933 	struct cmd_read_reg_result *res = parsed_result;
7934 	port_reg_display(res->port_id, res->reg_off);
7935 }
7936 
7937 cmdline_parse_token_string_t cmd_read_reg_read =
7938 	TOKEN_STRING_INITIALIZER(struct cmd_read_reg_result, read, "read");
7939 cmdline_parse_token_string_t cmd_read_reg_reg =
7940 	TOKEN_STRING_INITIALIZER(struct cmd_read_reg_result, reg, "reg");
7941 cmdline_parse_token_num_t cmd_read_reg_port_id =
7942 	TOKEN_NUM_INITIALIZER(struct cmd_read_reg_result, port_id, UINT16);
7943 cmdline_parse_token_num_t cmd_read_reg_reg_off =
7944 	TOKEN_NUM_INITIALIZER(struct cmd_read_reg_result, reg_off, UINT32);
7945 
7946 cmdline_parse_inst_t cmd_read_reg = {
7947 	.f = cmd_read_reg_parsed,
7948 	.data = NULL,
7949 	.help_str = "read reg <port_id> <reg_off>",
7950 	.tokens = {
7951 		(void *)&cmd_read_reg_read,
7952 		(void *)&cmd_read_reg_reg,
7953 		(void *)&cmd_read_reg_port_id,
7954 		(void *)&cmd_read_reg_reg_off,
7955 		NULL,
7956 	},
7957 };
7958 
7959 /* *** READ PORT REGISTER BIT FIELD *** */
7960 struct cmd_read_reg_bit_field_result {
7961 	cmdline_fixed_string_t read;
7962 	cmdline_fixed_string_t regfield;
7963 	portid_t port_id;
7964 	uint32_t reg_off;
7965 	uint8_t bit1_pos;
7966 	uint8_t bit2_pos;
7967 };
7968 
7969 static void
7970 cmd_read_reg_bit_field_parsed(void *parsed_result,
7971 			      __rte_unused struct cmdline *cl,
7972 			      __rte_unused void *data)
7973 {
7974 	struct cmd_read_reg_bit_field_result *res = parsed_result;
7975 	port_reg_bit_field_display(res->port_id, res->reg_off,
7976 				   res->bit1_pos, res->bit2_pos);
7977 }
7978 
7979 cmdline_parse_token_string_t cmd_read_reg_bit_field_read =
7980 	TOKEN_STRING_INITIALIZER(struct cmd_read_reg_bit_field_result, read,
7981 				 "read");
7982 cmdline_parse_token_string_t cmd_read_reg_bit_field_regfield =
7983 	TOKEN_STRING_INITIALIZER(struct cmd_read_reg_bit_field_result,
7984 				 regfield, "regfield");
7985 cmdline_parse_token_num_t cmd_read_reg_bit_field_port_id =
7986 	TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_field_result, port_id,
7987 			      UINT16);
7988 cmdline_parse_token_num_t cmd_read_reg_bit_field_reg_off =
7989 	TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_field_result, reg_off,
7990 			      UINT32);
7991 cmdline_parse_token_num_t cmd_read_reg_bit_field_bit1_pos =
7992 	TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_field_result, bit1_pos,
7993 			      UINT8);
7994 cmdline_parse_token_num_t cmd_read_reg_bit_field_bit2_pos =
7995 	TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_field_result, bit2_pos,
7996 			      UINT8);
7997 
7998 cmdline_parse_inst_t cmd_read_reg_bit_field = {
7999 	.f = cmd_read_reg_bit_field_parsed,
8000 	.data = NULL,
8001 	.help_str = "read regfield <port_id> <reg_off> <bit_x> <bit_y>: "
8002 	"Read register bit field between bit_x and bit_y included",
8003 	.tokens = {
8004 		(void *)&cmd_read_reg_bit_field_read,
8005 		(void *)&cmd_read_reg_bit_field_regfield,
8006 		(void *)&cmd_read_reg_bit_field_port_id,
8007 		(void *)&cmd_read_reg_bit_field_reg_off,
8008 		(void *)&cmd_read_reg_bit_field_bit1_pos,
8009 		(void *)&cmd_read_reg_bit_field_bit2_pos,
8010 		NULL,
8011 	},
8012 };
8013 
8014 /* *** READ PORT REGISTER BIT *** */
8015 struct cmd_read_reg_bit_result {
8016 	cmdline_fixed_string_t read;
8017 	cmdline_fixed_string_t regbit;
8018 	portid_t port_id;
8019 	uint32_t reg_off;
8020 	uint8_t bit_pos;
8021 };
8022 
8023 static void
8024 cmd_read_reg_bit_parsed(void *parsed_result,
8025 			__rte_unused struct cmdline *cl,
8026 			__rte_unused void *data)
8027 {
8028 	struct cmd_read_reg_bit_result *res = parsed_result;
8029 	port_reg_bit_display(res->port_id, res->reg_off, res->bit_pos);
8030 }
8031 
8032 cmdline_parse_token_string_t cmd_read_reg_bit_read =
8033 	TOKEN_STRING_INITIALIZER(struct cmd_read_reg_bit_result, read, "read");
8034 cmdline_parse_token_string_t cmd_read_reg_bit_regbit =
8035 	TOKEN_STRING_INITIALIZER(struct cmd_read_reg_bit_result,
8036 				 regbit, "regbit");
8037 cmdline_parse_token_num_t cmd_read_reg_bit_port_id =
8038 	TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_result, port_id, UINT16);
8039 cmdline_parse_token_num_t cmd_read_reg_bit_reg_off =
8040 	TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_result, reg_off, UINT32);
8041 cmdline_parse_token_num_t cmd_read_reg_bit_bit_pos =
8042 	TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_result, bit_pos, UINT8);
8043 
8044 cmdline_parse_inst_t cmd_read_reg_bit = {
8045 	.f = cmd_read_reg_bit_parsed,
8046 	.data = NULL,
8047 	.help_str = "read regbit <port_id> <reg_off> <bit_x>: 0 <= bit_x <= 31",
8048 	.tokens = {
8049 		(void *)&cmd_read_reg_bit_read,
8050 		(void *)&cmd_read_reg_bit_regbit,
8051 		(void *)&cmd_read_reg_bit_port_id,
8052 		(void *)&cmd_read_reg_bit_reg_off,
8053 		(void *)&cmd_read_reg_bit_bit_pos,
8054 		NULL,
8055 	},
8056 };
8057 
8058 /* *** WRITE PORT REGISTER *** */
8059 struct cmd_write_reg_result {
8060 	cmdline_fixed_string_t write;
8061 	cmdline_fixed_string_t reg;
8062 	portid_t port_id;
8063 	uint32_t reg_off;
8064 	uint32_t value;
8065 };
8066 
8067 static void
8068 cmd_write_reg_parsed(void *parsed_result,
8069 		     __rte_unused struct cmdline *cl,
8070 		     __rte_unused void *data)
8071 {
8072 	struct cmd_write_reg_result *res = parsed_result;
8073 	port_reg_set(res->port_id, res->reg_off, res->value);
8074 }
8075 
8076 cmdline_parse_token_string_t cmd_write_reg_write =
8077 	TOKEN_STRING_INITIALIZER(struct cmd_write_reg_result, write, "write");
8078 cmdline_parse_token_string_t cmd_write_reg_reg =
8079 	TOKEN_STRING_INITIALIZER(struct cmd_write_reg_result, reg, "reg");
8080 cmdline_parse_token_num_t cmd_write_reg_port_id =
8081 	TOKEN_NUM_INITIALIZER(struct cmd_write_reg_result, port_id, UINT16);
8082 cmdline_parse_token_num_t cmd_write_reg_reg_off =
8083 	TOKEN_NUM_INITIALIZER(struct cmd_write_reg_result, reg_off, UINT32);
8084 cmdline_parse_token_num_t cmd_write_reg_value =
8085 	TOKEN_NUM_INITIALIZER(struct cmd_write_reg_result, value, UINT32);
8086 
8087 cmdline_parse_inst_t cmd_write_reg = {
8088 	.f = cmd_write_reg_parsed,
8089 	.data = NULL,
8090 	.help_str = "write reg <port_id> <reg_off> <reg_value>",
8091 	.tokens = {
8092 		(void *)&cmd_write_reg_write,
8093 		(void *)&cmd_write_reg_reg,
8094 		(void *)&cmd_write_reg_port_id,
8095 		(void *)&cmd_write_reg_reg_off,
8096 		(void *)&cmd_write_reg_value,
8097 		NULL,
8098 	},
8099 };
8100 
8101 /* *** WRITE PORT REGISTER BIT FIELD *** */
8102 struct cmd_write_reg_bit_field_result {
8103 	cmdline_fixed_string_t write;
8104 	cmdline_fixed_string_t regfield;
8105 	portid_t port_id;
8106 	uint32_t reg_off;
8107 	uint8_t bit1_pos;
8108 	uint8_t bit2_pos;
8109 	uint32_t value;
8110 };
8111 
8112 static void
8113 cmd_write_reg_bit_field_parsed(void *parsed_result,
8114 			       __rte_unused struct cmdline *cl,
8115 			       __rte_unused void *data)
8116 {
8117 	struct cmd_write_reg_bit_field_result *res = parsed_result;
8118 	port_reg_bit_field_set(res->port_id, res->reg_off,
8119 			  res->bit1_pos, res->bit2_pos, res->value);
8120 }
8121 
8122 cmdline_parse_token_string_t cmd_write_reg_bit_field_write =
8123 	TOKEN_STRING_INITIALIZER(struct cmd_write_reg_bit_field_result, write,
8124 				 "write");
8125 cmdline_parse_token_string_t cmd_write_reg_bit_field_regfield =
8126 	TOKEN_STRING_INITIALIZER(struct cmd_write_reg_bit_field_result,
8127 				 regfield, "regfield");
8128 cmdline_parse_token_num_t cmd_write_reg_bit_field_port_id =
8129 	TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, port_id,
8130 			      UINT16);
8131 cmdline_parse_token_num_t cmd_write_reg_bit_field_reg_off =
8132 	TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, reg_off,
8133 			      UINT32);
8134 cmdline_parse_token_num_t cmd_write_reg_bit_field_bit1_pos =
8135 	TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, bit1_pos,
8136 			      UINT8);
8137 cmdline_parse_token_num_t cmd_write_reg_bit_field_bit2_pos =
8138 	TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, bit2_pos,
8139 			      UINT8);
8140 cmdline_parse_token_num_t cmd_write_reg_bit_field_value =
8141 	TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, value,
8142 			      UINT32);
8143 
8144 cmdline_parse_inst_t cmd_write_reg_bit_field = {
8145 	.f = cmd_write_reg_bit_field_parsed,
8146 	.data = NULL,
8147 	.help_str = "write regfield <port_id> <reg_off> <bit_x> <bit_y> "
8148 		"<reg_value>: "
8149 		"Set register bit field between bit_x and bit_y included",
8150 	.tokens = {
8151 		(void *)&cmd_write_reg_bit_field_write,
8152 		(void *)&cmd_write_reg_bit_field_regfield,
8153 		(void *)&cmd_write_reg_bit_field_port_id,
8154 		(void *)&cmd_write_reg_bit_field_reg_off,
8155 		(void *)&cmd_write_reg_bit_field_bit1_pos,
8156 		(void *)&cmd_write_reg_bit_field_bit2_pos,
8157 		(void *)&cmd_write_reg_bit_field_value,
8158 		NULL,
8159 	},
8160 };
8161 
8162 /* *** WRITE PORT REGISTER BIT *** */
8163 struct cmd_write_reg_bit_result {
8164 	cmdline_fixed_string_t write;
8165 	cmdline_fixed_string_t regbit;
8166 	portid_t port_id;
8167 	uint32_t reg_off;
8168 	uint8_t bit_pos;
8169 	uint8_t value;
8170 };
8171 
8172 static void
8173 cmd_write_reg_bit_parsed(void *parsed_result,
8174 			 __rte_unused struct cmdline *cl,
8175 			 __rte_unused void *data)
8176 {
8177 	struct cmd_write_reg_bit_result *res = parsed_result;
8178 	port_reg_bit_set(res->port_id, res->reg_off, res->bit_pos, res->value);
8179 }
8180 
8181 cmdline_parse_token_string_t cmd_write_reg_bit_write =
8182 	TOKEN_STRING_INITIALIZER(struct cmd_write_reg_bit_result, write,
8183 				 "write");
8184 cmdline_parse_token_string_t cmd_write_reg_bit_regbit =
8185 	TOKEN_STRING_INITIALIZER(struct cmd_write_reg_bit_result,
8186 				 regbit, "regbit");
8187 cmdline_parse_token_num_t cmd_write_reg_bit_port_id =
8188 	TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_result, port_id, UINT16);
8189 cmdline_parse_token_num_t cmd_write_reg_bit_reg_off =
8190 	TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_result, reg_off, UINT32);
8191 cmdline_parse_token_num_t cmd_write_reg_bit_bit_pos =
8192 	TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_result, bit_pos, UINT8);
8193 cmdline_parse_token_num_t cmd_write_reg_bit_value =
8194 	TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_result, value, UINT8);
8195 
8196 cmdline_parse_inst_t cmd_write_reg_bit = {
8197 	.f = cmd_write_reg_bit_parsed,
8198 	.data = NULL,
8199 	.help_str = "write regbit <port_id> <reg_off> <bit_x> 0|1: "
8200 		"0 <= bit_x <= 31",
8201 	.tokens = {
8202 		(void *)&cmd_write_reg_bit_write,
8203 		(void *)&cmd_write_reg_bit_regbit,
8204 		(void *)&cmd_write_reg_bit_port_id,
8205 		(void *)&cmd_write_reg_bit_reg_off,
8206 		(void *)&cmd_write_reg_bit_bit_pos,
8207 		(void *)&cmd_write_reg_bit_value,
8208 		NULL,
8209 	},
8210 };
8211 
8212 /* *** READ A RING DESCRIPTOR OF A PORT RX/TX QUEUE *** */
8213 struct cmd_read_rxd_txd_result {
8214 	cmdline_fixed_string_t read;
8215 	cmdline_fixed_string_t rxd_txd;
8216 	portid_t port_id;
8217 	uint16_t queue_id;
8218 	uint16_t desc_id;
8219 };
8220 
8221 static void
8222 cmd_read_rxd_txd_parsed(void *parsed_result,
8223 			__rte_unused struct cmdline *cl,
8224 			__rte_unused void *data)
8225 {
8226 	struct cmd_read_rxd_txd_result *res = parsed_result;
8227 
8228 	if (!strcmp(res->rxd_txd, "rxd"))
8229 		rx_ring_desc_display(res->port_id, res->queue_id, res->desc_id);
8230 	else if (!strcmp(res->rxd_txd, "txd"))
8231 		tx_ring_desc_display(res->port_id, res->queue_id, res->desc_id);
8232 }
8233 
8234 cmdline_parse_token_string_t cmd_read_rxd_txd_read =
8235 	TOKEN_STRING_INITIALIZER(struct cmd_read_rxd_txd_result, read, "read");
8236 cmdline_parse_token_string_t cmd_read_rxd_txd_rxd_txd =
8237 	TOKEN_STRING_INITIALIZER(struct cmd_read_rxd_txd_result, rxd_txd,
8238 				 "rxd#txd");
8239 cmdline_parse_token_num_t cmd_read_rxd_txd_port_id =
8240 	TOKEN_NUM_INITIALIZER(struct cmd_read_rxd_txd_result, port_id, UINT16);
8241 cmdline_parse_token_num_t cmd_read_rxd_txd_queue_id =
8242 	TOKEN_NUM_INITIALIZER(struct cmd_read_rxd_txd_result, queue_id, UINT16);
8243 cmdline_parse_token_num_t cmd_read_rxd_txd_desc_id =
8244 	TOKEN_NUM_INITIALIZER(struct cmd_read_rxd_txd_result, desc_id, UINT16);
8245 
8246 cmdline_parse_inst_t cmd_read_rxd_txd = {
8247 	.f = cmd_read_rxd_txd_parsed,
8248 	.data = NULL,
8249 	.help_str = "read rxd|txd <port_id> <queue_id> <desc_id>",
8250 	.tokens = {
8251 		(void *)&cmd_read_rxd_txd_read,
8252 		(void *)&cmd_read_rxd_txd_rxd_txd,
8253 		(void *)&cmd_read_rxd_txd_port_id,
8254 		(void *)&cmd_read_rxd_txd_queue_id,
8255 		(void *)&cmd_read_rxd_txd_desc_id,
8256 		NULL,
8257 	},
8258 };
8259 
8260 /* *** QUIT *** */
8261 struct cmd_quit_result {
8262 	cmdline_fixed_string_t quit;
8263 };
8264 
8265 static void cmd_quit_parsed(__rte_unused void *parsed_result,
8266 			    struct cmdline *cl,
8267 			    __rte_unused void *data)
8268 {
8269 	cmdline_quit(cl);
8270 }
8271 
8272 cmdline_parse_token_string_t cmd_quit_quit =
8273 	TOKEN_STRING_INITIALIZER(struct cmd_quit_result, quit, "quit");
8274 
8275 cmdline_parse_inst_t cmd_quit = {
8276 	.f = cmd_quit_parsed,
8277 	.data = NULL,
8278 	.help_str = "quit: Exit application",
8279 	.tokens = {
8280 		(void *)&cmd_quit_quit,
8281 		NULL,
8282 	},
8283 };
8284 
8285 /* *** ADD/REMOVE MAC ADDRESS FROM A PORT *** */
8286 struct cmd_mac_addr_result {
8287 	cmdline_fixed_string_t mac_addr_cmd;
8288 	cmdline_fixed_string_t what;
8289 	uint16_t port_num;
8290 	struct rte_ether_addr address;
8291 };
8292 
8293 static void cmd_mac_addr_parsed(void *parsed_result,
8294 		__rte_unused struct cmdline *cl,
8295 		__rte_unused void *data)
8296 {
8297 	struct cmd_mac_addr_result *res = parsed_result;
8298 	int ret;
8299 
8300 	if (strcmp(res->what, "add") == 0)
8301 		ret = rte_eth_dev_mac_addr_add(res->port_num, &res->address, 0);
8302 	else if (strcmp(res->what, "set") == 0)
8303 		ret = rte_eth_dev_default_mac_addr_set(res->port_num,
8304 						       &res->address);
8305 	else
8306 		ret = rte_eth_dev_mac_addr_remove(res->port_num, &res->address);
8307 
8308 	/* check the return value and print it if is < 0 */
8309 	if(ret < 0)
8310 		printf("mac_addr_cmd error: (%s)\n", strerror(-ret));
8311 
8312 }
8313 
8314 cmdline_parse_token_string_t cmd_mac_addr_cmd =
8315 	TOKEN_STRING_INITIALIZER(struct cmd_mac_addr_result, mac_addr_cmd,
8316 				"mac_addr");
8317 cmdline_parse_token_string_t cmd_mac_addr_what =
8318 	TOKEN_STRING_INITIALIZER(struct cmd_mac_addr_result, what,
8319 				"add#remove#set");
8320 cmdline_parse_token_num_t cmd_mac_addr_portnum =
8321 		TOKEN_NUM_INITIALIZER(struct cmd_mac_addr_result, port_num,
8322 					UINT16);
8323 cmdline_parse_token_etheraddr_t cmd_mac_addr_addr =
8324 		TOKEN_ETHERADDR_INITIALIZER(struct cmd_mac_addr_result, address);
8325 
8326 cmdline_parse_inst_t cmd_mac_addr = {
8327 	.f = cmd_mac_addr_parsed,
8328 	.data = (void *)0,
8329 	.help_str = "mac_addr add|remove|set <port_id> <mac_addr>: "
8330 			"Add/Remove/Set MAC address on port_id",
8331 	.tokens = {
8332 		(void *)&cmd_mac_addr_cmd,
8333 		(void *)&cmd_mac_addr_what,
8334 		(void *)&cmd_mac_addr_portnum,
8335 		(void *)&cmd_mac_addr_addr,
8336 		NULL,
8337 	},
8338 };
8339 
8340 /* *** SET THE PEER ADDRESS FOR CERTAIN PORT *** */
8341 struct cmd_eth_peer_result {
8342 	cmdline_fixed_string_t set;
8343 	cmdline_fixed_string_t eth_peer;
8344 	portid_t port_id;
8345 	cmdline_fixed_string_t peer_addr;
8346 };
8347 
8348 static void cmd_set_eth_peer_parsed(void *parsed_result,
8349 			__rte_unused struct cmdline *cl,
8350 			__rte_unused void *data)
8351 {
8352 		struct cmd_eth_peer_result *res = parsed_result;
8353 
8354 		if (test_done == 0) {
8355 			printf("Please stop forwarding first\n");
8356 			return;
8357 		}
8358 		if (!strcmp(res->eth_peer, "eth-peer")) {
8359 			set_fwd_eth_peer(res->port_id, res->peer_addr);
8360 			fwd_config_setup();
8361 		}
8362 }
8363 cmdline_parse_token_string_t cmd_eth_peer_set =
8364 	TOKEN_STRING_INITIALIZER(struct cmd_eth_peer_result, set, "set");
8365 cmdline_parse_token_string_t cmd_eth_peer =
8366 	TOKEN_STRING_INITIALIZER(struct cmd_eth_peer_result, eth_peer, "eth-peer");
8367 cmdline_parse_token_num_t cmd_eth_peer_port_id =
8368 	TOKEN_NUM_INITIALIZER(struct cmd_eth_peer_result, port_id, UINT16);
8369 cmdline_parse_token_string_t cmd_eth_peer_addr =
8370 	TOKEN_STRING_INITIALIZER(struct cmd_eth_peer_result, peer_addr, NULL);
8371 
8372 cmdline_parse_inst_t cmd_set_fwd_eth_peer = {
8373 	.f = cmd_set_eth_peer_parsed,
8374 	.data = NULL,
8375 	.help_str = "set eth-peer <port_id> <peer_mac>",
8376 	.tokens = {
8377 		(void *)&cmd_eth_peer_set,
8378 		(void *)&cmd_eth_peer,
8379 		(void *)&cmd_eth_peer_port_id,
8380 		(void *)&cmd_eth_peer_addr,
8381 		NULL,
8382 	},
8383 };
8384 
8385 /* *** CONFIGURE QUEUE STATS COUNTER MAPPINGS *** */
8386 struct cmd_set_qmap_result {
8387 	cmdline_fixed_string_t set;
8388 	cmdline_fixed_string_t qmap;
8389 	cmdline_fixed_string_t what;
8390 	portid_t port_id;
8391 	uint16_t queue_id;
8392 	uint8_t map_value;
8393 };
8394 
8395 static void
8396 cmd_set_qmap_parsed(void *parsed_result,
8397 		       __rte_unused struct cmdline *cl,
8398 		       __rte_unused void *data)
8399 {
8400 	struct cmd_set_qmap_result *res = parsed_result;
8401 	int is_rx = (strcmp(res->what, "tx") == 0) ? 0 : 1;
8402 
8403 	set_qmap(res->port_id, (uint8_t)is_rx, res->queue_id, res->map_value);
8404 }
8405 
8406 cmdline_parse_token_string_t cmd_setqmap_set =
8407 	TOKEN_STRING_INITIALIZER(struct cmd_set_qmap_result,
8408 				 set, "set");
8409 cmdline_parse_token_string_t cmd_setqmap_qmap =
8410 	TOKEN_STRING_INITIALIZER(struct cmd_set_qmap_result,
8411 				 qmap, "stat_qmap");
8412 cmdline_parse_token_string_t cmd_setqmap_what =
8413 	TOKEN_STRING_INITIALIZER(struct cmd_set_qmap_result,
8414 				 what, "tx#rx");
8415 cmdline_parse_token_num_t cmd_setqmap_portid =
8416 	TOKEN_NUM_INITIALIZER(struct cmd_set_qmap_result,
8417 			      port_id, UINT16);
8418 cmdline_parse_token_num_t cmd_setqmap_queueid =
8419 	TOKEN_NUM_INITIALIZER(struct cmd_set_qmap_result,
8420 			      queue_id, UINT16);
8421 cmdline_parse_token_num_t cmd_setqmap_mapvalue =
8422 	TOKEN_NUM_INITIALIZER(struct cmd_set_qmap_result,
8423 			      map_value, UINT8);
8424 
8425 cmdline_parse_inst_t cmd_set_qmap = {
8426 	.f = cmd_set_qmap_parsed,
8427 	.data = NULL,
8428 	.help_str = "set stat_qmap rx|tx <port_id> <queue_id> <map_value>: "
8429 		"Set statistics mapping value on tx|rx queue_id of port_id",
8430 	.tokens = {
8431 		(void *)&cmd_setqmap_set,
8432 		(void *)&cmd_setqmap_qmap,
8433 		(void *)&cmd_setqmap_what,
8434 		(void *)&cmd_setqmap_portid,
8435 		(void *)&cmd_setqmap_queueid,
8436 		(void *)&cmd_setqmap_mapvalue,
8437 		NULL,
8438 	},
8439 };
8440 
8441 /* *** SET OPTION TO HIDE ZERO VALUES FOR XSTATS  DISPLAY *** */
8442 struct cmd_set_xstats_hide_zero_result {
8443 	cmdline_fixed_string_t keyword;
8444 	cmdline_fixed_string_t name;
8445 	cmdline_fixed_string_t on_off;
8446 };
8447 
8448 static void
8449 cmd_set_xstats_hide_zero_parsed(void *parsed_result,
8450 			__rte_unused struct cmdline *cl,
8451 			__rte_unused void *data)
8452 {
8453 	struct cmd_set_xstats_hide_zero_result *res;
8454 	uint16_t on_off = 0;
8455 
8456 	res = parsed_result;
8457 	on_off = !strcmp(res->on_off, "on") ? 1 : 0;
8458 	set_xstats_hide_zero(on_off);
8459 }
8460 
8461 cmdline_parse_token_string_t cmd_set_xstats_hide_zero_keyword =
8462 	TOKEN_STRING_INITIALIZER(struct cmd_set_xstats_hide_zero_result,
8463 				 keyword, "set");
8464 cmdline_parse_token_string_t cmd_set_xstats_hide_zero_name =
8465 	TOKEN_STRING_INITIALIZER(struct cmd_set_xstats_hide_zero_result,
8466 				 name, "xstats-hide-zero");
8467 cmdline_parse_token_string_t cmd_set_xstats_hide_zero_on_off =
8468 	TOKEN_STRING_INITIALIZER(struct cmd_set_xstats_hide_zero_result,
8469 				 on_off, "on#off");
8470 
8471 cmdline_parse_inst_t cmd_set_xstats_hide_zero = {
8472 	.f = cmd_set_xstats_hide_zero_parsed,
8473 	.data = NULL,
8474 	.help_str = "set xstats-hide-zero on|off",
8475 	.tokens = {
8476 		(void *)&cmd_set_xstats_hide_zero_keyword,
8477 		(void *)&cmd_set_xstats_hide_zero_name,
8478 		(void *)&cmd_set_xstats_hide_zero_on_off,
8479 		NULL,
8480 	},
8481 };
8482 
8483 /* *** SET OPTION TO ENABLE MEASUREMENT OF CPU CYCLES *** */
8484 struct cmd_set_record_core_cycles_result {
8485 	cmdline_fixed_string_t keyword;
8486 	cmdline_fixed_string_t name;
8487 	cmdline_fixed_string_t on_off;
8488 };
8489 
8490 static void
8491 cmd_set_record_core_cycles_parsed(void *parsed_result,
8492 			__rte_unused struct cmdline *cl,
8493 			__rte_unused void *data)
8494 {
8495 	struct cmd_set_record_core_cycles_result *res;
8496 	uint16_t on_off = 0;
8497 
8498 	res = parsed_result;
8499 	on_off = !strcmp(res->on_off, "on") ? 1 : 0;
8500 	set_record_core_cycles(on_off);
8501 }
8502 
8503 cmdline_parse_token_string_t cmd_set_record_core_cycles_keyword =
8504 	TOKEN_STRING_INITIALIZER(struct cmd_set_record_core_cycles_result,
8505 				 keyword, "set");
8506 cmdline_parse_token_string_t cmd_set_record_core_cycles_name =
8507 	TOKEN_STRING_INITIALIZER(struct cmd_set_record_core_cycles_result,
8508 				 name, "record-core-cycles");
8509 cmdline_parse_token_string_t cmd_set_record_core_cycles_on_off =
8510 	TOKEN_STRING_INITIALIZER(struct cmd_set_record_core_cycles_result,
8511 				 on_off, "on#off");
8512 
8513 cmdline_parse_inst_t cmd_set_record_core_cycles = {
8514 	.f = cmd_set_record_core_cycles_parsed,
8515 	.data = NULL,
8516 	.help_str = "set record-core-cycles on|off",
8517 	.tokens = {
8518 		(void *)&cmd_set_record_core_cycles_keyword,
8519 		(void *)&cmd_set_record_core_cycles_name,
8520 		(void *)&cmd_set_record_core_cycles_on_off,
8521 		NULL,
8522 	},
8523 };
8524 
8525 /* *** SET OPTION TO ENABLE DISPLAY OF RX AND TX BURSTS *** */
8526 struct cmd_set_record_burst_stats_result {
8527 	cmdline_fixed_string_t keyword;
8528 	cmdline_fixed_string_t name;
8529 	cmdline_fixed_string_t on_off;
8530 };
8531 
8532 static void
8533 cmd_set_record_burst_stats_parsed(void *parsed_result,
8534 			__rte_unused struct cmdline *cl,
8535 			__rte_unused void *data)
8536 {
8537 	struct cmd_set_record_burst_stats_result *res;
8538 	uint16_t on_off = 0;
8539 
8540 	res = parsed_result;
8541 	on_off = !strcmp(res->on_off, "on") ? 1 : 0;
8542 	set_record_burst_stats(on_off);
8543 }
8544 
8545 cmdline_parse_token_string_t cmd_set_record_burst_stats_keyword =
8546 	TOKEN_STRING_INITIALIZER(struct cmd_set_record_burst_stats_result,
8547 				 keyword, "set");
8548 cmdline_parse_token_string_t cmd_set_record_burst_stats_name =
8549 	TOKEN_STRING_INITIALIZER(struct cmd_set_record_burst_stats_result,
8550 				 name, "record-burst-stats");
8551 cmdline_parse_token_string_t cmd_set_record_burst_stats_on_off =
8552 	TOKEN_STRING_INITIALIZER(struct cmd_set_record_burst_stats_result,
8553 				 on_off, "on#off");
8554 
8555 cmdline_parse_inst_t cmd_set_record_burst_stats = {
8556 	.f = cmd_set_record_burst_stats_parsed,
8557 	.data = NULL,
8558 	.help_str = "set record-burst-stats on|off",
8559 	.tokens = {
8560 		(void *)&cmd_set_record_burst_stats_keyword,
8561 		(void *)&cmd_set_record_burst_stats_name,
8562 		(void *)&cmd_set_record_burst_stats_on_off,
8563 		NULL,
8564 	},
8565 };
8566 
8567 /* *** CONFIGURE UNICAST HASH TABLE *** */
8568 struct cmd_set_uc_hash_table {
8569 	cmdline_fixed_string_t set;
8570 	cmdline_fixed_string_t port;
8571 	portid_t port_id;
8572 	cmdline_fixed_string_t what;
8573 	struct rte_ether_addr address;
8574 	cmdline_fixed_string_t mode;
8575 };
8576 
8577 static void
8578 cmd_set_uc_hash_parsed(void *parsed_result,
8579 		       __rte_unused struct cmdline *cl,
8580 		       __rte_unused void *data)
8581 {
8582 	int ret=0;
8583 	struct cmd_set_uc_hash_table *res = parsed_result;
8584 
8585 	int is_on = (strcmp(res->mode, "on") == 0) ? 1 : 0;
8586 
8587 	if (strcmp(res->what, "uta") == 0)
8588 		ret = rte_eth_dev_uc_hash_table_set(res->port_id,
8589 						&res->address,(uint8_t)is_on);
8590 	if (ret < 0)
8591 		printf("bad unicast hash table parameter, return code = %d \n", ret);
8592 
8593 }
8594 
8595 cmdline_parse_token_string_t cmd_set_uc_hash_set =
8596 	TOKEN_STRING_INITIALIZER(struct cmd_set_uc_hash_table,
8597 				 set, "set");
8598 cmdline_parse_token_string_t cmd_set_uc_hash_port =
8599 	TOKEN_STRING_INITIALIZER(struct cmd_set_uc_hash_table,
8600 				 port, "port");
8601 cmdline_parse_token_num_t cmd_set_uc_hash_portid =
8602 	TOKEN_NUM_INITIALIZER(struct cmd_set_uc_hash_table,
8603 			      port_id, UINT16);
8604 cmdline_parse_token_string_t cmd_set_uc_hash_what =
8605 	TOKEN_STRING_INITIALIZER(struct cmd_set_uc_hash_table,
8606 				 what, "uta");
8607 cmdline_parse_token_etheraddr_t cmd_set_uc_hash_mac =
8608 	TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_uc_hash_table,
8609 				address);
8610 cmdline_parse_token_string_t cmd_set_uc_hash_mode =
8611 	TOKEN_STRING_INITIALIZER(struct cmd_set_uc_hash_table,
8612 				 mode, "on#off");
8613 
8614 cmdline_parse_inst_t cmd_set_uc_hash_filter = {
8615 	.f = cmd_set_uc_hash_parsed,
8616 	.data = NULL,
8617 	.help_str = "set port <port_id> uta <mac_addr> on|off)",
8618 	.tokens = {
8619 		(void *)&cmd_set_uc_hash_set,
8620 		(void *)&cmd_set_uc_hash_port,
8621 		(void *)&cmd_set_uc_hash_portid,
8622 		(void *)&cmd_set_uc_hash_what,
8623 		(void *)&cmd_set_uc_hash_mac,
8624 		(void *)&cmd_set_uc_hash_mode,
8625 		NULL,
8626 	},
8627 };
8628 
8629 struct cmd_set_uc_all_hash_table {
8630 	cmdline_fixed_string_t set;
8631 	cmdline_fixed_string_t port;
8632 	portid_t port_id;
8633 	cmdline_fixed_string_t what;
8634 	cmdline_fixed_string_t value;
8635 	cmdline_fixed_string_t mode;
8636 };
8637 
8638 static void
8639 cmd_set_uc_all_hash_parsed(void *parsed_result,
8640 		       __rte_unused struct cmdline *cl,
8641 		       __rte_unused void *data)
8642 {
8643 	int ret=0;
8644 	struct cmd_set_uc_all_hash_table *res = parsed_result;
8645 
8646 	int is_on = (strcmp(res->mode, "on") == 0) ? 1 : 0;
8647 
8648 	if ((strcmp(res->what, "uta") == 0) &&
8649 		(strcmp(res->value, "all") == 0))
8650 		ret = rte_eth_dev_uc_all_hash_table_set(res->port_id,(uint8_t) is_on);
8651 	if (ret < 0)
8652 		printf("bad unicast hash table parameter,"
8653 			"return code = %d \n", ret);
8654 }
8655 
8656 cmdline_parse_token_string_t cmd_set_uc_all_hash_set =
8657 	TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table,
8658 				 set, "set");
8659 cmdline_parse_token_string_t cmd_set_uc_all_hash_port =
8660 	TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table,
8661 				 port, "port");
8662 cmdline_parse_token_num_t cmd_set_uc_all_hash_portid =
8663 	TOKEN_NUM_INITIALIZER(struct cmd_set_uc_all_hash_table,
8664 			      port_id, UINT16);
8665 cmdline_parse_token_string_t cmd_set_uc_all_hash_what =
8666 	TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table,
8667 				 what, "uta");
8668 cmdline_parse_token_string_t cmd_set_uc_all_hash_value =
8669 	TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table,
8670 				value,"all");
8671 cmdline_parse_token_string_t cmd_set_uc_all_hash_mode =
8672 	TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table,
8673 				 mode, "on#off");
8674 
8675 cmdline_parse_inst_t cmd_set_uc_all_hash_filter = {
8676 	.f = cmd_set_uc_all_hash_parsed,
8677 	.data = NULL,
8678 	.help_str = "set port <port_id> uta all on|off",
8679 	.tokens = {
8680 		(void *)&cmd_set_uc_all_hash_set,
8681 		(void *)&cmd_set_uc_all_hash_port,
8682 		(void *)&cmd_set_uc_all_hash_portid,
8683 		(void *)&cmd_set_uc_all_hash_what,
8684 		(void *)&cmd_set_uc_all_hash_value,
8685 		(void *)&cmd_set_uc_all_hash_mode,
8686 		NULL,
8687 	},
8688 };
8689 
8690 /* *** CONFIGURE VF TRAFFIC CONTROL *** */
8691 struct cmd_set_vf_traffic {
8692 	cmdline_fixed_string_t set;
8693 	cmdline_fixed_string_t port;
8694 	portid_t port_id;
8695 	cmdline_fixed_string_t vf;
8696 	uint8_t vf_id;
8697 	cmdline_fixed_string_t what;
8698 	cmdline_fixed_string_t mode;
8699 };
8700 
8701 static void
8702 cmd_set_vf_traffic_parsed(void *parsed_result,
8703 		       __rte_unused struct cmdline *cl,
8704 		       __rte_unused void *data)
8705 {
8706 	struct cmd_set_vf_traffic *res = parsed_result;
8707 	int is_rx = (strcmp(res->what, "rx") == 0) ? 1 : 0;
8708 	int is_on = (strcmp(res->mode, "on") == 0) ? 1 : 0;
8709 
8710 	set_vf_traffic(res->port_id, (uint8_t)is_rx, res->vf_id,(uint8_t) is_on);
8711 }
8712 
8713 cmdline_parse_token_string_t cmd_setvf_traffic_set =
8714 	TOKEN_STRING_INITIALIZER(struct cmd_set_vf_traffic,
8715 				 set, "set");
8716 cmdline_parse_token_string_t cmd_setvf_traffic_port =
8717 	TOKEN_STRING_INITIALIZER(struct cmd_set_vf_traffic,
8718 				 port, "port");
8719 cmdline_parse_token_num_t cmd_setvf_traffic_portid =
8720 	TOKEN_NUM_INITIALIZER(struct cmd_set_vf_traffic,
8721 			      port_id, UINT16);
8722 cmdline_parse_token_string_t cmd_setvf_traffic_vf =
8723 	TOKEN_STRING_INITIALIZER(struct cmd_set_vf_traffic,
8724 				 vf, "vf");
8725 cmdline_parse_token_num_t cmd_setvf_traffic_vfid =
8726 	TOKEN_NUM_INITIALIZER(struct cmd_set_vf_traffic,
8727 			      vf_id, UINT8);
8728 cmdline_parse_token_string_t cmd_setvf_traffic_what =
8729 	TOKEN_STRING_INITIALIZER(struct cmd_set_vf_traffic,
8730 				 what, "tx#rx");
8731 cmdline_parse_token_string_t cmd_setvf_traffic_mode =
8732 	TOKEN_STRING_INITIALIZER(struct cmd_set_vf_traffic,
8733 				 mode, "on#off");
8734 
8735 cmdline_parse_inst_t cmd_set_vf_traffic = {
8736 	.f = cmd_set_vf_traffic_parsed,
8737 	.data = NULL,
8738 	.help_str = "set port <port_id> vf <vf_id> rx|tx on|off",
8739 	.tokens = {
8740 		(void *)&cmd_setvf_traffic_set,
8741 		(void *)&cmd_setvf_traffic_port,
8742 		(void *)&cmd_setvf_traffic_portid,
8743 		(void *)&cmd_setvf_traffic_vf,
8744 		(void *)&cmd_setvf_traffic_vfid,
8745 		(void *)&cmd_setvf_traffic_what,
8746 		(void *)&cmd_setvf_traffic_mode,
8747 		NULL,
8748 	},
8749 };
8750 
8751 /* *** CONFIGURE VF RECEIVE MODE *** */
8752 struct cmd_set_vf_rxmode {
8753 	cmdline_fixed_string_t set;
8754 	cmdline_fixed_string_t port;
8755 	portid_t port_id;
8756 	cmdline_fixed_string_t vf;
8757 	uint8_t vf_id;
8758 	cmdline_fixed_string_t what;
8759 	cmdline_fixed_string_t mode;
8760 	cmdline_fixed_string_t on;
8761 };
8762 
8763 static void
8764 cmd_set_vf_rxmode_parsed(void *parsed_result,
8765 		       __rte_unused struct cmdline *cl,
8766 		       __rte_unused void *data)
8767 {
8768 	int ret = -ENOTSUP;
8769 	uint16_t vf_rxmode = 0;
8770 	struct cmd_set_vf_rxmode *res = parsed_result;
8771 
8772 	int is_on = (strcmp(res->on, "on") == 0) ? 1 : 0;
8773 	if (!strcmp(res->what,"rxmode")) {
8774 		if (!strcmp(res->mode, "AUPE"))
8775 			vf_rxmode |= ETH_VMDQ_ACCEPT_UNTAG;
8776 		else if (!strcmp(res->mode, "ROPE"))
8777 			vf_rxmode |= ETH_VMDQ_ACCEPT_HASH_UC;
8778 		else if (!strcmp(res->mode, "BAM"))
8779 			vf_rxmode |= ETH_VMDQ_ACCEPT_BROADCAST;
8780 		else if (!strncmp(res->mode, "MPE",3))
8781 			vf_rxmode |= ETH_VMDQ_ACCEPT_MULTICAST;
8782 	}
8783 
8784 	RTE_SET_USED(is_on);
8785 
8786 #ifdef RTE_NET_IXGBE
8787 	if (ret == -ENOTSUP)
8788 		ret = rte_pmd_ixgbe_set_vf_rxmode(res->port_id, res->vf_id,
8789 						  vf_rxmode, (uint8_t)is_on);
8790 #endif
8791 #ifdef RTE_NET_BNXT
8792 	if (ret == -ENOTSUP)
8793 		ret = rte_pmd_bnxt_set_vf_rxmode(res->port_id, res->vf_id,
8794 						 vf_rxmode, (uint8_t)is_on);
8795 #endif
8796 	if (ret < 0)
8797 		printf("bad VF receive mode parameter, return code = %d \n",
8798 		ret);
8799 }
8800 
8801 cmdline_parse_token_string_t cmd_set_vf_rxmode_set =
8802 	TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode,
8803 				 set, "set");
8804 cmdline_parse_token_string_t cmd_set_vf_rxmode_port =
8805 	TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode,
8806 				 port, "port");
8807 cmdline_parse_token_num_t cmd_set_vf_rxmode_portid =
8808 	TOKEN_NUM_INITIALIZER(struct cmd_set_vf_rxmode,
8809 			      port_id, UINT16);
8810 cmdline_parse_token_string_t cmd_set_vf_rxmode_vf =
8811 	TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode,
8812 				 vf, "vf");
8813 cmdline_parse_token_num_t cmd_set_vf_rxmode_vfid =
8814 	TOKEN_NUM_INITIALIZER(struct cmd_set_vf_rxmode,
8815 			      vf_id, UINT8);
8816 cmdline_parse_token_string_t cmd_set_vf_rxmode_what =
8817 	TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode,
8818 				 what, "rxmode");
8819 cmdline_parse_token_string_t cmd_set_vf_rxmode_mode =
8820 	TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode,
8821 				 mode, "AUPE#ROPE#BAM#MPE");
8822 cmdline_parse_token_string_t cmd_set_vf_rxmode_on =
8823 	TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode,
8824 				 on, "on#off");
8825 
8826 cmdline_parse_inst_t cmd_set_vf_rxmode = {
8827 	.f = cmd_set_vf_rxmode_parsed,
8828 	.data = NULL,
8829 	.help_str = "set port <port_id> vf <vf_id> rxmode "
8830 		"AUPE|ROPE|BAM|MPE on|off",
8831 	.tokens = {
8832 		(void *)&cmd_set_vf_rxmode_set,
8833 		(void *)&cmd_set_vf_rxmode_port,
8834 		(void *)&cmd_set_vf_rxmode_portid,
8835 		(void *)&cmd_set_vf_rxmode_vf,
8836 		(void *)&cmd_set_vf_rxmode_vfid,
8837 		(void *)&cmd_set_vf_rxmode_what,
8838 		(void *)&cmd_set_vf_rxmode_mode,
8839 		(void *)&cmd_set_vf_rxmode_on,
8840 		NULL,
8841 	},
8842 };
8843 
8844 /* *** ADD MAC ADDRESS FILTER FOR A VF OF A PORT *** */
8845 struct cmd_vf_mac_addr_result {
8846 	cmdline_fixed_string_t mac_addr_cmd;
8847 	cmdline_fixed_string_t what;
8848 	cmdline_fixed_string_t port;
8849 	uint16_t port_num;
8850 	cmdline_fixed_string_t vf;
8851 	uint8_t vf_num;
8852 	struct rte_ether_addr address;
8853 };
8854 
8855 static void cmd_vf_mac_addr_parsed(void *parsed_result,
8856 		__rte_unused struct cmdline *cl,
8857 		__rte_unused void *data)
8858 {
8859 	struct cmd_vf_mac_addr_result *res = parsed_result;
8860 	int ret = -ENOTSUP;
8861 
8862 	if (strcmp(res->what, "add") != 0)
8863 		return;
8864 
8865 #ifdef RTE_NET_I40E
8866 	if (ret == -ENOTSUP)
8867 		ret = rte_pmd_i40e_add_vf_mac_addr(res->port_num, res->vf_num,
8868 						   &res->address);
8869 #endif
8870 #ifdef RTE_NET_BNXT
8871 	if (ret == -ENOTSUP)
8872 		ret = rte_pmd_bnxt_mac_addr_add(res->port_num, &res->address,
8873 						res->vf_num);
8874 #endif
8875 
8876 	if(ret < 0)
8877 		printf("vf_mac_addr_cmd error: (%s)\n", strerror(-ret));
8878 
8879 }
8880 
8881 cmdline_parse_token_string_t cmd_vf_mac_addr_cmd =
8882 	TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result,
8883 				mac_addr_cmd,"mac_addr");
8884 cmdline_parse_token_string_t cmd_vf_mac_addr_what =
8885 	TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result,
8886 				what,"add");
8887 cmdline_parse_token_string_t cmd_vf_mac_addr_port =
8888 	TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result,
8889 				port,"port");
8890 cmdline_parse_token_num_t cmd_vf_mac_addr_portnum =
8891 	TOKEN_NUM_INITIALIZER(struct cmd_vf_mac_addr_result,
8892 				port_num, UINT16);
8893 cmdline_parse_token_string_t cmd_vf_mac_addr_vf =
8894 	TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result,
8895 				vf,"vf");
8896 cmdline_parse_token_num_t cmd_vf_mac_addr_vfnum =
8897 	TOKEN_NUM_INITIALIZER(struct cmd_vf_mac_addr_result,
8898 				vf_num, UINT8);
8899 cmdline_parse_token_etheraddr_t cmd_vf_mac_addr_addr =
8900 	TOKEN_ETHERADDR_INITIALIZER(struct cmd_vf_mac_addr_result,
8901 				address);
8902 
8903 cmdline_parse_inst_t cmd_vf_mac_addr_filter = {
8904 	.f = cmd_vf_mac_addr_parsed,
8905 	.data = (void *)0,
8906 	.help_str = "mac_addr add port <port_id> vf <vf_id> <mac_addr>: "
8907 		"Add MAC address filtering for a VF on port_id",
8908 	.tokens = {
8909 		(void *)&cmd_vf_mac_addr_cmd,
8910 		(void *)&cmd_vf_mac_addr_what,
8911 		(void *)&cmd_vf_mac_addr_port,
8912 		(void *)&cmd_vf_mac_addr_portnum,
8913 		(void *)&cmd_vf_mac_addr_vf,
8914 		(void *)&cmd_vf_mac_addr_vfnum,
8915 		(void *)&cmd_vf_mac_addr_addr,
8916 		NULL,
8917 	},
8918 };
8919 
8920 /* *** ADD/REMOVE A VLAN IDENTIFIER TO/FROM A PORT VLAN RX FILTER *** */
8921 struct cmd_vf_rx_vlan_filter {
8922 	cmdline_fixed_string_t rx_vlan;
8923 	cmdline_fixed_string_t what;
8924 	uint16_t vlan_id;
8925 	cmdline_fixed_string_t port;
8926 	portid_t port_id;
8927 	cmdline_fixed_string_t vf;
8928 	uint64_t vf_mask;
8929 };
8930 
8931 static void
8932 cmd_vf_rx_vlan_filter_parsed(void *parsed_result,
8933 			  __rte_unused struct cmdline *cl,
8934 			  __rte_unused void *data)
8935 {
8936 	struct cmd_vf_rx_vlan_filter *res = parsed_result;
8937 	int ret = -ENOTSUP;
8938 
8939 	__rte_unused int is_add = (strcmp(res->what, "add") == 0) ? 1 : 0;
8940 
8941 #ifdef RTE_NET_IXGBE
8942 	if (ret == -ENOTSUP)
8943 		ret = rte_pmd_ixgbe_set_vf_vlan_filter(res->port_id,
8944 				res->vlan_id, res->vf_mask, is_add);
8945 #endif
8946 #ifdef RTE_NET_I40E
8947 	if (ret == -ENOTSUP)
8948 		ret = rte_pmd_i40e_set_vf_vlan_filter(res->port_id,
8949 				res->vlan_id, res->vf_mask, is_add);
8950 #endif
8951 #ifdef RTE_NET_BNXT
8952 	if (ret == -ENOTSUP)
8953 		ret = rte_pmd_bnxt_set_vf_vlan_filter(res->port_id,
8954 				res->vlan_id, res->vf_mask, is_add);
8955 #endif
8956 
8957 	switch (ret) {
8958 	case 0:
8959 		break;
8960 	case -EINVAL:
8961 		printf("invalid vlan_id %d or vf_mask %"PRIu64"\n",
8962 				res->vlan_id, res->vf_mask);
8963 		break;
8964 	case -ENODEV:
8965 		printf("invalid port_id %d\n", res->port_id);
8966 		break;
8967 	case -ENOTSUP:
8968 		printf("function not implemented or supported\n");
8969 		break;
8970 	default:
8971 		printf("programming error: (%s)\n", strerror(-ret));
8972 	}
8973 }
8974 
8975 cmdline_parse_token_string_t cmd_vf_rx_vlan_filter_rx_vlan =
8976 	TOKEN_STRING_INITIALIZER(struct cmd_vf_rx_vlan_filter,
8977 				 rx_vlan, "rx_vlan");
8978 cmdline_parse_token_string_t cmd_vf_rx_vlan_filter_what =
8979 	TOKEN_STRING_INITIALIZER(struct cmd_vf_rx_vlan_filter,
8980 				 what, "add#rm");
8981 cmdline_parse_token_num_t cmd_vf_rx_vlan_filter_vlanid =
8982 	TOKEN_NUM_INITIALIZER(struct cmd_vf_rx_vlan_filter,
8983 			      vlan_id, UINT16);
8984 cmdline_parse_token_string_t cmd_vf_rx_vlan_filter_port =
8985 	TOKEN_STRING_INITIALIZER(struct cmd_vf_rx_vlan_filter,
8986 				 port, "port");
8987 cmdline_parse_token_num_t cmd_vf_rx_vlan_filter_portid =
8988 	TOKEN_NUM_INITIALIZER(struct cmd_vf_rx_vlan_filter,
8989 			      port_id, UINT16);
8990 cmdline_parse_token_string_t cmd_vf_rx_vlan_filter_vf =
8991 	TOKEN_STRING_INITIALIZER(struct cmd_vf_rx_vlan_filter,
8992 				 vf, "vf");
8993 cmdline_parse_token_num_t cmd_vf_rx_vlan_filter_vf_mask =
8994 	TOKEN_NUM_INITIALIZER(struct cmd_vf_rx_vlan_filter,
8995 			      vf_mask, UINT64);
8996 
8997 cmdline_parse_inst_t cmd_vf_rxvlan_filter = {
8998 	.f = cmd_vf_rx_vlan_filter_parsed,
8999 	.data = NULL,
9000 	.help_str = "rx_vlan add|rm <vlan_id> port <port_id> vf <vf_mask>: "
9001 		"(vf_mask = hexadecimal VF mask)",
9002 	.tokens = {
9003 		(void *)&cmd_vf_rx_vlan_filter_rx_vlan,
9004 		(void *)&cmd_vf_rx_vlan_filter_what,
9005 		(void *)&cmd_vf_rx_vlan_filter_vlanid,
9006 		(void *)&cmd_vf_rx_vlan_filter_port,
9007 		(void *)&cmd_vf_rx_vlan_filter_portid,
9008 		(void *)&cmd_vf_rx_vlan_filter_vf,
9009 		(void *)&cmd_vf_rx_vlan_filter_vf_mask,
9010 		NULL,
9011 	},
9012 };
9013 
9014 /* *** SET RATE LIMIT FOR A QUEUE OF A PORT *** */
9015 struct cmd_queue_rate_limit_result {
9016 	cmdline_fixed_string_t set;
9017 	cmdline_fixed_string_t port;
9018 	uint16_t port_num;
9019 	cmdline_fixed_string_t queue;
9020 	uint8_t queue_num;
9021 	cmdline_fixed_string_t rate;
9022 	uint16_t rate_num;
9023 };
9024 
9025 static void cmd_queue_rate_limit_parsed(void *parsed_result,
9026 		__rte_unused struct cmdline *cl,
9027 		__rte_unused void *data)
9028 {
9029 	struct cmd_queue_rate_limit_result *res = parsed_result;
9030 	int ret = 0;
9031 
9032 	if ((strcmp(res->set, "set") == 0) && (strcmp(res->port, "port") == 0)
9033 		&& (strcmp(res->queue, "queue") == 0)
9034 		&& (strcmp(res->rate, "rate") == 0))
9035 		ret = set_queue_rate_limit(res->port_num, res->queue_num,
9036 					res->rate_num);
9037 	if (ret < 0)
9038 		printf("queue_rate_limit_cmd error: (%s)\n", strerror(-ret));
9039 
9040 }
9041 
9042 cmdline_parse_token_string_t cmd_queue_rate_limit_set =
9043 	TOKEN_STRING_INITIALIZER(struct cmd_queue_rate_limit_result,
9044 				set, "set");
9045 cmdline_parse_token_string_t cmd_queue_rate_limit_port =
9046 	TOKEN_STRING_INITIALIZER(struct cmd_queue_rate_limit_result,
9047 				port, "port");
9048 cmdline_parse_token_num_t cmd_queue_rate_limit_portnum =
9049 	TOKEN_NUM_INITIALIZER(struct cmd_queue_rate_limit_result,
9050 				port_num, UINT16);
9051 cmdline_parse_token_string_t cmd_queue_rate_limit_queue =
9052 	TOKEN_STRING_INITIALIZER(struct cmd_queue_rate_limit_result,
9053 				queue, "queue");
9054 cmdline_parse_token_num_t cmd_queue_rate_limit_queuenum =
9055 	TOKEN_NUM_INITIALIZER(struct cmd_queue_rate_limit_result,
9056 				queue_num, UINT8);
9057 cmdline_parse_token_string_t cmd_queue_rate_limit_rate =
9058 	TOKEN_STRING_INITIALIZER(struct cmd_queue_rate_limit_result,
9059 				rate, "rate");
9060 cmdline_parse_token_num_t cmd_queue_rate_limit_ratenum =
9061 	TOKEN_NUM_INITIALIZER(struct cmd_queue_rate_limit_result,
9062 				rate_num, UINT16);
9063 
9064 cmdline_parse_inst_t cmd_queue_rate_limit = {
9065 	.f = cmd_queue_rate_limit_parsed,
9066 	.data = (void *)0,
9067 	.help_str = "set port <port_id> queue <queue_id> rate <rate_value>: "
9068 		"Set rate limit for a queue on port_id",
9069 	.tokens = {
9070 		(void *)&cmd_queue_rate_limit_set,
9071 		(void *)&cmd_queue_rate_limit_port,
9072 		(void *)&cmd_queue_rate_limit_portnum,
9073 		(void *)&cmd_queue_rate_limit_queue,
9074 		(void *)&cmd_queue_rate_limit_queuenum,
9075 		(void *)&cmd_queue_rate_limit_rate,
9076 		(void *)&cmd_queue_rate_limit_ratenum,
9077 		NULL,
9078 	},
9079 };
9080 
9081 /* *** SET RATE LIMIT FOR A VF OF A PORT *** */
9082 struct cmd_vf_rate_limit_result {
9083 	cmdline_fixed_string_t set;
9084 	cmdline_fixed_string_t port;
9085 	uint16_t port_num;
9086 	cmdline_fixed_string_t vf;
9087 	uint8_t vf_num;
9088 	cmdline_fixed_string_t rate;
9089 	uint16_t rate_num;
9090 	cmdline_fixed_string_t q_msk;
9091 	uint64_t q_msk_val;
9092 };
9093 
9094 static void cmd_vf_rate_limit_parsed(void *parsed_result,
9095 		__rte_unused struct cmdline *cl,
9096 		__rte_unused void *data)
9097 {
9098 	struct cmd_vf_rate_limit_result *res = parsed_result;
9099 	int ret = 0;
9100 
9101 	if ((strcmp(res->set, "set") == 0) && (strcmp(res->port, "port") == 0)
9102 		&& (strcmp(res->vf, "vf") == 0)
9103 		&& (strcmp(res->rate, "rate") == 0)
9104 		&& (strcmp(res->q_msk, "queue_mask") == 0))
9105 		ret = set_vf_rate_limit(res->port_num, res->vf_num,
9106 					res->rate_num, res->q_msk_val);
9107 	if (ret < 0)
9108 		printf("vf_rate_limit_cmd error: (%s)\n", strerror(-ret));
9109 
9110 }
9111 
9112 cmdline_parse_token_string_t cmd_vf_rate_limit_set =
9113 	TOKEN_STRING_INITIALIZER(struct cmd_vf_rate_limit_result,
9114 				set, "set");
9115 cmdline_parse_token_string_t cmd_vf_rate_limit_port =
9116 	TOKEN_STRING_INITIALIZER(struct cmd_vf_rate_limit_result,
9117 				port, "port");
9118 cmdline_parse_token_num_t cmd_vf_rate_limit_portnum =
9119 	TOKEN_NUM_INITIALIZER(struct cmd_vf_rate_limit_result,
9120 				port_num, UINT16);
9121 cmdline_parse_token_string_t cmd_vf_rate_limit_vf =
9122 	TOKEN_STRING_INITIALIZER(struct cmd_vf_rate_limit_result,
9123 				vf, "vf");
9124 cmdline_parse_token_num_t cmd_vf_rate_limit_vfnum =
9125 	TOKEN_NUM_INITIALIZER(struct cmd_vf_rate_limit_result,
9126 				vf_num, UINT8);
9127 cmdline_parse_token_string_t cmd_vf_rate_limit_rate =
9128 	TOKEN_STRING_INITIALIZER(struct cmd_vf_rate_limit_result,
9129 				rate, "rate");
9130 cmdline_parse_token_num_t cmd_vf_rate_limit_ratenum =
9131 	TOKEN_NUM_INITIALIZER(struct cmd_vf_rate_limit_result,
9132 				rate_num, UINT16);
9133 cmdline_parse_token_string_t cmd_vf_rate_limit_q_msk =
9134 	TOKEN_STRING_INITIALIZER(struct cmd_vf_rate_limit_result,
9135 				q_msk, "queue_mask");
9136 cmdline_parse_token_num_t cmd_vf_rate_limit_q_msk_val =
9137 	TOKEN_NUM_INITIALIZER(struct cmd_vf_rate_limit_result,
9138 				q_msk_val, UINT64);
9139 
9140 cmdline_parse_inst_t cmd_vf_rate_limit = {
9141 	.f = cmd_vf_rate_limit_parsed,
9142 	.data = (void *)0,
9143 	.help_str = "set port <port_id> vf <vf_id> rate <rate_value> "
9144 		"queue_mask <queue_mask_value>: "
9145 		"Set rate limit for queues of VF on port_id",
9146 	.tokens = {
9147 		(void *)&cmd_vf_rate_limit_set,
9148 		(void *)&cmd_vf_rate_limit_port,
9149 		(void *)&cmd_vf_rate_limit_portnum,
9150 		(void *)&cmd_vf_rate_limit_vf,
9151 		(void *)&cmd_vf_rate_limit_vfnum,
9152 		(void *)&cmd_vf_rate_limit_rate,
9153 		(void *)&cmd_vf_rate_limit_ratenum,
9154 		(void *)&cmd_vf_rate_limit_q_msk,
9155 		(void *)&cmd_vf_rate_limit_q_msk_val,
9156 		NULL,
9157 	},
9158 };
9159 
9160 /* *** CONFIGURE TUNNEL UDP PORT *** */
9161 struct cmd_tunnel_udp_config {
9162 	cmdline_fixed_string_t cmd;
9163 	cmdline_fixed_string_t what;
9164 	uint16_t udp_port;
9165 	portid_t port_id;
9166 };
9167 
9168 static void
9169 cmd_tunnel_udp_config_parsed(void *parsed_result,
9170 			  __rte_unused struct cmdline *cl,
9171 			  __rte_unused void *data)
9172 {
9173 	struct cmd_tunnel_udp_config *res = parsed_result;
9174 	struct rte_eth_udp_tunnel tunnel_udp;
9175 	int ret;
9176 
9177 	tunnel_udp.udp_port = res->udp_port;
9178 
9179 	if (!strcmp(res->cmd, "rx_vxlan_port"))
9180 		tunnel_udp.prot_type = RTE_TUNNEL_TYPE_VXLAN;
9181 
9182 	if (!strcmp(res->what, "add"))
9183 		ret = rte_eth_dev_udp_tunnel_port_add(res->port_id,
9184 						      &tunnel_udp);
9185 	else
9186 		ret = rte_eth_dev_udp_tunnel_port_delete(res->port_id,
9187 							 &tunnel_udp);
9188 
9189 	if (ret < 0)
9190 		printf("udp tunneling add error: (%s)\n", strerror(-ret));
9191 }
9192 
9193 cmdline_parse_token_string_t cmd_tunnel_udp_config_cmd =
9194 	TOKEN_STRING_INITIALIZER(struct cmd_tunnel_udp_config,
9195 				cmd, "rx_vxlan_port");
9196 cmdline_parse_token_string_t cmd_tunnel_udp_config_what =
9197 	TOKEN_STRING_INITIALIZER(struct cmd_tunnel_udp_config,
9198 				what, "add#rm");
9199 cmdline_parse_token_num_t cmd_tunnel_udp_config_udp_port =
9200 	TOKEN_NUM_INITIALIZER(struct cmd_tunnel_udp_config,
9201 				udp_port, UINT16);
9202 cmdline_parse_token_num_t cmd_tunnel_udp_config_port_id =
9203 	TOKEN_NUM_INITIALIZER(struct cmd_tunnel_udp_config,
9204 				port_id, UINT16);
9205 
9206 cmdline_parse_inst_t cmd_tunnel_udp_config = {
9207 	.f = cmd_tunnel_udp_config_parsed,
9208 	.data = (void *)0,
9209 	.help_str = "rx_vxlan_port add|rm <udp_port> <port_id>: "
9210 		"Add/Remove a tunneling UDP port filter",
9211 	.tokens = {
9212 		(void *)&cmd_tunnel_udp_config_cmd,
9213 		(void *)&cmd_tunnel_udp_config_what,
9214 		(void *)&cmd_tunnel_udp_config_udp_port,
9215 		(void *)&cmd_tunnel_udp_config_port_id,
9216 		NULL,
9217 	},
9218 };
9219 
9220 struct cmd_config_tunnel_udp_port {
9221 	cmdline_fixed_string_t port;
9222 	cmdline_fixed_string_t config;
9223 	portid_t port_id;
9224 	cmdline_fixed_string_t udp_tunnel_port;
9225 	cmdline_fixed_string_t action;
9226 	cmdline_fixed_string_t tunnel_type;
9227 	uint16_t udp_port;
9228 };
9229 
9230 static void
9231 cmd_cfg_tunnel_udp_port_parsed(void *parsed_result,
9232 			       __rte_unused struct cmdline *cl,
9233 			       __rte_unused void *data)
9234 {
9235 	struct cmd_config_tunnel_udp_port *res = parsed_result;
9236 	struct rte_eth_udp_tunnel tunnel_udp;
9237 	int ret = 0;
9238 
9239 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
9240 		return;
9241 
9242 	tunnel_udp.udp_port = res->udp_port;
9243 
9244 	if (!strcmp(res->tunnel_type, "vxlan")) {
9245 		tunnel_udp.prot_type = RTE_TUNNEL_TYPE_VXLAN;
9246 	} else if (!strcmp(res->tunnel_type, "geneve")) {
9247 		tunnel_udp.prot_type = RTE_TUNNEL_TYPE_GENEVE;
9248 	} else if (!strcmp(res->tunnel_type, "vxlan-gpe")) {
9249 		tunnel_udp.prot_type = RTE_TUNNEL_TYPE_VXLAN_GPE;
9250 	} else {
9251 		printf("Invalid tunnel type\n");
9252 		return;
9253 	}
9254 
9255 	if (!strcmp(res->action, "add"))
9256 		ret = rte_eth_dev_udp_tunnel_port_add(res->port_id,
9257 						      &tunnel_udp);
9258 	else
9259 		ret = rte_eth_dev_udp_tunnel_port_delete(res->port_id,
9260 							 &tunnel_udp);
9261 
9262 	if (ret < 0)
9263 		printf("udp tunneling port add error: (%s)\n", strerror(-ret));
9264 }
9265 
9266 cmdline_parse_token_string_t cmd_config_tunnel_udp_port_port =
9267 	TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, port,
9268 				 "port");
9269 cmdline_parse_token_string_t cmd_config_tunnel_udp_port_config =
9270 	TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, config,
9271 				 "config");
9272 cmdline_parse_token_num_t cmd_config_tunnel_udp_port_port_id =
9273 	TOKEN_NUM_INITIALIZER(struct cmd_config_tunnel_udp_port, port_id,
9274 			      UINT16);
9275 cmdline_parse_token_string_t cmd_config_tunnel_udp_port_tunnel_port =
9276 	TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port,
9277 				 udp_tunnel_port,
9278 				 "udp_tunnel_port");
9279 cmdline_parse_token_string_t cmd_config_tunnel_udp_port_action =
9280 	TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, action,
9281 				 "add#rm");
9282 cmdline_parse_token_string_t cmd_config_tunnel_udp_port_tunnel_type =
9283 	TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, tunnel_type,
9284 				 "vxlan#geneve#vxlan-gpe");
9285 cmdline_parse_token_num_t cmd_config_tunnel_udp_port_value =
9286 	TOKEN_NUM_INITIALIZER(struct cmd_config_tunnel_udp_port, udp_port,
9287 			      UINT16);
9288 
9289 cmdline_parse_inst_t cmd_cfg_tunnel_udp_port = {
9290 	.f = cmd_cfg_tunnel_udp_port_parsed,
9291 	.data = NULL,
9292 	.help_str = "port config <port_id> udp_tunnel_port add|rm vxlan|geneve|vxlan-gpe <udp_port>",
9293 	.tokens = {
9294 		(void *)&cmd_config_tunnel_udp_port_port,
9295 		(void *)&cmd_config_tunnel_udp_port_config,
9296 		(void *)&cmd_config_tunnel_udp_port_port_id,
9297 		(void *)&cmd_config_tunnel_udp_port_tunnel_port,
9298 		(void *)&cmd_config_tunnel_udp_port_action,
9299 		(void *)&cmd_config_tunnel_udp_port_tunnel_type,
9300 		(void *)&cmd_config_tunnel_udp_port_value,
9301 		NULL,
9302 	},
9303 };
9304 
9305 /* *** GLOBAL CONFIG *** */
9306 struct cmd_global_config_result {
9307 	cmdline_fixed_string_t cmd;
9308 	portid_t port_id;
9309 	cmdline_fixed_string_t cfg_type;
9310 	uint8_t len;
9311 };
9312 
9313 static void
9314 cmd_global_config_parsed(void *parsed_result,
9315 			 __rte_unused struct cmdline *cl,
9316 			 __rte_unused void *data)
9317 {
9318 	struct cmd_global_config_result *res = parsed_result;
9319 	struct rte_eth_global_cfg conf;
9320 	int ret;
9321 
9322 	memset(&conf, 0, sizeof(conf));
9323 	conf.cfg_type = RTE_ETH_GLOBAL_CFG_TYPE_GRE_KEY_LEN;
9324 	conf.cfg.gre_key_len = res->len;
9325 	ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE,
9326 				      RTE_ETH_FILTER_SET, &conf);
9327 #ifdef RTE_NET_I40E
9328 	if (ret == -ENOTSUP)
9329 		ret = rte_pmd_i40e_set_gre_key_len(res->port_id, res->len);
9330 #endif
9331 	if (ret != 0)
9332 		printf("Global config error\n");
9333 }
9334 
9335 cmdline_parse_token_string_t cmd_global_config_cmd =
9336 	TOKEN_STRING_INITIALIZER(struct cmd_global_config_result, cmd,
9337 		"global_config");
9338 cmdline_parse_token_num_t cmd_global_config_port_id =
9339 	TOKEN_NUM_INITIALIZER(struct cmd_global_config_result, port_id,
9340 			       UINT16);
9341 cmdline_parse_token_string_t cmd_global_config_type =
9342 	TOKEN_STRING_INITIALIZER(struct cmd_global_config_result,
9343 		cfg_type, "gre-key-len");
9344 cmdline_parse_token_num_t cmd_global_config_gre_key_len =
9345 	TOKEN_NUM_INITIALIZER(struct cmd_global_config_result,
9346 		len, UINT8);
9347 
9348 cmdline_parse_inst_t cmd_global_config = {
9349 	.f = cmd_global_config_parsed,
9350 	.data = (void *)NULL,
9351 	.help_str = "global_config <port_id> gre-key-len <key_len>",
9352 	.tokens = {
9353 		(void *)&cmd_global_config_cmd,
9354 		(void *)&cmd_global_config_port_id,
9355 		(void *)&cmd_global_config_type,
9356 		(void *)&cmd_global_config_gre_key_len,
9357 		NULL,
9358 	},
9359 };
9360 
9361 /* *** CONFIGURE VM MIRROR VLAN/POOL RULE *** */
9362 struct cmd_set_mirror_mask_result {
9363 	cmdline_fixed_string_t set;
9364 	cmdline_fixed_string_t port;
9365 	portid_t port_id;
9366 	cmdline_fixed_string_t mirror;
9367 	uint8_t rule_id;
9368 	cmdline_fixed_string_t what;
9369 	cmdline_fixed_string_t value;
9370 	cmdline_fixed_string_t dstpool;
9371 	uint8_t dstpool_id;
9372 	cmdline_fixed_string_t on;
9373 };
9374 
9375 cmdline_parse_token_string_t cmd_mirror_mask_set =
9376 	TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result,
9377 				set, "set");
9378 cmdline_parse_token_string_t cmd_mirror_mask_port =
9379 	TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result,
9380 				port, "port");
9381 cmdline_parse_token_num_t cmd_mirror_mask_portid =
9382 	TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_mask_result,
9383 				port_id, UINT16);
9384 cmdline_parse_token_string_t cmd_mirror_mask_mirror =
9385 	TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result,
9386 				mirror, "mirror-rule");
9387 cmdline_parse_token_num_t cmd_mirror_mask_ruleid =
9388 	TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_mask_result,
9389 				rule_id, UINT8);
9390 cmdline_parse_token_string_t cmd_mirror_mask_what =
9391 	TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result,
9392 				what, "pool-mirror-up#pool-mirror-down"
9393 				      "#vlan-mirror");
9394 cmdline_parse_token_string_t cmd_mirror_mask_value =
9395 	TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result,
9396 				value, NULL);
9397 cmdline_parse_token_string_t cmd_mirror_mask_dstpool =
9398 	TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result,
9399 				dstpool, "dst-pool");
9400 cmdline_parse_token_num_t cmd_mirror_mask_poolid =
9401 	TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_mask_result,
9402 				dstpool_id, UINT8);
9403 cmdline_parse_token_string_t cmd_mirror_mask_on =
9404 	TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result,
9405 				on, "on#off");
9406 
9407 static void
9408 cmd_set_mirror_mask_parsed(void *parsed_result,
9409 		       __rte_unused struct cmdline *cl,
9410 		       __rte_unused void *data)
9411 {
9412 	int ret,nb_item,i;
9413 	struct cmd_set_mirror_mask_result *res = parsed_result;
9414 	struct rte_eth_mirror_conf mr_conf;
9415 
9416 	memset(&mr_conf, 0, sizeof(struct rte_eth_mirror_conf));
9417 
9418 	unsigned int vlan_list[ETH_MIRROR_MAX_VLANS];
9419 
9420 	mr_conf.dst_pool = res->dstpool_id;
9421 
9422 	if (!strcmp(res->what, "pool-mirror-up")) {
9423 		mr_conf.pool_mask = strtoull(res->value, NULL, 16);
9424 		mr_conf.rule_type = ETH_MIRROR_VIRTUAL_POOL_UP;
9425 	} else if (!strcmp(res->what, "pool-mirror-down")) {
9426 		mr_conf.pool_mask = strtoull(res->value, NULL, 16);
9427 		mr_conf.rule_type = ETH_MIRROR_VIRTUAL_POOL_DOWN;
9428 	} else if (!strcmp(res->what, "vlan-mirror")) {
9429 		mr_conf.rule_type = ETH_MIRROR_VLAN;
9430 		nb_item = parse_item_list(res->value, "vlan",
9431 				ETH_MIRROR_MAX_VLANS, vlan_list, 1);
9432 		if (nb_item <= 0)
9433 			return;
9434 
9435 		for (i = 0; i < nb_item; i++) {
9436 			if (vlan_list[i] > RTE_ETHER_MAX_VLAN_ID) {
9437 				printf("Invalid vlan_id: must be < 4096\n");
9438 				return;
9439 			}
9440 
9441 			mr_conf.vlan.vlan_id[i] = (uint16_t)vlan_list[i];
9442 			mr_conf.vlan.vlan_mask |= 1ULL << i;
9443 		}
9444 	}
9445 
9446 	if (!strcmp(res->on, "on"))
9447 		ret = rte_eth_mirror_rule_set(res->port_id, &mr_conf,
9448 						res->rule_id, 1);
9449 	else
9450 		ret = rte_eth_mirror_rule_set(res->port_id, &mr_conf,
9451 						res->rule_id, 0);
9452 	if (ret < 0)
9453 		printf("mirror rule add error: (%s)\n", strerror(-ret));
9454 }
9455 
9456 cmdline_parse_inst_t cmd_set_mirror_mask = {
9457 		.f = cmd_set_mirror_mask_parsed,
9458 		.data = NULL,
9459 		.help_str = "set port <port_id> mirror-rule <rule_id> "
9460 			"pool-mirror-up|pool-mirror-down|vlan-mirror "
9461 			"<pool_mask|vlan_id[,vlan_id]*> dst-pool <pool_id> on|off",
9462 		.tokens = {
9463 			(void *)&cmd_mirror_mask_set,
9464 			(void *)&cmd_mirror_mask_port,
9465 			(void *)&cmd_mirror_mask_portid,
9466 			(void *)&cmd_mirror_mask_mirror,
9467 			(void *)&cmd_mirror_mask_ruleid,
9468 			(void *)&cmd_mirror_mask_what,
9469 			(void *)&cmd_mirror_mask_value,
9470 			(void *)&cmd_mirror_mask_dstpool,
9471 			(void *)&cmd_mirror_mask_poolid,
9472 			(void *)&cmd_mirror_mask_on,
9473 			NULL,
9474 		},
9475 };
9476 
9477 /* *** CONFIGURE VM MIRROR UPLINK/DOWNLINK RULE *** */
9478 struct cmd_set_mirror_link_result {
9479 	cmdline_fixed_string_t set;
9480 	cmdline_fixed_string_t port;
9481 	portid_t port_id;
9482 	cmdline_fixed_string_t mirror;
9483 	uint8_t rule_id;
9484 	cmdline_fixed_string_t what;
9485 	cmdline_fixed_string_t dstpool;
9486 	uint8_t dstpool_id;
9487 	cmdline_fixed_string_t on;
9488 };
9489 
9490 cmdline_parse_token_string_t cmd_mirror_link_set =
9491 	TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result,
9492 				 set, "set");
9493 cmdline_parse_token_string_t cmd_mirror_link_port =
9494 	TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result,
9495 				port, "port");
9496 cmdline_parse_token_num_t cmd_mirror_link_portid =
9497 	TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_link_result,
9498 				port_id, UINT16);
9499 cmdline_parse_token_string_t cmd_mirror_link_mirror =
9500 	TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result,
9501 				mirror, "mirror-rule");
9502 cmdline_parse_token_num_t cmd_mirror_link_ruleid =
9503 	TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_link_result,
9504 			    rule_id, UINT8);
9505 cmdline_parse_token_string_t cmd_mirror_link_what =
9506 	TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result,
9507 				what, "uplink-mirror#downlink-mirror");
9508 cmdline_parse_token_string_t cmd_mirror_link_dstpool =
9509 	TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result,
9510 				dstpool, "dst-pool");
9511 cmdline_parse_token_num_t cmd_mirror_link_poolid =
9512 	TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_link_result,
9513 				dstpool_id, UINT8);
9514 cmdline_parse_token_string_t cmd_mirror_link_on =
9515 	TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result,
9516 				on, "on#off");
9517 
9518 static void
9519 cmd_set_mirror_link_parsed(void *parsed_result,
9520 		       __rte_unused struct cmdline *cl,
9521 		       __rte_unused void *data)
9522 {
9523 	int ret;
9524 	struct cmd_set_mirror_link_result *res = parsed_result;
9525 	struct rte_eth_mirror_conf mr_conf;
9526 
9527 	memset(&mr_conf, 0, sizeof(struct rte_eth_mirror_conf));
9528 	if (!strcmp(res->what, "uplink-mirror"))
9529 		mr_conf.rule_type = ETH_MIRROR_UPLINK_PORT;
9530 	else
9531 		mr_conf.rule_type = ETH_MIRROR_DOWNLINK_PORT;
9532 
9533 	mr_conf.dst_pool = res->dstpool_id;
9534 
9535 	if (!strcmp(res->on, "on"))
9536 		ret = rte_eth_mirror_rule_set(res->port_id, &mr_conf,
9537 						res->rule_id, 1);
9538 	else
9539 		ret = rte_eth_mirror_rule_set(res->port_id, &mr_conf,
9540 						res->rule_id, 0);
9541 
9542 	/* check the return value and print it if is < 0 */
9543 	if (ret < 0)
9544 		printf("mirror rule add error: (%s)\n", strerror(-ret));
9545 
9546 }
9547 
9548 cmdline_parse_inst_t cmd_set_mirror_link = {
9549 		.f = cmd_set_mirror_link_parsed,
9550 		.data = NULL,
9551 		.help_str = "set port <port_id> mirror-rule <rule_id> "
9552 			"uplink-mirror|downlink-mirror dst-pool <pool_id> on|off",
9553 		.tokens = {
9554 			(void *)&cmd_mirror_link_set,
9555 			(void *)&cmd_mirror_link_port,
9556 			(void *)&cmd_mirror_link_portid,
9557 			(void *)&cmd_mirror_link_mirror,
9558 			(void *)&cmd_mirror_link_ruleid,
9559 			(void *)&cmd_mirror_link_what,
9560 			(void *)&cmd_mirror_link_dstpool,
9561 			(void *)&cmd_mirror_link_poolid,
9562 			(void *)&cmd_mirror_link_on,
9563 			NULL,
9564 		},
9565 };
9566 
9567 /* *** RESET VM MIRROR RULE *** */
9568 struct cmd_rm_mirror_rule_result {
9569 	cmdline_fixed_string_t reset;
9570 	cmdline_fixed_string_t port;
9571 	portid_t port_id;
9572 	cmdline_fixed_string_t mirror;
9573 	uint8_t rule_id;
9574 };
9575 
9576 cmdline_parse_token_string_t cmd_rm_mirror_rule_reset =
9577 	TOKEN_STRING_INITIALIZER(struct cmd_rm_mirror_rule_result,
9578 				 reset, "reset");
9579 cmdline_parse_token_string_t cmd_rm_mirror_rule_port =
9580 	TOKEN_STRING_INITIALIZER(struct cmd_rm_mirror_rule_result,
9581 				port, "port");
9582 cmdline_parse_token_num_t cmd_rm_mirror_rule_portid =
9583 	TOKEN_NUM_INITIALIZER(struct cmd_rm_mirror_rule_result,
9584 				port_id, UINT16);
9585 cmdline_parse_token_string_t cmd_rm_mirror_rule_mirror =
9586 	TOKEN_STRING_INITIALIZER(struct cmd_rm_mirror_rule_result,
9587 				mirror, "mirror-rule");
9588 cmdline_parse_token_num_t cmd_rm_mirror_rule_ruleid =
9589 	TOKEN_NUM_INITIALIZER(struct cmd_rm_mirror_rule_result,
9590 				rule_id, UINT8);
9591 
9592 static void
9593 cmd_reset_mirror_rule_parsed(void *parsed_result,
9594 		       __rte_unused struct cmdline *cl,
9595 		       __rte_unused void *data)
9596 {
9597 	int ret;
9598 	struct cmd_set_mirror_link_result *res = parsed_result;
9599         /* check rule_id */
9600 	ret = rte_eth_mirror_rule_reset(res->port_id,res->rule_id);
9601 	if(ret < 0)
9602 		printf("mirror rule remove error: (%s)\n", strerror(-ret));
9603 }
9604 
9605 cmdline_parse_inst_t cmd_reset_mirror_rule = {
9606 		.f = cmd_reset_mirror_rule_parsed,
9607 		.data = NULL,
9608 		.help_str = "reset port <port_id> mirror-rule <rule_id>",
9609 		.tokens = {
9610 			(void *)&cmd_rm_mirror_rule_reset,
9611 			(void *)&cmd_rm_mirror_rule_port,
9612 			(void *)&cmd_rm_mirror_rule_portid,
9613 			(void *)&cmd_rm_mirror_rule_mirror,
9614 			(void *)&cmd_rm_mirror_rule_ruleid,
9615 			NULL,
9616 		},
9617 };
9618 
9619 /* ******************************************************************************** */
9620 
9621 struct cmd_dump_result {
9622 	cmdline_fixed_string_t dump;
9623 };
9624 
9625 static void
9626 dump_struct_sizes(void)
9627 {
9628 #define DUMP_SIZE(t) printf("sizeof(" #t ") = %u\n", (unsigned)sizeof(t));
9629 	DUMP_SIZE(struct rte_mbuf);
9630 	DUMP_SIZE(struct rte_mempool);
9631 	DUMP_SIZE(struct rte_ring);
9632 #undef DUMP_SIZE
9633 }
9634 
9635 
9636 /* Dump the socket memory statistics on console */
9637 static void
9638 dump_socket_mem(FILE *f)
9639 {
9640 	struct rte_malloc_socket_stats socket_stats;
9641 	unsigned int i;
9642 	size_t total = 0;
9643 	size_t alloc = 0;
9644 	size_t free = 0;
9645 	unsigned int n_alloc = 0;
9646 	unsigned int n_free = 0;
9647 	static size_t last_allocs;
9648 	static size_t last_total;
9649 
9650 
9651 	for (i = 0; i < RTE_MAX_NUMA_NODES; i++) {
9652 		if (rte_malloc_get_socket_stats(i, &socket_stats) ||
9653 		    !socket_stats.heap_totalsz_bytes)
9654 			continue;
9655 		total += socket_stats.heap_totalsz_bytes;
9656 		alloc += socket_stats.heap_allocsz_bytes;
9657 		free += socket_stats.heap_freesz_bytes;
9658 		n_alloc += socket_stats.alloc_count;
9659 		n_free += socket_stats.free_count;
9660 		fprintf(f,
9661 			"Socket %u: size(M) total: %.6lf alloc: %.6lf(%.3lf%%) free: %.6lf \tcount alloc: %-4u free: %u\n",
9662 			i,
9663 			(double)socket_stats.heap_totalsz_bytes / (1024 * 1024),
9664 			(double)socket_stats.heap_allocsz_bytes / (1024 * 1024),
9665 			(double)socket_stats.heap_allocsz_bytes * 100 /
9666 			(double)socket_stats.heap_totalsz_bytes,
9667 			(double)socket_stats.heap_freesz_bytes / (1024 * 1024),
9668 			socket_stats.alloc_count,
9669 			socket_stats.free_count);
9670 	}
9671 	fprintf(f,
9672 		"Total   : size(M) total: %.6lf alloc: %.6lf(%.3lf%%) free: %.6lf \tcount alloc: %-4u free: %u\n",
9673 		(double)total / (1024 * 1024), (double)alloc / (1024 * 1024),
9674 		(double)alloc * 100 / (double)total,
9675 		(double)free / (1024 * 1024),
9676 		n_alloc, n_free);
9677 	if (last_allocs)
9678 		fprintf(stdout, "Memory total change: %.6lf(M), allocation change: %.6lf(M)\n",
9679 			((double)total - (double)last_total) / (1024 * 1024),
9680 			(double)(alloc - (double)last_allocs) / 1024 / 1024);
9681 	last_allocs = alloc;
9682 	last_total = total;
9683 }
9684 
9685 static void cmd_dump_parsed(void *parsed_result,
9686 			    __rte_unused struct cmdline *cl,
9687 			    __rte_unused void *data)
9688 {
9689 	struct cmd_dump_result *res = parsed_result;
9690 
9691 	if (!strcmp(res->dump, "dump_physmem"))
9692 		rte_dump_physmem_layout(stdout);
9693 	else if (!strcmp(res->dump, "dump_socket_mem"))
9694 		dump_socket_mem(stdout);
9695 	else if (!strcmp(res->dump, "dump_memzone"))
9696 		rte_memzone_dump(stdout);
9697 	else if (!strcmp(res->dump, "dump_struct_sizes"))
9698 		dump_struct_sizes();
9699 	else if (!strcmp(res->dump, "dump_ring"))
9700 		rte_ring_list_dump(stdout);
9701 	else if (!strcmp(res->dump, "dump_mempool"))
9702 		rte_mempool_list_dump(stdout);
9703 	else if (!strcmp(res->dump, "dump_devargs"))
9704 		rte_devargs_dump(stdout);
9705 	else if (!strcmp(res->dump, "dump_log_types"))
9706 		rte_log_dump(stdout);
9707 }
9708 
9709 cmdline_parse_token_string_t cmd_dump_dump =
9710 	TOKEN_STRING_INITIALIZER(struct cmd_dump_result, dump,
9711 		"dump_physmem#"
9712 		"dump_memzone#"
9713 		"dump_socket_mem#"
9714 		"dump_struct_sizes#"
9715 		"dump_ring#"
9716 		"dump_mempool#"
9717 		"dump_devargs#"
9718 		"dump_log_types");
9719 
9720 cmdline_parse_inst_t cmd_dump = {
9721 	.f = cmd_dump_parsed,  /* function to call */
9722 	.data = NULL,      /* 2nd arg of func */
9723 	.help_str = "Dump status",
9724 	.tokens = {        /* token list, NULL terminated */
9725 		(void *)&cmd_dump_dump,
9726 		NULL,
9727 	},
9728 };
9729 
9730 /* ******************************************************************************** */
9731 
9732 struct cmd_dump_one_result {
9733 	cmdline_fixed_string_t dump;
9734 	cmdline_fixed_string_t name;
9735 };
9736 
9737 static void cmd_dump_one_parsed(void *parsed_result, struct cmdline *cl,
9738 				__rte_unused void *data)
9739 {
9740 	struct cmd_dump_one_result *res = parsed_result;
9741 
9742 	if (!strcmp(res->dump, "dump_ring")) {
9743 		struct rte_ring *r;
9744 		r = rte_ring_lookup(res->name);
9745 		if (r == NULL) {
9746 			cmdline_printf(cl, "Cannot find ring\n");
9747 			return;
9748 		}
9749 		rte_ring_dump(stdout, r);
9750 	} else if (!strcmp(res->dump, "dump_mempool")) {
9751 		struct rte_mempool *mp;
9752 		mp = rte_mempool_lookup(res->name);
9753 		if (mp == NULL) {
9754 			cmdline_printf(cl, "Cannot find mempool\n");
9755 			return;
9756 		}
9757 		rte_mempool_dump(stdout, mp);
9758 	}
9759 }
9760 
9761 cmdline_parse_token_string_t cmd_dump_one_dump =
9762 	TOKEN_STRING_INITIALIZER(struct cmd_dump_one_result, dump,
9763 				 "dump_ring#dump_mempool");
9764 
9765 cmdline_parse_token_string_t cmd_dump_one_name =
9766 	TOKEN_STRING_INITIALIZER(struct cmd_dump_one_result, name, NULL);
9767 
9768 cmdline_parse_inst_t cmd_dump_one = {
9769 	.f = cmd_dump_one_parsed,  /* function to call */
9770 	.data = NULL,      /* 2nd arg of func */
9771 	.help_str = "dump_ring|dump_mempool <name>: Dump one ring/mempool",
9772 	.tokens = {        /* token list, NULL terminated */
9773 		(void *)&cmd_dump_one_dump,
9774 		(void *)&cmd_dump_one_name,
9775 		NULL,
9776 	},
9777 };
9778 
9779 /* *** queue region set *** */
9780 struct cmd_queue_region_result {
9781 	cmdline_fixed_string_t set;
9782 	cmdline_fixed_string_t port;
9783 	portid_t port_id;
9784 	cmdline_fixed_string_t cmd;
9785 	cmdline_fixed_string_t region;
9786 	uint8_t  region_id;
9787 	cmdline_fixed_string_t queue_start_index;
9788 	uint8_t  queue_id;
9789 	cmdline_fixed_string_t queue_num;
9790 	uint8_t  queue_num_value;
9791 };
9792 
9793 static void
9794 cmd_queue_region_parsed(void *parsed_result,
9795 			__rte_unused struct cmdline *cl,
9796 			__rte_unused void *data)
9797 {
9798 	struct cmd_queue_region_result *res = parsed_result;
9799 	int ret = -ENOTSUP;
9800 #ifdef RTE_NET_I40E
9801 	struct rte_pmd_i40e_queue_region_conf region_conf;
9802 	enum rte_pmd_i40e_queue_region_op op_type;
9803 #endif
9804 
9805 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
9806 		return;
9807 
9808 #ifdef RTE_NET_I40E
9809 	memset(&region_conf, 0, sizeof(region_conf));
9810 	op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_SET;
9811 	region_conf.region_id = res->region_id;
9812 	region_conf.queue_num = res->queue_num_value;
9813 	region_conf.queue_start_index = res->queue_id;
9814 
9815 	ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id,
9816 				op_type, &region_conf);
9817 #endif
9818 
9819 	switch (ret) {
9820 	case 0:
9821 		break;
9822 	case -ENOTSUP:
9823 		printf("function not implemented or supported\n");
9824 		break;
9825 	default:
9826 		printf("queue region config error: (%s)\n", strerror(-ret));
9827 	}
9828 }
9829 
9830 cmdline_parse_token_string_t cmd_queue_region_set =
9831 TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result,
9832 		set, "set");
9833 cmdline_parse_token_string_t cmd_queue_region_port =
9834 	TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result, port, "port");
9835 cmdline_parse_token_num_t cmd_queue_region_port_id =
9836 	TOKEN_NUM_INITIALIZER(struct cmd_queue_region_result,
9837 				port_id, UINT16);
9838 cmdline_parse_token_string_t cmd_queue_region_cmd =
9839 	TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result,
9840 				 cmd, "queue-region");
9841 cmdline_parse_token_string_t cmd_queue_region_id =
9842 	TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result,
9843 				region, "region_id");
9844 cmdline_parse_token_num_t cmd_queue_region_index =
9845 	TOKEN_NUM_INITIALIZER(struct cmd_queue_region_result,
9846 				region_id, UINT8);
9847 cmdline_parse_token_string_t cmd_queue_region_queue_start_index =
9848 	TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result,
9849 				queue_start_index, "queue_start_index");
9850 cmdline_parse_token_num_t cmd_queue_region_queue_id =
9851 	TOKEN_NUM_INITIALIZER(struct cmd_queue_region_result,
9852 				queue_id, UINT8);
9853 cmdline_parse_token_string_t cmd_queue_region_queue_num =
9854 	TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result,
9855 				queue_num, "queue_num");
9856 cmdline_parse_token_num_t cmd_queue_region_queue_num_value =
9857 	TOKEN_NUM_INITIALIZER(struct cmd_queue_region_result,
9858 				queue_num_value, UINT8);
9859 
9860 cmdline_parse_inst_t cmd_queue_region = {
9861 	.f = cmd_queue_region_parsed,
9862 	.data = NULL,
9863 	.help_str = "set port <port_id> queue-region region_id <value> "
9864 		"queue_start_index <value> queue_num <value>: Set a queue region",
9865 	.tokens = {
9866 		(void *)&cmd_queue_region_set,
9867 		(void *)&cmd_queue_region_port,
9868 		(void *)&cmd_queue_region_port_id,
9869 		(void *)&cmd_queue_region_cmd,
9870 		(void *)&cmd_queue_region_id,
9871 		(void *)&cmd_queue_region_index,
9872 		(void *)&cmd_queue_region_queue_start_index,
9873 		(void *)&cmd_queue_region_queue_id,
9874 		(void *)&cmd_queue_region_queue_num,
9875 		(void *)&cmd_queue_region_queue_num_value,
9876 		NULL,
9877 	},
9878 };
9879 
9880 /* *** queue region and flowtype set *** */
9881 struct cmd_region_flowtype_result {
9882 	cmdline_fixed_string_t set;
9883 	cmdline_fixed_string_t port;
9884 	portid_t port_id;
9885 	cmdline_fixed_string_t cmd;
9886 	cmdline_fixed_string_t region;
9887 	uint8_t  region_id;
9888 	cmdline_fixed_string_t flowtype;
9889 	uint8_t  flowtype_id;
9890 };
9891 
9892 static void
9893 cmd_region_flowtype_parsed(void *parsed_result,
9894 			__rte_unused struct cmdline *cl,
9895 			__rte_unused void *data)
9896 {
9897 	struct cmd_region_flowtype_result *res = parsed_result;
9898 	int ret = -ENOTSUP;
9899 #ifdef RTE_NET_I40E
9900 	struct rte_pmd_i40e_queue_region_conf region_conf;
9901 	enum rte_pmd_i40e_queue_region_op op_type;
9902 #endif
9903 
9904 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
9905 		return;
9906 
9907 #ifdef RTE_NET_I40E
9908 	memset(&region_conf, 0, sizeof(region_conf));
9909 
9910 	op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_FLOWTYPE_SET;
9911 	region_conf.region_id = res->region_id;
9912 	region_conf.hw_flowtype = res->flowtype_id;
9913 
9914 	ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id,
9915 			op_type, &region_conf);
9916 #endif
9917 
9918 	switch (ret) {
9919 	case 0:
9920 		break;
9921 	case -ENOTSUP:
9922 		printf("function not implemented or supported\n");
9923 		break;
9924 	default:
9925 		printf("region flowtype config error: (%s)\n", strerror(-ret));
9926 	}
9927 }
9928 
9929 cmdline_parse_token_string_t cmd_region_flowtype_set =
9930 TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result,
9931 				set, "set");
9932 cmdline_parse_token_string_t cmd_region_flowtype_port =
9933 	TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result,
9934 				port, "port");
9935 cmdline_parse_token_num_t cmd_region_flowtype_port_index =
9936 	TOKEN_NUM_INITIALIZER(struct cmd_region_flowtype_result,
9937 				port_id, UINT16);
9938 cmdline_parse_token_string_t cmd_region_flowtype_cmd =
9939 	TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result,
9940 				cmd, "queue-region");
9941 cmdline_parse_token_string_t cmd_region_flowtype_index =
9942 	TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result,
9943 				region, "region_id");
9944 cmdline_parse_token_num_t cmd_region_flowtype_id =
9945 	TOKEN_NUM_INITIALIZER(struct cmd_region_flowtype_result,
9946 				region_id, UINT8);
9947 cmdline_parse_token_string_t cmd_region_flowtype_flow_index =
9948 	TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result,
9949 				flowtype, "flowtype");
9950 cmdline_parse_token_num_t cmd_region_flowtype_flow_id =
9951 	TOKEN_NUM_INITIALIZER(struct cmd_region_flowtype_result,
9952 				flowtype_id, UINT8);
9953 cmdline_parse_inst_t cmd_region_flowtype = {
9954 	.f = cmd_region_flowtype_parsed,
9955 	.data = NULL,
9956 	.help_str = "set port <port_id> queue-region region_id <value> "
9957 		"flowtype <value>: Set a flowtype region index",
9958 	.tokens = {
9959 		(void *)&cmd_region_flowtype_set,
9960 		(void *)&cmd_region_flowtype_port,
9961 		(void *)&cmd_region_flowtype_port_index,
9962 		(void *)&cmd_region_flowtype_cmd,
9963 		(void *)&cmd_region_flowtype_index,
9964 		(void *)&cmd_region_flowtype_id,
9965 		(void *)&cmd_region_flowtype_flow_index,
9966 		(void *)&cmd_region_flowtype_flow_id,
9967 		NULL,
9968 	},
9969 };
9970 
9971 /* *** User Priority (UP) to queue region (region_id) set *** */
9972 struct cmd_user_priority_region_result {
9973 	cmdline_fixed_string_t set;
9974 	cmdline_fixed_string_t port;
9975 	portid_t port_id;
9976 	cmdline_fixed_string_t cmd;
9977 	cmdline_fixed_string_t user_priority;
9978 	uint8_t  user_priority_id;
9979 	cmdline_fixed_string_t region;
9980 	uint8_t  region_id;
9981 };
9982 
9983 static void
9984 cmd_user_priority_region_parsed(void *parsed_result,
9985 			__rte_unused struct cmdline *cl,
9986 			__rte_unused void *data)
9987 {
9988 	struct cmd_user_priority_region_result *res = parsed_result;
9989 	int ret = -ENOTSUP;
9990 #ifdef RTE_NET_I40E
9991 	struct rte_pmd_i40e_queue_region_conf region_conf;
9992 	enum rte_pmd_i40e_queue_region_op op_type;
9993 #endif
9994 
9995 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
9996 		return;
9997 
9998 #ifdef RTE_NET_I40E
9999 	memset(&region_conf, 0, sizeof(region_conf));
10000 	op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_USER_PRIORITY_SET;
10001 	region_conf.user_priority = res->user_priority_id;
10002 	region_conf.region_id = res->region_id;
10003 
10004 	ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id,
10005 				op_type, &region_conf);
10006 #endif
10007 
10008 	switch (ret) {
10009 	case 0:
10010 		break;
10011 	case -ENOTSUP:
10012 		printf("function not implemented or supported\n");
10013 		break;
10014 	default:
10015 		printf("user_priority region config error: (%s)\n",
10016 				strerror(-ret));
10017 	}
10018 }
10019 
10020 cmdline_parse_token_string_t cmd_user_priority_region_set =
10021 	TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result,
10022 				set, "set");
10023 cmdline_parse_token_string_t cmd_user_priority_region_port =
10024 	TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result,
10025 				port, "port");
10026 cmdline_parse_token_num_t cmd_user_priority_region_port_index =
10027 	TOKEN_NUM_INITIALIZER(struct cmd_user_priority_region_result,
10028 				port_id, UINT16);
10029 cmdline_parse_token_string_t cmd_user_priority_region_cmd =
10030 	TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result,
10031 				cmd, "queue-region");
10032 cmdline_parse_token_string_t cmd_user_priority_region_UP =
10033 	TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result,
10034 				user_priority, "UP");
10035 cmdline_parse_token_num_t cmd_user_priority_region_UP_id =
10036 	TOKEN_NUM_INITIALIZER(struct cmd_user_priority_region_result,
10037 				user_priority_id, UINT8);
10038 cmdline_parse_token_string_t cmd_user_priority_region_region =
10039 	TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result,
10040 				region, "region_id");
10041 cmdline_parse_token_num_t cmd_user_priority_region_region_id =
10042 	TOKEN_NUM_INITIALIZER(struct cmd_user_priority_region_result,
10043 				region_id, UINT8);
10044 
10045 cmdline_parse_inst_t cmd_user_priority_region = {
10046 	.f = cmd_user_priority_region_parsed,
10047 	.data = NULL,
10048 	.help_str = "set port <port_id> queue-region UP <value> "
10049 		"region_id <value>: Set the mapping of User Priority (UP) "
10050 		"to queue region (region_id) ",
10051 	.tokens = {
10052 		(void *)&cmd_user_priority_region_set,
10053 		(void *)&cmd_user_priority_region_port,
10054 		(void *)&cmd_user_priority_region_port_index,
10055 		(void *)&cmd_user_priority_region_cmd,
10056 		(void *)&cmd_user_priority_region_UP,
10057 		(void *)&cmd_user_priority_region_UP_id,
10058 		(void *)&cmd_user_priority_region_region,
10059 		(void *)&cmd_user_priority_region_region_id,
10060 		NULL,
10061 	},
10062 };
10063 
10064 /* *** flush all queue region related configuration *** */
10065 struct cmd_flush_queue_region_result {
10066 	cmdline_fixed_string_t set;
10067 	cmdline_fixed_string_t port;
10068 	portid_t port_id;
10069 	cmdline_fixed_string_t cmd;
10070 	cmdline_fixed_string_t flush;
10071 	cmdline_fixed_string_t what;
10072 };
10073 
10074 static void
10075 cmd_flush_queue_region_parsed(void *parsed_result,
10076 			__rte_unused struct cmdline *cl,
10077 			__rte_unused void *data)
10078 {
10079 	struct cmd_flush_queue_region_result *res = parsed_result;
10080 	int ret = -ENOTSUP;
10081 #ifdef RTE_NET_I40E
10082 	struct rte_pmd_i40e_queue_region_conf region_conf;
10083 	enum rte_pmd_i40e_queue_region_op op_type;
10084 #endif
10085 
10086 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
10087 		return;
10088 
10089 #ifdef RTE_NET_I40E
10090 	memset(&region_conf, 0, sizeof(region_conf));
10091 
10092 	if (strcmp(res->what, "on") == 0)
10093 		op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_ALL_FLUSH_ON;
10094 	else
10095 		op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_ALL_FLUSH_OFF;
10096 
10097 	ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id,
10098 				op_type, &region_conf);
10099 #endif
10100 
10101 	switch (ret) {
10102 	case 0:
10103 		break;
10104 	case -ENOTSUP:
10105 		printf("function not implemented or supported\n");
10106 		break;
10107 	default:
10108 		printf("queue region config flush error: (%s)\n",
10109 				strerror(-ret));
10110 	}
10111 }
10112 
10113 cmdline_parse_token_string_t cmd_flush_queue_region_set =
10114 	TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result,
10115 				set, "set");
10116 cmdline_parse_token_string_t cmd_flush_queue_region_port =
10117 	TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result,
10118 				port, "port");
10119 cmdline_parse_token_num_t cmd_flush_queue_region_port_index =
10120 	TOKEN_NUM_INITIALIZER(struct cmd_flush_queue_region_result,
10121 				port_id, UINT16);
10122 cmdline_parse_token_string_t cmd_flush_queue_region_cmd =
10123 	TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result,
10124 				cmd, "queue-region");
10125 cmdline_parse_token_string_t cmd_flush_queue_region_flush =
10126 	TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result,
10127 				flush, "flush");
10128 cmdline_parse_token_string_t cmd_flush_queue_region_what =
10129 	TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result,
10130 				what, "on#off");
10131 
10132 cmdline_parse_inst_t cmd_flush_queue_region = {
10133 	.f = cmd_flush_queue_region_parsed,
10134 	.data = NULL,
10135 	.help_str = "set port <port_id> queue-region flush on|off"
10136 		": flush all queue region related configuration",
10137 	.tokens = {
10138 		(void *)&cmd_flush_queue_region_set,
10139 		(void *)&cmd_flush_queue_region_port,
10140 		(void *)&cmd_flush_queue_region_port_index,
10141 		(void *)&cmd_flush_queue_region_cmd,
10142 		(void *)&cmd_flush_queue_region_flush,
10143 		(void *)&cmd_flush_queue_region_what,
10144 		NULL,
10145 	},
10146 };
10147 
10148 /* *** get all queue region related configuration info *** */
10149 struct cmd_show_queue_region_info {
10150 	cmdline_fixed_string_t show;
10151 	cmdline_fixed_string_t port;
10152 	portid_t port_id;
10153 	cmdline_fixed_string_t cmd;
10154 };
10155 
10156 static void
10157 cmd_show_queue_region_info_parsed(void *parsed_result,
10158 			__rte_unused struct cmdline *cl,
10159 			__rte_unused void *data)
10160 {
10161 	struct cmd_show_queue_region_info *res = parsed_result;
10162 	int ret = -ENOTSUP;
10163 #ifdef RTE_NET_I40E
10164 	struct rte_pmd_i40e_queue_regions rte_pmd_regions;
10165 	enum rte_pmd_i40e_queue_region_op op_type;
10166 #endif
10167 
10168 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
10169 		return;
10170 
10171 #ifdef RTE_NET_I40E
10172 	memset(&rte_pmd_regions, 0, sizeof(rte_pmd_regions));
10173 
10174 	op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_INFO_GET;
10175 
10176 	ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id,
10177 					op_type, &rte_pmd_regions);
10178 
10179 	port_queue_region_info_display(res->port_id, &rte_pmd_regions);
10180 #endif
10181 
10182 	switch (ret) {
10183 	case 0:
10184 		break;
10185 	case -ENOTSUP:
10186 		printf("function not implemented or supported\n");
10187 		break;
10188 	default:
10189 		printf("queue region config info show error: (%s)\n",
10190 				strerror(-ret));
10191 	}
10192 }
10193 
10194 cmdline_parse_token_string_t cmd_show_queue_region_info_get =
10195 TOKEN_STRING_INITIALIZER(struct cmd_show_queue_region_info,
10196 				show, "show");
10197 cmdline_parse_token_string_t cmd_show_queue_region_info_port =
10198 	TOKEN_STRING_INITIALIZER(struct cmd_show_queue_region_info,
10199 				port, "port");
10200 cmdline_parse_token_num_t cmd_show_queue_region_info_port_index =
10201 	TOKEN_NUM_INITIALIZER(struct cmd_show_queue_region_info,
10202 				port_id, UINT16);
10203 cmdline_parse_token_string_t cmd_show_queue_region_info_cmd =
10204 	TOKEN_STRING_INITIALIZER(struct cmd_show_queue_region_info,
10205 				cmd, "queue-region");
10206 
10207 cmdline_parse_inst_t cmd_show_queue_region_info_all = {
10208 	.f = cmd_show_queue_region_info_parsed,
10209 	.data = NULL,
10210 	.help_str = "show port <port_id> queue-region"
10211 		": show all queue region related configuration info",
10212 	.tokens = {
10213 		(void *)&cmd_show_queue_region_info_get,
10214 		(void *)&cmd_show_queue_region_info_port,
10215 		(void *)&cmd_show_queue_region_info_port_index,
10216 		(void *)&cmd_show_queue_region_info_cmd,
10217 		NULL,
10218 	},
10219 };
10220 
10221 /* *** Filters Control *** */
10222 
10223 /* *** deal with flow director filter *** */
10224 struct cmd_flow_director_result {
10225 	cmdline_fixed_string_t flow_director_filter;
10226 	portid_t port_id;
10227 	cmdline_fixed_string_t mode;
10228 	cmdline_fixed_string_t mode_value;
10229 	cmdline_fixed_string_t ops;
10230 	cmdline_fixed_string_t flow;
10231 	cmdline_fixed_string_t flow_type;
10232 	cmdline_fixed_string_t ether;
10233 	uint16_t ether_type;
10234 	cmdline_fixed_string_t src;
10235 	cmdline_ipaddr_t ip_src;
10236 	uint16_t port_src;
10237 	cmdline_fixed_string_t dst;
10238 	cmdline_ipaddr_t ip_dst;
10239 	uint16_t port_dst;
10240 	cmdline_fixed_string_t verify_tag;
10241 	uint32_t verify_tag_value;
10242 	cmdline_fixed_string_t tos;
10243 	uint8_t tos_value;
10244 	cmdline_fixed_string_t proto;
10245 	uint8_t proto_value;
10246 	cmdline_fixed_string_t ttl;
10247 	uint8_t ttl_value;
10248 	cmdline_fixed_string_t vlan;
10249 	uint16_t vlan_value;
10250 	cmdline_fixed_string_t flexbytes;
10251 	cmdline_fixed_string_t flexbytes_value;
10252 	cmdline_fixed_string_t pf_vf;
10253 	cmdline_fixed_string_t drop;
10254 	cmdline_fixed_string_t queue;
10255 	uint16_t  queue_id;
10256 	cmdline_fixed_string_t fd_id;
10257 	uint32_t  fd_id_value;
10258 	cmdline_fixed_string_t mac;
10259 	struct rte_ether_addr mac_addr;
10260 	cmdline_fixed_string_t tunnel;
10261 	cmdline_fixed_string_t tunnel_type;
10262 	cmdline_fixed_string_t tunnel_id;
10263 	uint32_t tunnel_id_value;
10264 	cmdline_fixed_string_t packet;
10265 	char filepath[];
10266 };
10267 
10268 static inline int
10269 parse_flexbytes(const char *q_arg, uint8_t *flexbytes, uint16_t max_num)
10270 {
10271 	char s[256];
10272 	const char *p, *p0 = q_arg;
10273 	char *end;
10274 	unsigned long int_fld;
10275 	char *str_fld[max_num];
10276 	int i;
10277 	unsigned size;
10278 	int ret = -1;
10279 
10280 	p = strchr(p0, '(');
10281 	if (p == NULL)
10282 		return -1;
10283 	++p;
10284 	p0 = strchr(p, ')');
10285 	if (p0 == NULL)
10286 		return -1;
10287 
10288 	size = p0 - p;
10289 	if (size >= sizeof(s))
10290 		return -1;
10291 
10292 	snprintf(s, sizeof(s), "%.*s", size, p);
10293 	ret = rte_strsplit(s, sizeof(s), str_fld, max_num, ',');
10294 	if (ret < 0 || ret > max_num)
10295 		return -1;
10296 	for (i = 0; i < ret; i++) {
10297 		errno = 0;
10298 		int_fld = strtoul(str_fld[i], &end, 0);
10299 		if (errno != 0 || *end != '\0' || int_fld > UINT8_MAX)
10300 			return -1;
10301 		flexbytes[i] = (uint8_t)int_fld;
10302 	}
10303 	return ret;
10304 }
10305 
10306 static uint16_t
10307 str2flowtype(char *string)
10308 {
10309 	uint8_t i = 0;
10310 	static const struct {
10311 		char str[32];
10312 		uint16_t type;
10313 	} flowtype_str[] = {
10314 		{"raw", RTE_ETH_FLOW_RAW},
10315 		{"ipv4", RTE_ETH_FLOW_IPV4},
10316 		{"ipv4-frag", RTE_ETH_FLOW_FRAG_IPV4},
10317 		{"ipv4-tcp", RTE_ETH_FLOW_NONFRAG_IPV4_TCP},
10318 		{"ipv4-udp", RTE_ETH_FLOW_NONFRAG_IPV4_UDP},
10319 		{"ipv4-sctp", RTE_ETH_FLOW_NONFRAG_IPV4_SCTP},
10320 		{"ipv4-other", RTE_ETH_FLOW_NONFRAG_IPV4_OTHER},
10321 		{"ipv6", RTE_ETH_FLOW_IPV6},
10322 		{"ipv6-frag", RTE_ETH_FLOW_FRAG_IPV6},
10323 		{"ipv6-tcp", RTE_ETH_FLOW_NONFRAG_IPV6_TCP},
10324 		{"ipv6-udp", RTE_ETH_FLOW_NONFRAG_IPV6_UDP},
10325 		{"ipv6-sctp", RTE_ETH_FLOW_NONFRAG_IPV6_SCTP},
10326 		{"ipv6-other", RTE_ETH_FLOW_NONFRAG_IPV6_OTHER},
10327 		{"l2_payload", RTE_ETH_FLOW_L2_PAYLOAD},
10328 	};
10329 
10330 	for (i = 0; i < RTE_DIM(flowtype_str); i++) {
10331 		if (!strcmp(flowtype_str[i].str, string))
10332 			return flowtype_str[i].type;
10333 	}
10334 
10335 	if (isdigit(string[0]) && atoi(string) > 0 && atoi(string) < 64)
10336 		return (uint16_t)atoi(string);
10337 
10338 	return RTE_ETH_FLOW_UNKNOWN;
10339 }
10340 
10341 static enum rte_eth_fdir_tunnel_type
10342 str2fdir_tunneltype(char *string)
10343 {
10344 	uint8_t i = 0;
10345 
10346 	static const struct {
10347 		char str[32];
10348 		enum rte_eth_fdir_tunnel_type type;
10349 	} tunneltype_str[] = {
10350 		{"NVGRE", RTE_FDIR_TUNNEL_TYPE_NVGRE},
10351 		{"VxLAN", RTE_FDIR_TUNNEL_TYPE_VXLAN},
10352 	};
10353 
10354 	for (i = 0; i < RTE_DIM(tunneltype_str); i++) {
10355 		if (!strcmp(tunneltype_str[i].str, string))
10356 			return tunneltype_str[i].type;
10357 	}
10358 	return RTE_FDIR_TUNNEL_TYPE_UNKNOWN;
10359 }
10360 
10361 #define IPV4_ADDR_TO_UINT(ip_addr, ip) \
10362 do { \
10363 	if ((ip_addr).family == AF_INET) \
10364 		(ip) = (ip_addr).addr.ipv4.s_addr; \
10365 	else { \
10366 		printf("invalid parameter.\n"); \
10367 		return; \
10368 	} \
10369 } while (0)
10370 
10371 #define IPV6_ADDR_TO_ARRAY(ip_addr, ip) \
10372 do { \
10373 	if ((ip_addr).family == AF_INET6) \
10374 		rte_memcpy(&(ip), \
10375 				 &((ip_addr).addr.ipv6), \
10376 				 sizeof(struct in6_addr)); \
10377 	else { \
10378 		printf("invalid parameter.\n"); \
10379 		return; \
10380 	} \
10381 } while (0)
10382 
10383 static void
10384 cmd_flow_director_filter_parsed(void *parsed_result,
10385 			  __rte_unused struct cmdline *cl,
10386 			  __rte_unused void *data)
10387 {
10388 	struct cmd_flow_director_result *res = parsed_result;
10389 	struct rte_eth_fdir_filter entry;
10390 	uint8_t flexbytes[RTE_ETH_FDIR_MAX_FLEXLEN];
10391 	char *end;
10392 	unsigned long vf_id;
10393 	int ret = 0;
10394 
10395 	ret = rte_eth_dev_filter_supported(res->port_id, RTE_ETH_FILTER_FDIR);
10396 	if (ret < 0) {
10397 		printf("flow director is not supported on port %u.\n",
10398 			res->port_id);
10399 		return;
10400 	}
10401 	memset(flexbytes, 0, sizeof(flexbytes));
10402 	memset(&entry, 0, sizeof(struct rte_eth_fdir_filter));
10403 
10404 	if (fdir_conf.mode ==  RTE_FDIR_MODE_PERFECT_MAC_VLAN) {
10405 		if (strcmp(res->mode_value, "MAC-VLAN")) {
10406 			printf("Please set mode to MAC-VLAN.\n");
10407 			return;
10408 		}
10409 	} else if (fdir_conf.mode ==  RTE_FDIR_MODE_PERFECT_TUNNEL) {
10410 		if (strcmp(res->mode_value, "Tunnel")) {
10411 			printf("Please set mode to Tunnel.\n");
10412 			return;
10413 		}
10414 	} else {
10415 		if (!strcmp(res->mode_value, "raw")) {
10416 #ifdef RTE_NET_I40E
10417 			struct rte_pmd_i40e_flow_type_mapping
10418 					mapping[RTE_PMD_I40E_FLOW_TYPE_MAX];
10419 			struct rte_pmd_i40e_pkt_template_conf conf;
10420 			uint16_t flow_type = str2flowtype(res->flow_type);
10421 			uint16_t i, port = res->port_id;
10422 			uint8_t add;
10423 
10424 			memset(&conf, 0, sizeof(conf));
10425 
10426 			if (flow_type == RTE_ETH_FLOW_UNKNOWN) {
10427 				printf("Invalid flow type specified.\n");
10428 				return;
10429 			}
10430 			ret = rte_pmd_i40e_flow_type_mapping_get(res->port_id,
10431 								 mapping);
10432 			if (ret)
10433 				return;
10434 			if (mapping[flow_type].pctype == 0ULL) {
10435 				printf("Invalid flow type specified.\n");
10436 				return;
10437 			}
10438 			for (i = 0; i < RTE_PMD_I40E_PCTYPE_MAX; i++) {
10439 				if (mapping[flow_type].pctype & (1ULL << i)) {
10440 					conf.input.pctype = i;
10441 					break;
10442 				}
10443 			}
10444 
10445 			conf.input.packet = open_file(res->filepath,
10446 						&conf.input.length);
10447 			if (!conf.input.packet)
10448 				return;
10449 			if (!strcmp(res->drop, "drop"))
10450 				conf.action.behavior =
10451 					RTE_PMD_I40E_PKT_TEMPLATE_REJECT;
10452 			else
10453 				conf.action.behavior =
10454 					RTE_PMD_I40E_PKT_TEMPLATE_ACCEPT;
10455 			conf.action.report_status =
10456 					RTE_PMD_I40E_PKT_TEMPLATE_REPORT_ID;
10457 			conf.action.rx_queue = res->queue_id;
10458 			conf.soft_id = res->fd_id_value;
10459 			add  = strcmp(res->ops, "del") ? 1 : 0;
10460 			ret = rte_pmd_i40e_flow_add_del_packet_template(port,
10461 									&conf,
10462 									add);
10463 			if (ret < 0)
10464 				printf("flow director config error: (%s)\n",
10465 				       strerror(-ret));
10466 			close_file(conf.input.packet);
10467 #endif
10468 			return;
10469 		} else if (strcmp(res->mode_value, "IP")) {
10470 			printf("Please set mode to IP or raw.\n");
10471 			return;
10472 		}
10473 		entry.input.flow_type = str2flowtype(res->flow_type);
10474 	}
10475 
10476 	ret = parse_flexbytes(res->flexbytes_value,
10477 					flexbytes,
10478 					RTE_ETH_FDIR_MAX_FLEXLEN);
10479 	if (ret < 0) {
10480 		printf("error: Cannot parse flexbytes input.\n");
10481 		return;
10482 	}
10483 
10484 	switch (entry.input.flow_type) {
10485 	case RTE_ETH_FLOW_FRAG_IPV4:
10486 	case RTE_ETH_FLOW_NONFRAG_IPV4_OTHER:
10487 		entry.input.flow.ip4_flow.proto = res->proto_value;
10488 		/* fall-through */
10489 	case RTE_ETH_FLOW_NONFRAG_IPV4_UDP:
10490 	case RTE_ETH_FLOW_NONFRAG_IPV4_TCP:
10491 		IPV4_ADDR_TO_UINT(res->ip_dst,
10492 			entry.input.flow.ip4_flow.dst_ip);
10493 		IPV4_ADDR_TO_UINT(res->ip_src,
10494 			entry.input.flow.ip4_flow.src_ip);
10495 		entry.input.flow.ip4_flow.tos = res->tos_value;
10496 		entry.input.flow.ip4_flow.ttl = res->ttl_value;
10497 		/* need convert to big endian. */
10498 		entry.input.flow.udp4_flow.dst_port =
10499 				rte_cpu_to_be_16(res->port_dst);
10500 		entry.input.flow.udp4_flow.src_port =
10501 				rte_cpu_to_be_16(res->port_src);
10502 		break;
10503 	case RTE_ETH_FLOW_NONFRAG_IPV4_SCTP:
10504 		IPV4_ADDR_TO_UINT(res->ip_dst,
10505 			entry.input.flow.sctp4_flow.ip.dst_ip);
10506 		IPV4_ADDR_TO_UINT(res->ip_src,
10507 			entry.input.flow.sctp4_flow.ip.src_ip);
10508 		entry.input.flow.ip4_flow.tos = res->tos_value;
10509 		entry.input.flow.ip4_flow.ttl = res->ttl_value;
10510 		/* need convert to big endian. */
10511 		entry.input.flow.sctp4_flow.dst_port =
10512 				rte_cpu_to_be_16(res->port_dst);
10513 		entry.input.flow.sctp4_flow.src_port =
10514 				rte_cpu_to_be_16(res->port_src);
10515 		entry.input.flow.sctp4_flow.verify_tag =
10516 				rte_cpu_to_be_32(res->verify_tag_value);
10517 		break;
10518 	case RTE_ETH_FLOW_FRAG_IPV6:
10519 	case RTE_ETH_FLOW_NONFRAG_IPV6_OTHER:
10520 		entry.input.flow.ipv6_flow.proto = res->proto_value;
10521 		/* fall-through */
10522 	case RTE_ETH_FLOW_NONFRAG_IPV6_UDP:
10523 	case RTE_ETH_FLOW_NONFRAG_IPV6_TCP:
10524 		IPV6_ADDR_TO_ARRAY(res->ip_dst,
10525 			entry.input.flow.ipv6_flow.dst_ip);
10526 		IPV6_ADDR_TO_ARRAY(res->ip_src,
10527 			entry.input.flow.ipv6_flow.src_ip);
10528 		entry.input.flow.ipv6_flow.tc = res->tos_value;
10529 		entry.input.flow.ipv6_flow.hop_limits = res->ttl_value;
10530 		/* need convert to big endian. */
10531 		entry.input.flow.udp6_flow.dst_port =
10532 				rte_cpu_to_be_16(res->port_dst);
10533 		entry.input.flow.udp6_flow.src_port =
10534 				rte_cpu_to_be_16(res->port_src);
10535 		break;
10536 	case RTE_ETH_FLOW_NONFRAG_IPV6_SCTP:
10537 		IPV6_ADDR_TO_ARRAY(res->ip_dst,
10538 			entry.input.flow.sctp6_flow.ip.dst_ip);
10539 		IPV6_ADDR_TO_ARRAY(res->ip_src,
10540 			entry.input.flow.sctp6_flow.ip.src_ip);
10541 		entry.input.flow.ipv6_flow.tc = res->tos_value;
10542 		entry.input.flow.ipv6_flow.hop_limits = res->ttl_value;
10543 		/* need convert to big endian. */
10544 		entry.input.flow.sctp6_flow.dst_port =
10545 				rte_cpu_to_be_16(res->port_dst);
10546 		entry.input.flow.sctp6_flow.src_port =
10547 				rte_cpu_to_be_16(res->port_src);
10548 		entry.input.flow.sctp6_flow.verify_tag =
10549 				rte_cpu_to_be_32(res->verify_tag_value);
10550 		break;
10551 	case RTE_ETH_FLOW_L2_PAYLOAD:
10552 		entry.input.flow.l2_flow.ether_type =
10553 			rte_cpu_to_be_16(res->ether_type);
10554 		break;
10555 	default:
10556 		break;
10557 	}
10558 
10559 	if (fdir_conf.mode ==  RTE_FDIR_MODE_PERFECT_MAC_VLAN)
10560 		rte_memcpy(&entry.input.flow.mac_vlan_flow.mac_addr,
10561 				 &res->mac_addr,
10562 				 sizeof(struct rte_ether_addr));
10563 
10564 	if (fdir_conf.mode ==  RTE_FDIR_MODE_PERFECT_TUNNEL) {
10565 		rte_memcpy(&entry.input.flow.tunnel_flow.mac_addr,
10566 				 &res->mac_addr,
10567 				 sizeof(struct rte_ether_addr));
10568 		entry.input.flow.tunnel_flow.tunnel_type =
10569 			str2fdir_tunneltype(res->tunnel_type);
10570 		entry.input.flow.tunnel_flow.tunnel_id =
10571 			rte_cpu_to_be_32(res->tunnel_id_value);
10572 	}
10573 
10574 	rte_memcpy(entry.input.flow_ext.flexbytes,
10575 		   flexbytes,
10576 		   RTE_ETH_FDIR_MAX_FLEXLEN);
10577 
10578 	entry.input.flow_ext.vlan_tci = rte_cpu_to_be_16(res->vlan_value);
10579 
10580 	entry.action.flex_off = 0;  /*use 0 by default */
10581 	if (!strcmp(res->drop, "drop"))
10582 		entry.action.behavior = RTE_ETH_FDIR_REJECT;
10583 	else
10584 		entry.action.behavior = RTE_ETH_FDIR_ACCEPT;
10585 
10586 	if (fdir_conf.mode !=  RTE_FDIR_MODE_PERFECT_MAC_VLAN &&
10587 	    fdir_conf.mode !=  RTE_FDIR_MODE_PERFECT_TUNNEL) {
10588 		if (!strcmp(res->pf_vf, "pf"))
10589 			entry.input.flow_ext.is_vf = 0;
10590 		else if (!strncmp(res->pf_vf, "vf", 2)) {
10591 			struct rte_eth_dev_info dev_info;
10592 
10593 			ret = eth_dev_info_get_print_err(res->port_id,
10594 						&dev_info);
10595 			if (ret != 0)
10596 				return;
10597 
10598 			errno = 0;
10599 			vf_id = strtoul(res->pf_vf + 2, &end, 10);
10600 			if (errno != 0 || *end != '\0' ||
10601 			    vf_id >= dev_info.max_vfs) {
10602 				printf("invalid parameter %s.\n", res->pf_vf);
10603 				return;
10604 			}
10605 			entry.input.flow_ext.is_vf = 1;
10606 			entry.input.flow_ext.dst_id = (uint16_t)vf_id;
10607 		} else {
10608 			printf("invalid parameter %s.\n", res->pf_vf);
10609 			return;
10610 		}
10611 	}
10612 
10613 	/* set to report FD ID by default */
10614 	entry.action.report_status = RTE_ETH_FDIR_REPORT_ID;
10615 	entry.action.rx_queue = res->queue_id;
10616 	entry.soft_id = res->fd_id_value;
10617 	if (!strcmp(res->ops, "add"))
10618 		ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR,
10619 					     RTE_ETH_FILTER_ADD, &entry);
10620 	else if (!strcmp(res->ops, "del"))
10621 		ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR,
10622 					     RTE_ETH_FILTER_DELETE, &entry);
10623 	else
10624 		ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR,
10625 					     RTE_ETH_FILTER_UPDATE, &entry);
10626 	if (ret < 0)
10627 		printf("flow director programming error: (%s)\n",
10628 			strerror(-ret));
10629 }
10630 
10631 cmdline_parse_token_string_t cmd_flow_director_filter =
10632 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10633 				 flow_director_filter, "flow_director_filter");
10634 cmdline_parse_token_num_t cmd_flow_director_port_id =
10635 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
10636 			      port_id, UINT16);
10637 cmdline_parse_token_string_t cmd_flow_director_ops =
10638 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10639 				 ops, "add#del#update");
10640 cmdline_parse_token_string_t cmd_flow_director_flow =
10641 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10642 				 flow, "flow");
10643 cmdline_parse_token_string_t cmd_flow_director_flow_type =
10644 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10645 		flow_type, NULL);
10646 cmdline_parse_token_string_t cmd_flow_director_ether =
10647 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10648 				 ether, "ether");
10649 cmdline_parse_token_num_t cmd_flow_director_ether_type =
10650 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
10651 			      ether_type, UINT16);
10652 cmdline_parse_token_string_t cmd_flow_director_src =
10653 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10654 				 src, "src");
10655 cmdline_parse_token_ipaddr_t cmd_flow_director_ip_src =
10656 	TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_result,
10657 				 ip_src);
10658 cmdline_parse_token_num_t cmd_flow_director_port_src =
10659 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
10660 			      port_src, UINT16);
10661 cmdline_parse_token_string_t cmd_flow_director_dst =
10662 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10663 				 dst, "dst");
10664 cmdline_parse_token_ipaddr_t cmd_flow_director_ip_dst =
10665 	TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_result,
10666 				 ip_dst);
10667 cmdline_parse_token_num_t cmd_flow_director_port_dst =
10668 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
10669 			      port_dst, UINT16);
10670 cmdline_parse_token_string_t cmd_flow_director_verify_tag =
10671 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10672 				  verify_tag, "verify_tag");
10673 cmdline_parse_token_num_t cmd_flow_director_verify_tag_value =
10674 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
10675 			      verify_tag_value, UINT32);
10676 cmdline_parse_token_string_t cmd_flow_director_tos =
10677 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10678 				 tos, "tos");
10679 cmdline_parse_token_num_t cmd_flow_director_tos_value =
10680 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
10681 			      tos_value, UINT8);
10682 cmdline_parse_token_string_t cmd_flow_director_proto =
10683 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10684 				 proto, "proto");
10685 cmdline_parse_token_num_t cmd_flow_director_proto_value =
10686 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
10687 			      proto_value, UINT8);
10688 cmdline_parse_token_string_t cmd_flow_director_ttl =
10689 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10690 				 ttl, "ttl");
10691 cmdline_parse_token_num_t cmd_flow_director_ttl_value =
10692 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
10693 			      ttl_value, UINT8);
10694 cmdline_parse_token_string_t cmd_flow_director_vlan =
10695 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10696 				 vlan, "vlan");
10697 cmdline_parse_token_num_t cmd_flow_director_vlan_value =
10698 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
10699 			      vlan_value, UINT16);
10700 cmdline_parse_token_string_t cmd_flow_director_flexbytes =
10701 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10702 				 flexbytes, "flexbytes");
10703 cmdline_parse_token_string_t cmd_flow_director_flexbytes_value =
10704 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10705 			      flexbytes_value, NULL);
10706 cmdline_parse_token_string_t cmd_flow_director_drop =
10707 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10708 				 drop, "drop#fwd");
10709 cmdline_parse_token_string_t cmd_flow_director_pf_vf =
10710 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10711 			      pf_vf, NULL);
10712 cmdline_parse_token_string_t cmd_flow_director_queue =
10713 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10714 				 queue, "queue");
10715 cmdline_parse_token_num_t cmd_flow_director_queue_id =
10716 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
10717 			      queue_id, UINT16);
10718 cmdline_parse_token_string_t cmd_flow_director_fd_id =
10719 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10720 				 fd_id, "fd_id");
10721 cmdline_parse_token_num_t cmd_flow_director_fd_id_value =
10722 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
10723 			      fd_id_value, UINT32);
10724 
10725 cmdline_parse_token_string_t cmd_flow_director_mode =
10726 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10727 				 mode, "mode");
10728 cmdline_parse_token_string_t cmd_flow_director_mode_ip =
10729 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10730 				 mode_value, "IP");
10731 cmdline_parse_token_string_t cmd_flow_director_mode_mac_vlan =
10732 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10733 				 mode_value, "MAC-VLAN");
10734 cmdline_parse_token_string_t cmd_flow_director_mode_tunnel =
10735 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10736 				 mode_value, "Tunnel");
10737 cmdline_parse_token_string_t cmd_flow_director_mode_raw =
10738 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10739 				 mode_value, "raw");
10740 cmdline_parse_token_string_t cmd_flow_director_mac =
10741 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10742 				 mac, "mac");
10743 cmdline_parse_token_etheraddr_t cmd_flow_director_mac_addr =
10744 	TOKEN_ETHERADDR_INITIALIZER(struct cmd_flow_director_result,
10745 				    mac_addr);
10746 cmdline_parse_token_string_t cmd_flow_director_tunnel =
10747 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10748 				 tunnel, "tunnel");
10749 cmdline_parse_token_string_t cmd_flow_director_tunnel_type =
10750 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10751 				 tunnel_type, "NVGRE#VxLAN");
10752 cmdline_parse_token_string_t cmd_flow_director_tunnel_id =
10753 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10754 				 tunnel_id, "tunnel-id");
10755 cmdline_parse_token_num_t cmd_flow_director_tunnel_id_value =
10756 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
10757 			      tunnel_id_value, UINT32);
10758 cmdline_parse_token_string_t cmd_flow_director_packet =
10759 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10760 				 packet, "packet");
10761 cmdline_parse_token_string_t cmd_flow_director_filepath =
10762 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
10763 				 filepath, NULL);
10764 
10765 cmdline_parse_inst_t cmd_add_del_ip_flow_director = {
10766 	.f = cmd_flow_director_filter_parsed,
10767 	.data = NULL,
10768 	.help_str = "flow_director_filter <port_id> mode IP add|del|update flow"
10769 		" ipv4-other|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|"
10770 		"ipv6-other|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|"
10771 		"l2_payload src <src_ip> dst <dst_ip> tos <tos_value> "
10772 		"proto <proto_value> ttl <ttl_value> vlan <vlan_value> "
10773 		"flexbytes <flexbyte_values> drop|fw <pf_vf> queue <queue_id> "
10774 		"fd_id <fd_id_value>: "
10775 		"Add or delete an ip flow director entry on NIC",
10776 	.tokens = {
10777 		(void *)&cmd_flow_director_filter,
10778 		(void *)&cmd_flow_director_port_id,
10779 		(void *)&cmd_flow_director_mode,
10780 		(void *)&cmd_flow_director_mode_ip,
10781 		(void *)&cmd_flow_director_ops,
10782 		(void *)&cmd_flow_director_flow,
10783 		(void *)&cmd_flow_director_flow_type,
10784 		(void *)&cmd_flow_director_src,
10785 		(void *)&cmd_flow_director_ip_src,
10786 		(void *)&cmd_flow_director_dst,
10787 		(void *)&cmd_flow_director_ip_dst,
10788 		(void *)&cmd_flow_director_tos,
10789 		(void *)&cmd_flow_director_tos_value,
10790 		(void *)&cmd_flow_director_proto,
10791 		(void *)&cmd_flow_director_proto_value,
10792 		(void *)&cmd_flow_director_ttl,
10793 		(void *)&cmd_flow_director_ttl_value,
10794 		(void *)&cmd_flow_director_vlan,
10795 		(void *)&cmd_flow_director_vlan_value,
10796 		(void *)&cmd_flow_director_flexbytes,
10797 		(void *)&cmd_flow_director_flexbytes_value,
10798 		(void *)&cmd_flow_director_drop,
10799 		(void *)&cmd_flow_director_pf_vf,
10800 		(void *)&cmd_flow_director_queue,
10801 		(void *)&cmd_flow_director_queue_id,
10802 		(void *)&cmd_flow_director_fd_id,
10803 		(void *)&cmd_flow_director_fd_id_value,
10804 		NULL,
10805 	},
10806 };
10807 
10808 cmdline_parse_inst_t cmd_add_del_udp_flow_director = {
10809 	.f = cmd_flow_director_filter_parsed,
10810 	.data = NULL,
10811 	.help_str = "flow_director_filter ... : Add or delete an udp/tcp flow "
10812 		"director entry on NIC",
10813 	.tokens = {
10814 		(void *)&cmd_flow_director_filter,
10815 		(void *)&cmd_flow_director_port_id,
10816 		(void *)&cmd_flow_director_mode,
10817 		(void *)&cmd_flow_director_mode_ip,
10818 		(void *)&cmd_flow_director_ops,
10819 		(void *)&cmd_flow_director_flow,
10820 		(void *)&cmd_flow_director_flow_type,
10821 		(void *)&cmd_flow_director_src,
10822 		(void *)&cmd_flow_director_ip_src,
10823 		(void *)&cmd_flow_director_port_src,
10824 		(void *)&cmd_flow_director_dst,
10825 		(void *)&cmd_flow_director_ip_dst,
10826 		(void *)&cmd_flow_director_port_dst,
10827 		(void *)&cmd_flow_director_tos,
10828 		(void *)&cmd_flow_director_tos_value,
10829 		(void *)&cmd_flow_director_ttl,
10830 		(void *)&cmd_flow_director_ttl_value,
10831 		(void *)&cmd_flow_director_vlan,
10832 		(void *)&cmd_flow_director_vlan_value,
10833 		(void *)&cmd_flow_director_flexbytes,
10834 		(void *)&cmd_flow_director_flexbytes_value,
10835 		(void *)&cmd_flow_director_drop,
10836 		(void *)&cmd_flow_director_pf_vf,
10837 		(void *)&cmd_flow_director_queue,
10838 		(void *)&cmd_flow_director_queue_id,
10839 		(void *)&cmd_flow_director_fd_id,
10840 		(void *)&cmd_flow_director_fd_id_value,
10841 		NULL,
10842 	},
10843 };
10844 
10845 cmdline_parse_inst_t cmd_add_del_sctp_flow_director = {
10846 	.f = cmd_flow_director_filter_parsed,
10847 	.data = NULL,
10848 	.help_str = "flow_director_filter ... : Add or delete a sctp flow "
10849 		"director entry on NIC",
10850 	.tokens = {
10851 		(void *)&cmd_flow_director_filter,
10852 		(void *)&cmd_flow_director_port_id,
10853 		(void *)&cmd_flow_director_mode,
10854 		(void *)&cmd_flow_director_mode_ip,
10855 		(void *)&cmd_flow_director_ops,
10856 		(void *)&cmd_flow_director_flow,
10857 		(void *)&cmd_flow_director_flow_type,
10858 		(void *)&cmd_flow_director_src,
10859 		(void *)&cmd_flow_director_ip_src,
10860 		(void *)&cmd_flow_director_port_src,
10861 		(void *)&cmd_flow_director_dst,
10862 		(void *)&cmd_flow_director_ip_dst,
10863 		(void *)&cmd_flow_director_port_dst,
10864 		(void *)&cmd_flow_director_verify_tag,
10865 		(void *)&cmd_flow_director_verify_tag_value,
10866 		(void *)&cmd_flow_director_tos,
10867 		(void *)&cmd_flow_director_tos_value,
10868 		(void *)&cmd_flow_director_ttl,
10869 		(void *)&cmd_flow_director_ttl_value,
10870 		(void *)&cmd_flow_director_vlan,
10871 		(void *)&cmd_flow_director_vlan_value,
10872 		(void *)&cmd_flow_director_flexbytes,
10873 		(void *)&cmd_flow_director_flexbytes_value,
10874 		(void *)&cmd_flow_director_drop,
10875 		(void *)&cmd_flow_director_pf_vf,
10876 		(void *)&cmd_flow_director_queue,
10877 		(void *)&cmd_flow_director_queue_id,
10878 		(void *)&cmd_flow_director_fd_id,
10879 		(void *)&cmd_flow_director_fd_id_value,
10880 		NULL,
10881 	},
10882 };
10883 
10884 cmdline_parse_inst_t cmd_add_del_l2_flow_director = {
10885 	.f = cmd_flow_director_filter_parsed,
10886 	.data = NULL,
10887 	.help_str = "flow_director_filter ... : Add or delete a L2 flow "
10888 		"director entry on NIC",
10889 	.tokens = {
10890 		(void *)&cmd_flow_director_filter,
10891 		(void *)&cmd_flow_director_port_id,
10892 		(void *)&cmd_flow_director_mode,
10893 		(void *)&cmd_flow_director_mode_ip,
10894 		(void *)&cmd_flow_director_ops,
10895 		(void *)&cmd_flow_director_flow,
10896 		(void *)&cmd_flow_director_flow_type,
10897 		(void *)&cmd_flow_director_ether,
10898 		(void *)&cmd_flow_director_ether_type,
10899 		(void *)&cmd_flow_director_flexbytes,
10900 		(void *)&cmd_flow_director_flexbytes_value,
10901 		(void *)&cmd_flow_director_drop,
10902 		(void *)&cmd_flow_director_pf_vf,
10903 		(void *)&cmd_flow_director_queue,
10904 		(void *)&cmd_flow_director_queue_id,
10905 		(void *)&cmd_flow_director_fd_id,
10906 		(void *)&cmd_flow_director_fd_id_value,
10907 		NULL,
10908 	},
10909 };
10910 
10911 cmdline_parse_inst_t cmd_add_del_mac_vlan_flow_director = {
10912 	.f = cmd_flow_director_filter_parsed,
10913 	.data = NULL,
10914 	.help_str = "flow_director_filter ... : Add or delete a MAC VLAN flow "
10915 		"director entry on NIC",
10916 	.tokens = {
10917 		(void *)&cmd_flow_director_filter,
10918 		(void *)&cmd_flow_director_port_id,
10919 		(void *)&cmd_flow_director_mode,
10920 		(void *)&cmd_flow_director_mode_mac_vlan,
10921 		(void *)&cmd_flow_director_ops,
10922 		(void *)&cmd_flow_director_mac,
10923 		(void *)&cmd_flow_director_mac_addr,
10924 		(void *)&cmd_flow_director_vlan,
10925 		(void *)&cmd_flow_director_vlan_value,
10926 		(void *)&cmd_flow_director_flexbytes,
10927 		(void *)&cmd_flow_director_flexbytes_value,
10928 		(void *)&cmd_flow_director_drop,
10929 		(void *)&cmd_flow_director_queue,
10930 		(void *)&cmd_flow_director_queue_id,
10931 		(void *)&cmd_flow_director_fd_id,
10932 		(void *)&cmd_flow_director_fd_id_value,
10933 		NULL,
10934 	},
10935 };
10936 
10937 cmdline_parse_inst_t cmd_add_del_tunnel_flow_director = {
10938 	.f = cmd_flow_director_filter_parsed,
10939 	.data = NULL,
10940 	.help_str = "flow_director_filter ... : Add or delete a tunnel flow "
10941 		"director entry on NIC",
10942 	.tokens = {
10943 		(void *)&cmd_flow_director_filter,
10944 		(void *)&cmd_flow_director_port_id,
10945 		(void *)&cmd_flow_director_mode,
10946 		(void *)&cmd_flow_director_mode_tunnel,
10947 		(void *)&cmd_flow_director_ops,
10948 		(void *)&cmd_flow_director_mac,
10949 		(void *)&cmd_flow_director_mac_addr,
10950 		(void *)&cmd_flow_director_vlan,
10951 		(void *)&cmd_flow_director_vlan_value,
10952 		(void *)&cmd_flow_director_tunnel,
10953 		(void *)&cmd_flow_director_tunnel_type,
10954 		(void *)&cmd_flow_director_tunnel_id,
10955 		(void *)&cmd_flow_director_tunnel_id_value,
10956 		(void *)&cmd_flow_director_flexbytes,
10957 		(void *)&cmd_flow_director_flexbytes_value,
10958 		(void *)&cmd_flow_director_drop,
10959 		(void *)&cmd_flow_director_queue,
10960 		(void *)&cmd_flow_director_queue_id,
10961 		(void *)&cmd_flow_director_fd_id,
10962 		(void *)&cmd_flow_director_fd_id_value,
10963 		NULL,
10964 	},
10965 };
10966 
10967 cmdline_parse_inst_t cmd_add_del_raw_flow_director = {
10968 	.f = cmd_flow_director_filter_parsed,
10969 	.data = NULL,
10970 	.help_str = "flow_director_filter ... : Add or delete a raw flow "
10971 		"director entry on NIC",
10972 	.tokens = {
10973 		(void *)&cmd_flow_director_filter,
10974 		(void *)&cmd_flow_director_port_id,
10975 		(void *)&cmd_flow_director_mode,
10976 		(void *)&cmd_flow_director_mode_raw,
10977 		(void *)&cmd_flow_director_ops,
10978 		(void *)&cmd_flow_director_flow,
10979 		(void *)&cmd_flow_director_flow_type,
10980 		(void *)&cmd_flow_director_drop,
10981 		(void *)&cmd_flow_director_queue,
10982 		(void *)&cmd_flow_director_queue_id,
10983 		(void *)&cmd_flow_director_fd_id,
10984 		(void *)&cmd_flow_director_fd_id_value,
10985 		(void *)&cmd_flow_director_packet,
10986 		(void *)&cmd_flow_director_filepath,
10987 		NULL,
10988 	},
10989 };
10990 
10991 struct cmd_flush_flow_director_result {
10992 	cmdline_fixed_string_t flush_flow_director;
10993 	portid_t port_id;
10994 };
10995 
10996 cmdline_parse_token_string_t cmd_flush_flow_director_flush =
10997 	TOKEN_STRING_INITIALIZER(struct cmd_flush_flow_director_result,
10998 				 flush_flow_director, "flush_flow_director");
10999 cmdline_parse_token_num_t cmd_flush_flow_director_port_id =
11000 	TOKEN_NUM_INITIALIZER(struct cmd_flush_flow_director_result,
11001 			      port_id, UINT16);
11002 
11003 static void
11004 cmd_flush_flow_director_parsed(void *parsed_result,
11005 			  __rte_unused struct cmdline *cl,
11006 			  __rte_unused void *data)
11007 {
11008 	struct cmd_flow_director_result *res = parsed_result;
11009 	int ret = 0;
11010 
11011 	ret = rte_eth_dev_filter_supported(res->port_id, RTE_ETH_FILTER_FDIR);
11012 	if (ret < 0) {
11013 		printf("flow director is not supported on port %u.\n",
11014 			res->port_id);
11015 		return;
11016 	}
11017 
11018 	ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR,
11019 			RTE_ETH_FILTER_FLUSH, NULL);
11020 	if (ret < 0)
11021 		printf("flow director table flushing error: (%s)\n",
11022 			strerror(-ret));
11023 }
11024 
11025 cmdline_parse_inst_t cmd_flush_flow_director = {
11026 	.f = cmd_flush_flow_director_parsed,
11027 	.data = NULL,
11028 	.help_str = "flush_flow_director <port_id>: "
11029 		"Flush all flow director entries of a device on NIC",
11030 	.tokens = {
11031 		(void *)&cmd_flush_flow_director_flush,
11032 		(void *)&cmd_flush_flow_director_port_id,
11033 		NULL,
11034 	},
11035 };
11036 
11037 /* *** deal with flow director mask *** */
11038 struct cmd_flow_director_mask_result {
11039 	cmdline_fixed_string_t flow_director_mask;
11040 	portid_t port_id;
11041 	cmdline_fixed_string_t mode;
11042 	cmdline_fixed_string_t mode_value;
11043 	cmdline_fixed_string_t vlan;
11044 	uint16_t vlan_mask;
11045 	cmdline_fixed_string_t src_mask;
11046 	cmdline_ipaddr_t ipv4_src;
11047 	cmdline_ipaddr_t ipv6_src;
11048 	uint16_t port_src;
11049 	cmdline_fixed_string_t dst_mask;
11050 	cmdline_ipaddr_t ipv4_dst;
11051 	cmdline_ipaddr_t ipv6_dst;
11052 	uint16_t port_dst;
11053 	cmdline_fixed_string_t mac;
11054 	uint8_t mac_addr_byte_mask;
11055 	cmdline_fixed_string_t tunnel_id;
11056 	uint32_t tunnel_id_mask;
11057 	cmdline_fixed_string_t tunnel_type;
11058 	uint8_t tunnel_type_mask;
11059 };
11060 
11061 static void
11062 cmd_flow_director_mask_parsed(void *parsed_result,
11063 			  __rte_unused struct cmdline *cl,
11064 			  __rte_unused void *data)
11065 {
11066 	struct cmd_flow_director_mask_result *res = parsed_result;
11067 	struct rte_eth_fdir_masks *mask;
11068 	struct rte_port *port;
11069 
11070 	port = &ports[res->port_id];
11071 	/** Check if the port is not started **/
11072 	if (port->port_status != RTE_PORT_STOPPED) {
11073 		printf("Please stop port %d first\n", res->port_id);
11074 		return;
11075 	}
11076 
11077 	mask = &port->dev_conf.fdir_conf.mask;
11078 
11079 	if (fdir_conf.mode ==  RTE_FDIR_MODE_PERFECT_MAC_VLAN) {
11080 		if (strcmp(res->mode_value, "MAC-VLAN")) {
11081 			printf("Please set mode to MAC-VLAN.\n");
11082 			return;
11083 		}
11084 
11085 		mask->vlan_tci_mask = rte_cpu_to_be_16(res->vlan_mask);
11086 	} else if (fdir_conf.mode ==  RTE_FDIR_MODE_PERFECT_TUNNEL) {
11087 		if (strcmp(res->mode_value, "Tunnel")) {
11088 			printf("Please set mode to Tunnel.\n");
11089 			return;
11090 		}
11091 
11092 		mask->vlan_tci_mask = rte_cpu_to_be_16(res->vlan_mask);
11093 		mask->mac_addr_byte_mask = res->mac_addr_byte_mask;
11094 		mask->tunnel_id_mask = rte_cpu_to_be_32(res->tunnel_id_mask);
11095 		mask->tunnel_type_mask = res->tunnel_type_mask;
11096 	} else {
11097 		if (strcmp(res->mode_value, "IP")) {
11098 			printf("Please set mode to IP.\n");
11099 			return;
11100 		}
11101 
11102 		mask->vlan_tci_mask = rte_cpu_to_be_16(res->vlan_mask);
11103 		IPV4_ADDR_TO_UINT(res->ipv4_src, mask->ipv4_mask.src_ip);
11104 		IPV4_ADDR_TO_UINT(res->ipv4_dst, mask->ipv4_mask.dst_ip);
11105 		IPV6_ADDR_TO_ARRAY(res->ipv6_src, mask->ipv6_mask.src_ip);
11106 		IPV6_ADDR_TO_ARRAY(res->ipv6_dst, mask->ipv6_mask.dst_ip);
11107 		mask->src_port_mask = rte_cpu_to_be_16(res->port_src);
11108 		mask->dst_port_mask = rte_cpu_to_be_16(res->port_dst);
11109 	}
11110 
11111 	cmd_reconfig_device_queue(res->port_id, 1, 1);
11112 }
11113 
11114 cmdline_parse_token_string_t cmd_flow_director_mask =
11115 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result,
11116 				 flow_director_mask, "flow_director_mask");
11117 cmdline_parse_token_num_t cmd_flow_director_mask_port_id =
11118 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result,
11119 			      port_id, UINT16);
11120 cmdline_parse_token_string_t cmd_flow_director_mask_vlan =
11121 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result,
11122 				 vlan, "vlan");
11123 cmdline_parse_token_num_t cmd_flow_director_mask_vlan_value =
11124 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result,
11125 			      vlan_mask, UINT16);
11126 cmdline_parse_token_string_t cmd_flow_director_mask_src =
11127 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result,
11128 				 src_mask, "src_mask");
11129 cmdline_parse_token_ipaddr_t cmd_flow_director_mask_ipv4_src =
11130 	TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_mask_result,
11131 				 ipv4_src);
11132 cmdline_parse_token_ipaddr_t cmd_flow_director_mask_ipv6_src =
11133 	TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_mask_result,
11134 				 ipv6_src);
11135 cmdline_parse_token_num_t cmd_flow_director_mask_port_src =
11136 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result,
11137 			      port_src, UINT16);
11138 cmdline_parse_token_string_t cmd_flow_director_mask_dst =
11139 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result,
11140 				 dst_mask, "dst_mask");
11141 cmdline_parse_token_ipaddr_t cmd_flow_director_mask_ipv4_dst =
11142 	TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_mask_result,
11143 				 ipv4_dst);
11144 cmdline_parse_token_ipaddr_t cmd_flow_director_mask_ipv6_dst =
11145 	TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_mask_result,
11146 				 ipv6_dst);
11147 cmdline_parse_token_num_t cmd_flow_director_mask_port_dst =
11148 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result,
11149 			      port_dst, UINT16);
11150 
11151 cmdline_parse_token_string_t cmd_flow_director_mask_mode =
11152 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result,
11153 				 mode, "mode");
11154 cmdline_parse_token_string_t cmd_flow_director_mask_mode_ip =
11155 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result,
11156 				 mode_value, "IP");
11157 cmdline_parse_token_string_t cmd_flow_director_mask_mode_mac_vlan =
11158 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result,
11159 				 mode_value, "MAC-VLAN");
11160 cmdline_parse_token_string_t cmd_flow_director_mask_mode_tunnel =
11161 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result,
11162 				 mode_value, "Tunnel");
11163 cmdline_parse_token_string_t cmd_flow_director_mask_mac =
11164 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result,
11165 				 mac, "mac");
11166 cmdline_parse_token_num_t cmd_flow_director_mask_mac_value =
11167 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result,
11168 			      mac_addr_byte_mask, UINT8);
11169 cmdline_parse_token_string_t cmd_flow_director_mask_tunnel_type =
11170 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result,
11171 				 tunnel_type, "tunnel-type");
11172 cmdline_parse_token_num_t cmd_flow_director_mask_tunnel_type_value =
11173 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result,
11174 			      tunnel_type_mask, UINT8);
11175 cmdline_parse_token_string_t cmd_flow_director_mask_tunnel_id =
11176 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result,
11177 				 tunnel_id, "tunnel-id");
11178 cmdline_parse_token_num_t cmd_flow_director_mask_tunnel_id_value =
11179 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result,
11180 			      tunnel_id_mask, UINT32);
11181 
11182 cmdline_parse_inst_t cmd_set_flow_director_ip_mask = {
11183 	.f = cmd_flow_director_mask_parsed,
11184 	.data = NULL,
11185 	.help_str = "flow_director_mask ... : "
11186 		"Set IP mode flow director's mask on NIC",
11187 	.tokens = {
11188 		(void *)&cmd_flow_director_mask,
11189 		(void *)&cmd_flow_director_mask_port_id,
11190 		(void *)&cmd_flow_director_mask_mode,
11191 		(void *)&cmd_flow_director_mask_mode_ip,
11192 		(void *)&cmd_flow_director_mask_vlan,
11193 		(void *)&cmd_flow_director_mask_vlan_value,
11194 		(void *)&cmd_flow_director_mask_src,
11195 		(void *)&cmd_flow_director_mask_ipv4_src,
11196 		(void *)&cmd_flow_director_mask_ipv6_src,
11197 		(void *)&cmd_flow_director_mask_port_src,
11198 		(void *)&cmd_flow_director_mask_dst,
11199 		(void *)&cmd_flow_director_mask_ipv4_dst,
11200 		(void *)&cmd_flow_director_mask_ipv6_dst,
11201 		(void *)&cmd_flow_director_mask_port_dst,
11202 		NULL,
11203 	},
11204 };
11205 
11206 cmdline_parse_inst_t cmd_set_flow_director_mac_vlan_mask = {
11207 	.f = cmd_flow_director_mask_parsed,
11208 	.data = NULL,
11209 	.help_str = "flow_director_mask ... : Set MAC VLAN mode "
11210 		"flow director's mask on NIC",
11211 	.tokens = {
11212 		(void *)&cmd_flow_director_mask,
11213 		(void *)&cmd_flow_director_mask_port_id,
11214 		(void *)&cmd_flow_director_mask_mode,
11215 		(void *)&cmd_flow_director_mask_mode_mac_vlan,
11216 		(void *)&cmd_flow_director_mask_vlan,
11217 		(void *)&cmd_flow_director_mask_vlan_value,
11218 		NULL,
11219 	},
11220 };
11221 
11222 cmdline_parse_inst_t cmd_set_flow_director_tunnel_mask = {
11223 	.f = cmd_flow_director_mask_parsed,
11224 	.data = NULL,
11225 	.help_str = "flow_director_mask ... : Set tunnel mode "
11226 		"flow director's mask on NIC",
11227 	.tokens = {
11228 		(void *)&cmd_flow_director_mask,
11229 		(void *)&cmd_flow_director_mask_port_id,
11230 		(void *)&cmd_flow_director_mask_mode,
11231 		(void *)&cmd_flow_director_mask_mode_tunnel,
11232 		(void *)&cmd_flow_director_mask_vlan,
11233 		(void *)&cmd_flow_director_mask_vlan_value,
11234 		(void *)&cmd_flow_director_mask_mac,
11235 		(void *)&cmd_flow_director_mask_mac_value,
11236 		(void *)&cmd_flow_director_mask_tunnel_type,
11237 		(void *)&cmd_flow_director_mask_tunnel_type_value,
11238 		(void *)&cmd_flow_director_mask_tunnel_id,
11239 		(void *)&cmd_flow_director_mask_tunnel_id_value,
11240 		NULL,
11241 	},
11242 };
11243 
11244 /* *** deal with flow director mask on flexible payload *** */
11245 struct cmd_flow_director_flex_mask_result {
11246 	cmdline_fixed_string_t flow_director_flexmask;
11247 	portid_t port_id;
11248 	cmdline_fixed_string_t flow;
11249 	cmdline_fixed_string_t flow_type;
11250 	cmdline_fixed_string_t mask;
11251 };
11252 
11253 static void
11254 cmd_flow_director_flex_mask_parsed(void *parsed_result,
11255 			  __rte_unused struct cmdline *cl,
11256 			  __rte_unused void *data)
11257 {
11258 	struct cmd_flow_director_flex_mask_result *res = parsed_result;
11259 	struct rte_eth_fdir_info fdir_info;
11260 	struct rte_eth_fdir_flex_mask flex_mask;
11261 	struct rte_port *port;
11262 	uint64_t flow_type_mask;
11263 	uint16_t i;
11264 	int ret;
11265 
11266 	port = &ports[res->port_id];
11267 	/** Check if the port is not started **/
11268 	if (port->port_status != RTE_PORT_STOPPED) {
11269 		printf("Please stop port %d first\n", res->port_id);
11270 		return;
11271 	}
11272 
11273 	memset(&flex_mask, 0, sizeof(struct rte_eth_fdir_flex_mask));
11274 	ret = parse_flexbytes(res->mask,
11275 			flex_mask.mask,
11276 			RTE_ETH_FDIR_MAX_FLEXLEN);
11277 	if (ret < 0) {
11278 		printf("error: Cannot parse mask input.\n");
11279 		return;
11280 	}
11281 
11282 	memset(&fdir_info, 0, sizeof(fdir_info));
11283 	ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR,
11284 				RTE_ETH_FILTER_INFO, &fdir_info);
11285 	if (ret < 0) {
11286 		printf("Cannot get FDir filter info\n");
11287 		return;
11288 	}
11289 
11290 	if (!strcmp(res->flow_type, "none")) {
11291 		/* means don't specify the flow type */
11292 		flex_mask.flow_type = RTE_ETH_FLOW_UNKNOWN;
11293 		for (i = 0; i < RTE_ETH_FLOW_MAX; i++)
11294 			memset(&port->dev_conf.fdir_conf.flex_conf.flex_mask[i],
11295 			       0, sizeof(struct rte_eth_fdir_flex_mask));
11296 		port->dev_conf.fdir_conf.flex_conf.nb_flexmasks = 1;
11297 		rte_memcpy(&port->dev_conf.fdir_conf.flex_conf.flex_mask[0],
11298 				 &flex_mask,
11299 				 sizeof(struct rte_eth_fdir_flex_mask));
11300 		cmd_reconfig_device_queue(res->port_id, 1, 1);
11301 		return;
11302 	}
11303 	flow_type_mask = fdir_info.flow_types_mask[0];
11304 	if (!strcmp(res->flow_type, "all")) {
11305 		if (!flow_type_mask) {
11306 			printf("No flow type supported\n");
11307 			return;
11308 		}
11309 		for (i = RTE_ETH_FLOW_UNKNOWN; i < RTE_ETH_FLOW_MAX; i++) {
11310 			if (flow_type_mask & (1ULL << i)) {
11311 				flex_mask.flow_type = i;
11312 				fdir_set_flex_mask(res->port_id, &flex_mask);
11313 			}
11314 		}
11315 		cmd_reconfig_device_queue(res->port_id, 1, 1);
11316 		return;
11317 	}
11318 	flex_mask.flow_type = str2flowtype(res->flow_type);
11319 	if (!(flow_type_mask & (1ULL << flex_mask.flow_type))) {
11320 		printf("Flow type %s not supported on port %d\n",
11321 				res->flow_type, res->port_id);
11322 		return;
11323 	}
11324 	fdir_set_flex_mask(res->port_id, &flex_mask);
11325 	cmd_reconfig_device_queue(res->port_id, 1, 1);
11326 }
11327 
11328 cmdline_parse_token_string_t cmd_flow_director_flexmask =
11329 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flex_mask_result,
11330 				 flow_director_flexmask,
11331 				 "flow_director_flex_mask");
11332 cmdline_parse_token_num_t cmd_flow_director_flexmask_port_id =
11333 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_flex_mask_result,
11334 			      port_id, UINT16);
11335 cmdline_parse_token_string_t cmd_flow_director_flexmask_flow =
11336 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flex_mask_result,
11337 				 flow, "flow");
11338 cmdline_parse_token_string_t cmd_flow_director_flexmask_flow_type =
11339 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flex_mask_result,
11340 		flow_type, "none#ipv4-other#ipv4-frag#ipv4-tcp#ipv4-udp#ipv4-sctp#"
11341 		"ipv6-other#ipv6-frag#ipv6-tcp#ipv6-udp#ipv6-sctp#l2_payload#all");
11342 cmdline_parse_token_string_t cmd_flow_director_flexmask_mask =
11343 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flex_mask_result,
11344 				 mask, NULL);
11345 
11346 cmdline_parse_inst_t cmd_set_flow_director_flex_mask = {
11347 	.f = cmd_flow_director_flex_mask_parsed,
11348 	.data = NULL,
11349 	.help_str = "flow_director_flex_mask ... : "
11350 		"Set flow director's flex mask on NIC",
11351 	.tokens = {
11352 		(void *)&cmd_flow_director_flexmask,
11353 		(void *)&cmd_flow_director_flexmask_port_id,
11354 		(void *)&cmd_flow_director_flexmask_flow,
11355 		(void *)&cmd_flow_director_flexmask_flow_type,
11356 		(void *)&cmd_flow_director_flexmask_mask,
11357 		NULL,
11358 	},
11359 };
11360 
11361 /* *** deal with flow director flexible payload configuration *** */
11362 struct cmd_flow_director_flexpayload_result {
11363 	cmdline_fixed_string_t flow_director_flexpayload;
11364 	portid_t port_id;
11365 	cmdline_fixed_string_t payload_layer;
11366 	cmdline_fixed_string_t payload_cfg;
11367 };
11368 
11369 static inline int
11370 parse_offsets(const char *q_arg, uint16_t *offsets, uint16_t max_num)
11371 {
11372 	char s[256];
11373 	const char *p, *p0 = q_arg;
11374 	char *end;
11375 	unsigned long int_fld;
11376 	char *str_fld[max_num];
11377 	int i;
11378 	unsigned size;
11379 	int ret = -1;
11380 
11381 	p = strchr(p0, '(');
11382 	if (p == NULL)
11383 		return -1;
11384 	++p;
11385 	p0 = strchr(p, ')');
11386 	if (p0 == NULL)
11387 		return -1;
11388 
11389 	size = p0 - p;
11390 	if (size >= sizeof(s))
11391 		return -1;
11392 
11393 	snprintf(s, sizeof(s), "%.*s", size, p);
11394 	ret = rte_strsplit(s, sizeof(s), str_fld, max_num, ',');
11395 	if (ret < 0 || ret > max_num)
11396 		return -1;
11397 	for (i = 0; i < ret; i++) {
11398 		errno = 0;
11399 		int_fld = strtoul(str_fld[i], &end, 0);
11400 		if (errno != 0 || *end != '\0' || int_fld > UINT16_MAX)
11401 			return -1;
11402 		offsets[i] = (uint16_t)int_fld;
11403 	}
11404 	return ret;
11405 }
11406 
11407 static void
11408 cmd_flow_director_flxpld_parsed(void *parsed_result,
11409 			  __rte_unused struct cmdline *cl,
11410 			  __rte_unused void *data)
11411 {
11412 	struct cmd_flow_director_flexpayload_result *res = parsed_result;
11413 	struct rte_eth_flex_payload_cfg flex_cfg;
11414 	struct rte_port *port;
11415 	int ret = 0;
11416 
11417 	port = &ports[res->port_id];
11418 	/** Check if the port is not started **/
11419 	if (port->port_status != RTE_PORT_STOPPED) {
11420 		printf("Please stop port %d first\n", res->port_id);
11421 		return;
11422 	}
11423 
11424 	memset(&flex_cfg, 0, sizeof(struct rte_eth_flex_payload_cfg));
11425 
11426 	if (!strcmp(res->payload_layer, "raw"))
11427 		flex_cfg.type = RTE_ETH_RAW_PAYLOAD;
11428 	else if (!strcmp(res->payload_layer, "l2"))
11429 		flex_cfg.type = RTE_ETH_L2_PAYLOAD;
11430 	else if (!strcmp(res->payload_layer, "l3"))
11431 		flex_cfg.type = RTE_ETH_L3_PAYLOAD;
11432 	else if (!strcmp(res->payload_layer, "l4"))
11433 		flex_cfg.type = RTE_ETH_L4_PAYLOAD;
11434 
11435 	ret = parse_offsets(res->payload_cfg, flex_cfg.src_offset,
11436 			    RTE_ETH_FDIR_MAX_FLEXLEN);
11437 	if (ret < 0) {
11438 		printf("error: Cannot parse flex payload input.\n");
11439 		return;
11440 	}
11441 
11442 	fdir_set_flex_payload(res->port_id, &flex_cfg);
11443 	cmd_reconfig_device_queue(res->port_id, 1, 1);
11444 }
11445 
11446 cmdline_parse_token_string_t cmd_flow_director_flexpayload =
11447 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flexpayload_result,
11448 				 flow_director_flexpayload,
11449 				 "flow_director_flex_payload");
11450 cmdline_parse_token_num_t cmd_flow_director_flexpayload_port_id =
11451 	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_flexpayload_result,
11452 			      port_id, UINT16);
11453 cmdline_parse_token_string_t cmd_flow_director_flexpayload_payload_layer =
11454 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flexpayload_result,
11455 				 payload_layer, "raw#l2#l3#l4");
11456 cmdline_parse_token_string_t cmd_flow_director_flexpayload_payload_cfg =
11457 	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flexpayload_result,
11458 				 payload_cfg, NULL);
11459 
11460 cmdline_parse_inst_t cmd_set_flow_director_flex_payload = {
11461 	.f = cmd_flow_director_flxpld_parsed,
11462 	.data = NULL,
11463 	.help_str = "flow_director_flexpayload ... : "
11464 		"Set flow director's flex payload on NIC",
11465 	.tokens = {
11466 		(void *)&cmd_flow_director_flexpayload,
11467 		(void *)&cmd_flow_director_flexpayload_port_id,
11468 		(void *)&cmd_flow_director_flexpayload_payload_layer,
11469 		(void *)&cmd_flow_director_flexpayload_payload_cfg,
11470 		NULL,
11471 	},
11472 };
11473 
11474 /* Generic flow interface command. */
11475 extern cmdline_parse_inst_t cmd_flow;
11476 
11477 /* *** Classification Filters Control *** */
11478 
11479 static enum rte_eth_input_set_field
11480 str2inset(char *string)
11481 {
11482 	uint16_t i;
11483 
11484 	static const struct {
11485 		char str[32];
11486 		enum rte_eth_input_set_field inset;
11487 	} inset_table[] = {
11488 		{"ethertype", RTE_ETH_INPUT_SET_L2_ETHERTYPE},
11489 		{"ovlan", RTE_ETH_INPUT_SET_L2_OUTER_VLAN},
11490 		{"ivlan", RTE_ETH_INPUT_SET_L2_INNER_VLAN},
11491 		{"src-ipv4", RTE_ETH_INPUT_SET_L3_SRC_IP4},
11492 		{"dst-ipv4", RTE_ETH_INPUT_SET_L3_DST_IP4},
11493 		{"ipv4-tos", RTE_ETH_INPUT_SET_L3_IP4_TOS},
11494 		{"ipv4-proto", RTE_ETH_INPUT_SET_L3_IP4_PROTO},
11495 		{"ipv4-ttl", RTE_ETH_INPUT_SET_L3_IP4_TTL},
11496 		{"src-ipv6", RTE_ETH_INPUT_SET_L3_SRC_IP6},
11497 		{"dst-ipv6", RTE_ETH_INPUT_SET_L3_DST_IP6},
11498 		{"ipv6-tc", RTE_ETH_INPUT_SET_L3_IP6_TC},
11499 		{"ipv6-next-header", RTE_ETH_INPUT_SET_L3_IP6_NEXT_HEADER},
11500 		{"ipv6-hop-limits", RTE_ETH_INPUT_SET_L3_IP6_HOP_LIMITS},
11501 		{"udp-src-port", RTE_ETH_INPUT_SET_L4_UDP_SRC_PORT},
11502 		{"udp-dst-port", RTE_ETH_INPUT_SET_L4_UDP_DST_PORT},
11503 		{"tcp-src-port", RTE_ETH_INPUT_SET_L4_TCP_SRC_PORT},
11504 		{"tcp-dst-port", RTE_ETH_INPUT_SET_L4_TCP_DST_PORT},
11505 		{"sctp-src-port", RTE_ETH_INPUT_SET_L4_SCTP_SRC_PORT},
11506 		{"sctp-dst-port", RTE_ETH_INPUT_SET_L4_SCTP_DST_PORT},
11507 		{"sctp-veri-tag", RTE_ETH_INPUT_SET_L4_SCTP_VERIFICATION_TAG},
11508 		{"udp-key", RTE_ETH_INPUT_SET_TUNNEL_L4_UDP_KEY},
11509 		{"gre-key", RTE_ETH_INPUT_SET_TUNNEL_GRE_KEY},
11510 		{"fld-1st", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_1ST_WORD},
11511 		{"fld-2nd", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_2ND_WORD},
11512 		{"fld-3rd", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_3RD_WORD},
11513 		{"fld-4th", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_4TH_WORD},
11514 		{"fld-5th", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_5TH_WORD},
11515 		{"fld-6th", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_6TH_WORD},
11516 		{"fld-7th", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_7TH_WORD},
11517 		{"fld-8th", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_8TH_WORD},
11518 		{"none", RTE_ETH_INPUT_SET_NONE},
11519 	};
11520 
11521 	for (i = 0; i < RTE_DIM(inset_table); i++) {
11522 		if (!strcmp(string, inset_table[i].str))
11523 			return inset_table[i].inset;
11524 	}
11525 
11526 	return RTE_ETH_INPUT_SET_UNKNOWN;
11527 }
11528 
11529 /* Set flow director input set */
11530 struct cmd_set_fdir_input_set_result {
11531 	cmdline_fixed_string_t set_fdir_input_set;
11532 	portid_t port_id;
11533 	cmdline_fixed_string_t flow_type;
11534 	cmdline_fixed_string_t inset_field;
11535 	cmdline_fixed_string_t select;
11536 };
11537 
11538 static void
11539 cmd_set_fdir_input_set_parsed(void *parsed_result,
11540 	__rte_unused struct cmdline *cl,
11541 	__rte_unused void *data)
11542 {
11543 	struct cmd_set_fdir_input_set_result *res = parsed_result;
11544 	struct rte_eth_fdir_filter_info info;
11545 
11546 	memset(&info, 0, sizeof(info));
11547 	info.info_type = RTE_ETH_FDIR_FILTER_INPUT_SET_SELECT;
11548 	info.info.input_set_conf.flow_type = str2flowtype(res->flow_type);
11549 	info.info.input_set_conf.field[0] = str2inset(res->inset_field);
11550 	info.info.input_set_conf.inset_size = 1;
11551 	if (!strcmp(res->select, "select"))
11552 		info.info.input_set_conf.op = RTE_ETH_INPUT_SET_SELECT;
11553 	else if (!strcmp(res->select, "add"))
11554 		info.info.input_set_conf.op = RTE_ETH_INPUT_SET_ADD;
11555 	rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR,
11556 		RTE_ETH_FILTER_SET, &info);
11557 }
11558 
11559 cmdline_parse_token_string_t cmd_set_fdir_input_set_cmd =
11560 	TOKEN_STRING_INITIALIZER(struct cmd_set_fdir_input_set_result,
11561 	set_fdir_input_set, "set_fdir_input_set");
11562 cmdline_parse_token_num_t cmd_set_fdir_input_set_port_id =
11563 	TOKEN_NUM_INITIALIZER(struct cmd_set_fdir_input_set_result,
11564 	port_id, UINT16);
11565 cmdline_parse_token_string_t cmd_set_fdir_input_set_flow_type =
11566 	TOKEN_STRING_INITIALIZER(struct cmd_set_fdir_input_set_result,
11567 	flow_type,
11568 	"ipv4-frag#ipv4-tcp#ipv4-udp#ipv4-sctp#ipv4-other#"
11569 	"ipv6-frag#ipv6-tcp#ipv6-udp#ipv6-sctp#ipv6-other#l2_payload");
11570 cmdline_parse_token_string_t cmd_set_fdir_input_set_field =
11571 	TOKEN_STRING_INITIALIZER(struct cmd_set_fdir_input_set_result,
11572 	inset_field,
11573 	"ivlan#ethertype#src-ipv4#dst-ipv4#src-ipv6#dst-ipv6#"
11574 	"ipv4-tos#ipv4-proto#ipv4-ttl#ipv6-tc#ipv6-next-header#"
11575 	"ipv6-hop-limits#udp-src-port#udp-dst-port#"
11576 	"tcp-src-port#tcp-dst-port#sctp-src-port#sctp-dst-port#"
11577 	"sctp-veri-tag#none");
11578 cmdline_parse_token_string_t cmd_set_fdir_input_set_select =
11579 	TOKEN_STRING_INITIALIZER(struct cmd_set_fdir_input_set_result,
11580 	select, "select#add");
11581 
11582 cmdline_parse_inst_t cmd_set_fdir_input_set = {
11583 	.f = cmd_set_fdir_input_set_parsed,
11584 	.data = NULL,
11585 	.help_str = "set_fdir_input_set <port_id> "
11586 	"ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|"
11587 	"ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|l2_payload "
11588 	"ivlan|ethertype|src-ipv4|dst-ipv4|src-ipv6|dst-ipv6|"
11589 	"ipv4-tos|ipv4-proto|ipv4-ttl|ipv6-tc|ipv6-next-header|"
11590 	"ipv6-hop-limits|udp-src-port|udp-dst-port|"
11591 	"tcp-src-port|tcp-dst-port|sctp-src-port|sctp-dst-port|"
11592 	"sctp-veri-tag|none select|add",
11593 	.tokens = {
11594 		(void *)&cmd_set_fdir_input_set_cmd,
11595 		(void *)&cmd_set_fdir_input_set_port_id,
11596 		(void *)&cmd_set_fdir_input_set_flow_type,
11597 		(void *)&cmd_set_fdir_input_set_field,
11598 		(void *)&cmd_set_fdir_input_set_select,
11599 		NULL,
11600 	},
11601 };
11602 
11603 /* *** ADD/REMOVE A MULTICAST MAC ADDRESS TO/FROM A PORT *** */
11604 struct cmd_mcast_addr_result {
11605 	cmdline_fixed_string_t mcast_addr_cmd;
11606 	cmdline_fixed_string_t what;
11607 	uint16_t port_num;
11608 	struct rte_ether_addr mc_addr;
11609 };
11610 
11611 static void cmd_mcast_addr_parsed(void *parsed_result,
11612 		__rte_unused struct cmdline *cl,
11613 		__rte_unused void *data)
11614 {
11615 	struct cmd_mcast_addr_result *res = parsed_result;
11616 
11617 	if (!rte_is_multicast_ether_addr(&res->mc_addr)) {
11618 		printf("Invalid multicast addr %02X:%02X:%02X:%02X:%02X:%02X\n",
11619 		       res->mc_addr.addr_bytes[0], res->mc_addr.addr_bytes[1],
11620 		       res->mc_addr.addr_bytes[2], res->mc_addr.addr_bytes[3],
11621 		       res->mc_addr.addr_bytes[4], res->mc_addr.addr_bytes[5]);
11622 		return;
11623 	}
11624 	if (strcmp(res->what, "add") == 0)
11625 		mcast_addr_add(res->port_num, &res->mc_addr);
11626 	else
11627 		mcast_addr_remove(res->port_num, &res->mc_addr);
11628 }
11629 
11630 cmdline_parse_token_string_t cmd_mcast_addr_cmd =
11631 	TOKEN_STRING_INITIALIZER(struct cmd_mcast_addr_result,
11632 				 mcast_addr_cmd, "mcast_addr");
11633 cmdline_parse_token_string_t cmd_mcast_addr_what =
11634 	TOKEN_STRING_INITIALIZER(struct cmd_mcast_addr_result, what,
11635 				 "add#remove");
11636 cmdline_parse_token_num_t cmd_mcast_addr_portnum =
11637 	TOKEN_NUM_INITIALIZER(struct cmd_mcast_addr_result, port_num, UINT16);
11638 cmdline_parse_token_etheraddr_t cmd_mcast_addr_addr =
11639 	TOKEN_ETHERADDR_INITIALIZER(struct cmd_mac_addr_result, address);
11640 
11641 cmdline_parse_inst_t cmd_mcast_addr = {
11642 	.f = cmd_mcast_addr_parsed,
11643 	.data = (void *)0,
11644 	.help_str = "mcast_addr add|remove <port_id> <mcast_addr>: "
11645 		"Add/Remove multicast MAC address on port_id",
11646 	.tokens = {
11647 		(void *)&cmd_mcast_addr_cmd,
11648 		(void *)&cmd_mcast_addr_what,
11649 		(void *)&cmd_mcast_addr_portnum,
11650 		(void *)&cmd_mcast_addr_addr,
11651 		NULL,
11652 	},
11653 };
11654 
11655 /* l2 tunnel config
11656  * only support E-tag now.
11657  */
11658 
11659 /* Ether type config */
11660 struct cmd_config_l2_tunnel_eth_type_result {
11661 	cmdline_fixed_string_t port;
11662 	cmdline_fixed_string_t config;
11663 	cmdline_fixed_string_t all;
11664 	portid_t id;
11665 	cmdline_fixed_string_t l2_tunnel;
11666 	cmdline_fixed_string_t l2_tunnel_type;
11667 	cmdline_fixed_string_t eth_type;
11668 	uint16_t eth_type_val;
11669 };
11670 
11671 cmdline_parse_token_string_t cmd_config_l2_tunnel_eth_type_port =
11672 	TOKEN_STRING_INITIALIZER
11673 		(struct cmd_config_l2_tunnel_eth_type_result,
11674 		 port, "port");
11675 cmdline_parse_token_string_t cmd_config_l2_tunnel_eth_type_config =
11676 	TOKEN_STRING_INITIALIZER
11677 		(struct cmd_config_l2_tunnel_eth_type_result,
11678 		 config, "config");
11679 cmdline_parse_token_string_t cmd_config_l2_tunnel_eth_type_all_str =
11680 	TOKEN_STRING_INITIALIZER
11681 		(struct cmd_config_l2_tunnel_eth_type_result,
11682 		 all, "all");
11683 cmdline_parse_token_num_t cmd_config_l2_tunnel_eth_type_id =
11684 	TOKEN_NUM_INITIALIZER
11685 		(struct cmd_config_l2_tunnel_eth_type_result,
11686 		 id, UINT16);
11687 cmdline_parse_token_string_t cmd_config_l2_tunnel_eth_type_l2_tunnel =
11688 	TOKEN_STRING_INITIALIZER
11689 		(struct cmd_config_l2_tunnel_eth_type_result,
11690 		 l2_tunnel, "l2-tunnel");
11691 cmdline_parse_token_string_t cmd_config_l2_tunnel_eth_type_l2_tunnel_type =
11692 	TOKEN_STRING_INITIALIZER
11693 		(struct cmd_config_l2_tunnel_eth_type_result,
11694 		 l2_tunnel_type, "E-tag");
11695 cmdline_parse_token_string_t cmd_config_l2_tunnel_eth_type_eth_type =
11696 	TOKEN_STRING_INITIALIZER
11697 		(struct cmd_config_l2_tunnel_eth_type_result,
11698 		 eth_type, "ether-type");
11699 cmdline_parse_token_num_t cmd_config_l2_tunnel_eth_type_eth_type_val =
11700 	TOKEN_NUM_INITIALIZER
11701 		(struct cmd_config_l2_tunnel_eth_type_result,
11702 		 eth_type_val, UINT16);
11703 
11704 static enum rte_eth_tunnel_type
11705 str2fdir_l2_tunnel_type(char *string)
11706 {
11707 	uint32_t i = 0;
11708 
11709 	static const struct {
11710 		char str[32];
11711 		enum rte_eth_tunnel_type type;
11712 	} l2_tunnel_type_str[] = {
11713 		{"E-tag", RTE_L2_TUNNEL_TYPE_E_TAG},
11714 	};
11715 
11716 	for (i = 0; i < RTE_DIM(l2_tunnel_type_str); i++) {
11717 		if (!strcmp(l2_tunnel_type_str[i].str, string))
11718 			return l2_tunnel_type_str[i].type;
11719 	}
11720 	return RTE_TUNNEL_TYPE_NONE;
11721 }
11722 
11723 /* ether type config for all ports */
11724 static void
11725 cmd_config_l2_tunnel_eth_type_all_parsed
11726 	(void *parsed_result,
11727 	 __rte_unused struct cmdline *cl,
11728 	 __rte_unused void *data)
11729 {
11730 	struct cmd_config_l2_tunnel_eth_type_result *res = parsed_result;
11731 	struct rte_eth_l2_tunnel_conf entry;
11732 	portid_t pid;
11733 
11734 	entry.l2_tunnel_type = str2fdir_l2_tunnel_type(res->l2_tunnel_type);
11735 	entry.ether_type = res->eth_type_val;
11736 
11737 	RTE_ETH_FOREACH_DEV(pid) {
11738 		rte_eth_dev_l2_tunnel_eth_type_conf(pid, &entry);
11739 	}
11740 }
11741 
11742 cmdline_parse_inst_t cmd_config_l2_tunnel_eth_type_all = {
11743 	.f = cmd_config_l2_tunnel_eth_type_all_parsed,
11744 	.data = NULL,
11745 	.help_str = "port config all l2-tunnel E-tag ether-type <value>",
11746 	.tokens = {
11747 		(void *)&cmd_config_l2_tunnel_eth_type_port,
11748 		(void *)&cmd_config_l2_tunnel_eth_type_config,
11749 		(void *)&cmd_config_l2_tunnel_eth_type_all_str,
11750 		(void *)&cmd_config_l2_tunnel_eth_type_l2_tunnel,
11751 		(void *)&cmd_config_l2_tunnel_eth_type_l2_tunnel_type,
11752 		(void *)&cmd_config_l2_tunnel_eth_type_eth_type,
11753 		(void *)&cmd_config_l2_tunnel_eth_type_eth_type_val,
11754 		NULL,
11755 	},
11756 };
11757 
11758 /* ether type config for a specific port */
11759 static void
11760 cmd_config_l2_tunnel_eth_type_specific_parsed(
11761 	void *parsed_result,
11762 	__rte_unused struct cmdline *cl,
11763 	__rte_unused void *data)
11764 {
11765 	struct cmd_config_l2_tunnel_eth_type_result *res =
11766 		 parsed_result;
11767 	struct rte_eth_l2_tunnel_conf entry;
11768 
11769 	if (port_id_is_invalid(res->id, ENABLED_WARN))
11770 		return;
11771 
11772 	entry.l2_tunnel_type = str2fdir_l2_tunnel_type(res->l2_tunnel_type);
11773 	entry.ether_type = res->eth_type_val;
11774 
11775 	rte_eth_dev_l2_tunnel_eth_type_conf(res->id, &entry);
11776 }
11777 
11778 cmdline_parse_inst_t cmd_config_l2_tunnel_eth_type_specific = {
11779 	.f = cmd_config_l2_tunnel_eth_type_specific_parsed,
11780 	.data = NULL,
11781 	.help_str = "port config <port_id> l2-tunnel E-tag ether-type <value>",
11782 	.tokens = {
11783 		(void *)&cmd_config_l2_tunnel_eth_type_port,
11784 		(void *)&cmd_config_l2_tunnel_eth_type_config,
11785 		(void *)&cmd_config_l2_tunnel_eth_type_id,
11786 		(void *)&cmd_config_l2_tunnel_eth_type_l2_tunnel,
11787 		(void *)&cmd_config_l2_tunnel_eth_type_l2_tunnel_type,
11788 		(void *)&cmd_config_l2_tunnel_eth_type_eth_type,
11789 		(void *)&cmd_config_l2_tunnel_eth_type_eth_type_val,
11790 		NULL,
11791 	},
11792 };
11793 
11794 /* Enable/disable l2 tunnel */
11795 struct cmd_config_l2_tunnel_en_dis_result {
11796 	cmdline_fixed_string_t port;
11797 	cmdline_fixed_string_t config;
11798 	cmdline_fixed_string_t all;
11799 	portid_t id;
11800 	cmdline_fixed_string_t l2_tunnel;
11801 	cmdline_fixed_string_t l2_tunnel_type;
11802 	cmdline_fixed_string_t en_dis;
11803 };
11804 
11805 cmdline_parse_token_string_t cmd_config_l2_tunnel_en_dis_port =
11806 	TOKEN_STRING_INITIALIZER
11807 		(struct cmd_config_l2_tunnel_en_dis_result,
11808 		 port, "port");
11809 cmdline_parse_token_string_t cmd_config_l2_tunnel_en_dis_config =
11810 	TOKEN_STRING_INITIALIZER
11811 		(struct cmd_config_l2_tunnel_en_dis_result,
11812 		 config, "config");
11813 cmdline_parse_token_string_t cmd_config_l2_tunnel_en_dis_all_str =
11814 	TOKEN_STRING_INITIALIZER
11815 		(struct cmd_config_l2_tunnel_en_dis_result,
11816 		 all, "all");
11817 cmdline_parse_token_num_t cmd_config_l2_tunnel_en_dis_id =
11818 	TOKEN_NUM_INITIALIZER
11819 		(struct cmd_config_l2_tunnel_en_dis_result,
11820 		 id, UINT16);
11821 cmdline_parse_token_string_t cmd_config_l2_tunnel_en_dis_l2_tunnel =
11822 	TOKEN_STRING_INITIALIZER
11823 		(struct cmd_config_l2_tunnel_en_dis_result,
11824 		 l2_tunnel, "l2-tunnel");
11825 cmdline_parse_token_string_t cmd_config_l2_tunnel_en_dis_l2_tunnel_type =
11826 	TOKEN_STRING_INITIALIZER
11827 		(struct cmd_config_l2_tunnel_en_dis_result,
11828 		 l2_tunnel_type, "E-tag");
11829 cmdline_parse_token_string_t cmd_config_l2_tunnel_en_dis_en_dis =
11830 	TOKEN_STRING_INITIALIZER
11831 		(struct cmd_config_l2_tunnel_en_dis_result,
11832 		 en_dis, "enable#disable");
11833 
11834 /* enable/disable l2 tunnel for all ports */
11835 static void
11836 cmd_config_l2_tunnel_en_dis_all_parsed(
11837 	void *parsed_result,
11838 	__rte_unused struct cmdline *cl,
11839 	__rte_unused void *data)
11840 {
11841 	struct cmd_config_l2_tunnel_en_dis_result *res = parsed_result;
11842 	struct rte_eth_l2_tunnel_conf entry;
11843 	portid_t pid;
11844 	uint8_t en;
11845 
11846 	entry.l2_tunnel_type = str2fdir_l2_tunnel_type(res->l2_tunnel_type);
11847 
11848 	if (!strcmp("enable", res->en_dis))
11849 		en = 1;
11850 	else
11851 		en = 0;
11852 
11853 	RTE_ETH_FOREACH_DEV(pid) {
11854 		rte_eth_dev_l2_tunnel_offload_set(pid,
11855 						  &entry,
11856 						  ETH_L2_TUNNEL_ENABLE_MASK,
11857 						  en);
11858 	}
11859 }
11860 
11861 cmdline_parse_inst_t cmd_config_l2_tunnel_en_dis_all = {
11862 	.f = cmd_config_l2_tunnel_en_dis_all_parsed,
11863 	.data = NULL,
11864 	.help_str = "port config all l2-tunnel E-tag enable|disable",
11865 	.tokens = {
11866 		(void *)&cmd_config_l2_tunnel_en_dis_port,
11867 		(void *)&cmd_config_l2_tunnel_en_dis_config,
11868 		(void *)&cmd_config_l2_tunnel_en_dis_all_str,
11869 		(void *)&cmd_config_l2_tunnel_en_dis_l2_tunnel,
11870 		(void *)&cmd_config_l2_tunnel_en_dis_l2_tunnel_type,
11871 		(void *)&cmd_config_l2_tunnel_en_dis_en_dis,
11872 		NULL,
11873 	},
11874 };
11875 
11876 /* enable/disable l2 tunnel for a port */
11877 static void
11878 cmd_config_l2_tunnel_en_dis_specific_parsed(
11879 	void *parsed_result,
11880 	__rte_unused struct cmdline *cl,
11881 	__rte_unused void *data)
11882 {
11883 	struct cmd_config_l2_tunnel_en_dis_result *res =
11884 		parsed_result;
11885 	struct rte_eth_l2_tunnel_conf entry;
11886 
11887 	if (port_id_is_invalid(res->id, ENABLED_WARN))
11888 		return;
11889 
11890 	entry.l2_tunnel_type = str2fdir_l2_tunnel_type(res->l2_tunnel_type);
11891 
11892 	if (!strcmp("enable", res->en_dis))
11893 		rte_eth_dev_l2_tunnel_offload_set(res->id,
11894 						  &entry,
11895 						  ETH_L2_TUNNEL_ENABLE_MASK,
11896 						  1);
11897 	else
11898 		rte_eth_dev_l2_tunnel_offload_set(res->id,
11899 						  &entry,
11900 						  ETH_L2_TUNNEL_ENABLE_MASK,
11901 						  0);
11902 }
11903 
11904 cmdline_parse_inst_t cmd_config_l2_tunnel_en_dis_specific = {
11905 	.f = cmd_config_l2_tunnel_en_dis_specific_parsed,
11906 	.data = NULL,
11907 	.help_str = "port config <port_id> l2-tunnel E-tag enable|disable",
11908 	.tokens = {
11909 		(void *)&cmd_config_l2_tunnel_en_dis_port,
11910 		(void *)&cmd_config_l2_tunnel_en_dis_config,
11911 		(void *)&cmd_config_l2_tunnel_en_dis_id,
11912 		(void *)&cmd_config_l2_tunnel_en_dis_l2_tunnel,
11913 		(void *)&cmd_config_l2_tunnel_en_dis_l2_tunnel_type,
11914 		(void *)&cmd_config_l2_tunnel_en_dis_en_dis,
11915 		NULL,
11916 	},
11917 };
11918 
11919 /* E-tag configuration */
11920 
11921 /* Common result structure for all E-tag configuration */
11922 struct cmd_config_e_tag_result {
11923 	cmdline_fixed_string_t e_tag;
11924 	cmdline_fixed_string_t set;
11925 	cmdline_fixed_string_t insertion;
11926 	cmdline_fixed_string_t stripping;
11927 	cmdline_fixed_string_t forwarding;
11928 	cmdline_fixed_string_t filter;
11929 	cmdline_fixed_string_t add;
11930 	cmdline_fixed_string_t del;
11931 	cmdline_fixed_string_t on;
11932 	cmdline_fixed_string_t off;
11933 	cmdline_fixed_string_t on_off;
11934 	cmdline_fixed_string_t port_tag_id;
11935 	uint32_t port_tag_id_val;
11936 	cmdline_fixed_string_t e_tag_id;
11937 	uint16_t e_tag_id_val;
11938 	cmdline_fixed_string_t dst_pool;
11939 	uint8_t dst_pool_val;
11940 	cmdline_fixed_string_t port;
11941 	portid_t port_id;
11942 	cmdline_fixed_string_t vf;
11943 	uint8_t vf_id;
11944 };
11945 
11946 /* Common CLI fields for all E-tag configuration */
11947 cmdline_parse_token_string_t cmd_config_e_tag_e_tag =
11948 	TOKEN_STRING_INITIALIZER
11949 		(struct cmd_config_e_tag_result,
11950 		 e_tag, "E-tag");
11951 cmdline_parse_token_string_t cmd_config_e_tag_set =
11952 	TOKEN_STRING_INITIALIZER
11953 		(struct cmd_config_e_tag_result,
11954 		 set, "set");
11955 cmdline_parse_token_string_t cmd_config_e_tag_insertion =
11956 	TOKEN_STRING_INITIALIZER
11957 		(struct cmd_config_e_tag_result,
11958 		 insertion, "insertion");
11959 cmdline_parse_token_string_t cmd_config_e_tag_stripping =
11960 	TOKEN_STRING_INITIALIZER
11961 		(struct cmd_config_e_tag_result,
11962 		 stripping, "stripping");
11963 cmdline_parse_token_string_t cmd_config_e_tag_forwarding =
11964 	TOKEN_STRING_INITIALIZER
11965 		(struct cmd_config_e_tag_result,
11966 		 forwarding, "forwarding");
11967 cmdline_parse_token_string_t cmd_config_e_tag_filter =
11968 	TOKEN_STRING_INITIALIZER
11969 		(struct cmd_config_e_tag_result,
11970 		 filter, "filter");
11971 cmdline_parse_token_string_t cmd_config_e_tag_add =
11972 	TOKEN_STRING_INITIALIZER
11973 		(struct cmd_config_e_tag_result,
11974 		 add, "add");
11975 cmdline_parse_token_string_t cmd_config_e_tag_del =
11976 	TOKEN_STRING_INITIALIZER
11977 		(struct cmd_config_e_tag_result,
11978 		 del, "del");
11979 cmdline_parse_token_string_t cmd_config_e_tag_on =
11980 	TOKEN_STRING_INITIALIZER
11981 		(struct cmd_config_e_tag_result,
11982 		 on, "on");
11983 cmdline_parse_token_string_t cmd_config_e_tag_off =
11984 	TOKEN_STRING_INITIALIZER
11985 		(struct cmd_config_e_tag_result,
11986 		 off, "off");
11987 cmdline_parse_token_string_t cmd_config_e_tag_on_off =
11988 	TOKEN_STRING_INITIALIZER
11989 		(struct cmd_config_e_tag_result,
11990 		 on_off, "on#off");
11991 cmdline_parse_token_string_t cmd_config_e_tag_port_tag_id =
11992 	TOKEN_STRING_INITIALIZER
11993 		(struct cmd_config_e_tag_result,
11994 		 port_tag_id, "port-tag-id");
11995 cmdline_parse_token_num_t cmd_config_e_tag_port_tag_id_val =
11996 	TOKEN_NUM_INITIALIZER
11997 		(struct cmd_config_e_tag_result,
11998 		 port_tag_id_val, UINT32);
11999 cmdline_parse_token_string_t cmd_config_e_tag_e_tag_id =
12000 	TOKEN_STRING_INITIALIZER
12001 		(struct cmd_config_e_tag_result,
12002 		 e_tag_id, "e-tag-id");
12003 cmdline_parse_token_num_t cmd_config_e_tag_e_tag_id_val =
12004 	TOKEN_NUM_INITIALIZER
12005 		(struct cmd_config_e_tag_result,
12006 		 e_tag_id_val, UINT16);
12007 cmdline_parse_token_string_t cmd_config_e_tag_dst_pool =
12008 	TOKEN_STRING_INITIALIZER
12009 		(struct cmd_config_e_tag_result,
12010 		 dst_pool, "dst-pool");
12011 cmdline_parse_token_num_t cmd_config_e_tag_dst_pool_val =
12012 	TOKEN_NUM_INITIALIZER
12013 		(struct cmd_config_e_tag_result,
12014 		 dst_pool_val, UINT8);
12015 cmdline_parse_token_string_t cmd_config_e_tag_port =
12016 	TOKEN_STRING_INITIALIZER
12017 		(struct cmd_config_e_tag_result,
12018 		 port, "port");
12019 cmdline_parse_token_num_t cmd_config_e_tag_port_id =
12020 	TOKEN_NUM_INITIALIZER
12021 		(struct cmd_config_e_tag_result,
12022 		 port_id, UINT16);
12023 cmdline_parse_token_string_t cmd_config_e_tag_vf =
12024 	TOKEN_STRING_INITIALIZER
12025 		(struct cmd_config_e_tag_result,
12026 		 vf, "vf");
12027 cmdline_parse_token_num_t cmd_config_e_tag_vf_id =
12028 	TOKEN_NUM_INITIALIZER
12029 		(struct cmd_config_e_tag_result,
12030 		 vf_id, UINT8);
12031 
12032 /* E-tag insertion configuration */
12033 static void
12034 cmd_config_e_tag_insertion_en_parsed(
12035 	void *parsed_result,
12036 	__rte_unused struct cmdline *cl,
12037 	__rte_unused void *data)
12038 {
12039 	struct cmd_config_e_tag_result *res =
12040 		parsed_result;
12041 	struct rte_eth_l2_tunnel_conf entry;
12042 
12043 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
12044 		return;
12045 
12046 	entry.l2_tunnel_type = RTE_L2_TUNNEL_TYPE_E_TAG;
12047 	entry.tunnel_id = res->port_tag_id_val;
12048 	entry.vf_id = res->vf_id;
12049 	rte_eth_dev_l2_tunnel_offload_set(res->port_id,
12050 					  &entry,
12051 					  ETH_L2_TUNNEL_INSERTION_MASK,
12052 					  1);
12053 }
12054 
12055 static void
12056 cmd_config_e_tag_insertion_dis_parsed(
12057 	void *parsed_result,
12058 	__rte_unused struct cmdline *cl,
12059 	__rte_unused void *data)
12060 {
12061 	struct cmd_config_e_tag_result *res =
12062 		parsed_result;
12063 	struct rte_eth_l2_tunnel_conf entry;
12064 
12065 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
12066 		return;
12067 
12068 	entry.l2_tunnel_type = RTE_L2_TUNNEL_TYPE_E_TAG;
12069 	entry.vf_id = res->vf_id;
12070 
12071 	rte_eth_dev_l2_tunnel_offload_set(res->port_id,
12072 					  &entry,
12073 					  ETH_L2_TUNNEL_INSERTION_MASK,
12074 					  0);
12075 }
12076 
12077 cmdline_parse_inst_t cmd_config_e_tag_insertion_en = {
12078 	.f = cmd_config_e_tag_insertion_en_parsed,
12079 	.data = NULL,
12080 	.help_str = "E-tag ... : E-tag insertion enable",
12081 	.tokens = {
12082 		(void *)&cmd_config_e_tag_e_tag,
12083 		(void *)&cmd_config_e_tag_set,
12084 		(void *)&cmd_config_e_tag_insertion,
12085 		(void *)&cmd_config_e_tag_on,
12086 		(void *)&cmd_config_e_tag_port_tag_id,
12087 		(void *)&cmd_config_e_tag_port_tag_id_val,
12088 		(void *)&cmd_config_e_tag_port,
12089 		(void *)&cmd_config_e_tag_port_id,
12090 		(void *)&cmd_config_e_tag_vf,
12091 		(void *)&cmd_config_e_tag_vf_id,
12092 		NULL,
12093 	},
12094 };
12095 
12096 cmdline_parse_inst_t cmd_config_e_tag_insertion_dis = {
12097 	.f = cmd_config_e_tag_insertion_dis_parsed,
12098 	.data = NULL,
12099 	.help_str = "E-tag ... : E-tag insertion disable",
12100 	.tokens = {
12101 		(void *)&cmd_config_e_tag_e_tag,
12102 		(void *)&cmd_config_e_tag_set,
12103 		(void *)&cmd_config_e_tag_insertion,
12104 		(void *)&cmd_config_e_tag_off,
12105 		(void *)&cmd_config_e_tag_port,
12106 		(void *)&cmd_config_e_tag_port_id,
12107 		(void *)&cmd_config_e_tag_vf,
12108 		(void *)&cmd_config_e_tag_vf_id,
12109 		NULL,
12110 	},
12111 };
12112 
12113 /* E-tag stripping configuration */
12114 static void
12115 cmd_config_e_tag_stripping_parsed(
12116 	void *parsed_result,
12117 	__rte_unused struct cmdline *cl,
12118 	__rte_unused void *data)
12119 {
12120 	struct cmd_config_e_tag_result *res =
12121 		parsed_result;
12122 	struct rte_eth_l2_tunnel_conf entry;
12123 
12124 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
12125 		return;
12126 
12127 	entry.l2_tunnel_type = RTE_L2_TUNNEL_TYPE_E_TAG;
12128 
12129 	if (!strcmp(res->on_off, "on"))
12130 		rte_eth_dev_l2_tunnel_offload_set
12131 			(res->port_id,
12132 			 &entry,
12133 			 ETH_L2_TUNNEL_STRIPPING_MASK,
12134 			 1);
12135 	else
12136 		rte_eth_dev_l2_tunnel_offload_set
12137 			(res->port_id,
12138 			 &entry,
12139 			 ETH_L2_TUNNEL_STRIPPING_MASK,
12140 			 0);
12141 }
12142 
12143 cmdline_parse_inst_t cmd_config_e_tag_stripping_en_dis = {
12144 	.f = cmd_config_e_tag_stripping_parsed,
12145 	.data = NULL,
12146 	.help_str = "E-tag ... : E-tag stripping enable/disable",
12147 	.tokens = {
12148 		(void *)&cmd_config_e_tag_e_tag,
12149 		(void *)&cmd_config_e_tag_set,
12150 		(void *)&cmd_config_e_tag_stripping,
12151 		(void *)&cmd_config_e_tag_on_off,
12152 		(void *)&cmd_config_e_tag_port,
12153 		(void *)&cmd_config_e_tag_port_id,
12154 		NULL,
12155 	},
12156 };
12157 
12158 /* E-tag forwarding configuration */
12159 static void
12160 cmd_config_e_tag_forwarding_parsed(
12161 	void *parsed_result,
12162 	__rte_unused struct cmdline *cl,
12163 	__rte_unused void *data)
12164 {
12165 	struct cmd_config_e_tag_result *res = parsed_result;
12166 	struct rte_eth_l2_tunnel_conf entry;
12167 
12168 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
12169 		return;
12170 
12171 	entry.l2_tunnel_type = RTE_L2_TUNNEL_TYPE_E_TAG;
12172 
12173 	if (!strcmp(res->on_off, "on"))
12174 		rte_eth_dev_l2_tunnel_offload_set
12175 			(res->port_id,
12176 			 &entry,
12177 			 ETH_L2_TUNNEL_FORWARDING_MASK,
12178 			 1);
12179 	else
12180 		rte_eth_dev_l2_tunnel_offload_set
12181 			(res->port_id,
12182 			 &entry,
12183 			 ETH_L2_TUNNEL_FORWARDING_MASK,
12184 			 0);
12185 }
12186 
12187 cmdline_parse_inst_t cmd_config_e_tag_forwarding_en_dis = {
12188 	.f = cmd_config_e_tag_forwarding_parsed,
12189 	.data = NULL,
12190 	.help_str = "E-tag ... : E-tag forwarding enable/disable",
12191 	.tokens = {
12192 		(void *)&cmd_config_e_tag_e_tag,
12193 		(void *)&cmd_config_e_tag_set,
12194 		(void *)&cmd_config_e_tag_forwarding,
12195 		(void *)&cmd_config_e_tag_on_off,
12196 		(void *)&cmd_config_e_tag_port,
12197 		(void *)&cmd_config_e_tag_port_id,
12198 		NULL,
12199 	},
12200 };
12201 
12202 /* E-tag filter configuration */
12203 static void
12204 cmd_config_e_tag_filter_add_parsed(
12205 	void *parsed_result,
12206 	__rte_unused struct cmdline *cl,
12207 	__rte_unused void *data)
12208 {
12209 	struct cmd_config_e_tag_result *res = parsed_result;
12210 	struct rte_eth_l2_tunnel_conf entry;
12211 	int ret = 0;
12212 
12213 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
12214 		return;
12215 
12216 	if (res->e_tag_id_val > 0x3fff) {
12217 		printf("e-tag-id must be equal or less than 0x3fff.\n");
12218 		return;
12219 	}
12220 
12221 	ret = rte_eth_dev_filter_supported(res->port_id,
12222 					   RTE_ETH_FILTER_L2_TUNNEL);
12223 	if (ret < 0) {
12224 		printf("E-tag filter is not supported on port %u.\n",
12225 		       res->port_id);
12226 		return;
12227 	}
12228 
12229 	entry.l2_tunnel_type = RTE_L2_TUNNEL_TYPE_E_TAG;
12230 	entry.tunnel_id = res->e_tag_id_val;
12231 	entry.pool = res->dst_pool_val;
12232 
12233 	ret = rte_eth_dev_filter_ctrl(res->port_id,
12234 				      RTE_ETH_FILTER_L2_TUNNEL,
12235 				      RTE_ETH_FILTER_ADD,
12236 				      &entry);
12237 	if (ret < 0)
12238 		printf("E-tag filter programming error: (%s)\n",
12239 		       strerror(-ret));
12240 }
12241 
12242 cmdline_parse_inst_t cmd_config_e_tag_filter_add = {
12243 	.f = cmd_config_e_tag_filter_add_parsed,
12244 	.data = NULL,
12245 	.help_str = "E-tag ... : E-tag filter add",
12246 	.tokens = {
12247 		(void *)&cmd_config_e_tag_e_tag,
12248 		(void *)&cmd_config_e_tag_set,
12249 		(void *)&cmd_config_e_tag_filter,
12250 		(void *)&cmd_config_e_tag_add,
12251 		(void *)&cmd_config_e_tag_e_tag_id,
12252 		(void *)&cmd_config_e_tag_e_tag_id_val,
12253 		(void *)&cmd_config_e_tag_dst_pool,
12254 		(void *)&cmd_config_e_tag_dst_pool_val,
12255 		(void *)&cmd_config_e_tag_port,
12256 		(void *)&cmd_config_e_tag_port_id,
12257 		NULL,
12258 	},
12259 };
12260 
12261 static void
12262 cmd_config_e_tag_filter_del_parsed(
12263 	void *parsed_result,
12264 	__rte_unused struct cmdline *cl,
12265 	__rte_unused void *data)
12266 {
12267 	struct cmd_config_e_tag_result *res = parsed_result;
12268 	struct rte_eth_l2_tunnel_conf entry;
12269 	int ret = 0;
12270 
12271 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
12272 		return;
12273 
12274 	if (res->e_tag_id_val > 0x3fff) {
12275 		printf("e-tag-id must be less than 0x3fff.\n");
12276 		return;
12277 	}
12278 
12279 	ret = rte_eth_dev_filter_supported(res->port_id,
12280 					   RTE_ETH_FILTER_L2_TUNNEL);
12281 	if (ret < 0) {
12282 		printf("E-tag filter is not supported on port %u.\n",
12283 		       res->port_id);
12284 		return;
12285 	}
12286 
12287 	entry.l2_tunnel_type = RTE_L2_TUNNEL_TYPE_E_TAG;
12288 	entry.tunnel_id = res->e_tag_id_val;
12289 
12290 	ret = rte_eth_dev_filter_ctrl(res->port_id,
12291 				      RTE_ETH_FILTER_L2_TUNNEL,
12292 				      RTE_ETH_FILTER_DELETE,
12293 				      &entry);
12294 	if (ret < 0)
12295 		printf("E-tag filter programming error: (%s)\n",
12296 		       strerror(-ret));
12297 }
12298 
12299 cmdline_parse_inst_t cmd_config_e_tag_filter_del = {
12300 	.f = cmd_config_e_tag_filter_del_parsed,
12301 	.data = NULL,
12302 	.help_str = "E-tag ... : E-tag filter delete",
12303 	.tokens = {
12304 		(void *)&cmd_config_e_tag_e_tag,
12305 		(void *)&cmd_config_e_tag_set,
12306 		(void *)&cmd_config_e_tag_filter,
12307 		(void *)&cmd_config_e_tag_del,
12308 		(void *)&cmd_config_e_tag_e_tag_id,
12309 		(void *)&cmd_config_e_tag_e_tag_id_val,
12310 		(void *)&cmd_config_e_tag_port,
12311 		(void *)&cmd_config_e_tag_port_id,
12312 		NULL,
12313 	},
12314 };
12315 
12316 /* vf vlan anti spoof configuration */
12317 
12318 /* Common result structure for vf vlan anti spoof */
12319 struct cmd_vf_vlan_anti_spoof_result {
12320 	cmdline_fixed_string_t set;
12321 	cmdline_fixed_string_t vf;
12322 	cmdline_fixed_string_t vlan;
12323 	cmdline_fixed_string_t antispoof;
12324 	portid_t port_id;
12325 	uint32_t vf_id;
12326 	cmdline_fixed_string_t on_off;
12327 };
12328 
12329 /* Common CLI fields for vf vlan anti spoof enable disable */
12330 cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_set =
12331 	TOKEN_STRING_INITIALIZER
12332 		(struct cmd_vf_vlan_anti_spoof_result,
12333 		 set, "set");
12334 cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_vf =
12335 	TOKEN_STRING_INITIALIZER
12336 		(struct cmd_vf_vlan_anti_spoof_result,
12337 		 vf, "vf");
12338 cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_vlan =
12339 	TOKEN_STRING_INITIALIZER
12340 		(struct cmd_vf_vlan_anti_spoof_result,
12341 		 vlan, "vlan");
12342 cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_antispoof =
12343 	TOKEN_STRING_INITIALIZER
12344 		(struct cmd_vf_vlan_anti_spoof_result,
12345 		 antispoof, "antispoof");
12346 cmdline_parse_token_num_t cmd_vf_vlan_anti_spoof_port_id =
12347 	TOKEN_NUM_INITIALIZER
12348 		(struct cmd_vf_vlan_anti_spoof_result,
12349 		 port_id, UINT16);
12350 cmdline_parse_token_num_t cmd_vf_vlan_anti_spoof_vf_id =
12351 	TOKEN_NUM_INITIALIZER
12352 		(struct cmd_vf_vlan_anti_spoof_result,
12353 		 vf_id, UINT32);
12354 cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_on_off =
12355 	TOKEN_STRING_INITIALIZER
12356 		(struct cmd_vf_vlan_anti_spoof_result,
12357 		 on_off, "on#off");
12358 
12359 static void
12360 cmd_set_vf_vlan_anti_spoof_parsed(
12361 	void *parsed_result,
12362 	__rte_unused struct cmdline *cl,
12363 	__rte_unused void *data)
12364 {
12365 	struct cmd_vf_vlan_anti_spoof_result *res = parsed_result;
12366 	int ret = -ENOTSUP;
12367 
12368 	__rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
12369 
12370 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
12371 		return;
12372 
12373 #ifdef RTE_NET_IXGBE
12374 	if (ret == -ENOTSUP)
12375 		ret = rte_pmd_ixgbe_set_vf_vlan_anti_spoof(res->port_id,
12376 				res->vf_id, is_on);
12377 #endif
12378 #ifdef RTE_NET_I40E
12379 	if (ret == -ENOTSUP)
12380 		ret = rte_pmd_i40e_set_vf_vlan_anti_spoof(res->port_id,
12381 				res->vf_id, is_on);
12382 #endif
12383 #ifdef RTE_NET_BNXT
12384 	if (ret == -ENOTSUP)
12385 		ret = rte_pmd_bnxt_set_vf_vlan_anti_spoof(res->port_id,
12386 				res->vf_id, is_on);
12387 #endif
12388 
12389 	switch (ret) {
12390 	case 0:
12391 		break;
12392 	case -EINVAL:
12393 		printf("invalid vf_id %d\n", res->vf_id);
12394 		break;
12395 	case -ENODEV:
12396 		printf("invalid port_id %d\n", res->port_id);
12397 		break;
12398 	case -ENOTSUP:
12399 		printf("function not implemented\n");
12400 		break;
12401 	default:
12402 		printf("programming error: (%s)\n", strerror(-ret));
12403 	}
12404 }
12405 
12406 cmdline_parse_inst_t cmd_set_vf_vlan_anti_spoof = {
12407 	.f = cmd_set_vf_vlan_anti_spoof_parsed,
12408 	.data = NULL,
12409 	.help_str = "set vf vlan antispoof <port_id> <vf_id> on|off",
12410 	.tokens = {
12411 		(void *)&cmd_vf_vlan_anti_spoof_set,
12412 		(void *)&cmd_vf_vlan_anti_spoof_vf,
12413 		(void *)&cmd_vf_vlan_anti_spoof_vlan,
12414 		(void *)&cmd_vf_vlan_anti_spoof_antispoof,
12415 		(void *)&cmd_vf_vlan_anti_spoof_port_id,
12416 		(void *)&cmd_vf_vlan_anti_spoof_vf_id,
12417 		(void *)&cmd_vf_vlan_anti_spoof_on_off,
12418 		NULL,
12419 	},
12420 };
12421 
12422 /* vf mac anti spoof configuration */
12423 
12424 /* Common result structure for vf mac anti spoof */
12425 struct cmd_vf_mac_anti_spoof_result {
12426 	cmdline_fixed_string_t set;
12427 	cmdline_fixed_string_t vf;
12428 	cmdline_fixed_string_t mac;
12429 	cmdline_fixed_string_t antispoof;
12430 	portid_t port_id;
12431 	uint32_t vf_id;
12432 	cmdline_fixed_string_t on_off;
12433 };
12434 
12435 /* Common CLI fields for vf mac anti spoof enable disable */
12436 cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_set =
12437 	TOKEN_STRING_INITIALIZER
12438 		(struct cmd_vf_mac_anti_spoof_result,
12439 		 set, "set");
12440 cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_vf =
12441 	TOKEN_STRING_INITIALIZER
12442 		(struct cmd_vf_mac_anti_spoof_result,
12443 		 vf, "vf");
12444 cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_mac =
12445 	TOKEN_STRING_INITIALIZER
12446 		(struct cmd_vf_mac_anti_spoof_result,
12447 		 mac, "mac");
12448 cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_antispoof =
12449 	TOKEN_STRING_INITIALIZER
12450 		(struct cmd_vf_mac_anti_spoof_result,
12451 		 antispoof, "antispoof");
12452 cmdline_parse_token_num_t cmd_vf_mac_anti_spoof_port_id =
12453 	TOKEN_NUM_INITIALIZER
12454 		(struct cmd_vf_mac_anti_spoof_result,
12455 		 port_id, UINT16);
12456 cmdline_parse_token_num_t cmd_vf_mac_anti_spoof_vf_id =
12457 	TOKEN_NUM_INITIALIZER
12458 		(struct cmd_vf_mac_anti_spoof_result,
12459 		 vf_id, UINT32);
12460 cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_on_off =
12461 	TOKEN_STRING_INITIALIZER
12462 		(struct cmd_vf_mac_anti_spoof_result,
12463 		 on_off, "on#off");
12464 
12465 static void
12466 cmd_set_vf_mac_anti_spoof_parsed(
12467 	void *parsed_result,
12468 	__rte_unused struct cmdline *cl,
12469 	__rte_unused void *data)
12470 {
12471 	struct cmd_vf_mac_anti_spoof_result *res = parsed_result;
12472 	int ret = -ENOTSUP;
12473 
12474 	__rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
12475 
12476 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
12477 		return;
12478 
12479 #ifdef RTE_NET_IXGBE
12480 	if (ret == -ENOTSUP)
12481 		ret = rte_pmd_ixgbe_set_vf_mac_anti_spoof(res->port_id,
12482 			res->vf_id, is_on);
12483 #endif
12484 #ifdef RTE_NET_I40E
12485 	if (ret == -ENOTSUP)
12486 		ret = rte_pmd_i40e_set_vf_mac_anti_spoof(res->port_id,
12487 			res->vf_id, is_on);
12488 #endif
12489 #ifdef RTE_NET_BNXT
12490 	if (ret == -ENOTSUP)
12491 		ret = rte_pmd_bnxt_set_vf_mac_anti_spoof(res->port_id,
12492 			res->vf_id, is_on);
12493 #endif
12494 
12495 	switch (ret) {
12496 	case 0:
12497 		break;
12498 	case -EINVAL:
12499 		printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on);
12500 		break;
12501 	case -ENODEV:
12502 		printf("invalid port_id %d\n", res->port_id);
12503 		break;
12504 	case -ENOTSUP:
12505 		printf("function not implemented\n");
12506 		break;
12507 	default:
12508 		printf("programming error: (%s)\n", strerror(-ret));
12509 	}
12510 }
12511 
12512 cmdline_parse_inst_t cmd_set_vf_mac_anti_spoof = {
12513 	.f = cmd_set_vf_mac_anti_spoof_parsed,
12514 	.data = NULL,
12515 	.help_str = "set vf mac antispoof <port_id> <vf_id> on|off",
12516 	.tokens = {
12517 		(void *)&cmd_vf_mac_anti_spoof_set,
12518 		(void *)&cmd_vf_mac_anti_spoof_vf,
12519 		(void *)&cmd_vf_mac_anti_spoof_mac,
12520 		(void *)&cmd_vf_mac_anti_spoof_antispoof,
12521 		(void *)&cmd_vf_mac_anti_spoof_port_id,
12522 		(void *)&cmd_vf_mac_anti_spoof_vf_id,
12523 		(void *)&cmd_vf_mac_anti_spoof_on_off,
12524 		NULL,
12525 	},
12526 };
12527 
12528 /* vf vlan strip queue configuration */
12529 
12530 /* Common result structure for vf mac anti spoof */
12531 struct cmd_vf_vlan_stripq_result {
12532 	cmdline_fixed_string_t set;
12533 	cmdline_fixed_string_t vf;
12534 	cmdline_fixed_string_t vlan;
12535 	cmdline_fixed_string_t stripq;
12536 	portid_t port_id;
12537 	uint16_t vf_id;
12538 	cmdline_fixed_string_t on_off;
12539 };
12540 
12541 /* Common CLI fields for vf vlan strip enable disable */
12542 cmdline_parse_token_string_t cmd_vf_vlan_stripq_set =
12543 	TOKEN_STRING_INITIALIZER
12544 		(struct cmd_vf_vlan_stripq_result,
12545 		 set, "set");
12546 cmdline_parse_token_string_t cmd_vf_vlan_stripq_vf =
12547 	TOKEN_STRING_INITIALIZER
12548 		(struct cmd_vf_vlan_stripq_result,
12549 		 vf, "vf");
12550 cmdline_parse_token_string_t cmd_vf_vlan_stripq_vlan =
12551 	TOKEN_STRING_INITIALIZER
12552 		(struct cmd_vf_vlan_stripq_result,
12553 		 vlan, "vlan");
12554 cmdline_parse_token_string_t cmd_vf_vlan_stripq_stripq =
12555 	TOKEN_STRING_INITIALIZER
12556 		(struct cmd_vf_vlan_stripq_result,
12557 		 stripq, "stripq");
12558 cmdline_parse_token_num_t cmd_vf_vlan_stripq_port_id =
12559 	TOKEN_NUM_INITIALIZER
12560 		(struct cmd_vf_vlan_stripq_result,
12561 		 port_id, UINT16);
12562 cmdline_parse_token_num_t cmd_vf_vlan_stripq_vf_id =
12563 	TOKEN_NUM_INITIALIZER
12564 		(struct cmd_vf_vlan_stripq_result,
12565 		 vf_id, UINT16);
12566 cmdline_parse_token_string_t cmd_vf_vlan_stripq_on_off =
12567 	TOKEN_STRING_INITIALIZER
12568 		(struct cmd_vf_vlan_stripq_result,
12569 		 on_off, "on#off");
12570 
12571 static void
12572 cmd_set_vf_vlan_stripq_parsed(
12573 	void *parsed_result,
12574 	__rte_unused struct cmdline *cl,
12575 	__rte_unused void *data)
12576 {
12577 	struct cmd_vf_vlan_stripq_result *res = parsed_result;
12578 	int ret = -ENOTSUP;
12579 
12580 	__rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
12581 
12582 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
12583 		return;
12584 
12585 #ifdef RTE_NET_IXGBE
12586 	if (ret == -ENOTSUP)
12587 		ret = rte_pmd_ixgbe_set_vf_vlan_stripq(res->port_id,
12588 			res->vf_id, is_on);
12589 #endif
12590 #ifdef RTE_NET_I40E
12591 	if (ret == -ENOTSUP)
12592 		ret = rte_pmd_i40e_set_vf_vlan_stripq(res->port_id,
12593 			res->vf_id, is_on);
12594 #endif
12595 #ifdef RTE_NET_BNXT
12596 	if (ret == -ENOTSUP)
12597 		ret = rte_pmd_bnxt_set_vf_vlan_stripq(res->port_id,
12598 			res->vf_id, is_on);
12599 #endif
12600 
12601 	switch (ret) {
12602 	case 0:
12603 		break;
12604 	case -EINVAL:
12605 		printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on);
12606 		break;
12607 	case -ENODEV:
12608 		printf("invalid port_id %d\n", res->port_id);
12609 		break;
12610 	case -ENOTSUP:
12611 		printf("function not implemented\n");
12612 		break;
12613 	default:
12614 		printf("programming error: (%s)\n", strerror(-ret));
12615 	}
12616 }
12617 
12618 cmdline_parse_inst_t cmd_set_vf_vlan_stripq = {
12619 	.f = cmd_set_vf_vlan_stripq_parsed,
12620 	.data = NULL,
12621 	.help_str = "set vf vlan stripq <port_id> <vf_id> on|off",
12622 	.tokens = {
12623 		(void *)&cmd_vf_vlan_stripq_set,
12624 		(void *)&cmd_vf_vlan_stripq_vf,
12625 		(void *)&cmd_vf_vlan_stripq_vlan,
12626 		(void *)&cmd_vf_vlan_stripq_stripq,
12627 		(void *)&cmd_vf_vlan_stripq_port_id,
12628 		(void *)&cmd_vf_vlan_stripq_vf_id,
12629 		(void *)&cmd_vf_vlan_stripq_on_off,
12630 		NULL,
12631 	},
12632 };
12633 
12634 /* vf vlan insert configuration */
12635 
12636 /* Common result structure for vf vlan insert */
12637 struct cmd_vf_vlan_insert_result {
12638 	cmdline_fixed_string_t set;
12639 	cmdline_fixed_string_t vf;
12640 	cmdline_fixed_string_t vlan;
12641 	cmdline_fixed_string_t insert;
12642 	portid_t port_id;
12643 	uint16_t vf_id;
12644 	uint16_t vlan_id;
12645 };
12646 
12647 /* Common CLI fields for vf vlan insert enable disable */
12648 cmdline_parse_token_string_t cmd_vf_vlan_insert_set =
12649 	TOKEN_STRING_INITIALIZER
12650 		(struct cmd_vf_vlan_insert_result,
12651 		 set, "set");
12652 cmdline_parse_token_string_t cmd_vf_vlan_insert_vf =
12653 	TOKEN_STRING_INITIALIZER
12654 		(struct cmd_vf_vlan_insert_result,
12655 		 vf, "vf");
12656 cmdline_parse_token_string_t cmd_vf_vlan_insert_vlan =
12657 	TOKEN_STRING_INITIALIZER
12658 		(struct cmd_vf_vlan_insert_result,
12659 		 vlan, "vlan");
12660 cmdline_parse_token_string_t cmd_vf_vlan_insert_insert =
12661 	TOKEN_STRING_INITIALIZER
12662 		(struct cmd_vf_vlan_insert_result,
12663 		 insert, "insert");
12664 cmdline_parse_token_num_t cmd_vf_vlan_insert_port_id =
12665 	TOKEN_NUM_INITIALIZER
12666 		(struct cmd_vf_vlan_insert_result,
12667 		 port_id, UINT16);
12668 cmdline_parse_token_num_t cmd_vf_vlan_insert_vf_id =
12669 	TOKEN_NUM_INITIALIZER
12670 		(struct cmd_vf_vlan_insert_result,
12671 		 vf_id, UINT16);
12672 cmdline_parse_token_num_t cmd_vf_vlan_insert_vlan_id =
12673 	TOKEN_NUM_INITIALIZER
12674 		(struct cmd_vf_vlan_insert_result,
12675 		 vlan_id, UINT16);
12676 
12677 static void
12678 cmd_set_vf_vlan_insert_parsed(
12679 	void *parsed_result,
12680 	__rte_unused struct cmdline *cl,
12681 	__rte_unused void *data)
12682 {
12683 	struct cmd_vf_vlan_insert_result *res = parsed_result;
12684 	int ret = -ENOTSUP;
12685 
12686 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
12687 		return;
12688 
12689 #ifdef RTE_NET_IXGBE
12690 	if (ret == -ENOTSUP)
12691 		ret = rte_pmd_ixgbe_set_vf_vlan_insert(res->port_id, res->vf_id,
12692 			res->vlan_id);
12693 #endif
12694 #ifdef RTE_NET_I40E
12695 	if (ret == -ENOTSUP)
12696 		ret = rte_pmd_i40e_set_vf_vlan_insert(res->port_id, res->vf_id,
12697 			res->vlan_id);
12698 #endif
12699 #ifdef RTE_NET_BNXT
12700 	if (ret == -ENOTSUP)
12701 		ret = rte_pmd_bnxt_set_vf_vlan_insert(res->port_id, res->vf_id,
12702 			res->vlan_id);
12703 #endif
12704 
12705 	switch (ret) {
12706 	case 0:
12707 		break;
12708 	case -EINVAL:
12709 		printf("invalid vf_id %d or vlan_id %d\n", res->vf_id, res->vlan_id);
12710 		break;
12711 	case -ENODEV:
12712 		printf("invalid port_id %d\n", res->port_id);
12713 		break;
12714 	case -ENOTSUP:
12715 		printf("function not implemented\n");
12716 		break;
12717 	default:
12718 		printf("programming error: (%s)\n", strerror(-ret));
12719 	}
12720 }
12721 
12722 cmdline_parse_inst_t cmd_set_vf_vlan_insert = {
12723 	.f = cmd_set_vf_vlan_insert_parsed,
12724 	.data = NULL,
12725 	.help_str = "set vf vlan insert <port_id> <vf_id> <vlan_id>",
12726 	.tokens = {
12727 		(void *)&cmd_vf_vlan_insert_set,
12728 		(void *)&cmd_vf_vlan_insert_vf,
12729 		(void *)&cmd_vf_vlan_insert_vlan,
12730 		(void *)&cmd_vf_vlan_insert_insert,
12731 		(void *)&cmd_vf_vlan_insert_port_id,
12732 		(void *)&cmd_vf_vlan_insert_vf_id,
12733 		(void *)&cmd_vf_vlan_insert_vlan_id,
12734 		NULL,
12735 	},
12736 };
12737 
12738 /* tx loopback configuration */
12739 
12740 /* Common result structure for tx loopback */
12741 struct cmd_tx_loopback_result {
12742 	cmdline_fixed_string_t set;
12743 	cmdline_fixed_string_t tx;
12744 	cmdline_fixed_string_t loopback;
12745 	portid_t port_id;
12746 	cmdline_fixed_string_t on_off;
12747 };
12748 
12749 /* Common CLI fields for tx loopback enable disable */
12750 cmdline_parse_token_string_t cmd_tx_loopback_set =
12751 	TOKEN_STRING_INITIALIZER
12752 		(struct cmd_tx_loopback_result,
12753 		 set, "set");
12754 cmdline_parse_token_string_t cmd_tx_loopback_tx =
12755 	TOKEN_STRING_INITIALIZER
12756 		(struct cmd_tx_loopback_result,
12757 		 tx, "tx");
12758 cmdline_parse_token_string_t cmd_tx_loopback_loopback =
12759 	TOKEN_STRING_INITIALIZER
12760 		(struct cmd_tx_loopback_result,
12761 		 loopback, "loopback");
12762 cmdline_parse_token_num_t cmd_tx_loopback_port_id =
12763 	TOKEN_NUM_INITIALIZER
12764 		(struct cmd_tx_loopback_result,
12765 		 port_id, UINT16);
12766 cmdline_parse_token_string_t cmd_tx_loopback_on_off =
12767 	TOKEN_STRING_INITIALIZER
12768 		(struct cmd_tx_loopback_result,
12769 		 on_off, "on#off");
12770 
12771 static void
12772 cmd_set_tx_loopback_parsed(
12773 	void *parsed_result,
12774 	__rte_unused struct cmdline *cl,
12775 	__rte_unused void *data)
12776 {
12777 	struct cmd_tx_loopback_result *res = parsed_result;
12778 	int ret = -ENOTSUP;
12779 
12780 	__rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
12781 
12782 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
12783 		return;
12784 
12785 #ifdef RTE_NET_IXGBE
12786 	if (ret == -ENOTSUP)
12787 		ret = rte_pmd_ixgbe_set_tx_loopback(res->port_id, is_on);
12788 #endif
12789 #ifdef RTE_NET_I40E
12790 	if (ret == -ENOTSUP)
12791 		ret = rte_pmd_i40e_set_tx_loopback(res->port_id, is_on);
12792 #endif
12793 #ifdef RTE_NET_BNXT
12794 	if (ret == -ENOTSUP)
12795 		ret = rte_pmd_bnxt_set_tx_loopback(res->port_id, is_on);
12796 #endif
12797 #if defined RTE_BUS_DPAA && defined RTE_NET_DPAA
12798 	if (ret == -ENOTSUP)
12799 		ret = rte_pmd_dpaa_set_tx_loopback(res->port_id, is_on);
12800 #endif
12801 
12802 	switch (ret) {
12803 	case 0:
12804 		break;
12805 	case -EINVAL:
12806 		printf("invalid is_on %d\n", is_on);
12807 		break;
12808 	case -ENODEV:
12809 		printf("invalid port_id %d\n", res->port_id);
12810 		break;
12811 	case -ENOTSUP:
12812 		printf("function not implemented\n");
12813 		break;
12814 	default:
12815 		printf("programming error: (%s)\n", strerror(-ret));
12816 	}
12817 }
12818 
12819 cmdline_parse_inst_t cmd_set_tx_loopback = {
12820 	.f = cmd_set_tx_loopback_parsed,
12821 	.data = NULL,
12822 	.help_str = "set tx loopback <port_id> on|off",
12823 	.tokens = {
12824 		(void *)&cmd_tx_loopback_set,
12825 		(void *)&cmd_tx_loopback_tx,
12826 		(void *)&cmd_tx_loopback_loopback,
12827 		(void *)&cmd_tx_loopback_port_id,
12828 		(void *)&cmd_tx_loopback_on_off,
12829 		NULL,
12830 	},
12831 };
12832 
12833 /* all queues drop enable configuration */
12834 
12835 /* Common result structure for all queues drop enable */
12836 struct cmd_all_queues_drop_en_result {
12837 	cmdline_fixed_string_t set;
12838 	cmdline_fixed_string_t all;
12839 	cmdline_fixed_string_t queues;
12840 	cmdline_fixed_string_t drop;
12841 	portid_t port_id;
12842 	cmdline_fixed_string_t on_off;
12843 };
12844 
12845 /* Common CLI fields for tx loopback enable disable */
12846 cmdline_parse_token_string_t cmd_all_queues_drop_en_set =
12847 	TOKEN_STRING_INITIALIZER
12848 		(struct cmd_all_queues_drop_en_result,
12849 		 set, "set");
12850 cmdline_parse_token_string_t cmd_all_queues_drop_en_all =
12851 	TOKEN_STRING_INITIALIZER
12852 		(struct cmd_all_queues_drop_en_result,
12853 		 all, "all");
12854 cmdline_parse_token_string_t cmd_all_queues_drop_en_queues =
12855 	TOKEN_STRING_INITIALIZER
12856 		(struct cmd_all_queues_drop_en_result,
12857 		 queues, "queues");
12858 cmdline_parse_token_string_t cmd_all_queues_drop_en_drop =
12859 	TOKEN_STRING_INITIALIZER
12860 		(struct cmd_all_queues_drop_en_result,
12861 		 drop, "drop");
12862 cmdline_parse_token_num_t cmd_all_queues_drop_en_port_id =
12863 	TOKEN_NUM_INITIALIZER
12864 		(struct cmd_all_queues_drop_en_result,
12865 		 port_id, UINT16);
12866 cmdline_parse_token_string_t cmd_all_queues_drop_en_on_off =
12867 	TOKEN_STRING_INITIALIZER
12868 		(struct cmd_all_queues_drop_en_result,
12869 		 on_off, "on#off");
12870 
12871 static void
12872 cmd_set_all_queues_drop_en_parsed(
12873 	void *parsed_result,
12874 	__rte_unused struct cmdline *cl,
12875 	__rte_unused void *data)
12876 {
12877 	struct cmd_all_queues_drop_en_result *res = parsed_result;
12878 	int ret = -ENOTSUP;
12879 	int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
12880 
12881 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
12882 		return;
12883 
12884 #ifdef RTE_NET_IXGBE
12885 	if (ret == -ENOTSUP)
12886 		ret = rte_pmd_ixgbe_set_all_queues_drop_en(res->port_id, is_on);
12887 #endif
12888 #ifdef RTE_NET_BNXT
12889 	if (ret == -ENOTSUP)
12890 		ret = rte_pmd_bnxt_set_all_queues_drop_en(res->port_id, is_on);
12891 #endif
12892 	switch (ret) {
12893 	case 0:
12894 		break;
12895 	case -EINVAL:
12896 		printf("invalid is_on %d\n", is_on);
12897 		break;
12898 	case -ENODEV:
12899 		printf("invalid port_id %d\n", res->port_id);
12900 		break;
12901 	case -ENOTSUP:
12902 		printf("function not implemented\n");
12903 		break;
12904 	default:
12905 		printf("programming error: (%s)\n", strerror(-ret));
12906 	}
12907 }
12908 
12909 cmdline_parse_inst_t cmd_set_all_queues_drop_en = {
12910 	.f = cmd_set_all_queues_drop_en_parsed,
12911 	.data = NULL,
12912 	.help_str = "set all queues drop <port_id> on|off",
12913 	.tokens = {
12914 		(void *)&cmd_all_queues_drop_en_set,
12915 		(void *)&cmd_all_queues_drop_en_all,
12916 		(void *)&cmd_all_queues_drop_en_queues,
12917 		(void *)&cmd_all_queues_drop_en_drop,
12918 		(void *)&cmd_all_queues_drop_en_port_id,
12919 		(void *)&cmd_all_queues_drop_en_on_off,
12920 		NULL,
12921 	},
12922 };
12923 
12924 /* vf split drop enable configuration */
12925 
12926 /* Common result structure for vf split drop enable */
12927 struct cmd_vf_split_drop_en_result {
12928 	cmdline_fixed_string_t set;
12929 	cmdline_fixed_string_t vf;
12930 	cmdline_fixed_string_t split;
12931 	cmdline_fixed_string_t drop;
12932 	portid_t port_id;
12933 	uint16_t vf_id;
12934 	cmdline_fixed_string_t on_off;
12935 };
12936 
12937 /* Common CLI fields for vf split drop enable disable */
12938 cmdline_parse_token_string_t cmd_vf_split_drop_en_set =
12939 	TOKEN_STRING_INITIALIZER
12940 		(struct cmd_vf_split_drop_en_result,
12941 		 set, "set");
12942 cmdline_parse_token_string_t cmd_vf_split_drop_en_vf =
12943 	TOKEN_STRING_INITIALIZER
12944 		(struct cmd_vf_split_drop_en_result,
12945 		 vf, "vf");
12946 cmdline_parse_token_string_t cmd_vf_split_drop_en_split =
12947 	TOKEN_STRING_INITIALIZER
12948 		(struct cmd_vf_split_drop_en_result,
12949 		 split, "split");
12950 cmdline_parse_token_string_t cmd_vf_split_drop_en_drop =
12951 	TOKEN_STRING_INITIALIZER
12952 		(struct cmd_vf_split_drop_en_result,
12953 		 drop, "drop");
12954 cmdline_parse_token_num_t cmd_vf_split_drop_en_port_id =
12955 	TOKEN_NUM_INITIALIZER
12956 		(struct cmd_vf_split_drop_en_result,
12957 		 port_id, UINT16);
12958 cmdline_parse_token_num_t cmd_vf_split_drop_en_vf_id =
12959 	TOKEN_NUM_INITIALIZER
12960 		(struct cmd_vf_split_drop_en_result,
12961 		 vf_id, UINT16);
12962 cmdline_parse_token_string_t cmd_vf_split_drop_en_on_off =
12963 	TOKEN_STRING_INITIALIZER
12964 		(struct cmd_vf_split_drop_en_result,
12965 		 on_off, "on#off");
12966 
12967 static void
12968 cmd_set_vf_split_drop_en_parsed(
12969 	void *parsed_result,
12970 	__rte_unused struct cmdline *cl,
12971 	__rte_unused void *data)
12972 {
12973 	struct cmd_vf_split_drop_en_result *res = parsed_result;
12974 	int ret = -ENOTSUP;
12975 	int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
12976 
12977 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
12978 		return;
12979 
12980 #ifdef RTE_NET_IXGBE
12981 	ret = rte_pmd_ixgbe_set_vf_split_drop_en(res->port_id, res->vf_id,
12982 			is_on);
12983 #endif
12984 	switch (ret) {
12985 	case 0:
12986 		break;
12987 	case -EINVAL:
12988 		printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on);
12989 		break;
12990 	case -ENODEV:
12991 		printf("invalid port_id %d\n", res->port_id);
12992 		break;
12993 	case -ENOTSUP:
12994 		printf("not supported on port %d\n", res->port_id);
12995 		break;
12996 	default:
12997 		printf("programming error: (%s)\n", strerror(-ret));
12998 	}
12999 }
13000 
13001 cmdline_parse_inst_t cmd_set_vf_split_drop_en = {
13002 	.f = cmd_set_vf_split_drop_en_parsed,
13003 	.data = NULL,
13004 	.help_str = "set vf split drop <port_id> <vf_id> on|off",
13005 	.tokens = {
13006 		(void *)&cmd_vf_split_drop_en_set,
13007 		(void *)&cmd_vf_split_drop_en_vf,
13008 		(void *)&cmd_vf_split_drop_en_split,
13009 		(void *)&cmd_vf_split_drop_en_drop,
13010 		(void *)&cmd_vf_split_drop_en_port_id,
13011 		(void *)&cmd_vf_split_drop_en_vf_id,
13012 		(void *)&cmd_vf_split_drop_en_on_off,
13013 		NULL,
13014 	},
13015 };
13016 
13017 /* vf mac address configuration */
13018 
13019 /* Common result structure for vf mac address */
13020 struct cmd_set_vf_mac_addr_result {
13021 	cmdline_fixed_string_t set;
13022 	cmdline_fixed_string_t vf;
13023 	cmdline_fixed_string_t mac;
13024 	cmdline_fixed_string_t addr;
13025 	portid_t port_id;
13026 	uint16_t vf_id;
13027 	struct rte_ether_addr mac_addr;
13028 
13029 };
13030 
13031 /* Common CLI fields for vf split drop enable disable */
13032 cmdline_parse_token_string_t cmd_set_vf_mac_addr_set =
13033 	TOKEN_STRING_INITIALIZER
13034 		(struct cmd_set_vf_mac_addr_result,
13035 		 set, "set");
13036 cmdline_parse_token_string_t cmd_set_vf_mac_addr_vf =
13037 	TOKEN_STRING_INITIALIZER
13038 		(struct cmd_set_vf_mac_addr_result,
13039 		 vf, "vf");
13040 cmdline_parse_token_string_t cmd_set_vf_mac_addr_mac =
13041 	TOKEN_STRING_INITIALIZER
13042 		(struct cmd_set_vf_mac_addr_result,
13043 		 mac, "mac");
13044 cmdline_parse_token_string_t cmd_set_vf_mac_addr_addr =
13045 	TOKEN_STRING_INITIALIZER
13046 		(struct cmd_set_vf_mac_addr_result,
13047 		 addr, "addr");
13048 cmdline_parse_token_num_t cmd_set_vf_mac_addr_port_id =
13049 	TOKEN_NUM_INITIALIZER
13050 		(struct cmd_set_vf_mac_addr_result,
13051 		 port_id, UINT16);
13052 cmdline_parse_token_num_t cmd_set_vf_mac_addr_vf_id =
13053 	TOKEN_NUM_INITIALIZER
13054 		(struct cmd_set_vf_mac_addr_result,
13055 		 vf_id, UINT16);
13056 cmdline_parse_token_etheraddr_t cmd_set_vf_mac_addr_mac_addr =
13057 	TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_vf_mac_addr_result,
13058 		 mac_addr);
13059 
13060 static void
13061 cmd_set_vf_mac_addr_parsed(
13062 	void *parsed_result,
13063 	__rte_unused struct cmdline *cl,
13064 	__rte_unused void *data)
13065 {
13066 	struct cmd_set_vf_mac_addr_result *res = parsed_result;
13067 	int ret = -ENOTSUP;
13068 
13069 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
13070 		return;
13071 
13072 #ifdef RTE_NET_IXGBE
13073 	if (ret == -ENOTSUP)
13074 		ret = rte_pmd_ixgbe_set_vf_mac_addr(res->port_id, res->vf_id,
13075 				&res->mac_addr);
13076 #endif
13077 #ifdef RTE_NET_I40E
13078 	if (ret == -ENOTSUP)
13079 		ret = rte_pmd_i40e_set_vf_mac_addr(res->port_id, res->vf_id,
13080 				&res->mac_addr);
13081 #endif
13082 #ifdef RTE_NET_BNXT
13083 	if (ret == -ENOTSUP)
13084 		ret = rte_pmd_bnxt_set_vf_mac_addr(res->port_id, res->vf_id,
13085 				&res->mac_addr);
13086 #endif
13087 
13088 	switch (ret) {
13089 	case 0:
13090 		break;
13091 	case -EINVAL:
13092 		printf("invalid vf_id %d or mac_addr\n", res->vf_id);
13093 		break;
13094 	case -ENODEV:
13095 		printf("invalid port_id %d\n", res->port_id);
13096 		break;
13097 	case -ENOTSUP:
13098 		printf("function not implemented\n");
13099 		break;
13100 	default:
13101 		printf("programming error: (%s)\n", strerror(-ret));
13102 	}
13103 }
13104 
13105 cmdline_parse_inst_t cmd_set_vf_mac_addr = {
13106 	.f = cmd_set_vf_mac_addr_parsed,
13107 	.data = NULL,
13108 	.help_str = "set vf mac addr <port_id> <vf_id> <mac_addr>",
13109 	.tokens = {
13110 		(void *)&cmd_set_vf_mac_addr_set,
13111 		(void *)&cmd_set_vf_mac_addr_vf,
13112 		(void *)&cmd_set_vf_mac_addr_mac,
13113 		(void *)&cmd_set_vf_mac_addr_addr,
13114 		(void *)&cmd_set_vf_mac_addr_port_id,
13115 		(void *)&cmd_set_vf_mac_addr_vf_id,
13116 		(void *)&cmd_set_vf_mac_addr_mac_addr,
13117 		NULL,
13118 	},
13119 };
13120 
13121 /* MACsec configuration */
13122 
13123 /* Common result structure for MACsec offload enable */
13124 struct cmd_macsec_offload_on_result {
13125 	cmdline_fixed_string_t set;
13126 	cmdline_fixed_string_t macsec;
13127 	cmdline_fixed_string_t offload;
13128 	portid_t port_id;
13129 	cmdline_fixed_string_t on;
13130 	cmdline_fixed_string_t encrypt;
13131 	cmdline_fixed_string_t en_on_off;
13132 	cmdline_fixed_string_t replay_protect;
13133 	cmdline_fixed_string_t rp_on_off;
13134 };
13135 
13136 /* Common CLI fields for MACsec offload disable */
13137 cmdline_parse_token_string_t cmd_macsec_offload_on_set =
13138 	TOKEN_STRING_INITIALIZER
13139 		(struct cmd_macsec_offload_on_result,
13140 		 set, "set");
13141 cmdline_parse_token_string_t cmd_macsec_offload_on_macsec =
13142 	TOKEN_STRING_INITIALIZER
13143 		(struct cmd_macsec_offload_on_result,
13144 		 macsec, "macsec");
13145 cmdline_parse_token_string_t cmd_macsec_offload_on_offload =
13146 	TOKEN_STRING_INITIALIZER
13147 		(struct cmd_macsec_offload_on_result,
13148 		 offload, "offload");
13149 cmdline_parse_token_num_t cmd_macsec_offload_on_port_id =
13150 	TOKEN_NUM_INITIALIZER
13151 		(struct cmd_macsec_offload_on_result,
13152 		 port_id, UINT16);
13153 cmdline_parse_token_string_t cmd_macsec_offload_on_on =
13154 	TOKEN_STRING_INITIALIZER
13155 		(struct cmd_macsec_offload_on_result,
13156 		 on, "on");
13157 cmdline_parse_token_string_t cmd_macsec_offload_on_encrypt =
13158 	TOKEN_STRING_INITIALIZER
13159 		(struct cmd_macsec_offload_on_result,
13160 		 encrypt, "encrypt");
13161 cmdline_parse_token_string_t cmd_macsec_offload_on_en_on_off =
13162 	TOKEN_STRING_INITIALIZER
13163 		(struct cmd_macsec_offload_on_result,
13164 		 en_on_off, "on#off");
13165 cmdline_parse_token_string_t cmd_macsec_offload_on_replay_protect =
13166 	TOKEN_STRING_INITIALIZER
13167 		(struct cmd_macsec_offload_on_result,
13168 		 replay_protect, "replay-protect");
13169 cmdline_parse_token_string_t cmd_macsec_offload_on_rp_on_off =
13170 	TOKEN_STRING_INITIALIZER
13171 		(struct cmd_macsec_offload_on_result,
13172 		 rp_on_off, "on#off");
13173 
13174 static void
13175 cmd_set_macsec_offload_on_parsed(
13176 	void *parsed_result,
13177 	__rte_unused struct cmdline *cl,
13178 	__rte_unused void *data)
13179 {
13180 	struct cmd_macsec_offload_on_result *res = parsed_result;
13181 	int ret = -ENOTSUP;
13182 	portid_t port_id = res->port_id;
13183 	int en = (strcmp(res->en_on_off, "on") == 0) ? 1 : 0;
13184 	int rp = (strcmp(res->rp_on_off, "on") == 0) ? 1 : 0;
13185 	struct rte_eth_dev_info dev_info;
13186 
13187 	if (port_id_is_invalid(port_id, ENABLED_WARN))
13188 		return;
13189 	if (!port_is_stopped(port_id)) {
13190 		printf("Please stop port %d first\n", port_id);
13191 		return;
13192 	}
13193 
13194 	ret = eth_dev_info_get_print_err(port_id, &dev_info);
13195 	if (ret != 0)
13196 		return;
13197 
13198 	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
13199 #ifdef RTE_NET_IXGBE
13200 		ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
13201 #endif
13202 	}
13203 	RTE_SET_USED(en);
13204 	RTE_SET_USED(rp);
13205 
13206 	switch (ret) {
13207 	case 0:
13208 		ports[port_id].dev_conf.txmode.offloads |=
13209 						DEV_TX_OFFLOAD_MACSEC_INSERT;
13210 		cmd_reconfig_device_queue(port_id, 1, 1);
13211 		break;
13212 	case -ENODEV:
13213 		printf("invalid port_id %d\n", port_id);
13214 		break;
13215 	case -ENOTSUP:
13216 		printf("not supported on port %d\n", port_id);
13217 		break;
13218 	default:
13219 		printf("programming error: (%s)\n", strerror(-ret));
13220 	}
13221 }
13222 
13223 cmdline_parse_inst_t cmd_set_macsec_offload_on = {
13224 	.f = cmd_set_macsec_offload_on_parsed,
13225 	.data = NULL,
13226 	.help_str = "set macsec offload <port_id> on "
13227 		"encrypt on|off replay-protect on|off",
13228 	.tokens = {
13229 		(void *)&cmd_macsec_offload_on_set,
13230 		(void *)&cmd_macsec_offload_on_macsec,
13231 		(void *)&cmd_macsec_offload_on_offload,
13232 		(void *)&cmd_macsec_offload_on_port_id,
13233 		(void *)&cmd_macsec_offload_on_on,
13234 		(void *)&cmd_macsec_offload_on_encrypt,
13235 		(void *)&cmd_macsec_offload_on_en_on_off,
13236 		(void *)&cmd_macsec_offload_on_replay_protect,
13237 		(void *)&cmd_macsec_offload_on_rp_on_off,
13238 		NULL,
13239 	},
13240 };
13241 
13242 /* Common result structure for MACsec offload disable */
13243 struct cmd_macsec_offload_off_result {
13244 	cmdline_fixed_string_t set;
13245 	cmdline_fixed_string_t macsec;
13246 	cmdline_fixed_string_t offload;
13247 	portid_t port_id;
13248 	cmdline_fixed_string_t off;
13249 };
13250 
13251 /* Common CLI fields for MACsec offload disable */
13252 cmdline_parse_token_string_t cmd_macsec_offload_off_set =
13253 	TOKEN_STRING_INITIALIZER
13254 		(struct cmd_macsec_offload_off_result,
13255 		 set, "set");
13256 cmdline_parse_token_string_t cmd_macsec_offload_off_macsec =
13257 	TOKEN_STRING_INITIALIZER
13258 		(struct cmd_macsec_offload_off_result,
13259 		 macsec, "macsec");
13260 cmdline_parse_token_string_t cmd_macsec_offload_off_offload =
13261 	TOKEN_STRING_INITIALIZER
13262 		(struct cmd_macsec_offload_off_result,
13263 		 offload, "offload");
13264 cmdline_parse_token_num_t cmd_macsec_offload_off_port_id =
13265 	TOKEN_NUM_INITIALIZER
13266 		(struct cmd_macsec_offload_off_result,
13267 		 port_id, UINT16);
13268 cmdline_parse_token_string_t cmd_macsec_offload_off_off =
13269 	TOKEN_STRING_INITIALIZER
13270 		(struct cmd_macsec_offload_off_result,
13271 		 off, "off");
13272 
13273 static void
13274 cmd_set_macsec_offload_off_parsed(
13275 	void *parsed_result,
13276 	__rte_unused struct cmdline *cl,
13277 	__rte_unused void *data)
13278 {
13279 	struct cmd_macsec_offload_off_result *res = parsed_result;
13280 	int ret = -ENOTSUP;
13281 	struct rte_eth_dev_info dev_info;
13282 	portid_t port_id = res->port_id;
13283 
13284 	if (port_id_is_invalid(port_id, ENABLED_WARN))
13285 		return;
13286 	if (!port_is_stopped(port_id)) {
13287 		printf("Please stop port %d first\n", port_id);
13288 		return;
13289 	}
13290 
13291 	ret = eth_dev_info_get_print_err(port_id, &dev_info);
13292 	if (ret != 0)
13293 		return;
13294 
13295 	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
13296 #ifdef RTE_NET_IXGBE
13297 		ret = rte_pmd_ixgbe_macsec_disable(port_id);
13298 #endif
13299 	}
13300 	switch (ret) {
13301 	case 0:
13302 		ports[port_id].dev_conf.txmode.offloads &=
13303 						~DEV_TX_OFFLOAD_MACSEC_INSERT;
13304 		cmd_reconfig_device_queue(port_id, 1, 1);
13305 		break;
13306 	case -ENODEV:
13307 		printf("invalid port_id %d\n", port_id);
13308 		break;
13309 	case -ENOTSUP:
13310 		printf("not supported on port %d\n", port_id);
13311 		break;
13312 	default:
13313 		printf("programming error: (%s)\n", strerror(-ret));
13314 	}
13315 }
13316 
13317 cmdline_parse_inst_t cmd_set_macsec_offload_off = {
13318 	.f = cmd_set_macsec_offload_off_parsed,
13319 	.data = NULL,
13320 	.help_str = "set macsec offload <port_id> off",
13321 	.tokens = {
13322 		(void *)&cmd_macsec_offload_off_set,
13323 		(void *)&cmd_macsec_offload_off_macsec,
13324 		(void *)&cmd_macsec_offload_off_offload,
13325 		(void *)&cmd_macsec_offload_off_port_id,
13326 		(void *)&cmd_macsec_offload_off_off,
13327 		NULL,
13328 	},
13329 };
13330 
13331 /* Common result structure for MACsec secure connection configure */
13332 struct cmd_macsec_sc_result {
13333 	cmdline_fixed_string_t set;
13334 	cmdline_fixed_string_t macsec;
13335 	cmdline_fixed_string_t sc;
13336 	cmdline_fixed_string_t tx_rx;
13337 	portid_t port_id;
13338 	struct rte_ether_addr mac;
13339 	uint16_t pi;
13340 };
13341 
13342 /* Common CLI fields for MACsec secure connection configure */
13343 cmdline_parse_token_string_t cmd_macsec_sc_set =
13344 	TOKEN_STRING_INITIALIZER
13345 		(struct cmd_macsec_sc_result,
13346 		 set, "set");
13347 cmdline_parse_token_string_t cmd_macsec_sc_macsec =
13348 	TOKEN_STRING_INITIALIZER
13349 		(struct cmd_macsec_sc_result,
13350 		 macsec, "macsec");
13351 cmdline_parse_token_string_t cmd_macsec_sc_sc =
13352 	TOKEN_STRING_INITIALIZER
13353 		(struct cmd_macsec_sc_result,
13354 		 sc, "sc");
13355 cmdline_parse_token_string_t cmd_macsec_sc_tx_rx =
13356 	TOKEN_STRING_INITIALIZER
13357 		(struct cmd_macsec_sc_result,
13358 		 tx_rx, "tx#rx");
13359 cmdline_parse_token_num_t cmd_macsec_sc_port_id =
13360 	TOKEN_NUM_INITIALIZER
13361 		(struct cmd_macsec_sc_result,
13362 		 port_id, UINT16);
13363 cmdline_parse_token_etheraddr_t cmd_macsec_sc_mac =
13364 	TOKEN_ETHERADDR_INITIALIZER
13365 		(struct cmd_macsec_sc_result,
13366 		 mac);
13367 cmdline_parse_token_num_t cmd_macsec_sc_pi =
13368 	TOKEN_NUM_INITIALIZER
13369 		(struct cmd_macsec_sc_result,
13370 		 pi, UINT16);
13371 
13372 static void
13373 cmd_set_macsec_sc_parsed(
13374 	void *parsed_result,
13375 	__rte_unused struct cmdline *cl,
13376 	__rte_unused void *data)
13377 {
13378 	struct cmd_macsec_sc_result *res = parsed_result;
13379 	int ret = -ENOTSUP;
13380 	int is_tx = (strcmp(res->tx_rx, "tx") == 0) ? 1 : 0;
13381 
13382 #ifdef RTE_NET_IXGBE
13383 	ret = is_tx ?
13384 		rte_pmd_ixgbe_macsec_config_txsc(res->port_id,
13385 				res->mac.addr_bytes) :
13386 		rte_pmd_ixgbe_macsec_config_rxsc(res->port_id,
13387 				res->mac.addr_bytes, res->pi);
13388 #endif
13389 	RTE_SET_USED(is_tx);
13390 
13391 	switch (ret) {
13392 	case 0:
13393 		break;
13394 	case -ENODEV:
13395 		printf("invalid port_id %d\n", res->port_id);
13396 		break;
13397 	case -ENOTSUP:
13398 		printf("not supported on port %d\n", res->port_id);
13399 		break;
13400 	default:
13401 		printf("programming error: (%s)\n", strerror(-ret));
13402 	}
13403 }
13404 
13405 cmdline_parse_inst_t cmd_set_macsec_sc = {
13406 	.f = cmd_set_macsec_sc_parsed,
13407 	.data = NULL,
13408 	.help_str = "set macsec sc tx|rx <port_id> <mac> <pi>",
13409 	.tokens = {
13410 		(void *)&cmd_macsec_sc_set,
13411 		(void *)&cmd_macsec_sc_macsec,
13412 		(void *)&cmd_macsec_sc_sc,
13413 		(void *)&cmd_macsec_sc_tx_rx,
13414 		(void *)&cmd_macsec_sc_port_id,
13415 		(void *)&cmd_macsec_sc_mac,
13416 		(void *)&cmd_macsec_sc_pi,
13417 		NULL,
13418 	},
13419 };
13420 
13421 /* Common result structure for MACsec secure connection configure */
13422 struct cmd_macsec_sa_result {
13423 	cmdline_fixed_string_t set;
13424 	cmdline_fixed_string_t macsec;
13425 	cmdline_fixed_string_t sa;
13426 	cmdline_fixed_string_t tx_rx;
13427 	portid_t port_id;
13428 	uint8_t idx;
13429 	uint8_t an;
13430 	uint32_t pn;
13431 	cmdline_fixed_string_t key;
13432 };
13433 
13434 /* Common CLI fields for MACsec secure connection configure */
13435 cmdline_parse_token_string_t cmd_macsec_sa_set =
13436 	TOKEN_STRING_INITIALIZER
13437 		(struct cmd_macsec_sa_result,
13438 		 set, "set");
13439 cmdline_parse_token_string_t cmd_macsec_sa_macsec =
13440 	TOKEN_STRING_INITIALIZER
13441 		(struct cmd_macsec_sa_result,
13442 		 macsec, "macsec");
13443 cmdline_parse_token_string_t cmd_macsec_sa_sa =
13444 	TOKEN_STRING_INITIALIZER
13445 		(struct cmd_macsec_sa_result,
13446 		 sa, "sa");
13447 cmdline_parse_token_string_t cmd_macsec_sa_tx_rx =
13448 	TOKEN_STRING_INITIALIZER
13449 		(struct cmd_macsec_sa_result,
13450 		 tx_rx, "tx#rx");
13451 cmdline_parse_token_num_t cmd_macsec_sa_port_id =
13452 	TOKEN_NUM_INITIALIZER
13453 		(struct cmd_macsec_sa_result,
13454 		 port_id, UINT16);
13455 cmdline_parse_token_num_t cmd_macsec_sa_idx =
13456 	TOKEN_NUM_INITIALIZER
13457 		(struct cmd_macsec_sa_result,
13458 		 idx, UINT8);
13459 cmdline_parse_token_num_t cmd_macsec_sa_an =
13460 	TOKEN_NUM_INITIALIZER
13461 		(struct cmd_macsec_sa_result,
13462 		 an, UINT8);
13463 cmdline_parse_token_num_t cmd_macsec_sa_pn =
13464 	TOKEN_NUM_INITIALIZER
13465 		(struct cmd_macsec_sa_result,
13466 		 pn, UINT32);
13467 cmdline_parse_token_string_t cmd_macsec_sa_key =
13468 	TOKEN_STRING_INITIALIZER
13469 		(struct cmd_macsec_sa_result,
13470 		 key, NULL);
13471 
13472 static void
13473 cmd_set_macsec_sa_parsed(
13474 	void *parsed_result,
13475 	__rte_unused struct cmdline *cl,
13476 	__rte_unused void *data)
13477 {
13478 	struct cmd_macsec_sa_result *res = parsed_result;
13479 	int ret = -ENOTSUP;
13480 	int is_tx = (strcmp(res->tx_rx, "tx") == 0) ? 1 : 0;
13481 	uint8_t key[16] = { 0 };
13482 	uint8_t xdgt0;
13483 	uint8_t xdgt1;
13484 	int key_len;
13485 	int i;
13486 
13487 	key_len = strlen(res->key) / 2;
13488 	if (key_len > 16)
13489 		key_len = 16;
13490 
13491 	for (i = 0; i < key_len; i++) {
13492 		xdgt0 = parse_and_check_key_hexa_digit(res->key, (i * 2));
13493 		if (xdgt0 == 0xFF)
13494 			return;
13495 		xdgt1 = parse_and_check_key_hexa_digit(res->key, (i * 2) + 1);
13496 		if (xdgt1 == 0xFF)
13497 			return;
13498 		key[i] = (uint8_t) ((xdgt0 * 16) + xdgt1);
13499 	}
13500 
13501 #ifdef RTE_NET_IXGBE
13502 	ret = is_tx ?
13503 		rte_pmd_ixgbe_macsec_select_txsa(res->port_id,
13504 			res->idx, res->an, res->pn, key) :
13505 		rte_pmd_ixgbe_macsec_select_rxsa(res->port_id,
13506 			res->idx, res->an, res->pn, key);
13507 #endif
13508 	RTE_SET_USED(is_tx);
13509 	RTE_SET_USED(key);
13510 
13511 	switch (ret) {
13512 	case 0:
13513 		break;
13514 	case -EINVAL:
13515 		printf("invalid idx %d or an %d\n", res->idx, res->an);
13516 		break;
13517 	case -ENODEV:
13518 		printf("invalid port_id %d\n", res->port_id);
13519 		break;
13520 	case -ENOTSUP:
13521 		printf("not supported on port %d\n", res->port_id);
13522 		break;
13523 	default:
13524 		printf("programming error: (%s)\n", strerror(-ret));
13525 	}
13526 }
13527 
13528 cmdline_parse_inst_t cmd_set_macsec_sa = {
13529 	.f = cmd_set_macsec_sa_parsed,
13530 	.data = NULL,
13531 	.help_str = "set macsec sa tx|rx <port_id> <idx> <an> <pn> <key>",
13532 	.tokens = {
13533 		(void *)&cmd_macsec_sa_set,
13534 		(void *)&cmd_macsec_sa_macsec,
13535 		(void *)&cmd_macsec_sa_sa,
13536 		(void *)&cmd_macsec_sa_tx_rx,
13537 		(void *)&cmd_macsec_sa_port_id,
13538 		(void *)&cmd_macsec_sa_idx,
13539 		(void *)&cmd_macsec_sa_an,
13540 		(void *)&cmd_macsec_sa_pn,
13541 		(void *)&cmd_macsec_sa_key,
13542 		NULL,
13543 	},
13544 };
13545 
13546 /* VF unicast promiscuous mode configuration */
13547 
13548 /* Common result structure for VF unicast promiscuous mode */
13549 struct cmd_vf_promisc_result {
13550 	cmdline_fixed_string_t set;
13551 	cmdline_fixed_string_t vf;
13552 	cmdline_fixed_string_t promisc;
13553 	portid_t port_id;
13554 	uint32_t vf_id;
13555 	cmdline_fixed_string_t on_off;
13556 };
13557 
13558 /* Common CLI fields for VF unicast promiscuous mode enable disable */
13559 cmdline_parse_token_string_t cmd_vf_promisc_set =
13560 	TOKEN_STRING_INITIALIZER
13561 		(struct cmd_vf_promisc_result,
13562 		 set, "set");
13563 cmdline_parse_token_string_t cmd_vf_promisc_vf =
13564 	TOKEN_STRING_INITIALIZER
13565 		(struct cmd_vf_promisc_result,
13566 		 vf, "vf");
13567 cmdline_parse_token_string_t cmd_vf_promisc_promisc =
13568 	TOKEN_STRING_INITIALIZER
13569 		(struct cmd_vf_promisc_result,
13570 		 promisc, "promisc");
13571 cmdline_parse_token_num_t cmd_vf_promisc_port_id =
13572 	TOKEN_NUM_INITIALIZER
13573 		(struct cmd_vf_promisc_result,
13574 		 port_id, UINT16);
13575 cmdline_parse_token_num_t cmd_vf_promisc_vf_id =
13576 	TOKEN_NUM_INITIALIZER
13577 		(struct cmd_vf_promisc_result,
13578 		 vf_id, UINT32);
13579 cmdline_parse_token_string_t cmd_vf_promisc_on_off =
13580 	TOKEN_STRING_INITIALIZER
13581 		(struct cmd_vf_promisc_result,
13582 		 on_off, "on#off");
13583 
13584 static void
13585 cmd_set_vf_promisc_parsed(
13586 	void *parsed_result,
13587 	__rte_unused struct cmdline *cl,
13588 	__rte_unused void *data)
13589 {
13590 	struct cmd_vf_promisc_result *res = parsed_result;
13591 	int ret = -ENOTSUP;
13592 
13593 	__rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
13594 
13595 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
13596 		return;
13597 
13598 #ifdef RTE_NET_I40E
13599 	ret = rte_pmd_i40e_set_vf_unicast_promisc(res->port_id,
13600 						  res->vf_id, is_on);
13601 #endif
13602 
13603 	switch (ret) {
13604 	case 0:
13605 		break;
13606 	case -EINVAL:
13607 		printf("invalid vf_id %d\n", res->vf_id);
13608 		break;
13609 	case -ENODEV:
13610 		printf("invalid port_id %d\n", res->port_id);
13611 		break;
13612 	case -ENOTSUP:
13613 		printf("function not implemented\n");
13614 		break;
13615 	default:
13616 		printf("programming error: (%s)\n", strerror(-ret));
13617 	}
13618 }
13619 
13620 cmdline_parse_inst_t cmd_set_vf_promisc = {
13621 	.f = cmd_set_vf_promisc_parsed,
13622 	.data = NULL,
13623 	.help_str = "set vf promisc <port_id> <vf_id> on|off: "
13624 		"Set unicast promiscuous mode for a VF from the PF",
13625 	.tokens = {
13626 		(void *)&cmd_vf_promisc_set,
13627 		(void *)&cmd_vf_promisc_vf,
13628 		(void *)&cmd_vf_promisc_promisc,
13629 		(void *)&cmd_vf_promisc_port_id,
13630 		(void *)&cmd_vf_promisc_vf_id,
13631 		(void *)&cmd_vf_promisc_on_off,
13632 		NULL,
13633 	},
13634 };
13635 
13636 /* VF multicast promiscuous mode configuration */
13637 
13638 /* Common result structure for VF multicast promiscuous mode */
13639 struct cmd_vf_allmulti_result {
13640 	cmdline_fixed_string_t set;
13641 	cmdline_fixed_string_t vf;
13642 	cmdline_fixed_string_t allmulti;
13643 	portid_t port_id;
13644 	uint32_t vf_id;
13645 	cmdline_fixed_string_t on_off;
13646 };
13647 
13648 /* Common CLI fields for VF multicast promiscuous mode enable disable */
13649 cmdline_parse_token_string_t cmd_vf_allmulti_set =
13650 	TOKEN_STRING_INITIALIZER
13651 		(struct cmd_vf_allmulti_result,
13652 		 set, "set");
13653 cmdline_parse_token_string_t cmd_vf_allmulti_vf =
13654 	TOKEN_STRING_INITIALIZER
13655 		(struct cmd_vf_allmulti_result,
13656 		 vf, "vf");
13657 cmdline_parse_token_string_t cmd_vf_allmulti_allmulti =
13658 	TOKEN_STRING_INITIALIZER
13659 		(struct cmd_vf_allmulti_result,
13660 		 allmulti, "allmulti");
13661 cmdline_parse_token_num_t cmd_vf_allmulti_port_id =
13662 	TOKEN_NUM_INITIALIZER
13663 		(struct cmd_vf_allmulti_result,
13664 		 port_id, UINT16);
13665 cmdline_parse_token_num_t cmd_vf_allmulti_vf_id =
13666 	TOKEN_NUM_INITIALIZER
13667 		(struct cmd_vf_allmulti_result,
13668 		 vf_id, UINT32);
13669 cmdline_parse_token_string_t cmd_vf_allmulti_on_off =
13670 	TOKEN_STRING_INITIALIZER
13671 		(struct cmd_vf_allmulti_result,
13672 		 on_off, "on#off");
13673 
13674 static void
13675 cmd_set_vf_allmulti_parsed(
13676 	void *parsed_result,
13677 	__rte_unused struct cmdline *cl,
13678 	__rte_unused void *data)
13679 {
13680 	struct cmd_vf_allmulti_result *res = parsed_result;
13681 	int ret = -ENOTSUP;
13682 
13683 	__rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
13684 
13685 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
13686 		return;
13687 
13688 #ifdef RTE_NET_I40E
13689 	ret = rte_pmd_i40e_set_vf_multicast_promisc(res->port_id,
13690 						    res->vf_id, is_on);
13691 #endif
13692 
13693 	switch (ret) {
13694 	case 0:
13695 		break;
13696 	case -EINVAL:
13697 		printf("invalid vf_id %d\n", res->vf_id);
13698 		break;
13699 	case -ENODEV:
13700 		printf("invalid port_id %d\n", res->port_id);
13701 		break;
13702 	case -ENOTSUP:
13703 		printf("function not implemented\n");
13704 		break;
13705 	default:
13706 		printf("programming error: (%s)\n", strerror(-ret));
13707 	}
13708 }
13709 
13710 cmdline_parse_inst_t cmd_set_vf_allmulti = {
13711 	.f = cmd_set_vf_allmulti_parsed,
13712 	.data = NULL,
13713 	.help_str = "set vf allmulti <port_id> <vf_id> on|off: "
13714 		"Set multicast promiscuous mode for a VF from the PF",
13715 	.tokens = {
13716 		(void *)&cmd_vf_allmulti_set,
13717 		(void *)&cmd_vf_allmulti_vf,
13718 		(void *)&cmd_vf_allmulti_allmulti,
13719 		(void *)&cmd_vf_allmulti_port_id,
13720 		(void *)&cmd_vf_allmulti_vf_id,
13721 		(void *)&cmd_vf_allmulti_on_off,
13722 		NULL,
13723 	},
13724 };
13725 
13726 /* vf broadcast mode configuration */
13727 
13728 /* Common result structure for vf broadcast */
13729 struct cmd_set_vf_broadcast_result {
13730 	cmdline_fixed_string_t set;
13731 	cmdline_fixed_string_t vf;
13732 	cmdline_fixed_string_t broadcast;
13733 	portid_t port_id;
13734 	uint16_t vf_id;
13735 	cmdline_fixed_string_t on_off;
13736 };
13737 
13738 /* Common CLI fields for vf broadcast enable disable */
13739 cmdline_parse_token_string_t cmd_set_vf_broadcast_set =
13740 	TOKEN_STRING_INITIALIZER
13741 		(struct cmd_set_vf_broadcast_result,
13742 		 set, "set");
13743 cmdline_parse_token_string_t cmd_set_vf_broadcast_vf =
13744 	TOKEN_STRING_INITIALIZER
13745 		(struct cmd_set_vf_broadcast_result,
13746 		 vf, "vf");
13747 cmdline_parse_token_string_t cmd_set_vf_broadcast_broadcast =
13748 	TOKEN_STRING_INITIALIZER
13749 		(struct cmd_set_vf_broadcast_result,
13750 		 broadcast, "broadcast");
13751 cmdline_parse_token_num_t cmd_set_vf_broadcast_port_id =
13752 	TOKEN_NUM_INITIALIZER
13753 		(struct cmd_set_vf_broadcast_result,
13754 		 port_id, UINT16);
13755 cmdline_parse_token_num_t cmd_set_vf_broadcast_vf_id =
13756 	TOKEN_NUM_INITIALIZER
13757 		(struct cmd_set_vf_broadcast_result,
13758 		 vf_id, UINT16);
13759 cmdline_parse_token_string_t cmd_set_vf_broadcast_on_off =
13760 	TOKEN_STRING_INITIALIZER
13761 		(struct cmd_set_vf_broadcast_result,
13762 		 on_off, "on#off");
13763 
13764 static void
13765 cmd_set_vf_broadcast_parsed(
13766 	void *parsed_result,
13767 	__rte_unused struct cmdline *cl,
13768 	__rte_unused void *data)
13769 {
13770 	struct cmd_set_vf_broadcast_result *res = parsed_result;
13771 	int ret = -ENOTSUP;
13772 
13773 	__rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
13774 
13775 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
13776 		return;
13777 
13778 #ifdef RTE_NET_I40E
13779 	ret = rte_pmd_i40e_set_vf_broadcast(res->port_id,
13780 					    res->vf_id, is_on);
13781 #endif
13782 
13783 	switch (ret) {
13784 	case 0:
13785 		break;
13786 	case -EINVAL:
13787 		printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on);
13788 		break;
13789 	case -ENODEV:
13790 		printf("invalid port_id %d\n", res->port_id);
13791 		break;
13792 	case -ENOTSUP:
13793 		printf("function not implemented\n");
13794 		break;
13795 	default:
13796 		printf("programming error: (%s)\n", strerror(-ret));
13797 	}
13798 }
13799 
13800 cmdline_parse_inst_t cmd_set_vf_broadcast = {
13801 	.f = cmd_set_vf_broadcast_parsed,
13802 	.data = NULL,
13803 	.help_str = "set vf broadcast <port_id> <vf_id> on|off",
13804 	.tokens = {
13805 		(void *)&cmd_set_vf_broadcast_set,
13806 		(void *)&cmd_set_vf_broadcast_vf,
13807 		(void *)&cmd_set_vf_broadcast_broadcast,
13808 		(void *)&cmd_set_vf_broadcast_port_id,
13809 		(void *)&cmd_set_vf_broadcast_vf_id,
13810 		(void *)&cmd_set_vf_broadcast_on_off,
13811 		NULL,
13812 	},
13813 };
13814 
13815 /* vf vlan tag configuration */
13816 
13817 /* Common result structure for vf vlan tag */
13818 struct cmd_set_vf_vlan_tag_result {
13819 	cmdline_fixed_string_t set;
13820 	cmdline_fixed_string_t vf;
13821 	cmdline_fixed_string_t vlan;
13822 	cmdline_fixed_string_t tag;
13823 	portid_t port_id;
13824 	uint16_t vf_id;
13825 	cmdline_fixed_string_t on_off;
13826 };
13827 
13828 /* Common CLI fields for vf vlan tag enable disable */
13829 cmdline_parse_token_string_t cmd_set_vf_vlan_tag_set =
13830 	TOKEN_STRING_INITIALIZER
13831 		(struct cmd_set_vf_vlan_tag_result,
13832 		 set, "set");
13833 cmdline_parse_token_string_t cmd_set_vf_vlan_tag_vf =
13834 	TOKEN_STRING_INITIALIZER
13835 		(struct cmd_set_vf_vlan_tag_result,
13836 		 vf, "vf");
13837 cmdline_parse_token_string_t cmd_set_vf_vlan_tag_vlan =
13838 	TOKEN_STRING_INITIALIZER
13839 		(struct cmd_set_vf_vlan_tag_result,
13840 		 vlan, "vlan");
13841 cmdline_parse_token_string_t cmd_set_vf_vlan_tag_tag =
13842 	TOKEN_STRING_INITIALIZER
13843 		(struct cmd_set_vf_vlan_tag_result,
13844 		 tag, "tag");
13845 cmdline_parse_token_num_t cmd_set_vf_vlan_tag_port_id =
13846 	TOKEN_NUM_INITIALIZER
13847 		(struct cmd_set_vf_vlan_tag_result,
13848 		 port_id, UINT16);
13849 cmdline_parse_token_num_t cmd_set_vf_vlan_tag_vf_id =
13850 	TOKEN_NUM_INITIALIZER
13851 		(struct cmd_set_vf_vlan_tag_result,
13852 		 vf_id, UINT16);
13853 cmdline_parse_token_string_t cmd_set_vf_vlan_tag_on_off =
13854 	TOKEN_STRING_INITIALIZER
13855 		(struct cmd_set_vf_vlan_tag_result,
13856 		 on_off, "on#off");
13857 
13858 static void
13859 cmd_set_vf_vlan_tag_parsed(
13860 	void *parsed_result,
13861 	__rte_unused struct cmdline *cl,
13862 	__rte_unused void *data)
13863 {
13864 	struct cmd_set_vf_vlan_tag_result *res = parsed_result;
13865 	int ret = -ENOTSUP;
13866 
13867 	__rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
13868 
13869 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
13870 		return;
13871 
13872 #ifdef RTE_NET_I40E
13873 	ret = rte_pmd_i40e_set_vf_vlan_tag(res->port_id,
13874 					   res->vf_id, is_on);
13875 #endif
13876 
13877 	switch (ret) {
13878 	case 0:
13879 		break;
13880 	case -EINVAL:
13881 		printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on);
13882 		break;
13883 	case -ENODEV:
13884 		printf("invalid port_id %d\n", res->port_id);
13885 		break;
13886 	case -ENOTSUP:
13887 		printf("function not implemented\n");
13888 		break;
13889 	default:
13890 		printf("programming error: (%s)\n", strerror(-ret));
13891 	}
13892 }
13893 
13894 cmdline_parse_inst_t cmd_set_vf_vlan_tag = {
13895 	.f = cmd_set_vf_vlan_tag_parsed,
13896 	.data = NULL,
13897 	.help_str = "set vf vlan tag <port_id> <vf_id> on|off",
13898 	.tokens = {
13899 		(void *)&cmd_set_vf_vlan_tag_set,
13900 		(void *)&cmd_set_vf_vlan_tag_vf,
13901 		(void *)&cmd_set_vf_vlan_tag_vlan,
13902 		(void *)&cmd_set_vf_vlan_tag_tag,
13903 		(void *)&cmd_set_vf_vlan_tag_port_id,
13904 		(void *)&cmd_set_vf_vlan_tag_vf_id,
13905 		(void *)&cmd_set_vf_vlan_tag_on_off,
13906 		NULL,
13907 	},
13908 };
13909 
13910 /* Common definition of VF and TC TX bandwidth configuration */
13911 struct cmd_vf_tc_bw_result {
13912 	cmdline_fixed_string_t set;
13913 	cmdline_fixed_string_t vf;
13914 	cmdline_fixed_string_t tc;
13915 	cmdline_fixed_string_t tx;
13916 	cmdline_fixed_string_t min_bw;
13917 	cmdline_fixed_string_t max_bw;
13918 	cmdline_fixed_string_t strict_link_prio;
13919 	portid_t port_id;
13920 	uint16_t vf_id;
13921 	uint8_t tc_no;
13922 	uint32_t bw;
13923 	cmdline_fixed_string_t bw_list;
13924 	uint8_t tc_map;
13925 };
13926 
13927 cmdline_parse_token_string_t cmd_vf_tc_bw_set =
13928 	TOKEN_STRING_INITIALIZER
13929 		(struct cmd_vf_tc_bw_result,
13930 		 set, "set");
13931 cmdline_parse_token_string_t cmd_vf_tc_bw_vf =
13932 	TOKEN_STRING_INITIALIZER
13933 		(struct cmd_vf_tc_bw_result,
13934 		 vf, "vf");
13935 cmdline_parse_token_string_t cmd_vf_tc_bw_tc =
13936 	TOKEN_STRING_INITIALIZER
13937 		(struct cmd_vf_tc_bw_result,
13938 		 tc, "tc");
13939 cmdline_parse_token_string_t cmd_vf_tc_bw_tx =
13940 	TOKEN_STRING_INITIALIZER
13941 		(struct cmd_vf_tc_bw_result,
13942 		 tx, "tx");
13943 cmdline_parse_token_string_t cmd_vf_tc_bw_strict_link_prio =
13944 	TOKEN_STRING_INITIALIZER
13945 		(struct cmd_vf_tc_bw_result,
13946 		 strict_link_prio, "strict-link-priority");
13947 cmdline_parse_token_string_t cmd_vf_tc_bw_min_bw =
13948 	TOKEN_STRING_INITIALIZER
13949 		(struct cmd_vf_tc_bw_result,
13950 		 min_bw, "min-bandwidth");
13951 cmdline_parse_token_string_t cmd_vf_tc_bw_max_bw =
13952 	TOKEN_STRING_INITIALIZER
13953 		(struct cmd_vf_tc_bw_result,
13954 		 max_bw, "max-bandwidth");
13955 cmdline_parse_token_num_t cmd_vf_tc_bw_port_id =
13956 	TOKEN_NUM_INITIALIZER
13957 		(struct cmd_vf_tc_bw_result,
13958 		 port_id, UINT16);
13959 cmdline_parse_token_num_t cmd_vf_tc_bw_vf_id =
13960 	TOKEN_NUM_INITIALIZER
13961 		(struct cmd_vf_tc_bw_result,
13962 		 vf_id, UINT16);
13963 cmdline_parse_token_num_t cmd_vf_tc_bw_tc_no =
13964 	TOKEN_NUM_INITIALIZER
13965 		(struct cmd_vf_tc_bw_result,
13966 		 tc_no, UINT8);
13967 cmdline_parse_token_num_t cmd_vf_tc_bw_bw =
13968 	TOKEN_NUM_INITIALIZER
13969 		(struct cmd_vf_tc_bw_result,
13970 		 bw, UINT32);
13971 cmdline_parse_token_string_t cmd_vf_tc_bw_bw_list =
13972 	TOKEN_STRING_INITIALIZER
13973 		(struct cmd_vf_tc_bw_result,
13974 		 bw_list, NULL);
13975 cmdline_parse_token_num_t cmd_vf_tc_bw_tc_map =
13976 	TOKEN_NUM_INITIALIZER
13977 		(struct cmd_vf_tc_bw_result,
13978 		 tc_map, UINT8);
13979 
13980 /* VF max bandwidth setting */
13981 static void
13982 cmd_vf_max_bw_parsed(
13983 	void *parsed_result,
13984 	__rte_unused struct cmdline *cl,
13985 	__rte_unused void *data)
13986 {
13987 	struct cmd_vf_tc_bw_result *res = parsed_result;
13988 	int ret = -ENOTSUP;
13989 
13990 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
13991 		return;
13992 
13993 #ifdef RTE_NET_I40E
13994 	ret = rte_pmd_i40e_set_vf_max_bw(res->port_id,
13995 					 res->vf_id, res->bw);
13996 #endif
13997 
13998 	switch (ret) {
13999 	case 0:
14000 		break;
14001 	case -EINVAL:
14002 		printf("invalid vf_id %d or bandwidth %d\n",
14003 		       res->vf_id, res->bw);
14004 		break;
14005 	case -ENODEV:
14006 		printf("invalid port_id %d\n", res->port_id);
14007 		break;
14008 	case -ENOTSUP:
14009 		printf("function not implemented\n");
14010 		break;
14011 	default:
14012 		printf("programming error: (%s)\n", strerror(-ret));
14013 	}
14014 }
14015 
14016 cmdline_parse_inst_t cmd_vf_max_bw = {
14017 	.f = cmd_vf_max_bw_parsed,
14018 	.data = NULL,
14019 	.help_str = "set vf tx max-bandwidth <port_id> <vf_id> <bandwidth>",
14020 	.tokens = {
14021 		(void *)&cmd_vf_tc_bw_set,
14022 		(void *)&cmd_vf_tc_bw_vf,
14023 		(void *)&cmd_vf_tc_bw_tx,
14024 		(void *)&cmd_vf_tc_bw_max_bw,
14025 		(void *)&cmd_vf_tc_bw_port_id,
14026 		(void *)&cmd_vf_tc_bw_vf_id,
14027 		(void *)&cmd_vf_tc_bw_bw,
14028 		NULL,
14029 	},
14030 };
14031 
14032 static int
14033 vf_tc_min_bw_parse_bw_list(uint8_t *bw_list,
14034 			   uint8_t *tc_num,
14035 			   char *str)
14036 {
14037 	uint32_t size;
14038 	const char *p, *p0 = str;
14039 	char s[256];
14040 	char *end;
14041 	char *str_fld[16];
14042 	uint16_t i;
14043 	int ret;
14044 
14045 	p = strchr(p0, '(');
14046 	if (p == NULL) {
14047 		printf("The bandwidth-list should be '(bw1, bw2, ...)'\n");
14048 		return -1;
14049 	}
14050 	p++;
14051 	p0 = strchr(p, ')');
14052 	if (p0 == NULL) {
14053 		printf("The bandwidth-list should be '(bw1, bw2, ...)'\n");
14054 		return -1;
14055 	}
14056 	size = p0 - p;
14057 	if (size >= sizeof(s)) {
14058 		printf("The string size exceeds the internal buffer size\n");
14059 		return -1;
14060 	}
14061 	snprintf(s, sizeof(s), "%.*s", size, p);
14062 	ret = rte_strsplit(s, sizeof(s), str_fld, 16, ',');
14063 	if (ret <= 0) {
14064 		printf("Failed to get the bandwidth list. ");
14065 		return -1;
14066 	}
14067 	*tc_num = ret;
14068 	for (i = 0; i < ret; i++)
14069 		bw_list[i] = (uint8_t)strtoul(str_fld[i], &end, 0);
14070 
14071 	return 0;
14072 }
14073 
14074 /* TC min bandwidth setting */
14075 static void
14076 cmd_vf_tc_min_bw_parsed(
14077 	void *parsed_result,
14078 	__rte_unused struct cmdline *cl,
14079 	__rte_unused void *data)
14080 {
14081 	struct cmd_vf_tc_bw_result *res = parsed_result;
14082 	uint8_t tc_num;
14083 	uint8_t bw[16];
14084 	int ret = -ENOTSUP;
14085 
14086 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
14087 		return;
14088 
14089 	ret = vf_tc_min_bw_parse_bw_list(bw, &tc_num, res->bw_list);
14090 	if (ret)
14091 		return;
14092 
14093 #ifdef RTE_NET_I40E
14094 	ret = rte_pmd_i40e_set_vf_tc_bw_alloc(res->port_id, res->vf_id,
14095 					      tc_num, bw);
14096 #endif
14097 
14098 	switch (ret) {
14099 	case 0:
14100 		break;
14101 	case -EINVAL:
14102 		printf("invalid vf_id %d or bandwidth\n", res->vf_id);
14103 		break;
14104 	case -ENODEV:
14105 		printf("invalid port_id %d\n", res->port_id);
14106 		break;
14107 	case -ENOTSUP:
14108 		printf("function not implemented\n");
14109 		break;
14110 	default:
14111 		printf("programming error: (%s)\n", strerror(-ret));
14112 	}
14113 }
14114 
14115 cmdline_parse_inst_t cmd_vf_tc_min_bw = {
14116 	.f = cmd_vf_tc_min_bw_parsed,
14117 	.data = NULL,
14118 	.help_str = "set vf tc tx min-bandwidth <port_id> <vf_id>"
14119 		    " <bw1, bw2, ...>",
14120 	.tokens = {
14121 		(void *)&cmd_vf_tc_bw_set,
14122 		(void *)&cmd_vf_tc_bw_vf,
14123 		(void *)&cmd_vf_tc_bw_tc,
14124 		(void *)&cmd_vf_tc_bw_tx,
14125 		(void *)&cmd_vf_tc_bw_min_bw,
14126 		(void *)&cmd_vf_tc_bw_port_id,
14127 		(void *)&cmd_vf_tc_bw_vf_id,
14128 		(void *)&cmd_vf_tc_bw_bw_list,
14129 		NULL,
14130 	},
14131 };
14132 
14133 static void
14134 cmd_tc_min_bw_parsed(
14135 	void *parsed_result,
14136 	__rte_unused struct cmdline *cl,
14137 	__rte_unused void *data)
14138 {
14139 	struct cmd_vf_tc_bw_result *res = parsed_result;
14140 	struct rte_port *port;
14141 	uint8_t tc_num;
14142 	uint8_t bw[16];
14143 	int ret = -ENOTSUP;
14144 
14145 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
14146 		return;
14147 
14148 	port = &ports[res->port_id];
14149 	/** Check if the port is not started **/
14150 	if (port->port_status != RTE_PORT_STOPPED) {
14151 		printf("Please stop port %d first\n", res->port_id);
14152 		return;
14153 	}
14154 
14155 	ret = vf_tc_min_bw_parse_bw_list(bw, &tc_num, res->bw_list);
14156 	if (ret)
14157 		return;
14158 
14159 #ifdef RTE_NET_IXGBE
14160 	ret = rte_pmd_ixgbe_set_tc_bw_alloc(res->port_id, tc_num, bw);
14161 #endif
14162 
14163 	switch (ret) {
14164 	case 0:
14165 		break;
14166 	case -EINVAL:
14167 		printf("invalid bandwidth\n");
14168 		break;
14169 	case -ENODEV:
14170 		printf("invalid port_id %d\n", res->port_id);
14171 		break;
14172 	case -ENOTSUP:
14173 		printf("function not implemented\n");
14174 		break;
14175 	default:
14176 		printf("programming error: (%s)\n", strerror(-ret));
14177 	}
14178 }
14179 
14180 cmdline_parse_inst_t cmd_tc_min_bw = {
14181 	.f = cmd_tc_min_bw_parsed,
14182 	.data = NULL,
14183 	.help_str = "set tc tx min-bandwidth <port_id> <bw1, bw2, ...>",
14184 	.tokens = {
14185 		(void *)&cmd_vf_tc_bw_set,
14186 		(void *)&cmd_vf_tc_bw_tc,
14187 		(void *)&cmd_vf_tc_bw_tx,
14188 		(void *)&cmd_vf_tc_bw_min_bw,
14189 		(void *)&cmd_vf_tc_bw_port_id,
14190 		(void *)&cmd_vf_tc_bw_bw_list,
14191 		NULL,
14192 	},
14193 };
14194 
14195 /* TC max bandwidth setting */
14196 static void
14197 cmd_vf_tc_max_bw_parsed(
14198 	void *parsed_result,
14199 	__rte_unused struct cmdline *cl,
14200 	__rte_unused void *data)
14201 {
14202 	struct cmd_vf_tc_bw_result *res = parsed_result;
14203 	int ret = -ENOTSUP;
14204 
14205 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
14206 		return;
14207 
14208 #ifdef RTE_NET_I40E
14209 	ret = rte_pmd_i40e_set_vf_tc_max_bw(res->port_id, res->vf_id,
14210 					    res->tc_no, res->bw);
14211 #endif
14212 
14213 	switch (ret) {
14214 	case 0:
14215 		break;
14216 	case -EINVAL:
14217 		printf("invalid vf_id %d, tc_no %d or bandwidth %d\n",
14218 		       res->vf_id, res->tc_no, res->bw);
14219 		break;
14220 	case -ENODEV:
14221 		printf("invalid port_id %d\n", res->port_id);
14222 		break;
14223 	case -ENOTSUP:
14224 		printf("function not implemented\n");
14225 		break;
14226 	default:
14227 		printf("programming error: (%s)\n", strerror(-ret));
14228 	}
14229 }
14230 
14231 cmdline_parse_inst_t cmd_vf_tc_max_bw = {
14232 	.f = cmd_vf_tc_max_bw_parsed,
14233 	.data = NULL,
14234 	.help_str = "set vf tc tx max-bandwidth <port_id> <vf_id> <tc_no>"
14235 		    " <bandwidth>",
14236 	.tokens = {
14237 		(void *)&cmd_vf_tc_bw_set,
14238 		(void *)&cmd_vf_tc_bw_vf,
14239 		(void *)&cmd_vf_tc_bw_tc,
14240 		(void *)&cmd_vf_tc_bw_tx,
14241 		(void *)&cmd_vf_tc_bw_max_bw,
14242 		(void *)&cmd_vf_tc_bw_port_id,
14243 		(void *)&cmd_vf_tc_bw_vf_id,
14244 		(void *)&cmd_vf_tc_bw_tc_no,
14245 		(void *)&cmd_vf_tc_bw_bw,
14246 		NULL,
14247 	},
14248 };
14249 
14250 /** Set VXLAN encapsulation details */
14251 struct cmd_set_vxlan_result {
14252 	cmdline_fixed_string_t set;
14253 	cmdline_fixed_string_t vxlan;
14254 	cmdline_fixed_string_t pos_token;
14255 	cmdline_fixed_string_t ip_version;
14256 	uint32_t vlan_present:1;
14257 	uint32_t vni;
14258 	uint16_t udp_src;
14259 	uint16_t udp_dst;
14260 	cmdline_ipaddr_t ip_src;
14261 	cmdline_ipaddr_t ip_dst;
14262 	uint16_t tci;
14263 	uint8_t tos;
14264 	uint8_t ttl;
14265 	struct rte_ether_addr eth_src;
14266 	struct rte_ether_addr eth_dst;
14267 };
14268 
14269 cmdline_parse_token_string_t cmd_set_vxlan_set =
14270 	TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, set, "set");
14271 cmdline_parse_token_string_t cmd_set_vxlan_vxlan =
14272 	TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, vxlan, "vxlan");
14273 cmdline_parse_token_string_t cmd_set_vxlan_vxlan_tos_ttl =
14274 	TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, vxlan,
14275 				 "vxlan-tos-ttl");
14276 cmdline_parse_token_string_t cmd_set_vxlan_vxlan_with_vlan =
14277 	TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, vxlan,
14278 				 "vxlan-with-vlan");
14279 cmdline_parse_token_string_t cmd_set_vxlan_ip_version =
14280 	TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token,
14281 				 "ip-version");
14282 cmdline_parse_token_string_t cmd_set_vxlan_ip_version_value =
14283 	TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, ip_version,
14284 				 "ipv4#ipv6");
14285 cmdline_parse_token_string_t cmd_set_vxlan_vni =
14286 	TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token,
14287 				 "vni");
14288 cmdline_parse_token_num_t cmd_set_vxlan_vni_value =
14289 	TOKEN_NUM_INITIALIZER(struct cmd_set_vxlan_result, vni, UINT32);
14290 cmdline_parse_token_string_t cmd_set_vxlan_udp_src =
14291 	TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token,
14292 				 "udp-src");
14293 cmdline_parse_token_num_t cmd_set_vxlan_udp_src_value =
14294 	TOKEN_NUM_INITIALIZER(struct cmd_set_vxlan_result, udp_src, UINT16);
14295 cmdline_parse_token_string_t cmd_set_vxlan_udp_dst =
14296 	TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token,
14297 				 "udp-dst");
14298 cmdline_parse_token_num_t cmd_set_vxlan_udp_dst_value =
14299 	TOKEN_NUM_INITIALIZER(struct cmd_set_vxlan_result, udp_dst, UINT16);
14300 cmdline_parse_token_string_t cmd_set_vxlan_ip_tos =
14301 	TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token,
14302 				 "ip-tos");
14303 cmdline_parse_token_num_t cmd_set_vxlan_ip_tos_value =
14304 	TOKEN_NUM_INITIALIZER(struct cmd_set_vxlan_result, tos, UINT8);
14305 cmdline_parse_token_string_t cmd_set_vxlan_ip_ttl =
14306 	TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token,
14307 				 "ip-ttl");
14308 cmdline_parse_token_num_t cmd_set_vxlan_ip_ttl_value =
14309 	TOKEN_NUM_INITIALIZER(struct cmd_set_vxlan_result, ttl, UINT8);
14310 cmdline_parse_token_string_t cmd_set_vxlan_ip_src =
14311 	TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token,
14312 				 "ip-src");
14313 cmdline_parse_token_ipaddr_t cmd_set_vxlan_ip_src_value =
14314 	TOKEN_IPADDR_INITIALIZER(struct cmd_set_vxlan_result, ip_src);
14315 cmdline_parse_token_string_t cmd_set_vxlan_ip_dst =
14316 	TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token,
14317 				 "ip-dst");
14318 cmdline_parse_token_ipaddr_t cmd_set_vxlan_ip_dst_value =
14319 	TOKEN_IPADDR_INITIALIZER(struct cmd_set_vxlan_result, ip_dst);
14320 cmdline_parse_token_string_t cmd_set_vxlan_vlan =
14321 	TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token,
14322 				 "vlan-tci");
14323 cmdline_parse_token_num_t cmd_set_vxlan_vlan_value =
14324 	TOKEN_NUM_INITIALIZER(struct cmd_set_vxlan_result, tci, UINT16);
14325 cmdline_parse_token_string_t cmd_set_vxlan_eth_src =
14326 	TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token,
14327 				 "eth-src");
14328 cmdline_parse_token_etheraddr_t cmd_set_vxlan_eth_src_value =
14329 	TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_vxlan_result, eth_src);
14330 cmdline_parse_token_string_t cmd_set_vxlan_eth_dst =
14331 	TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token,
14332 				 "eth-dst");
14333 cmdline_parse_token_etheraddr_t cmd_set_vxlan_eth_dst_value =
14334 	TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_vxlan_result, eth_dst);
14335 
14336 static void cmd_set_vxlan_parsed(void *parsed_result,
14337 	__rte_unused struct cmdline *cl,
14338 	__rte_unused void *data)
14339 {
14340 	struct cmd_set_vxlan_result *res = parsed_result;
14341 	union {
14342 		uint32_t vxlan_id;
14343 		uint8_t vni[4];
14344 	} id = {
14345 		.vxlan_id = rte_cpu_to_be_32(res->vni) & RTE_BE32(0x00ffffff),
14346 	};
14347 
14348 	vxlan_encap_conf.select_tos_ttl = 0;
14349 	if (strcmp(res->vxlan, "vxlan") == 0)
14350 		vxlan_encap_conf.select_vlan = 0;
14351 	else if (strcmp(res->vxlan, "vxlan-with-vlan") == 0)
14352 		vxlan_encap_conf.select_vlan = 1;
14353 	else if (strcmp(res->vxlan, "vxlan-tos-ttl") == 0) {
14354 		vxlan_encap_conf.select_vlan = 0;
14355 		vxlan_encap_conf.select_tos_ttl = 1;
14356 	}
14357 	if (strcmp(res->ip_version, "ipv4") == 0)
14358 		vxlan_encap_conf.select_ipv4 = 1;
14359 	else if (strcmp(res->ip_version, "ipv6") == 0)
14360 		vxlan_encap_conf.select_ipv4 = 0;
14361 	else
14362 		return;
14363 	rte_memcpy(vxlan_encap_conf.vni, &id.vni[1], 3);
14364 	vxlan_encap_conf.udp_src = rte_cpu_to_be_16(res->udp_src);
14365 	vxlan_encap_conf.udp_dst = rte_cpu_to_be_16(res->udp_dst);
14366 	vxlan_encap_conf.ip_tos = res->tos;
14367 	vxlan_encap_conf.ip_ttl = res->ttl;
14368 	if (vxlan_encap_conf.select_ipv4) {
14369 		IPV4_ADDR_TO_UINT(res->ip_src, vxlan_encap_conf.ipv4_src);
14370 		IPV4_ADDR_TO_UINT(res->ip_dst, vxlan_encap_conf.ipv4_dst);
14371 	} else {
14372 		IPV6_ADDR_TO_ARRAY(res->ip_src, vxlan_encap_conf.ipv6_src);
14373 		IPV6_ADDR_TO_ARRAY(res->ip_dst, vxlan_encap_conf.ipv6_dst);
14374 	}
14375 	if (vxlan_encap_conf.select_vlan)
14376 		vxlan_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci);
14377 	rte_memcpy(vxlan_encap_conf.eth_src, res->eth_src.addr_bytes,
14378 		   RTE_ETHER_ADDR_LEN);
14379 	rte_memcpy(vxlan_encap_conf.eth_dst, res->eth_dst.addr_bytes,
14380 		   RTE_ETHER_ADDR_LEN);
14381 }
14382 
14383 cmdline_parse_inst_t cmd_set_vxlan = {
14384 	.f = cmd_set_vxlan_parsed,
14385 	.data = NULL,
14386 	.help_str = "set vxlan ip-version ipv4|ipv6 vni <vni> udp-src"
14387 		" <udp-src> udp-dst <udp-dst> ip-src <ip-src> ip-dst <ip-dst>"
14388 		" eth-src <eth-src> eth-dst <eth-dst>",
14389 	.tokens = {
14390 		(void *)&cmd_set_vxlan_set,
14391 		(void *)&cmd_set_vxlan_vxlan,
14392 		(void *)&cmd_set_vxlan_ip_version,
14393 		(void *)&cmd_set_vxlan_ip_version_value,
14394 		(void *)&cmd_set_vxlan_vni,
14395 		(void *)&cmd_set_vxlan_vni_value,
14396 		(void *)&cmd_set_vxlan_udp_src,
14397 		(void *)&cmd_set_vxlan_udp_src_value,
14398 		(void *)&cmd_set_vxlan_udp_dst,
14399 		(void *)&cmd_set_vxlan_udp_dst_value,
14400 		(void *)&cmd_set_vxlan_ip_src,
14401 		(void *)&cmd_set_vxlan_ip_src_value,
14402 		(void *)&cmd_set_vxlan_ip_dst,
14403 		(void *)&cmd_set_vxlan_ip_dst_value,
14404 		(void *)&cmd_set_vxlan_eth_src,
14405 		(void *)&cmd_set_vxlan_eth_src_value,
14406 		(void *)&cmd_set_vxlan_eth_dst,
14407 		(void *)&cmd_set_vxlan_eth_dst_value,
14408 		NULL,
14409 	},
14410 };
14411 
14412 cmdline_parse_inst_t cmd_set_vxlan_tos_ttl = {
14413 	.f = cmd_set_vxlan_parsed,
14414 	.data = NULL,
14415 	.help_str = "set vxlan-tos-ttl ip-version ipv4|ipv6 vni <vni> udp-src"
14416 		" <udp-src> udp-dst <udp-dst> ip-tos <ip-tos> ip-ttl <ip-ttl>"
14417 		" ip-src <ip-src> ip-dst <ip-dst> eth-src <eth-src>"
14418 		" eth-dst <eth-dst>",
14419 	.tokens = {
14420 		(void *)&cmd_set_vxlan_set,
14421 		(void *)&cmd_set_vxlan_vxlan_tos_ttl,
14422 		(void *)&cmd_set_vxlan_ip_version,
14423 		(void *)&cmd_set_vxlan_ip_version_value,
14424 		(void *)&cmd_set_vxlan_vni,
14425 		(void *)&cmd_set_vxlan_vni_value,
14426 		(void *)&cmd_set_vxlan_udp_src,
14427 		(void *)&cmd_set_vxlan_udp_src_value,
14428 		(void *)&cmd_set_vxlan_udp_dst,
14429 		(void *)&cmd_set_vxlan_udp_dst_value,
14430 		(void *)&cmd_set_vxlan_ip_tos,
14431 		(void *)&cmd_set_vxlan_ip_tos_value,
14432 		(void *)&cmd_set_vxlan_ip_ttl,
14433 		(void *)&cmd_set_vxlan_ip_ttl_value,
14434 		(void *)&cmd_set_vxlan_ip_src,
14435 		(void *)&cmd_set_vxlan_ip_src_value,
14436 		(void *)&cmd_set_vxlan_ip_dst,
14437 		(void *)&cmd_set_vxlan_ip_dst_value,
14438 		(void *)&cmd_set_vxlan_eth_src,
14439 		(void *)&cmd_set_vxlan_eth_src_value,
14440 		(void *)&cmd_set_vxlan_eth_dst,
14441 		(void *)&cmd_set_vxlan_eth_dst_value,
14442 		NULL,
14443 	},
14444 };
14445 
14446 cmdline_parse_inst_t cmd_set_vxlan_with_vlan = {
14447 	.f = cmd_set_vxlan_parsed,
14448 	.data = NULL,
14449 	.help_str = "set vxlan-with-vlan ip-version ipv4|ipv6 vni <vni>"
14450 		" udp-src <udp-src> udp-dst <udp-dst> ip-src <ip-src> ip-dst"
14451 		" <ip-dst> vlan-tci <vlan-tci> eth-src <eth-src> eth-dst"
14452 		" <eth-dst>",
14453 	.tokens = {
14454 		(void *)&cmd_set_vxlan_set,
14455 		(void *)&cmd_set_vxlan_vxlan_with_vlan,
14456 		(void *)&cmd_set_vxlan_ip_version,
14457 		(void *)&cmd_set_vxlan_ip_version_value,
14458 		(void *)&cmd_set_vxlan_vni,
14459 		(void *)&cmd_set_vxlan_vni_value,
14460 		(void *)&cmd_set_vxlan_udp_src,
14461 		(void *)&cmd_set_vxlan_udp_src_value,
14462 		(void *)&cmd_set_vxlan_udp_dst,
14463 		(void *)&cmd_set_vxlan_udp_dst_value,
14464 		(void *)&cmd_set_vxlan_ip_src,
14465 		(void *)&cmd_set_vxlan_ip_src_value,
14466 		(void *)&cmd_set_vxlan_ip_dst,
14467 		(void *)&cmd_set_vxlan_ip_dst_value,
14468 		(void *)&cmd_set_vxlan_vlan,
14469 		(void *)&cmd_set_vxlan_vlan_value,
14470 		(void *)&cmd_set_vxlan_eth_src,
14471 		(void *)&cmd_set_vxlan_eth_src_value,
14472 		(void *)&cmd_set_vxlan_eth_dst,
14473 		(void *)&cmd_set_vxlan_eth_dst_value,
14474 		NULL,
14475 	},
14476 };
14477 
14478 /** Set NVGRE encapsulation details */
14479 struct cmd_set_nvgre_result {
14480 	cmdline_fixed_string_t set;
14481 	cmdline_fixed_string_t nvgre;
14482 	cmdline_fixed_string_t pos_token;
14483 	cmdline_fixed_string_t ip_version;
14484 	uint32_t tni;
14485 	cmdline_ipaddr_t ip_src;
14486 	cmdline_ipaddr_t ip_dst;
14487 	uint16_t tci;
14488 	struct rte_ether_addr eth_src;
14489 	struct rte_ether_addr eth_dst;
14490 };
14491 
14492 cmdline_parse_token_string_t cmd_set_nvgre_set =
14493 	TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, set, "set");
14494 cmdline_parse_token_string_t cmd_set_nvgre_nvgre =
14495 	TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, nvgre, "nvgre");
14496 cmdline_parse_token_string_t cmd_set_nvgre_nvgre_with_vlan =
14497 	TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, nvgre,
14498 				 "nvgre-with-vlan");
14499 cmdline_parse_token_string_t cmd_set_nvgre_ip_version =
14500 	TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token,
14501 				 "ip-version");
14502 cmdline_parse_token_string_t cmd_set_nvgre_ip_version_value =
14503 	TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, ip_version,
14504 				 "ipv4#ipv6");
14505 cmdline_parse_token_string_t cmd_set_nvgre_tni =
14506 	TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token,
14507 				 "tni");
14508 cmdline_parse_token_num_t cmd_set_nvgre_tni_value =
14509 	TOKEN_NUM_INITIALIZER(struct cmd_set_nvgre_result, tni, UINT32);
14510 cmdline_parse_token_string_t cmd_set_nvgre_ip_src =
14511 	TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token,
14512 				 "ip-src");
14513 cmdline_parse_token_num_t cmd_set_nvgre_ip_src_value =
14514 	TOKEN_IPADDR_INITIALIZER(struct cmd_set_nvgre_result, ip_src);
14515 cmdline_parse_token_string_t cmd_set_nvgre_ip_dst =
14516 	TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token,
14517 				 "ip-dst");
14518 cmdline_parse_token_ipaddr_t cmd_set_nvgre_ip_dst_value =
14519 	TOKEN_IPADDR_INITIALIZER(struct cmd_set_nvgre_result, ip_dst);
14520 cmdline_parse_token_string_t cmd_set_nvgre_vlan =
14521 	TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token,
14522 				 "vlan-tci");
14523 cmdline_parse_token_num_t cmd_set_nvgre_vlan_value =
14524 	TOKEN_NUM_INITIALIZER(struct cmd_set_nvgre_result, tci, UINT16);
14525 cmdline_parse_token_string_t cmd_set_nvgre_eth_src =
14526 	TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token,
14527 				 "eth-src");
14528 cmdline_parse_token_etheraddr_t cmd_set_nvgre_eth_src_value =
14529 	TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_nvgre_result, eth_src);
14530 cmdline_parse_token_string_t cmd_set_nvgre_eth_dst =
14531 	TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token,
14532 				 "eth-dst");
14533 cmdline_parse_token_etheraddr_t cmd_set_nvgre_eth_dst_value =
14534 	TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_nvgre_result, eth_dst);
14535 
14536 static void cmd_set_nvgre_parsed(void *parsed_result,
14537 	__rte_unused struct cmdline *cl,
14538 	__rte_unused void *data)
14539 {
14540 	struct cmd_set_nvgre_result *res = parsed_result;
14541 	union {
14542 		uint32_t nvgre_tni;
14543 		uint8_t tni[4];
14544 	} id = {
14545 		.nvgre_tni = rte_cpu_to_be_32(res->tni) & RTE_BE32(0x00ffffff),
14546 	};
14547 
14548 	if (strcmp(res->nvgre, "nvgre") == 0)
14549 		nvgre_encap_conf.select_vlan = 0;
14550 	else if (strcmp(res->nvgre, "nvgre-with-vlan") == 0)
14551 		nvgre_encap_conf.select_vlan = 1;
14552 	if (strcmp(res->ip_version, "ipv4") == 0)
14553 		nvgre_encap_conf.select_ipv4 = 1;
14554 	else if (strcmp(res->ip_version, "ipv6") == 0)
14555 		nvgre_encap_conf.select_ipv4 = 0;
14556 	else
14557 		return;
14558 	rte_memcpy(nvgre_encap_conf.tni, &id.tni[1], 3);
14559 	if (nvgre_encap_conf.select_ipv4) {
14560 		IPV4_ADDR_TO_UINT(res->ip_src, nvgre_encap_conf.ipv4_src);
14561 		IPV4_ADDR_TO_UINT(res->ip_dst, nvgre_encap_conf.ipv4_dst);
14562 	} else {
14563 		IPV6_ADDR_TO_ARRAY(res->ip_src, nvgre_encap_conf.ipv6_src);
14564 		IPV6_ADDR_TO_ARRAY(res->ip_dst, nvgre_encap_conf.ipv6_dst);
14565 	}
14566 	if (nvgre_encap_conf.select_vlan)
14567 		nvgre_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci);
14568 	rte_memcpy(nvgre_encap_conf.eth_src, res->eth_src.addr_bytes,
14569 		   RTE_ETHER_ADDR_LEN);
14570 	rte_memcpy(nvgre_encap_conf.eth_dst, res->eth_dst.addr_bytes,
14571 		   RTE_ETHER_ADDR_LEN);
14572 }
14573 
14574 cmdline_parse_inst_t cmd_set_nvgre = {
14575 	.f = cmd_set_nvgre_parsed,
14576 	.data = NULL,
14577 	.help_str = "set nvgre ip-version <ipv4|ipv6> tni <tni> ip-src"
14578 		" <ip-src> ip-dst <ip-dst> eth-src <eth-src>"
14579 		" eth-dst <eth-dst>",
14580 	.tokens = {
14581 		(void *)&cmd_set_nvgre_set,
14582 		(void *)&cmd_set_nvgre_nvgre,
14583 		(void *)&cmd_set_nvgre_ip_version,
14584 		(void *)&cmd_set_nvgre_ip_version_value,
14585 		(void *)&cmd_set_nvgre_tni,
14586 		(void *)&cmd_set_nvgre_tni_value,
14587 		(void *)&cmd_set_nvgre_ip_src,
14588 		(void *)&cmd_set_nvgre_ip_src_value,
14589 		(void *)&cmd_set_nvgre_ip_dst,
14590 		(void *)&cmd_set_nvgre_ip_dst_value,
14591 		(void *)&cmd_set_nvgre_eth_src,
14592 		(void *)&cmd_set_nvgre_eth_src_value,
14593 		(void *)&cmd_set_nvgre_eth_dst,
14594 		(void *)&cmd_set_nvgre_eth_dst_value,
14595 		NULL,
14596 	},
14597 };
14598 
14599 cmdline_parse_inst_t cmd_set_nvgre_with_vlan = {
14600 	.f = cmd_set_nvgre_parsed,
14601 	.data = NULL,
14602 	.help_str = "set nvgre-with-vlan ip-version <ipv4|ipv6> tni <tni>"
14603 		" ip-src <ip-src> ip-dst <ip-dst> vlan-tci <vlan-tci>"
14604 		" eth-src <eth-src> eth-dst <eth-dst>",
14605 	.tokens = {
14606 		(void *)&cmd_set_nvgre_set,
14607 		(void *)&cmd_set_nvgre_nvgre_with_vlan,
14608 		(void *)&cmd_set_nvgre_ip_version,
14609 		(void *)&cmd_set_nvgre_ip_version_value,
14610 		(void *)&cmd_set_nvgre_tni,
14611 		(void *)&cmd_set_nvgre_tni_value,
14612 		(void *)&cmd_set_nvgre_ip_src,
14613 		(void *)&cmd_set_nvgre_ip_src_value,
14614 		(void *)&cmd_set_nvgre_ip_dst,
14615 		(void *)&cmd_set_nvgre_ip_dst_value,
14616 		(void *)&cmd_set_nvgre_vlan,
14617 		(void *)&cmd_set_nvgre_vlan_value,
14618 		(void *)&cmd_set_nvgre_eth_src,
14619 		(void *)&cmd_set_nvgre_eth_src_value,
14620 		(void *)&cmd_set_nvgre_eth_dst,
14621 		(void *)&cmd_set_nvgre_eth_dst_value,
14622 		NULL,
14623 	},
14624 };
14625 
14626 /** Set L2 encapsulation details */
14627 struct cmd_set_l2_encap_result {
14628 	cmdline_fixed_string_t set;
14629 	cmdline_fixed_string_t l2_encap;
14630 	cmdline_fixed_string_t pos_token;
14631 	cmdline_fixed_string_t ip_version;
14632 	uint32_t vlan_present:1;
14633 	uint16_t tci;
14634 	struct rte_ether_addr eth_src;
14635 	struct rte_ether_addr eth_dst;
14636 };
14637 
14638 cmdline_parse_token_string_t cmd_set_l2_encap_set =
14639 	TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, set, "set");
14640 cmdline_parse_token_string_t cmd_set_l2_encap_l2_encap =
14641 	TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, l2_encap, "l2_encap");
14642 cmdline_parse_token_string_t cmd_set_l2_encap_l2_encap_with_vlan =
14643 	TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, l2_encap,
14644 				 "l2_encap-with-vlan");
14645 cmdline_parse_token_string_t cmd_set_l2_encap_ip_version =
14646 	TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, pos_token,
14647 				 "ip-version");
14648 cmdline_parse_token_string_t cmd_set_l2_encap_ip_version_value =
14649 	TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, ip_version,
14650 				 "ipv4#ipv6");
14651 cmdline_parse_token_string_t cmd_set_l2_encap_vlan =
14652 	TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, pos_token,
14653 				 "vlan-tci");
14654 cmdline_parse_token_num_t cmd_set_l2_encap_vlan_value =
14655 	TOKEN_NUM_INITIALIZER(struct cmd_set_l2_encap_result, tci, UINT16);
14656 cmdline_parse_token_string_t cmd_set_l2_encap_eth_src =
14657 	TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, pos_token,
14658 				 "eth-src");
14659 cmdline_parse_token_etheraddr_t cmd_set_l2_encap_eth_src_value =
14660 	TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_l2_encap_result, eth_src);
14661 cmdline_parse_token_string_t cmd_set_l2_encap_eth_dst =
14662 	TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, pos_token,
14663 				 "eth-dst");
14664 cmdline_parse_token_etheraddr_t cmd_set_l2_encap_eth_dst_value =
14665 	TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_l2_encap_result, eth_dst);
14666 
14667 static void cmd_set_l2_encap_parsed(void *parsed_result,
14668 	__rte_unused struct cmdline *cl,
14669 	__rte_unused void *data)
14670 {
14671 	struct cmd_set_l2_encap_result *res = parsed_result;
14672 
14673 	if (strcmp(res->l2_encap, "l2_encap") == 0)
14674 		l2_encap_conf.select_vlan = 0;
14675 	else if (strcmp(res->l2_encap, "l2_encap-with-vlan") == 0)
14676 		l2_encap_conf.select_vlan = 1;
14677 	if (strcmp(res->ip_version, "ipv4") == 0)
14678 		l2_encap_conf.select_ipv4 = 1;
14679 	else if (strcmp(res->ip_version, "ipv6") == 0)
14680 		l2_encap_conf.select_ipv4 = 0;
14681 	else
14682 		return;
14683 	if (l2_encap_conf.select_vlan)
14684 		l2_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci);
14685 	rte_memcpy(l2_encap_conf.eth_src, res->eth_src.addr_bytes,
14686 		   RTE_ETHER_ADDR_LEN);
14687 	rte_memcpy(l2_encap_conf.eth_dst, res->eth_dst.addr_bytes,
14688 		   RTE_ETHER_ADDR_LEN);
14689 }
14690 
14691 cmdline_parse_inst_t cmd_set_l2_encap = {
14692 	.f = cmd_set_l2_encap_parsed,
14693 	.data = NULL,
14694 	.help_str = "set l2_encap ip-version ipv4|ipv6"
14695 		" eth-src <eth-src> eth-dst <eth-dst>",
14696 	.tokens = {
14697 		(void *)&cmd_set_l2_encap_set,
14698 		(void *)&cmd_set_l2_encap_l2_encap,
14699 		(void *)&cmd_set_l2_encap_ip_version,
14700 		(void *)&cmd_set_l2_encap_ip_version_value,
14701 		(void *)&cmd_set_l2_encap_eth_src,
14702 		(void *)&cmd_set_l2_encap_eth_src_value,
14703 		(void *)&cmd_set_l2_encap_eth_dst,
14704 		(void *)&cmd_set_l2_encap_eth_dst_value,
14705 		NULL,
14706 	},
14707 };
14708 
14709 cmdline_parse_inst_t cmd_set_l2_encap_with_vlan = {
14710 	.f = cmd_set_l2_encap_parsed,
14711 	.data = NULL,
14712 	.help_str = "set l2_encap-with-vlan ip-version ipv4|ipv6"
14713 		" vlan-tci <vlan-tci> eth-src <eth-src> eth-dst <eth-dst>",
14714 	.tokens = {
14715 		(void *)&cmd_set_l2_encap_set,
14716 		(void *)&cmd_set_l2_encap_l2_encap_with_vlan,
14717 		(void *)&cmd_set_l2_encap_ip_version,
14718 		(void *)&cmd_set_l2_encap_ip_version_value,
14719 		(void *)&cmd_set_l2_encap_vlan,
14720 		(void *)&cmd_set_l2_encap_vlan_value,
14721 		(void *)&cmd_set_l2_encap_eth_src,
14722 		(void *)&cmd_set_l2_encap_eth_src_value,
14723 		(void *)&cmd_set_l2_encap_eth_dst,
14724 		(void *)&cmd_set_l2_encap_eth_dst_value,
14725 		NULL,
14726 	},
14727 };
14728 
14729 /** Set L2 decapsulation details */
14730 struct cmd_set_l2_decap_result {
14731 	cmdline_fixed_string_t set;
14732 	cmdline_fixed_string_t l2_decap;
14733 	cmdline_fixed_string_t pos_token;
14734 	uint32_t vlan_present:1;
14735 };
14736 
14737 cmdline_parse_token_string_t cmd_set_l2_decap_set =
14738 	TOKEN_STRING_INITIALIZER(struct cmd_set_l2_decap_result, set, "set");
14739 cmdline_parse_token_string_t cmd_set_l2_decap_l2_decap =
14740 	TOKEN_STRING_INITIALIZER(struct cmd_set_l2_decap_result, l2_decap,
14741 				 "l2_decap");
14742 cmdline_parse_token_string_t cmd_set_l2_decap_l2_decap_with_vlan =
14743 	TOKEN_STRING_INITIALIZER(struct cmd_set_l2_decap_result, l2_decap,
14744 				 "l2_decap-with-vlan");
14745 
14746 static void cmd_set_l2_decap_parsed(void *parsed_result,
14747 	__rte_unused struct cmdline *cl,
14748 	__rte_unused void *data)
14749 {
14750 	struct cmd_set_l2_decap_result *res = parsed_result;
14751 
14752 	if (strcmp(res->l2_decap, "l2_decap") == 0)
14753 		l2_decap_conf.select_vlan = 0;
14754 	else if (strcmp(res->l2_decap, "l2_decap-with-vlan") == 0)
14755 		l2_decap_conf.select_vlan = 1;
14756 }
14757 
14758 cmdline_parse_inst_t cmd_set_l2_decap = {
14759 	.f = cmd_set_l2_decap_parsed,
14760 	.data = NULL,
14761 	.help_str = "set l2_decap",
14762 	.tokens = {
14763 		(void *)&cmd_set_l2_decap_set,
14764 		(void *)&cmd_set_l2_decap_l2_decap,
14765 		NULL,
14766 	},
14767 };
14768 
14769 cmdline_parse_inst_t cmd_set_l2_decap_with_vlan = {
14770 	.f = cmd_set_l2_decap_parsed,
14771 	.data = NULL,
14772 	.help_str = "set l2_decap-with-vlan",
14773 	.tokens = {
14774 		(void *)&cmd_set_l2_decap_set,
14775 		(void *)&cmd_set_l2_decap_l2_decap_with_vlan,
14776 		NULL,
14777 	},
14778 };
14779 
14780 /** Set MPLSoGRE encapsulation details */
14781 struct cmd_set_mplsogre_encap_result {
14782 	cmdline_fixed_string_t set;
14783 	cmdline_fixed_string_t mplsogre;
14784 	cmdline_fixed_string_t pos_token;
14785 	cmdline_fixed_string_t ip_version;
14786 	uint32_t vlan_present:1;
14787 	uint32_t label;
14788 	cmdline_ipaddr_t ip_src;
14789 	cmdline_ipaddr_t ip_dst;
14790 	uint16_t tci;
14791 	struct rte_ether_addr eth_src;
14792 	struct rte_ether_addr eth_dst;
14793 };
14794 
14795 cmdline_parse_token_string_t cmd_set_mplsogre_encap_set =
14796 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result, set,
14797 				 "set");
14798 cmdline_parse_token_string_t cmd_set_mplsogre_encap_mplsogre_encap =
14799 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result, mplsogre,
14800 				 "mplsogre_encap");
14801 cmdline_parse_token_string_t cmd_set_mplsogre_encap_mplsogre_encap_with_vlan =
14802 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result,
14803 				 mplsogre, "mplsogre_encap-with-vlan");
14804 cmdline_parse_token_string_t cmd_set_mplsogre_encap_ip_version =
14805 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result,
14806 				 pos_token, "ip-version");
14807 cmdline_parse_token_string_t cmd_set_mplsogre_encap_ip_version_value =
14808 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result,
14809 				 ip_version, "ipv4#ipv6");
14810 cmdline_parse_token_string_t cmd_set_mplsogre_encap_label =
14811 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result,
14812 				 pos_token, "label");
14813 cmdline_parse_token_num_t cmd_set_mplsogre_encap_label_value =
14814 	TOKEN_NUM_INITIALIZER(struct cmd_set_mplsogre_encap_result, label,
14815 			      UINT32);
14816 cmdline_parse_token_string_t cmd_set_mplsogre_encap_ip_src =
14817 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result,
14818 				 pos_token, "ip-src");
14819 cmdline_parse_token_ipaddr_t cmd_set_mplsogre_encap_ip_src_value =
14820 	TOKEN_IPADDR_INITIALIZER(struct cmd_set_mplsogre_encap_result, ip_src);
14821 cmdline_parse_token_string_t cmd_set_mplsogre_encap_ip_dst =
14822 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result,
14823 				 pos_token, "ip-dst");
14824 cmdline_parse_token_ipaddr_t cmd_set_mplsogre_encap_ip_dst_value =
14825 	TOKEN_IPADDR_INITIALIZER(struct cmd_set_mplsogre_encap_result, ip_dst);
14826 cmdline_parse_token_string_t cmd_set_mplsogre_encap_vlan =
14827 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result,
14828 				 pos_token, "vlan-tci");
14829 cmdline_parse_token_num_t cmd_set_mplsogre_encap_vlan_value =
14830 	TOKEN_NUM_INITIALIZER(struct cmd_set_mplsogre_encap_result, tci,
14831 			      UINT16);
14832 cmdline_parse_token_string_t cmd_set_mplsogre_encap_eth_src =
14833 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result,
14834 				 pos_token, "eth-src");
14835 cmdline_parse_token_etheraddr_t cmd_set_mplsogre_encap_eth_src_value =
14836 	TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_mplsogre_encap_result,
14837 				    eth_src);
14838 cmdline_parse_token_string_t cmd_set_mplsogre_encap_eth_dst =
14839 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result,
14840 				 pos_token, "eth-dst");
14841 cmdline_parse_token_etheraddr_t cmd_set_mplsogre_encap_eth_dst_value =
14842 	TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_mplsogre_encap_result,
14843 				    eth_dst);
14844 
14845 static void cmd_set_mplsogre_encap_parsed(void *parsed_result,
14846 	__rte_unused struct cmdline *cl,
14847 	__rte_unused void *data)
14848 {
14849 	struct cmd_set_mplsogre_encap_result *res = parsed_result;
14850 	union {
14851 		uint32_t mplsogre_label;
14852 		uint8_t label[4];
14853 	} id = {
14854 		.mplsogre_label = rte_cpu_to_be_32(res->label<<12),
14855 	};
14856 
14857 	if (strcmp(res->mplsogre, "mplsogre_encap") == 0)
14858 		mplsogre_encap_conf.select_vlan = 0;
14859 	else if (strcmp(res->mplsogre, "mplsogre_encap-with-vlan") == 0)
14860 		mplsogre_encap_conf.select_vlan = 1;
14861 	if (strcmp(res->ip_version, "ipv4") == 0)
14862 		mplsogre_encap_conf.select_ipv4 = 1;
14863 	else if (strcmp(res->ip_version, "ipv6") == 0)
14864 		mplsogre_encap_conf.select_ipv4 = 0;
14865 	else
14866 		return;
14867 	rte_memcpy(mplsogre_encap_conf.label, &id.label, 3);
14868 	if (mplsogre_encap_conf.select_ipv4) {
14869 		IPV4_ADDR_TO_UINT(res->ip_src, mplsogre_encap_conf.ipv4_src);
14870 		IPV4_ADDR_TO_UINT(res->ip_dst, mplsogre_encap_conf.ipv4_dst);
14871 	} else {
14872 		IPV6_ADDR_TO_ARRAY(res->ip_src, mplsogre_encap_conf.ipv6_src);
14873 		IPV6_ADDR_TO_ARRAY(res->ip_dst, mplsogre_encap_conf.ipv6_dst);
14874 	}
14875 	if (mplsogre_encap_conf.select_vlan)
14876 		mplsogre_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci);
14877 	rte_memcpy(mplsogre_encap_conf.eth_src, res->eth_src.addr_bytes,
14878 		   RTE_ETHER_ADDR_LEN);
14879 	rte_memcpy(mplsogre_encap_conf.eth_dst, res->eth_dst.addr_bytes,
14880 		   RTE_ETHER_ADDR_LEN);
14881 }
14882 
14883 cmdline_parse_inst_t cmd_set_mplsogre_encap = {
14884 	.f = cmd_set_mplsogre_encap_parsed,
14885 	.data = NULL,
14886 	.help_str = "set mplsogre_encap ip-version ipv4|ipv6 label <label>"
14887 		" ip-src <ip-src> ip-dst <ip-dst> eth-src <eth-src>"
14888 		" eth-dst <eth-dst>",
14889 	.tokens = {
14890 		(void *)&cmd_set_mplsogre_encap_set,
14891 		(void *)&cmd_set_mplsogre_encap_mplsogre_encap,
14892 		(void *)&cmd_set_mplsogre_encap_ip_version,
14893 		(void *)&cmd_set_mplsogre_encap_ip_version_value,
14894 		(void *)&cmd_set_mplsogre_encap_label,
14895 		(void *)&cmd_set_mplsogre_encap_label_value,
14896 		(void *)&cmd_set_mplsogre_encap_ip_src,
14897 		(void *)&cmd_set_mplsogre_encap_ip_src_value,
14898 		(void *)&cmd_set_mplsogre_encap_ip_dst,
14899 		(void *)&cmd_set_mplsogre_encap_ip_dst_value,
14900 		(void *)&cmd_set_mplsogre_encap_eth_src,
14901 		(void *)&cmd_set_mplsogre_encap_eth_src_value,
14902 		(void *)&cmd_set_mplsogre_encap_eth_dst,
14903 		(void *)&cmd_set_mplsogre_encap_eth_dst_value,
14904 		NULL,
14905 	},
14906 };
14907 
14908 cmdline_parse_inst_t cmd_set_mplsogre_encap_with_vlan = {
14909 	.f = cmd_set_mplsogre_encap_parsed,
14910 	.data = NULL,
14911 	.help_str = "set mplsogre_encap-with-vlan ip-version ipv4|ipv6"
14912 		" label <label> ip-src <ip-src> ip-dst <ip-dst>"
14913 		" vlan-tci <vlan-tci> eth-src <eth-src> eth-dst <eth-dst>",
14914 	.tokens = {
14915 		(void *)&cmd_set_mplsogre_encap_set,
14916 		(void *)&cmd_set_mplsogre_encap_mplsogre_encap_with_vlan,
14917 		(void *)&cmd_set_mplsogre_encap_ip_version,
14918 		(void *)&cmd_set_mplsogre_encap_ip_version_value,
14919 		(void *)&cmd_set_mplsogre_encap_label,
14920 		(void *)&cmd_set_mplsogre_encap_label_value,
14921 		(void *)&cmd_set_mplsogre_encap_ip_src,
14922 		(void *)&cmd_set_mplsogre_encap_ip_src_value,
14923 		(void *)&cmd_set_mplsogre_encap_ip_dst,
14924 		(void *)&cmd_set_mplsogre_encap_ip_dst_value,
14925 		(void *)&cmd_set_mplsogre_encap_vlan,
14926 		(void *)&cmd_set_mplsogre_encap_vlan_value,
14927 		(void *)&cmd_set_mplsogre_encap_eth_src,
14928 		(void *)&cmd_set_mplsogre_encap_eth_src_value,
14929 		(void *)&cmd_set_mplsogre_encap_eth_dst,
14930 		(void *)&cmd_set_mplsogre_encap_eth_dst_value,
14931 		NULL,
14932 	},
14933 };
14934 
14935 /** Set MPLSoGRE decapsulation details */
14936 struct cmd_set_mplsogre_decap_result {
14937 	cmdline_fixed_string_t set;
14938 	cmdline_fixed_string_t mplsogre;
14939 	cmdline_fixed_string_t pos_token;
14940 	cmdline_fixed_string_t ip_version;
14941 	uint32_t vlan_present:1;
14942 };
14943 
14944 cmdline_parse_token_string_t cmd_set_mplsogre_decap_set =
14945 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_decap_result, set,
14946 				 "set");
14947 cmdline_parse_token_string_t cmd_set_mplsogre_decap_mplsogre_decap =
14948 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_decap_result, mplsogre,
14949 				 "mplsogre_decap");
14950 cmdline_parse_token_string_t cmd_set_mplsogre_decap_mplsogre_decap_with_vlan =
14951 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_decap_result,
14952 				 mplsogre, "mplsogre_decap-with-vlan");
14953 cmdline_parse_token_string_t cmd_set_mplsogre_decap_ip_version =
14954 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_decap_result,
14955 				 pos_token, "ip-version");
14956 cmdline_parse_token_string_t cmd_set_mplsogre_decap_ip_version_value =
14957 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_decap_result,
14958 				 ip_version, "ipv4#ipv6");
14959 
14960 static void cmd_set_mplsogre_decap_parsed(void *parsed_result,
14961 	__rte_unused struct cmdline *cl,
14962 	__rte_unused void *data)
14963 {
14964 	struct cmd_set_mplsogre_decap_result *res = parsed_result;
14965 
14966 	if (strcmp(res->mplsogre, "mplsogre_decap") == 0)
14967 		mplsogre_decap_conf.select_vlan = 0;
14968 	else if (strcmp(res->mplsogre, "mplsogre_decap-with-vlan") == 0)
14969 		mplsogre_decap_conf.select_vlan = 1;
14970 	if (strcmp(res->ip_version, "ipv4") == 0)
14971 		mplsogre_decap_conf.select_ipv4 = 1;
14972 	else if (strcmp(res->ip_version, "ipv6") == 0)
14973 		mplsogre_decap_conf.select_ipv4 = 0;
14974 }
14975 
14976 cmdline_parse_inst_t cmd_set_mplsogre_decap = {
14977 	.f = cmd_set_mplsogre_decap_parsed,
14978 	.data = NULL,
14979 	.help_str = "set mplsogre_decap ip-version ipv4|ipv6",
14980 	.tokens = {
14981 		(void *)&cmd_set_mplsogre_decap_set,
14982 		(void *)&cmd_set_mplsogre_decap_mplsogre_decap,
14983 		(void *)&cmd_set_mplsogre_decap_ip_version,
14984 		(void *)&cmd_set_mplsogre_decap_ip_version_value,
14985 		NULL,
14986 	},
14987 };
14988 
14989 cmdline_parse_inst_t cmd_set_mplsogre_decap_with_vlan = {
14990 	.f = cmd_set_mplsogre_decap_parsed,
14991 	.data = NULL,
14992 	.help_str = "set mplsogre_decap-with-vlan ip-version ipv4|ipv6",
14993 	.tokens = {
14994 		(void *)&cmd_set_mplsogre_decap_set,
14995 		(void *)&cmd_set_mplsogre_decap_mplsogre_decap_with_vlan,
14996 		(void *)&cmd_set_mplsogre_decap_ip_version,
14997 		(void *)&cmd_set_mplsogre_decap_ip_version_value,
14998 		NULL,
14999 	},
15000 };
15001 
15002 /** Set MPLSoUDP encapsulation details */
15003 struct cmd_set_mplsoudp_encap_result {
15004 	cmdline_fixed_string_t set;
15005 	cmdline_fixed_string_t mplsoudp;
15006 	cmdline_fixed_string_t pos_token;
15007 	cmdline_fixed_string_t ip_version;
15008 	uint32_t vlan_present:1;
15009 	uint32_t label;
15010 	uint16_t udp_src;
15011 	uint16_t udp_dst;
15012 	cmdline_ipaddr_t ip_src;
15013 	cmdline_ipaddr_t ip_dst;
15014 	uint16_t tci;
15015 	struct rte_ether_addr eth_src;
15016 	struct rte_ether_addr eth_dst;
15017 };
15018 
15019 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_set =
15020 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, set,
15021 				 "set");
15022 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_mplsoudp_encap =
15023 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, mplsoudp,
15024 				 "mplsoudp_encap");
15025 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_mplsoudp_encap_with_vlan =
15026 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result,
15027 				 mplsoudp, "mplsoudp_encap-with-vlan");
15028 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_ip_version =
15029 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result,
15030 				 pos_token, "ip-version");
15031 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_ip_version_value =
15032 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result,
15033 				 ip_version, "ipv4#ipv6");
15034 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_label =
15035 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result,
15036 				 pos_token, "label");
15037 cmdline_parse_token_num_t cmd_set_mplsoudp_encap_label_value =
15038 	TOKEN_NUM_INITIALIZER(struct cmd_set_mplsoudp_encap_result, label,
15039 			      UINT32);
15040 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_udp_src =
15041 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result,
15042 				 pos_token, "udp-src");
15043 cmdline_parse_token_num_t cmd_set_mplsoudp_encap_udp_src_value =
15044 	TOKEN_NUM_INITIALIZER(struct cmd_set_mplsoudp_encap_result, udp_src,
15045 			      UINT16);
15046 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_udp_dst =
15047 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result,
15048 				 pos_token, "udp-dst");
15049 cmdline_parse_token_num_t cmd_set_mplsoudp_encap_udp_dst_value =
15050 	TOKEN_NUM_INITIALIZER(struct cmd_set_mplsoudp_encap_result, udp_dst,
15051 			      UINT16);
15052 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_ip_src =
15053 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result,
15054 				 pos_token, "ip-src");
15055 cmdline_parse_token_ipaddr_t cmd_set_mplsoudp_encap_ip_src_value =
15056 	TOKEN_IPADDR_INITIALIZER(struct cmd_set_mplsoudp_encap_result, ip_src);
15057 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_ip_dst =
15058 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result,
15059 				 pos_token, "ip-dst");
15060 cmdline_parse_token_ipaddr_t cmd_set_mplsoudp_encap_ip_dst_value =
15061 	TOKEN_IPADDR_INITIALIZER(struct cmd_set_mplsoudp_encap_result, ip_dst);
15062 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_vlan =
15063 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result,
15064 				 pos_token, "vlan-tci");
15065 cmdline_parse_token_num_t cmd_set_mplsoudp_encap_vlan_value =
15066 	TOKEN_NUM_INITIALIZER(struct cmd_set_mplsoudp_encap_result, tci,
15067 			      UINT16);
15068 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_eth_src =
15069 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result,
15070 				 pos_token, "eth-src");
15071 cmdline_parse_token_etheraddr_t cmd_set_mplsoudp_encap_eth_src_value =
15072 	TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_mplsoudp_encap_result,
15073 				    eth_src);
15074 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_eth_dst =
15075 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result,
15076 				 pos_token, "eth-dst");
15077 cmdline_parse_token_etheraddr_t cmd_set_mplsoudp_encap_eth_dst_value =
15078 	TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_mplsoudp_encap_result,
15079 				    eth_dst);
15080 
15081 static void cmd_set_mplsoudp_encap_parsed(void *parsed_result,
15082 	__rte_unused struct cmdline *cl,
15083 	__rte_unused void *data)
15084 {
15085 	struct cmd_set_mplsoudp_encap_result *res = parsed_result;
15086 	union {
15087 		uint32_t mplsoudp_label;
15088 		uint8_t label[4];
15089 	} id = {
15090 		.mplsoudp_label = rte_cpu_to_be_32(res->label<<12),
15091 	};
15092 
15093 	if (strcmp(res->mplsoudp, "mplsoudp_encap") == 0)
15094 		mplsoudp_encap_conf.select_vlan = 0;
15095 	else if (strcmp(res->mplsoudp, "mplsoudp_encap-with-vlan") == 0)
15096 		mplsoudp_encap_conf.select_vlan = 1;
15097 	if (strcmp(res->ip_version, "ipv4") == 0)
15098 		mplsoudp_encap_conf.select_ipv4 = 1;
15099 	else if (strcmp(res->ip_version, "ipv6") == 0)
15100 		mplsoudp_encap_conf.select_ipv4 = 0;
15101 	else
15102 		return;
15103 	rte_memcpy(mplsoudp_encap_conf.label, &id.label, 3);
15104 	mplsoudp_encap_conf.udp_src = rte_cpu_to_be_16(res->udp_src);
15105 	mplsoudp_encap_conf.udp_dst = rte_cpu_to_be_16(res->udp_dst);
15106 	if (mplsoudp_encap_conf.select_ipv4) {
15107 		IPV4_ADDR_TO_UINT(res->ip_src, mplsoudp_encap_conf.ipv4_src);
15108 		IPV4_ADDR_TO_UINT(res->ip_dst, mplsoudp_encap_conf.ipv4_dst);
15109 	} else {
15110 		IPV6_ADDR_TO_ARRAY(res->ip_src, mplsoudp_encap_conf.ipv6_src);
15111 		IPV6_ADDR_TO_ARRAY(res->ip_dst, mplsoudp_encap_conf.ipv6_dst);
15112 	}
15113 	if (mplsoudp_encap_conf.select_vlan)
15114 		mplsoudp_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci);
15115 	rte_memcpy(mplsoudp_encap_conf.eth_src, res->eth_src.addr_bytes,
15116 		   RTE_ETHER_ADDR_LEN);
15117 	rte_memcpy(mplsoudp_encap_conf.eth_dst, res->eth_dst.addr_bytes,
15118 		   RTE_ETHER_ADDR_LEN);
15119 }
15120 
15121 cmdline_parse_inst_t cmd_set_mplsoudp_encap = {
15122 	.f = cmd_set_mplsoudp_encap_parsed,
15123 	.data = NULL,
15124 	.help_str = "set mplsoudp_encap ip-version ipv4|ipv6 label <label>"
15125 		" udp-src <udp-src> udp-dst <udp-dst> ip-src <ip-src>"
15126 		" ip-dst <ip-dst> eth-src <eth-src> eth-dst <eth-dst>",
15127 	.tokens = {
15128 		(void *)&cmd_set_mplsoudp_encap_set,
15129 		(void *)&cmd_set_mplsoudp_encap_mplsoudp_encap,
15130 		(void *)&cmd_set_mplsoudp_encap_ip_version,
15131 		(void *)&cmd_set_mplsoudp_encap_ip_version_value,
15132 		(void *)&cmd_set_mplsoudp_encap_label,
15133 		(void *)&cmd_set_mplsoudp_encap_label_value,
15134 		(void *)&cmd_set_mplsoudp_encap_udp_src,
15135 		(void *)&cmd_set_mplsoudp_encap_udp_src_value,
15136 		(void *)&cmd_set_mplsoudp_encap_udp_dst,
15137 		(void *)&cmd_set_mplsoudp_encap_udp_dst_value,
15138 		(void *)&cmd_set_mplsoudp_encap_ip_src,
15139 		(void *)&cmd_set_mplsoudp_encap_ip_src_value,
15140 		(void *)&cmd_set_mplsoudp_encap_ip_dst,
15141 		(void *)&cmd_set_mplsoudp_encap_ip_dst_value,
15142 		(void *)&cmd_set_mplsoudp_encap_eth_src,
15143 		(void *)&cmd_set_mplsoudp_encap_eth_src_value,
15144 		(void *)&cmd_set_mplsoudp_encap_eth_dst,
15145 		(void *)&cmd_set_mplsoudp_encap_eth_dst_value,
15146 		NULL,
15147 	},
15148 };
15149 
15150 cmdline_parse_inst_t cmd_set_mplsoudp_encap_with_vlan = {
15151 	.f = cmd_set_mplsoudp_encap_parsed,
15152 	.data = NULL,
15153 	.help_str = "set mplsoudp_encap-with-vlan ip-version ipv4|ipv6"
15154 		" label <label> udp-src <udp-src> udp-dst <udp-dst>"
15155 		" ip-src <ip-src> ip-dst <ip-dst> vlan-tci <vlan-tci>"
15156 		" eth-src <eth-src> eth-dst <eth-dst>",
15157 	.tokens = {
15158 		(void *)&cmd_set_mplsoudp_encap_set,
15159 		(void *)&cmd_set_mplsoudp_encap_mplsoudp_encap_with_vlan,
15160 		(void *)&cmd_set_mplsoudp_encap_ip_version,
15161 		(void *)&cmd_set_mplsoudp_encap_ip_version_value,
15162 		(void *)&cmd_set_mplsoudp_encap_label,
15163 		(void *)&cmd_set_mplsoudp_encap_label_value,
15164 		(void *)&cmd_set_mplsoudp_encap_udp_src,
15165 		(void *)&cmd_set_mplsoudp_encap_udp_src_value,
15166 		(void *)&cmd_set_mplsoudp_encap_udp_dst,
15167 		(void *)&cmd_set_mplsoudp_encap_udp_dst_value,
15168 		(void *)&cmd_set_mplsoudp_encap_ip_src,
15169 		(void *)&cmd_set_mplsoudp_encap_ip_src_value,
15170 		(void *)&cmd_set_mplsoudp_encap_ip_dst,
15171 		(void *)&cmd_set_mplsoudp_encap_ip_dst_value,
15172 		(void *)&cmd_set_mplsoudp_encap_vlan,
15173 		(void *)&cmd_set_mplsoudp_encap_vlan_value,
15174 		(void *)&cmd_set_mplsoudp_encap_eth_src,
15175 		(void *)&cmd_set_mplsoudp_encap_eth_src_value,
15176 		(void *)&cmd_set_mplsoudp_encap_eth_dst,
15177 		(void *)&cmd_set_mplsoudp_encap_eth_dst_value,
15178 		NULL,
15179 	},
15180 };
15181 
15182 /** Set MPLSoUDP decapsulation details */
15183 struct cmd_set_mplsoudp_decap_result {
15184 	cmdline_fixed_string_t set;
15185 	cmdline_fixed_string_t mplsoudp;
15186 	cmdline_fixed_string_t pos_token;
15187 	cmdline_fixed_string_t ip_version;
15188 	uint32_t vlan_present:1;
15189 };
15190 
15191 cmdline_parse_token_string_t cmd_set_mplsoudp_decap_set =
15192 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_decap_result, set,
15193 				 "set");
15194 cmdline_parse_token_string_t cmd_set_mplsoudp_decap_mplsoudp_decap =
15195 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_decap_result, mplsoudp,
15196 				 "mplsoudp_decap");
15197 cmdline_parse_token_string_t cmd_set_mplsoudp_decap_mplsoudp_decap_with_vlan =
15198 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_decap_result,
15199 				 mplsoudp, "mplsoudp_decap-with-vlan");
15200 cmdline_parse_token_string_t cmd_set_mplsoudp_decap_ip_version =
15201 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_decap_result,
15202 				 pos_token, "ip-version");
15203 cmdline_parse_token_string_t cmd_set_mplsoudp_decap_ip_version_value =
15204 	TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_decap_result,
15205 				 ip_version, "ipv4#ipv6");
15206 
15207 static void cmd_set_mplsoudp_decap_parsed(void *parsed_result,
15208 	__rte_unused struct cmdline *cl,
15209 	__rte_unused void *data)
15210 {
15211 	struct cmd_set_mplsoudp_decap_result *res = parsed_result;
15212 
15213 	if (strcmp(res->mplsoudp, "mplsoudp_decap") == 0)
15214 		mplsoudp_decap_conf.select_vlan = 0;
15215 	else if (strcmp(res->mplsoudp, "mplsoudp_decap-with-vlan") == 0)
15216 		mplsoudp_decap_conf.select_vlan = 1;
15217 	if (strcmp(res->ip_version, "ipv4") == 0)
15218 		mplsoudp_decap_conf.select_ipv4 = 1;
15219 	else if (strcmp(res->ip_version, "ipv6") == 0)
15220 		mplsoudp_decap_conf.select_ipv4 = 0;
15221 }
15222 
15223 cmdline_parse_inst_t cmd_set_mplsoudp_decap = {
15224 	.f = cmd_set_mplsoudp_decap_parsed,
15225 	.data = NULL,
15226 	.help_str = "set mplsoudp_decap ip-version ipv4|ipv6",
15227 	.tokens = {
15228 		(void *)&cmd_set_mplsoudp_decap_set,
15229 		(void *)&cmd_set_mplsoudp_decap_mplsoudp_decap,
15230 		(void *)&cmd_set_mplsoudp_decap_ip_version,
15231 		(void *)&cmd_set_mplsoudp_decap_ip_version_value,
15232 		NULL,
15233 	},
15234 };
15235 
15236 cmdline_parse_inst_t cmd_set_mplsoudp_decap_with_vlan = {
15237 	.f = cmd_set_mplsoudp_decap_parsed,
15238 	.data = NULL,
15239 	.help_str = "set mplsoudp_decap-with-vlan ip-version ipv4|ipv6",
15240 	.tokens = {
15241 		(void *)&cmd_set_mplsoudp_decap_set,
15242 		(void *)&cmd_set_mplsoudp_decap_mplsoudp_decap_with_vlan,
15243 		(void *)&cmd_set_mplsoudp_decap_ip_version,
15244 		(void *)&cmd_set_mplsoudp_decap_ip_version_value,
15245 		NULL,
15246 	},
15247 };
15248 
15249 /* Strict link priority scheduling mode setting */
15250 static void
15251 cmd_strict_link_prio_parsed(
15252 	void *parsed_result,
15253 	__rte_unused struct cmdline *cl,
15254 	__rte_unused void *data)
15255 {
15256 	struct cmd_vf_tc_bw_result *res = parsed_result;
15257 	int ret = -ENOTSUP;
15258 
15259 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
15260 		return;
15261 
15262 #ifdef RTE_NET_I40E
15263 	ret = rte_pmd_i40e_set_tc_strict_prio(res->port_id, res->tc_map);
15264 #endif
15265 
15266 	switch (ret) {
15267 	case 0:
15268 		break;
15269 	case -EINVAL:
15270 		printf("invalid tc_bitmap 0x%x\n", res->tc_map);
15271 		break;
15272 	case -ENODEV:
15273 		printf("invalid port_id %d\n", res->port_id);
15274 		break;
15275 	case -ENOTSUP:
15276 		printf("function not implemented\n");
15277 		break;
15278 	default:
15279 		printf("programming error: (%s)\n", strerror(-ret));
15280 	}
15281 }
15282 
15283 cmdline_parse_inst_t cmd_strict_link_prio = {
15284 	.f = cmd_strict_link_prio_parsed,
15285 	.data = NULL,
15286 	.help_str = "set tx strict-link-priority <port_id> <tc_bitmap>",
15287 	.tokens = {
15288 		(void *)&cmd_vf_tc_bw_set,
15289 		(void *)&cmd_vf_tc_bw_tx,
15290 		(void *)&cmd_vf_tc_bw_strict_link_prio,
15291 		(void *)&cmd_vf_tc_bw_port_id,
15292 		(void *)&cmd_vf_tc_bw_tc_map,
15293 		NULL,
15294 	},
15295 };
15296 
15297 /* Load dynamic device personalization*/
15298 struct cmd_ddp_add_result {
15299 	cmdline_fixed_string_t ddp;
15300 	cmdline_fixed_string_t add;
15301 	portid_t port_id;
15302 	char filepath[];
15303 };
15304 
15305 cmdline_parse_token_string_t cmd_ddp_add_ddp =
15306 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_add_result, ddp, "ddp");
15307 cmdline_parse_token_string_t cmd_ddp_add_add =
15308 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_add_result, add, "add");
15309 cmdline_parse_token_num_t cmd_ddp_add_port_id =
15310 	TOKEN_NUM_INITIALIZER(struct cmd_ddp_add_result, port_id, UINT16);
15311 cmdline_parse_token_string_t cmd_ddp_add_filepath =
15312 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_add_result, filepath, NULL);
15313 
15314 static void
15315 cmd_ddp_add_parsed(
15316 	void *parsed_result,
15317 	__rte_unused struct cmdline *cl,
15318 	__rte_unused void *data)
15319 {
15320 	struct cmd_ddp_add_result *res = parsed_result;
15321 	uint8_t *buff;
15322 	uint32_t size;
15323 	char *filepath;
15324 	char *file_fld[2];
15325 	int file_num;
15326 	int ret = -ENOTSUP;
15327 
15328 	if (!all_ports_stopped()) {
15329 		printf("Please stop all ports first\n");
15330 		return;
15331 	}
15332 
15333 	filepath = strdup(res->filepath);
15334 	if (filepath == NULL) {
15335 		printf("Failed to allocate memory\n");
15336 		return;
15337 	}
15338 	file_num = rte_strsplit(filepath, strlen(filepath), file_fld, 2, ',');
15339 
15340 	buff = open_file(file_fld[0], &size);
15341 	if (!buff) {
15342 		free((void *)filepath);
15343 		return;
15344 	}
15345 
15346 #ifdef RTE_NET_I40E
15347 	if (ret == -ENOTSUP)
15348 		ret = rte_pmd_i40e_process_ddp_package(res->port_id,
15349 					       buff, size,
15350 					       RTE_PMD_I40E_PKG_OP_WR_ADD);
15351 #endif
15352 
15353 	if (ret == -EEXIST)
15354 		printf("Profile has already existed.\n");
15355 	else if (ret < 0)
15356 		printf("Failed to load profile.\n");
15357 	else if (file_num == 2)
15358 		save_file(file_fld[1], buff, size);
15359 
15360 	close_file(buff);
15361 	free((void *)filepath);
15362 }
15363 
15364 cmdline_parse_inst_t cmd_ddp_add = {
15365 	.f = cmd_ddp_add_parsed,
15366 	.data = NULL,
15367 	.help_str = "ddp add <port_id> <profile_path[,backup_profile_path]>",
15368 	.tokens = {
15369 		(void *)&cmd_ddp_add_ddp,
15370 		(void *)&cmd_ddp_add_add,
15371 		(void *)&cmd_ddp_add_port_id,
15372 		(void *)&cmd_ddp_add_filepath,
15373 		NULL,
15374 	},
15375 };
15376 
15377 /* Delete dynamic device personalization*/
15378 struct cmd_ddp_del_result {
15379 	cmdline_fixed_string_t ddp;
15380 	cmdline_fixed_string_t del;
15381 	portid_t port_id;
15382 	char filepath[];
15383 };
15384 
15385 cmdline_parse_token_string_t cmd_ddp_del_ddp =
15386 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_del_result, ddp, "ddp");
15387 cmdline_parse_token_string_t cmd_ddp_del_del =
15388 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_del_result, del, "del");
15389 cmdline_parse_token_num_t cmd_ddp_del_port_id =
15390 	TOKEN_NUM_INITIALIZER(struct cmd_ddp_del_result, port_id, UINT16);
15391 cmdline_parse_token_string_t cmd_ddp_del_filepath =
15392 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_del_result, filepath, NULL);
15393 
15394 static void
15395 cmd_ddp_del_parsed(
15396 	void *parsed_result,
15397 	__rte_unused struct cmdline *cl,
15398 	__rte_unused void *data)
15399 {
15400 	struct cmd_ddp_del_result *res = parsed_result;
15401 	uint8_t *buff;
15402 	uint32_t size;
15403 	int ret = -ENOTSUP;
15404 
15405 	if (!all_ports_stopped()) {
15406 		printf("Please stop all ports first\n");
15407 		return;
15408 	}
15409 
15410 	buff = open_file(res->filepath, &size);
15411 	if (!buff)
15412 		return;
15413 
15414 #ifdef RTE_NET_I40E
15415 	if (ret == -ENOTSUP)
15416 		ret = rte_pmd_i40e_process_ddp_package(res->port_id,
15417 					       buff, size,
15418 					       RTE_PMD_I40E_PKG_OP_WR_DEL);
15419 #endif
15420 
15421 	if (ret == -EACCES)
15422 		printf("Profile does not exist.\n");
15423 	else if (ret < 0)
15424 		printf("Failed to delete profile.\n");
15425 
15426 	close_file(buff);
15427 }
15428 
15429 cmdline_parse_inst_t cmd_ddp_del = {
15430 	.f = cmd_ddp_del_parsed,
15431 	.data = NULL,
15432 	.help_str = "ddp del <port_id> <backup_profile_path>",
15433 	.tokens = {
15434 		(void *)&cmd_ddp_del_ddp,
15435 		(void *)&cmd_ddp_del_del,
15436 		(void *)&cmd_ddp_del_port_id,
15437 		(void *)&cmd_ddp_del_filepath,
15438 		NULL,
15439 	},
15440 };
15441 
15442 /* Get dynamic device personalization profile info */
15443 struct cmd_ddp_info_result {
15444 	cmdline_fixed_string_t ddp;
15445 	cmdline_fixed_string_t get;
15446 	cmdline_fixed_string_t info;
15447 	char filepath[];
15448 };
15449 
15450 cmdline_parse_token_string_t cmd_ddp_info_ddp =
15451 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, ddp, "ddp");
15452 cmdline_parse_token_string_t cmd_ddp_info_get =
15453 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, get, "get");
15454 cmdline_parse_token_string_t cmd_ddp_info_info =
15455 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, info, "info");
15456 cmdline_parse_token_string_t cmd_ddp_info_filepath =
15457 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, filepath, NULL);
15458 
15459 static void
15460 cmd_ddp_info_parsed(
15461 	void *parsed_result,
15462 	__rte_unused struct cmdline *cl,
15463 	__rte_unused void *data)
15464 {
15465 	struct cmd_ddp_info_result *res = parsed_result;
15466 	uint8_t *pkg;
15467 	uint32_t pkg_size;
15468 	int ret = -ENOTSUP;
15469 #ifdef RTE_NET_I40E
15470 	uint32_t i, j, n;
15471 	uint8_t *buff;
15472 	uint32_t buff_size = 0;
15473 	struct rte_pmd_i40e_profile_info info;
15474 	uint32_t dev_num = 0;
15475 	struct rte_pmd_i40e_ddp_device_id *devs;
15476 	uint32_t proto_num = 0;
15477 	struct rte_pmd_i40e_proto_info *proto = NULL;
15478 	uint32_t pctype_num = 0;
15479 	struct rte_pmd_i40e_ptype_info *pctype;
15480 	uint32_t ptype_num = 0;
15481 	struct rte_pmd_i40e_ptype_info *ptype;
15482 	uint8_t proto_id;
15483 
15484 #endif
15485 
15486 	pkg = open_file(res->filepath, &pkg_size);
15487 	if (!pkg)
15488 		return;
15489 
15490 #ifdef RTE_NET_I40E
15491 	ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
15492 				(uint8_t *)&info, sizeof(info),
15493 				RTE_PMD_I40E_PKG_INFO_GLOBAL_HEADER);
15494 	if (!ret) {
15495 		printf("Global Track id:       0x%x\n", info.track_id);
15496 		printf("Global Version:        %d.%d.%d.%d\n",
15497 			info.version.major,
15498 			info.version.minor,
15499 			info.version.update,
15500 			info.version.draft);
15501 		printf("Global Package name:   %s\n\n", info.name);
15502 	}
15503 
15504 	ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
15505 				(uint8_t *)&info, sizeof(info),
15506 				RTE_PMD_I40E_PKG_INFO_HEADER);
15507 	if (!ret) {
15508 		printf("i40e Profile Track id: 0x%x\n", info.track_id);
15509 		printf("i40e Profile Version:  %d.%d.%d.%d\n",
15510 			info.version.major,
15511 			info.version.minor,
15512 			info.version.update,
15513 			info.version.draft);
15514 		printf("i40e Profile name:     %s\n\n", info.name);
15515 	}
15516 
15517 	ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
15518 				(uint8_t *)&buff_size, sizeof(buff_size),
15519 				RTE_PMD_I40E_PKG_INFO_GLOBAL_NOTES_SIZE);
15520 	if (!ret && buff_size) {
15521 		buff = (uint8_t *)malloc(buff_size);
15522 		if (buff) {
15523 			ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
15524 						buff, buff_size,
15525 						RTE_PMD_I40E_PKG_INFO_GLOBAL_NOTES);
15526 			if (!ret)
15527 				printf("Package Notes:\n%s\n\n", buff);
15528 			free(buff);
15529 		}
15530 	}
15531 
15532 	ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
15533 				(uint8_t *)&dev_num, sizeof(dev_num),
15534 				RTE_PMD_I40E_PKG_INFO_DEVID_NUM);
15535 	if (!ret && dev_num) {
15536 		buff_size = dev_num * sizeof(struct rte_pmd_i40e_ddp_device_id);
15537 		devs = (struct rte_pmd_i40e_ddp_device_id *)malloc(buff_size);
15538 		if (devs) {
15539 			ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
15540 						(uint8_t *)devs, buff_size,
15541 						RTE_PMD_I40E_PKG_INFO_DEVID_LIST);
15542 			if (!ret) {
15543 				printf("List of supported devices:\n");
15544 				for (i = 0; i < dev_num; i++) {
15545 					printf("  %04X:%04X %04X:%04X\n",
15546 						devs[i].vendor_dev_id >> 16,
15547 						devs[i].vendor_dev_id & 0xFFFF,
15548 						devs[i].sub_vendor_dev_id >> 16,
15549 						devs[i].sub_vendor_dev_id & 0xFFFF);
15550 				}
15551 				printf("\n");
15552 			}
15553 			free(devs);
15554 		}
15555 	}
15556 
15557 	/* get information about protocols and packet types */
15558 	ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
15559 		(uint8_t *)&proto_num, sizeof(proto_num),
15560 		RTE_PMD_I40E_PKG_INFO_PROTOCOL_NUM);
15561 	if (ret || !proto_num)
15562 		goto no_print_return;
15563 
15564 	buff_size = proto_num * sizeof(struct rte_pmd_i40e_proto_info);
15565 	proto = (struct rte_pmd_i40e_proto_info *)malloc(buff_size);
15566 	if (!proto)
15567 		goto no_print_return;
15568 
15569 	ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, (uint8_t *)proto,
15570 					buff_size,
15571 					RTE_PMD_I40E_PKG_INFO_PROTOCOL_LIST);
15572 	if (!ret) {
15573 		printf("List of used protocols:\n");
15574 		for (i = 0; i < proto_num; i++)
15575 			printf("  %2u: %s\n", proto[i].proto_id,
15576 			       proto[i].name);
15577 		printf("\n");
15578 	}
15579 	ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
15580 		(uint8_t *)&pctype_num, sizeof(pctype_num),
15581 		RTE_PMD_I40E_PKG_INFO_PCTYPE_NUM);
15582 	if (ret || !pctype_num)
15583 		goto no_print_pctypes;
15584 
15585 	buff_size = pctype_num * sizeof(struct rte_pmd_i40e_ptype_info);
15586 	pctype = (struct rte_pmd_i40e_ptype_info *)malloc(buff_size);
15587 	if (!pctype)
15588 		goto no_print_pctypes;
15589 
15590 	ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, (uint8_t *)pctype,
15591 					buff_size,
15592 					RTE_PMD_I40E_PKG_INFO_PCTYPE_LIST);
15593 	if (ret) {
15594 		free(pctype);
15595 		goto no_print_pctypes;
15596 	}
15597 
15598 	printf("List of defined packet classification types:\n");
15599 	for (i = 0; i < pctype_num; i++) {
15600 		printf("  %2u:", pctype[i].ptype_id);
15601 		for (j = 0; j < RTE_PMD_I40E_PROTO_NUM; j++) {
15602 			proto_id = pctype[i].protocols[j];
15603 			if (proto_id != RTE_PMD_I40E_PROTO_UNUSED) {
15604 				for (n = 0; n < proto_num; n++) {
15605 					if (proto[n].proto_id == proto_id) {
15606 						printf(" %s", proto[n].name);
15607 						break;
15608 					}
15609 				}
15610 			}
15611 		}
15612 		printf("\n");
15613 	}
15614 	printf("\n");
15615 	free(pctype);
15616 
15617 no_print_pctypes:
15618 
15619 	ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, (uint8_t *)&ptype_num,
15620 					sizeof(ptype_num),
15621 					RTE_PMD_I40E_PKG_INFO_PTYPE_NUM);
15622 	if (ret || !ptype_num)
15623 		goto no_print_return;
15624 
15625 	buff_size = ptype_num * sizeof(struct rte_pmd_i40e_ptype_info);
15626 	ptype = (struct rte_pmd_i40e_ptype_info *)malloc(buff_size);
15627 	if (!ptype)
15628 		goto no_print_return;
15629 
15630 	ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, (uint8_t *)ptype,
15631 					buff_size,
15632 					RTE_PMD_I40E_PKG_INFO_PTYPE_LIST);
15633 	if (ret) {
15634 		free(ptype);
15635 		goto no_print_return;
15636 	}
15637 	printf("List of defined packet types:\n");
15638 	for (i = 0; i < ptype_num; i++) {
15639 		printf("  %2u:", ptype[i].ptype_id);
15640 		for (j = 0; j < RTE_PMD_I40E_PROTO_NUM; j++) {
15641 			proto_id = ptype[i].protocols[j];
15642 			if (proto_id != RTE_PMD_I40E_PROTO_UNUSED) {
15643 				for (n = 0; n < proto_num; n++) {
15644 					if (proto[n].proto_id == proto_id) {
15645 						printf(" %s", proto[n].name);
15646 						break;
15647 					}
15648 				}
15649 			}
15650 		}
15651 		printf("\n");
15652 	}
15653 	free(ptype);
15654 	printf("\n");
15655 
15656 	ret = 0;
15657 no_print_return:
15658 	if (proto)
15659 		free(proto);
15660 #endif
15661 	if (ret == -ENOTSUP)
15662 		printf("Function not supported in PMD driver\n");
15663 	close_file(pkg);
15664 }
15665 
15666 cmdline_parse_inst_t cmd_ddp_get_info = {
15667 	.f = cmd_ddp_info_parsed,
15668 	.data = NULL,
15669 	.help_str = "ddp get info <profile_path>",
15670 	.tokens = {
15671 		(void *)&cmd_ddp_info_ddp,
15672 		(void *)&cmd_ddp_info_get,
15673 		(void *)&cmd_ddp_info_info,
15674 		(void *)&cmd_ddp_info_filepath,
15675 		NULL,
15676 	},
15677 };
15678 
15679 /* Get dynamic device personalization profile info list*/
15680 #define PROFILE_INFO_SIZE 48
15681 #define MAX_PROFILE_NUM 16
15682 
15683 struct cmd_ddp_get_list_result {
15684 	cmdline_fixed_string_t ddp;
15685 	cmdline_fixed_string_t get;
15686 	cmdline_fixed_string_t list;
15687 	portid_t port_id;
15688 };
15689 
15690 cmdline_parse_token_string_t cmd_ddp_get_list_ddp =
15691 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_get_list_result, ddp, "ddp");
15692 cmdline_parse_token_string_t cmd_ddp_get_list_get =
15693 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_get_list_result, get, "get");
15694 cmdline_parse_token_string_t cmd_ddp_get_list_list =
15695 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_get_list_result, list, "list");
15696 cmdline_parse_token_num_t cmd_ddp_get_list_port_id =
15697 	TOKEN_NUM_INITIALIZER(struct cmd_ddp_get_list_result, port_id, UINT16);
15698 
15699 static void
15700 cmd_ddp_get_list_parsed(
15701 	__rte_unused void *parsed_result,
15702 	__rte_unused struct cmdline *cl,
15703 	__rte_unused void *data)
15704 {
15705 #ifdef RTE_NET_I40E
15706 	struct cmd_ddp_get_list_result *res = parsed_result;
15707 	struct rte_pmd_i40e_profile_list *p_list;
15708 	struct rte_pmd_i40e_profile_info *p_info;
15709 	uint32_t p_num;
15710 	uint32_t size;
15711 	uint32_t i;
15712 #endif
15713 	int ret = -ENOTSUP;
15714 
15715 #ifdef RTE_NET_I40E
15716 	size = PROFILE_INFO_SIZE * MAX_PROFILE_NUM + 4;
15717 	p_list = (struct rte_pmd_i40e_profile_list *)malloc(size);
15718 	if (!p_list) {
15719 		printf("%s: Failed to malloc buffer\n", __func__);
15720 		return;
15721 	}
15722 
15723 	if (ret == -ENOTSUP)
15724 		ret = rte_pmd_i40e_get_ddp_list(res->port_id,
15725 						(uint8_t *)p_list, size);
15726 
15727 	if (!ret) {
15728 		p_num = p_list->p_count;
15729 		printf("Profile number is: %d\n\n", p_num);
15730 
15731 		for (i = 0; i < p_num; i++) {
15732 			p_info = &p_list->p_info[i];
15733 			printf("Profile %d:\n", i);
15734 			printf("Track id:     0x%x\n", p_info->track_id);
15735 			printf("Version:      %d.%d.%d.%d\n",
15736 			       p_info->version.major,
15737 			       p_info->version.minor,
15738 			       p_info->version.update,
15739 			       p_info->version.draft);
15740 			printf("Profile name: %s\n\n", p_info->name);
15741 		}
15742 	}
15743 
15744 	free(p_list);
15745 #endif
15746 
15747 	if (ret < 0)
15748 		printf("Failed to get ddp list\n");
15749 }
15750 
15751 cmdline_parse_inst_t cmd_ddp_get_list = {
15752 	.f = cmd_ddp_get_list_parsed,
15753 	.data = NULL,
15754 	.help_str = "ddp get list <port_id>",
15755 	.tokens = {
15756 		(void *)&cmd_ddp_get_list_ddp,
15757 		(void *)&cmd_ddp_get_list_get,
15758 		(void *)&cmd_ddp_get_list_list,
15759 		(void *)&cmd_ddp_get_list_port_id,
15760 		NULL,
15761 	},
15762 };
15763 
15764 /* Configure input set */
15765 struct cmd_cfg_input_set_result {
15766 	cmdline_fixed_string_t port;
15767 	cmdline_fixed_string_t cfg;
15768 	portid_t port_id;
15769 	cmdline_fixed_string_t pctype;
15770 	uint8_t pctype_id;
15771 	cmdline_fixed_string_t inset_type;
15772 	cmdline_fixed_string_t opt;
15773 	cmdline_fixed_string_t field;
15774 	uint8_t field_idx;
15775 };
15776 
15777 static void
15778 cmd_cfg_input_set_parsed(
15779 	__rte_unused void *parsed_result,
15780 	__rte_unused struct cmdline *cl,
15781 	__rte_unused void *data)
15782 {
15783 #ifdef RTE_NET_I40E
15784 	struct cmd_cfg_input_set_result *res = parsed_result;
15785 	enum rte_pmd_i40e_inset_type inset_type = INSET_NONE;
15786 	struct rte_pmd_i40e_inset inset;
15787 #endif
15788 	int ret = -ENOTSUP;
15789 
15790 	if (!all_ports_stopped()) {
15791 		printf("Please stop all ports first\n");
15792 		return;
15793 	}
15794 
15795 #ifdef RTE_NET_I40E
15796 	if (!strcmp(res->inset_type, "hash_inset"))
15797 		inset_type = INSET_HASH;
15798 	else if (!strcmp(res->inset_type, "fdir_inset"))
15799 		inset_type = INSET_FDIR;
15800 	else if (!strcmp(res->inset_type, "fdir_flx_inset"))
15801 		inset_type = INSET_FDIR_FLX;
15802 	ret = rte_pmd_i40e_inset_get(res->port_id, res->pctype_id,
15803 				     &inset, inset_type);
15804 	if (ret) {
15805 		printf("Failed to get input set.\n");
15806 		return;
15807 	}
15808 
15809 	if (!strcmp(res->opt, "get")) {
15810 		ret = rte_pmd_i40e_inset_field_get(inset.inset,
15811 						   res->field_idx);
15812 		if (ret)
15813 			printf("Field index %d is enabled.\n", res->field_idx);
15814 		else
15815 			printf("Field index %d is disabled.\n", res->field_idx);
15816 		return;
15817 	} else if (!strcmp(res->opt, "set"))
15818 		ret = rte_pmd_i40e_inset_field_set(&inset.inset,
15819 						   res->field_idx);
15820 	else if (!strcmp(res->opt, "clear"))
15821 		ret = rte_pmd_i40e_inset_field_clear(&inset.inset,
15822 						     res->field_idx);
15823 	if (ret) {
15824 		printf("Failed to configure input set field.\n");
15825 		return;
15826 	}
15827 
15828 	ret = rte_pmd_i40e_inset_set(res->port_id, res->pctype_id,
15829 				     &inset, inset_type);
15830 	if (ret) {
15831 		printf("Failed to set input set.\n");
15832 		return;
15833 	}
15834 #endif
15835 
15836 	if (ret == -ENOTSUP)
15837 		printf("Function not supported\n");
15838 }
15839 
15840 cmdline_parse_token_string_t cmd_cfg_input_set_port =
15841 	TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result,
15842 				 port, "port");
15843 cmdline_parse_token_string_t cmd_cfg_input_set_cfg =
15844 	TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result,
15845 				 cfg, "config");
15846 cmdline_parse_token_num_t cmd_cfg_input_set_port_id =
15847 	TOKEN_NUM_INITIALIZER(struct cmd_cfg_input_set_result,
15848 			      port_id, UINT16);
15849 cmdline_parse_token_string_t cmd_cfg_input_set_pctype =
15850 	TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result,
15851 				 pctype, "pctype");
15852 cmdline_parse_token_num_t cmd_cfg_input_set_pctype_id =
15853 	TOKEN_NUM_INITIALIZER(struct cmd_cfg_input_set_result,
15854 			      pctype_id, UINT8);
15855 cmdline_parse_token_string_t cmd_cfg_input_set_inset_type =
15856 	TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result,
15857 				 inset_type,
15858 				 "hash_inset#fdir_inset#fdir_flx_inset");
15859 cmdline_parse_token_string_t cmd_cfg_input_set_opt =
15860 	TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result,
15861 				 opt, "get#set#clear");
15862 cmdline_parse_token_string_t cmd_cfg_input_set_field =
15863 	TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result,
15864 				 field, "field");
15865 cmdline_parse_token_num_t cmd_cfg_input_set_field_idx =
15866 	TOKEN_NUM_INITIALIZER(struct cmd_cfg_input_set_result,
15867 			      field_idx, UINT8);
15868 
15869 cmdline_parse_inst_t cmd_cfg_input_set = {
15870 	.f = cmd_cfg_input_set_parsed,
15871 	.data = NULL,
15872 	.help_str = "port config <port_id> pctype <pctype_id> hash_inset|"
15873 		    "fdir_inset|fdir_flx_inset get|set|clear field <field_idx>",
15874 	.tokens = {
15875 		(void *)&cmd_cfg_input_set_port,
15876 		(void *)&cmd_cfg_input_set_cfg,
15877 		(void *)&cmd_cfg_input_set_port_id,
15878 		(void *)&cmd_cfg_input_set_pctype,
15879 		(void *)&cmd_cfg_input_set_pctype_id,
15880 		(void *)&cmd_cfg_input_set_inset_type,
15881 		(void *)&cmd_cfg_input_set_opt,
15882 		(void *)&cmd_cfg_input_set_field,
15883 		(void *)&cmd_cfg_input_set_field_idx,
15884 		NULL,
15885 	},
15886 };
15887 
15888 /* Clear input set */
15889 struct cmd_clear_input_set_result {
15890 	cmdline_fixed_string_t port;
15891 	cmdline_fixed_string_t cfg;
15892 	portid_t port_id;
15893 	cmdline_fixed_string_t pctype;
15894 	uint8_t pctype_id;
15895 	cmdline_fixed_string_t inset_type;
15896 	cmdline_fixed_string_t clear;
15897 	cmdline_fixed_string_t all;
15898 };
15899 
15900 static void
15901 cmd_clear_input_set_parsed(
15902 	__rte_unused void *parsed_result,
15903 	__rte_unused struct cmdline *cl,
15904 	__rte_unused void *data)
15905 {
15906 #ifdef RTE_NET_I40E
15907 	struct cmd_clear_input_set_result *res = parsed_result;
15908 	enum rte_pmd_i40e_inset_type inset_type = INSET_NONE;
15909 	struct rte_pmd_i40e_inset inset;
15910 #endif
15911 	int ret = -ENOTSUP;
15912 
15913 	if (!all_ports_stopped()) {
15914 		printf("Please stop all ports first\n");
15915 		return;
15916 	}
15917 
15918 #ifdef RTE_NET_I40E
15919 	if (!strcmp(res->inset_type, "hash_inset"))
15920 		inset_type = INSET_HASH;
15921 	else if (!strcmp(res->inset_type, "fdir_inset"))
15922 		inset_type = INSET_FDIR;
15923 	else if (!strcmp(res->inset_type, "fdir_flx_inset"))
15924 		inset_type = INSET_FDIR_FLX;
15925 
15926 	memset(&inset, 0, sizeof(inset));
15927 
15928 	ret = rte_pmd_i40e_inset_set(res->port_id, res->pctype_id,
15929 				     &inset, inset_type);
15930 	if (ret) {
15931 		printf("Failed to clear input set.\n");
15932 		return;
15933 	}
15934 
15935 #endif
15936 
15937 	if (ret == -ENOTSUP)
15938 		printf("Function not supported\n");
15939 }
15940 
15941 cmdline_parse_token_string_t cmd_clear_input_set_port =
15942 	TOKEN_STRING_INITIALIZER(struct cmd_clear_input_set_result,
15943 				 port, "port");
15944 cmdline_parse_token_string_t cmd_clear_input_set_cfg =
15945 	TOKEN_STRING_INITIALIZER(struct cmd_clear_input_set_result,
15946 				 cfg, "config");
15947 cmdline_parse_token_num_t cmd_clear_input_set_port_id =
15948 	TOKEN_NUM_INITIALIZER(struct cmd_clear_input_set_result,
15949 			      port_id, UINT16);
15950 cmdline_parse_token_string_t cmd_clear_input_set_pctype =
15951 	TOKEN_STRING_INITIALIZER(struct cmd_clear_input_set_result,
15952 				 pctype, "pctype");
15953 cmdline_parse_token_num_t cmd_clear_input_set_pctype_id =
15954 	TOKEN_NUM_INITIALIZER(struct cmd_clear_input_set_result,
15955 			      pctype_id, UINT8);
15956 cmdline_parse_token_string_t cmd_clear_input_set_inset_type =
15957 	TOKEN_STRING_INITIALIZER(struct cmd_clear_input_set_result,
15958 				 inset_type,
15959 				 "hash_inset#fdir_inset#fdir_flx_inset");
15960 cmdline_parse_token_string_t cmd_clear_input_set_clear =
15961 	TOKEN_STRING_INITIALIZER(struct cmd_clear_input_set_result,
15962 				 clear, "clear");
15963 cmdline_parse_token_string_t cmd_clear_input_set_all =
15964 	TOKEN_STRING_INITIALIZER(struct cmd_clear_input_set_result,
15965 				 all, "all");
15966 
15967 cmdline_parse_inst_t cmd_clear_input_set = {
15968 	.f = cmd_clear_input_set_parsed,
15969 	.data = NULL,
15970 	.help_str = "port config <port_id> pctype <pctype_id> hash_inset|"
15971 		    "fdir_inset|fdir_flx_inset clear all",
15972 	.tokens = {
15973 		(void *)&cmd_clear_input_set_port,
15974 		(void *)&cmd_clear_input_set_cfg,
15975 		(void *)&cmd_clear_input_set_port_id,
15976 		(void *)&cmd_clear_input_set_pctype,
15977 		(void *)&cmd_clear_input_set_pctype_id,
15978 		(void *)&cmd_clear_input_set_inset_type,
15979 		(void *)&cmd_clear_input_set_clear,
15980 		(void *)&cmd_clear_input_set_all,
15981 		NULL,
15982 	},
15983 };
15984 
15985 /* show vf stats */
15986 
15987 /* Common result structure for show vf stats */
15988 struct cmd_show_vf_stats_result {
15989 	cmdline_fixed_string_t show;
15990 	cmdline_fixed_string_t vf;
15991 	cmdline_fixed_string_t stats;
15992 	portid_t port_id;
15993 	uint16_t vf_id;
15994 };
15995 
15996 /* Common CLI fields show vf stats*/
15997 cmdline_parse_token_string_t cmd_show_vf_stats_show =
15998 	TOKEN_STRING_INITIALIZER
15999 		(struct cmd_show_vf_stats_result,
16000 		 show, "show");
16001 cmdline_parse_token_string_t cmd_show_vf_stats_vf =
16002 	TOKEN_STRING_INITIALIZER
16003 		(struct cmd_show_vf_stats_result,
16004 		 vf, "vf");
16005 cmdline_parse_token_string_t cmd_show_vf_stats_stats =
16006 	TOKEN_STRING_INITIALIZER
16007 		(struct cmd_show_vf_stats_result,
16008 		 stats, "stats");
16009 cmdline_parse_token_num_t cmd_show_vf_stats_port_id =
16010 	TOKEN_NUM_INITIALIZER
16011 		(struct cmd_show_vf_stats_result,
16012 		 port_id, UINT16);
16013 cmdline_parse_token_num_t cmd_show_vf_stats_vf_id =
16014 	TOKEN_NUM_INITIALIZER
16015 		(struct cmd_show_vf_stats_result,
16016 		 vf_id, UINT16);
16017 
16018 static void
16019 cmd_show_vf_stats_parsed(
16020 	void *parsed_result,
16021 	__rte_unused struct cmdline *cl,
16022 	__rte_unused void *data)
16023 {
16024 	struct cmd_show_vf_stats_result *res = parsed_result;
16025 	struct rte_eth_stats stats;
16026 	int ret = -ENOTSUP;
16027 	static const char *nic_stats_border = "########################";
16028 
16029 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
16030 		return;
16031 
16032 	memset(&stats, 0, sizeof(stats));
16033 
16034 #ifdef RTE_NET_I40E
16035 	if (ret == -ENOTSUP)
16036 		ret = rte_pmd_i40e_get_vf_stats(res->port_id,
16037 						res->vf_id,
16038 						&stats);
16039 #endif
16040 #ifdef RTE_NET_BNXT
16041 	if (ret == -ENOTSUP)
16042 		ret = rte_pmd_bnxt_get_vf_stats(res->port_id,
16043 						res->vf_id,
16044 						&stats);
16045 #endif
16046 
16047 	switch (ret) {
16048 	case 0:
16049 		break;
16050 	case -EINVAL:
16051 		printf("invalid vf_id %d\n", res->vf_id);
16052 		break;
16053 	case -ENODEV:
16054 		printf("invalid port_id %d\n", res->port_id);
16055 		break;
16056 	case -ENOTSUP:
16057 		printf("function not implemented\n");
16058 		break;
16059 	default:
16060 		printf("programming error: (%s)\n", strerror(-ret));
16061 	}
16062 
16063 	printf("\n  %s NIC statistics for port %-2d vf %-2d %s\n",
16064 		nic_stats_border, res->port_id, res->vf_id, nic_stats_border);
16065 
16066 	printf("  RX-packets: %-10"PRIu64" RX-missed: %-10"PRIu64" RX-bytes:  "
16067 	       "%-"PRIu64"\n",
16068 	       stats.ipackets, stats.imissed, stats.ibytes);
16069 	printf("  RX-errors: %-"PRIu64"\n", stats.ierrors);
16070 	printf("  RX-nombuf:  %-10"PRIu64"\n",
16071 	       stats.rx_nombuf);
16072 	printf("  TX-packets: %-10"PRIu64" TX-errors: %-10"PRIu64" TX-bytes:  "
16073 	       "%-"PRIu64"\n",
16074 	       stats.opackets, stats.oerrors, stats.obytes);
16075 
16076 	printf("  %s############################%s\n",
16077 			       nic_stats_border, nic_stats_border);
16078 }
16079 
16080 cmdline_parse_inst_t cmd_show_vf_stats = {
16081 	.f = cmd_show_vf_stats_parsed,
16082 	.data = NULL,
16083 	.help_str = "show vf stats <port_id> <vf_id>",
16084 	.tokens = {
16085 		(void *)&cmd_show_vf_stats_show,
16086 		(void *)&cmd_show_vf_stats_vf,
16087 		(void *)&cmd_show_vf_stats_stats,
16088 		(void *)&cmd_show_vf_stats_port_id,
16089 		(void *)&cmd_show_vf_stats_vf_id,
16090 		NULL,
16091 	},
16092 };
16093 
16094 /* clear vf stats */
16095 
16096 /* Common result structure for clear vf stats */
16097 struct cmd_clear_vf_stats_result {
16098 	cmdline_fixed_string_t clear;
16099 	cmdline_fixed_string_t vf;
16100 	cmdline_fixed_string_t stats;
16101 	portid_t port_id;
16102 	uint16_t vf_id;
16103 };
16104 
16105 /* Common CLI fields clear vf stats*/
16106 cmdline_parse_token_string_t cmd_clear_vf_stats_clear =
16107 	TOKEN_STRING_INITIALIZER
16108 		(struct cmd_clear_vf_stats_result,
16109 		 clear, "clear");
16110 cmdline_parse_token_string_t cmd_clear_vf_stats_vf =
16111 	TOKEN_STRING_INITIALIZER
16112 		(struct cmd_clear_vf_stats_result,
16113 		 vf, "vf");
16114 cmdline_parse_token_string_t cmd_clear_vf_stats_stats =
16115 	TOKEN_STRING_INITIALIZER
16116 		(struct cmd_clear_vf_stats_result,
16117 		 stats, "stats");
16118 cmdline_parse_token_num_t cmd_clear_vf_stats_port_id =
16119 	TOKEN_NUM_INITIALIZER
16120 		(struct cmd_clear_vf_stats_result,
16121 		 port_id, UINT16);
16122 cmdline_parse_token_num_t cmd_clear_vf_stats_vf_id =
16123 	TOKEN_NUM_INITIALIZER
16124 		(struct cmd_clear_vf_stats_result,
16125 		 vf_id, UINT16);
16126 
16127 static void
16128 cmd_clear_vf_stats_parsed(
16129 	void *parsed_result,
16130 	__rte_unused struct cmdline *cl,
16131 	__rte_unused void *data)
16132 {
16133 	struct cmd_clear_vf_stats_result *res = parsed_result;
16134 	int ret = -ENOTSUP;
16135 
16136 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
16137 		return;
16138 
16139 #ifdef RTE_NET_I40E
16140 	if (ret == -ENOTSUP)
16141 		ret = rte_pmd_i40e_reset_vf_stats(res->port_id,
16142 						  res->vf_id);
16143 #endif
16144 #ifdef RTE_NET_BNXT
16145 	if (ret == -ENOTSUP)
16146 		ret = rte_pmd_bnxt_reset_vf_stats(res->port_id,
16147 						  res->vf_id);
16148 #endif
16149 
16150 	switch (ret) {
16151 	case 0:
16152 		break;
16153 	case -EINVAL:
16154 		printf("invalid vf_id %d\n", res->vf_id);
16155 		break;
16156 	case -ENODEV:
16157 		printf("invalid port_id %d\n", res->port_id);
16158 		break;
16159 	case -ENOTSUP:
16160 		printf("function not implemented\n");
16161 		break;
16162 	default:
16163 		printf("programming error: (%s)\n", strerror(-ret));
16164 	}
16165 }
16166 
16167 cmdline_parse_inst_t cmd_clear_vf_stats = {
16168 	.f = cmd_clear_vf_stats_parsed,
16169 	.data = NULL,
16170 	.help_str = "clear vf stats <port_id> <vf_id>",
16171 	.tokens = {
16172 		(void *)&cmd_clear_vf_stats_clear,
16173 		(void *)&cmd_clear_vf_stats_vf,
16174 		(void *)&cmd_clear_vf_stats_stats,
16175 		(void *)&cmd_clear_vf_stats_port_id,
16176 		(void *)&cmd_clear_vf_stats_vf_id,
16177 		NULL,
16178 	},
16179 };
16180 
16181 /* port config pctype mapping reset */
16182 
16183 /* Common result structure for port config pctype mapping reset */
16184 struct cmd_pctype_mapping_reset_result {
16185 	cmdline_fixed_string_t port;
16186 	cmdline_fixed_string_t config;
16187 	portid_t port_id;
16188 	cmdline_fixed_string_t pctype;
16189 	cmdline_fixed_string_t mapping;
16190 	cmdline_fixed_string_t reset;
16191 };
16192 
16193 /* Common CLI fields for port config pctype mapping reset*/
16194 cmdline_parse_token_string_t cmd_pctype_mapping_reset_port =
16195 	TOKEN_STRING_INITIALIZER
16196 		(struct cmd_pctype_mapping_reset_result,
16197 		 port, "port");
16198 cmdline_parse_token_string_t cmd_pctype_mapping_reset_config =
16199 	TOKEN_STRING_INITIALIZER
16200 		(struct cmd_pctype_mapping_reset_result,
16201 		 config, "config");
16202 cmdline_parse_token_num_t cmd_pctype_mapping_reset_port_id =
16203 	TOKEN_NUM_INITIALIZER
16204 		(struct cmd_pctype_mapping_reset_result,
16205 		 port_id, UINT16);
16206 cmdline_parse_token_string_t cmd_pctype_mapping_reset_pctype =
16207 	TOKEN_STRING_INITIALIZER
16208 		(struct cmd_pctype_mapping_reset_result,
16209 		 pctype, "pctype");
16210 cmdline_parse_token_string_t cmd_pctype_mapping_reset_mapping =
16211 	TOKEN_STRING_INITIALIZER
16212 		(struct cmd_pctype_mapping_reset_result,
16213 		 mapping, "mapping");
16214 cmdline_parse_token_string_t cmd_pctype_mapping_reset_reset =
16215 	TOKEN_STRING_INITIALIZER
16216 		(struct cmd_pctype_mapping_reset_result,
16217 		 reset, "reset");
16218 
16219 static void
16220 cmd_pctype_mapping_reset_parsed(
16221 	void *parsed_result,
16222 	__rte_unused struct cmdline *cl,
16223 	__rte_unused void *data)
16224 {
16225 	struct cmd_pctype_mapping_reset_result *res = parsed_result;
16226 	int ret = -ENOTSUP;
16227 
16228 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
16229 		return;
16230 
16231 #ifdef RTE_NET_I40E
16232 	ret = rte_pmd_i40e_flow_type_mapping_reset(res->port_id);
16233 #endif
16234 
16235 	switch (ret) {
16236 	case 0:
16237 		break;
16238 	case -ENODEV:
16239 		printf("invalid port_id %d\n", res->port_id);
16240 		break;
16241 	case -ENOTSUP:
16242 		printf("function not implemented\n");
16243 		break;
16244 	default:
16245 		printf("programming error: (%s)\n", strerror(-ret));
16246 	}
16247 }
16248 
16249 cmdline_parse_inst_t cmd_pctype_mapping_reset = {
16250 	.f = cmd_pctype_mapping_reset_parsed,
16251 	.data = NULL,
16252 	.help_str = "port config <port_id> pctype mapping reset",
16253 	.tokens = {
16254 		(void *)&cmd_pctype_mapping_reset_port,
16255 		(void *)&cmd_pctype_mapping_reset_config,
16256 		(void *)&cmd_pctype_mapping_reset_port_id,
16257 		(void *)&cmd_pctype_mapping_reset_pctype,
16258 		(void *)&cmd_pctype_mapping_reset_mapping,
16259 		(void *)&cmd_pctype_mapping_reset_reset,
16260 		NULL,
16261 	},
16262 };
16263 
16264 /* show port pctype mapping */
16265 
16266 /* Common result structure for show port pctype mapping */
16267 struct cmd_pctype_mapping_get_result {
16268 	cmdline_fixed_string_t show;
16269 	cmdline_fixed_string_t port;
16270 	portid_t port_id;
16271 	cmdline_fixed_string_t pctype;
16272 	cmdline_fixed_string_t mapping;
16273 };
16274 
16275 /* Common CLI fields for pctype mapping get */
16276 cmdline_parse_token_string_t cmd_pctype_mapping_get_show =
16277 	TOKEN_STRING_INITIALIZER
16278 		(struct cmd_pctype_mapping_get_result,
16279 		 show, "show");
16280 cmdline_parse_token_string_t cmd_pctype_mapping_get_port =
16281 	TOKEN_STRING_INITIALIZER
16282 		(struct cmd_pctype_mapping_get_result,
16283 		 port, "port");
16284 cmdline_parse_token_num_t cmd_pctype_mapping_get_port_id =
16285 	TOKEN_NUM_INITIALIZER
16286 		(struct cmd_pctype_mapping_get_result,
16287 		 port_id, UINT16);
16288 cmdline_parse_token_string_t cmd_pctype_mapping_get_pctype =
16289 	TOKEN_STRING_INITIALIZER
16290 		(struct cmd_pctype_mapping_get_result,
16291 		 pctype, "pctype");
16292 cmdline_parse_token_string_t cmd_pctype_mapping_get_mapping =
16293 	TOKEN_STRING_INITIALIZER
16294 		(struct cmd_pctype_mapping_get_result,
16295 		 mapping, "mapping");
16296 
16297 static void
16298 cmd_pctype_mapping_get_parsed(
16299 	void *parsed_result,
16300 	__rte_unused struct cmdline *cl,
16301 	__rte_unused void *data)
16302 {
16303 	struct cmd_pctype_mapping_get_result *res = parsed_result;
16304 	int ret = -ENOTSUP;
16305 #ifdef RTE_NET_I40E
16306 	struct rte_pmd_i40e_flow_type_mapping
16307 				mapping[RTE_PMD_I40E_FLOW_TYPE_MAX];
16308 	int i, j, first_pctype;
16309 #endif
16310 
16311 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
16312 		return;
16313 
16314 #ifdef RTE_NET_I40E
16315 	ret = rte_pmd_i40e_flow_type_mapping_get(res->port_id, mapping);
16316 #endif
16317 
16318 	switch (ret) {
16319 	case 0:
16320 		break;
16321 	case -ENODEV:
16322 		printf("invalid port_id %d\n", res->port_id);
16323 		return;
16324 	case -ENOTSUP:
16325 		printf("function not implemented\n");
16326 		return;
16327 	default:
16328 		printf("programming error: (%s)\n", strerror(-ret));
16329 		return;
16330 	}
16331 
16332 #ifdef RTE_NET_I40E
16333 	for (i = 0; i < RTE_PMD_I40E_FLOW_TYPE_MAX; i++) {
16334 		if (mapping[i].pctype != 0ULL) {
16335 			first_pctype = 1;
16336 
16337 			printf("pctype: ");
16338 			for (j = 0; j < RTE_PMD_I40E_PCTYPE_MAX; j++) {
16339 				if (mapping[i].pctype & (1ULL << j)) {
16340 					printf(first_pctype ?
16341 					       "%02d" : ",%02d", j);
16342 					first_pctype = 0;
16343 				}
16344 			}
16345 			printf("  ->  flowtype: %02d\n", mapping[i].flow_type);
16346 		}
16347 	}
16348 #endif
16349 }
16350 
16351 cmdline_parse_inst_t cmd_pctype_mapping_get = {
16352 	.f = cmd_pctype_mapping_get_parsed,
16353 	.data = NULL,
16354 	.help_str = "show port <port_id> pctype mapping",
16355 	.tokens = {
16356 		(void *)&cmd_pctype_mapping_get_show,
16357 		(void *)&cmd_pctype_mapping_get_port,
16358 		(void *)&cmd_pctype_mapping_get_port_id,
16359 		(void *)&cmd_pctype_mapping_get_pctype,
16360 		(void *)&cmd_pctype_mapping_get_mapping,
16361 		NULL,
16362 	},
16363 };
16364 
16365 /* port config pctype mapping update */
16366 
16367 /* Common result structure for port config pctype mapping update */
16368 struct cmd_pctype_mapping_update_result {
16369 	cmdline_fixed_string_t port;
16370 	cmdline_fixed_string_t config;
16371 	portid_t port_id;
16372 	cmdline_fixed_string_t pctype;
16373 	cmdline_fixed_string_t mapping;
16374 	cmdline_fixed_string_t update;
16375 	cmdline_fixed_string_t pctype_list;
16376 	uint16_t flow_type;
16377 };
16378 
16379 /* Common CLI fields for pctype mapping update*/
16380 cmdline_parse_token_string_t cmd_pctype_mapping_update_port =
16381 	TOKEN_STRING_INITIALIZER
16382 		(struct cmd_pctype_mapping_update_result,
16383 		 port, "port");
16384 cmdline_parse_token_string_t cmd_pctype_mapping_update_config =
16385 	TOKEN_STRING_INITIALIZER
16386 		(struct cmd_pctype_mapping_update_result,
16387 		 config, "config");
16388 cmdline_parse_token_num_t cmd_pctype_mapping_update_port_id =
16389 	TOKEN_NUM_INITIALIZER
16390 		(struct cmd_pctype_mapping_update_result,
16391 		 port_id, UINT16);
16392 cmdline_parse_token_string_t cmd_pctype_mapping_update_pctype =
16393 	TOKEN_STRING_INITIALIZER
16394 		(struct cmd_pctype_mapping_update_result,
16395 		 pctype, "pctype");
16396 cmdline_parse_token_string_t cmd_pctype_mapping_update_mapping =
16397 	TOKEN_STRING_INITIALIZER
16398 		(struct cmd_pctype_mapping_update_result,
16399 		 mapping, "mapping");
16400 cmdline_parse_token_string_t cmd_pctype_mapping_update_update =
16401 	TOKEN_STRING_INITIALIZER
16402 		(struct cmd_pctype_mapping_update_result,
16403 		 update, "update");
16404 cmdline_parse_token_string_t cmd_pctype_mapping_update_pc_type =
16405 	TOKEN_STRING_INITIALIZER
16406 		(struct cmd_pctype_mapping_update_result,
16407 		 pctype_list, NULL);
16408 cmdline_parse_token_num_t cmd_pctype_mapping_update_flow_type =
16409 	TOKEN_NUM_INITIALIZER
16410 		(struct cmd_pctype_mapping_update_result,
16411 		 flow_type, UINT16);
16412 
16413 static void
16414 cmd_pctype_mapping_update_parsed(
16415 	void *parsed_result,
16416 	__rte_unused struct cmdline *cl,
16417 	__rte_unused void *data)
16418 {
16419 	struct cmd_pctype_mapping_update_result *res = parsed_result;
16420 	int ret = -ENOTSUP;
16421 #ifdef RTE_NET_I40E
16422 	struct rte_pmd_i40e_flow_type_mapping mapping;
16423 	unsigned int i;
16424 	unsigned int nb_item;
16425 	unsigned int pctype_list[RTE_PMD_I40E_PCTYPE_MAX];
16426 #endif
16427 
16428 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
16429 		return;
16430 
16431 #ifdef RTE_NET_I40E
16432 	nb_item = parse_item_list(res->pctype_list, "pctypes",
16433 				  RTE_PMD_I40E_PCTYPE_MAX, pctype_list, 1);
16434 	mapping.flow_type = res->flow_type;
16435 	for (i = 0, mapping.pctype = 0ULL; i < nb_item; i++)
16436 		mapping.pctype |= (1ULL << pctype_list[i]);
16437 	ret = rte_pmd_i40e_flow_type_mapping_update(res->port_id,
16438 						&mapping,
16439 						1,
16440 						0);
16441 #endif
16442 
16443 	switch (ret) {
16444 	case 0:
16445 		break;
16446 	case -EINVAL:
16447 		printf("invalid pctype or flow type\n");
16448 		break;
16449 	case -ENODEV:
16450 		printf("invalid port_id %d\n", res->port_id);
16451 		break;
16452 	case -ENOTSUP:
16453 		printf("function not implemented\n");
16454 		break;
16455 	default:
16456 		printf("programming error: (%s)\n", strerror(-ret));
16457 	}
16458 }
16459 
16460 cmdline_parse_inst_t cmd_pctype_mapping_update = {
16461 	.f = cmd_pctype_mapping_update_parsed,
16462 	.data = NULL,
16463 	.help_str = "port config <port_id> pctype mapping update"
16464 	" <pctype_id_0,[pctype_id_1]*> <flowtype_id>",
16465 	.tokens = {
16466 		(void *)&cmd_pctype_mapping_update_port,
16467 		(void *)&cmd_pctype_mapping_update_config,
16468 		(void *)&cmd_pctype_mapping_update_port_id,
16469 		(void *)&cmd_pctype_mapping_update_pctype,
16470 		(void *)&cmd_pctype_mapping_update_mapping,
16471 		(void *)&cmd_pctype_mapping_update_update,
16472 		(void *)&cmd_pctype_mapping_update_pc_type,
16473 		(void *)&cmd_pctype_mapping_update_flow_type,
16474 		NULL,
16475 	},
16476 };
16477 
16478 /* ptype mapping get */
16479 
16480 /* Common result structure for ptype mapping get */
16481 struct cmd_ptype_mapping_get_result {
16482 	cmdline_fixed_string_t ptype;
16483 	cmdline_fixed_string_t mapping;
16484 	cmdline_fixed_string_t get;
16485 	portid_t port_id;
16486 	uint8_t valid_only;
16487 };
16488 
16489 /* Common CLI fields for ptype mapping get */
16490 cmdline_parse_token_string_t cmd_ptype_mapping_get_ptype =
16491 	TOKEN_STRING_INITIALIZER
16492 		(struct cmd_ptype_mapping_get_result,
16493 		 ptype, "ptype");
16494 cmdline_parse_token_string_t cmd_ptype_mapping_get_mapping =
16495 	TOKEN_STRING_INITIALIZER
16496 		(struct cmd_ptype_mapping_get_result,
16497 		 mapping, "mapping");
16498 cmdline_parse_token_string_t cmd_ptype_mapping_get_get =
16499 	TOKEN_STRING_INITIALIZER
16500 		(struct cmd_ptype_mapping_get_result,
16501 		 get, "get");
16502 cmdline_parse_token_num_t cmd_ptype_mapping_get_port_id =
16503 	TOKEN_NUM_INITIALIZER
16504 		(struct cmd_ptype_mapping_get_result,
16505 		 port_id, UINT16);
16506 cmdline_parse_token_num_t cmd_ptype_mapping_get_valid_only =
16507 	TOKEN_NUM_INITIALIZER
16508 		(struct cmd_ptype_mapping_get_result,
16509 		 valid_only, UINT8);
16510 
16511 static void
16512 cmd_ptype_mapping_get_parsed(
16513 	void *parsed_result,
16514 	__rte_unused struct cmdline *cl,
16515 	__rte_unused void *data)
16516 {
16517 	struct cmd_ptype_mapping_get_result *res = parsed_result;
16518 	int ret = -ENOTSUP;
16519 #ifdef RTE_NET_I40E
16520 	int max_ptype_num = 256;
16521 	struct rte_pmd_i40e_ptype_mapping mapping[max_ptype_num];
16522 	uint16_t count;
16523 	int i;
16524 #endif
16525 
16526 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
16527 		return;
16528 
16529 #ifdef RTE_NET_I40E
16530 	ret = rte_pmd_i40e_ptype_mapping_get(res->port_id,
16531 					mapping,
16532 					max_ptype_num,
16533 					&count,
16534 					res->valid_only);
16535 #endif
16536 
16537 	switch (ret) {
16538 	case 0:
16539 		break;
16540 	case -ENODEV:
16541 		printf("invalid port_id %d\n", res->port_id);
16542 		break;
16543 	case -ENOTSUP:
16544 		printf("function not implemented\n");
16545 		break;
16546 	default:
16547 		printf("programming error: (%s)\n", strerror(-ret));
16548 	}
16549 
16550 #ifdef RTE_NET_I40E
16551 	if (!ret) {
16552 		for (i = 0; i < count; i++)
16553 			printf("%3d\t0x%08x\n",
16554 				mapping[i].hw_ptype, mapping[i].sw_ptype);
16555 	}
16556 #endif
16557 }
16558 
16559 cmdline_parse_inst_t cmd_ptype_mapping_get = {
16560 	.f = cmd_ptype_mapping_get_parsed,
16561 	.data = NULL,
16562 	.help_str = "ptype mapping get <port_id> <valid_only>",
16563 	.tokens = {
16564 		(void *)&cmd_ptype_mapping_get_ptype,
16565 		(void *)&cmd_ptype_mapping_get_mapping,
16566 		(void *)&cmd_ptype_mapping_get_get,
16567 		(void *)&cmd_ptype_mapping_get_port_id,
16568 		(void *)&cmd_ptype_mapping_get_valid_only,
16569 		NULL,
16570 	},
16571 };
16572 
16573 /* ptype mapping replace */
16574 
16575 /* Common result structure for ptype mapping replace */
16576 struct cmd_ptype_mapping_replace_result {
16577 	cmdline_fixed_string_t ptype;
16578 	cmdline_fixed_string_t mapping;
16579 	cmdline_fixed_string_t replace;
16580 	portid_t port_id;
16581 	uint32_t target;
16582 	uint8_t mask;
16583 	uint32_t pkt_type;
16584 };
16585 
16586 /* Common CLI fields for ptype mapping replace */
16587 cmdline_parse_token_string_t cmd_ptype_mapping_replace_ptype =
16588 	TOKEN_STRING_INITIALIZER
16589 		(struct cmd_ptype_mapping_replace_result,
16590 		 ptype, "ptype");
16591 cmdline_parse_token_string_t cmd_ptype_mapping_replace_mapping =
16592 	TOKEN_STRING_INITIALIZER
16593 		(struct cmd_ptype_mapping_replace_result,
16594 		 mapping, "mapping");
16595 cmdline_parse_token_string_t cmd_ptype_mapping_replace_replace =
16596 	TOKEN_STRING_INITIALIZER
16597 		(struct cmd_ptype_mapping_replace_result,
16598 		 replace, "replace");
16599 cmdline_parse_token_num_t cmd_ptype_mapping_replace_port_id =
16600 	TOKEN_NUM_INITIALIZER
16601 		(struct cmd_ptype_mapping_replace_result,
16602 		 port_id, UINT16);
16603 cmdline_parse_token_num_t cmd_ptype_mapping_replace_target =
16604 	TOKEN_NUM_INITIALIZER
16605 		(struct cmd_ptype_mapping_replace_result,
16606 		 target, UINT32);
16607 cmdline_parse_token_num_t cmd_ptype_mapping_replace_mask =
16608 	TOKEN_NUM_INITIALIZER
16609 		(struct cmd_ptype_mapping_replace_result,
16610 		 mask, UINT8);
16611 cmdline_parse_token_num_t cmd_ptype_mapping_replace_pkt_type =
16612 	TOKEN_NUM_INITIALIZER
16613 		(struct cmd_ptype_mapping_replace_result,
16614 		 pkt_type, UINT32);
16615 
16616 static void
16617 cmd_ptype_mapping_replace_parsed(
16618 	void *parsed_result,
16619 	__rte_unused struct cmdline *cl,
16620 	__rte_unused void *data)
16621 {
16622 	struct cmd_ptype_mapping_replace_result *res = parsed_result;
16623 	int ret = -ENOTSUP;
16624 
16625 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
16626 		return;
16627 
16628 #ifdef RTE_NET_I40E
16629 	ret = rte_pmd_i40e_ptype_mapping_replace(res->port_id,
16630 					res->target,
16631 					res->mask,
16632 					res->pkt_type);
16633 #endif
16634 
16635 	switch (ret) {
16636 	case 0:
16637 		break;
16638 	case -EINVAL:
16639 		printf("invalid ptype 0x%8x or 0x%8x\n",
16640 				res->target, res->pkt_type);
16641 		break;
16642 	case -ENODEV:
16643 		printf("invalid port_id %d\n", res->port_id);
16644 		break;
16645 	case -ENOTSUP:
16646 		printf("function not implemented\n");
16647 		break;
16648 	default:
16649 		printf("programming error: (%s)\n", strerror(-ret));
16650 	}
16651 }
16652 
16653 cmdline_parse_inst_t cmd_ptype_mapping_replace = {
16654 	.f = cmd_ptype_mapping_replace_parsed,
16655 	.data = NULL,
16656 	.help_str =
16657 		"ptype mapping replace <port_id> <target> <mask> <pkt_type>",
16658 	.tokens = {
16659 		(void *)&cmd_ptype_mapping_replace_ptype,
16660 		(void *)&cmd_ptype_mapping_replace_mapping,
16661 		(void *)&cmd_ptype_mapping_replace_replace,
16662 		(void *)&cmd_ptype_mapping_replace_port_id,
16663 		(void *)&cmd_ptype_mapping_replace_target,
16664 		(void *)&cmd_ptype_mapping_replace_mask,
16665 		(void *)&cmd_ptype_mapping_replace_pkt_type,
16666 		NULL,
16667 	},
16668 };
16669 
16670 /* ptype mapping reset */
16671 
16672 /* Common result structure for ptype mapping reset */
16673 struct cmd_ptype_mapping_reset_result {
16674 	cmdline_fixed_string_t ptype;
16675 	cmdline_fixed_string_t mapping;
16676 	cmdline_fixed_string_t reset;
16677 	portid_t port_id;
16678 };
16679 
16680 /* Common CLI fields for ptype mapping reset*/
16681 cmdline_parse_token_string_t cmd_ptype_mapping_reset_ptype =
16682 	TOKEN_STRING_INITIALIZER
16683 		(struct cmd_ptype_mapping_reset_result,
16684 		 ptype, "ptype");
16685 cmdline_parse_token_string_t cmd_ptype_mapping_reset_mapping =
16686 	TOKEN_STRING_INITIALIZER
16687 		(struct cmd_ptype_mapping_reset_result,
16688 		 mapping, "mapping");
16689 cmdline_parse_token_string_t cmd_ptype_mapping_reset_reset =
16690 	TOKEN_STRING_INITIALIZER
16691 		(struct cmd_ptype_mapping_reset_result,
16692 		 reset, "reset");
16693 cmdline_parse_token_num_t cmd_ptype_mapping_reset_port_id =
16694 	TOKEN_NUM_INITIALIZER
16695 		(struct cmd_ptype_mapping_reset_result,
16696 		 port_id, UINT16);
16697 
16698 static void
16699 cmd_ptype_mapping_reset_parsed(
16700 	void *parsed_result,
16701 	__rte_unused struct cmdline *cl,
16702 	__rte_unused void *data)
16703 {
16704 	struct cmd_ptype_mapping_reset_result *res = parsed_result;
16705 	int ret = -ENOTSUP;
16706 
16707 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
16708 		return;
16709 
16710 #ifdef RTE_NET_I40E
16711 	ret = rte_pmd_i40e_ptype_mapping_reset(res->port_id);
16712 #endif
16713 
16714 	switch (ret) {
16715 	case 0:
16716 		break;
16717 	case -ENODEV:
16718 		printf("invalid port_id %d\n", res->port_id);
16719 		break;
16720 	case -ENOTSUP:
16721 		printf("function not implemented\n");
16722 		break;
16723 	default:
16724 		printf("programming error: (%s)\n", strerror(-ret));
16725 	}
16726 }
16727 
16728 cmdline_parse_inst_t cmd_ptype_mapping_reset = {
16729 	.f = cmd_ptype_mapping_reset_parsed,
16730 	.data = NULL,
16731 	.help_str = "ptype mapping reset <port_id>",
16732 	.tokens = {
16733 		(void *)&cmd_ptype_mapping_reset_ptype,
16734 		(void *)&cmd_ptype_mapping_reset_mapping,
16735 		(void *)&cmd_ptype_mapping_reset_reset,
16736 		(void *)&cmd_ptype_mapping_reset_port_id,
16737 		NULL,
16738 	},
16739 };
16740 
16741 /* ptype mapping update */
16742 
16743 /* Common result structure for ptype mapping update */
16744 struct cmd_ptype_mapping_update_result {
16745 	cmdline_fixed_string_t ptype;
16746 	cmdline_fixed_string_t mapping;
16747 	cmdline_fixed_string_t reset;
16748 	portid_t port_id;
16749 	uint8_t hw_ptype;
16750 	uint32_t sw_ptype;
16751 };
16752 
16753 /* Common CLI fields for ptype mapping update*/
16754 cmdline_parse_token_string_t cmd_ptype_mapping_update_ptype =
16755 	TOKEN_STRING_INITIALIZER
16756 		(struct cmd_ptype_mapping_update_result,
16757 		 ptype, "ptype");
16758 cmdline_parse_token_string_t cmd_ptype_mapping_update_mapping =
16759 	TOKEN_STRING_INITIALIZER
16760 		(struct cmd_ptype_mapping_update_result,
16761 		 mapping, "mapping");
16762 cmdline_parse_token_string_t cmd_ptype_mapping_update_update =
16763 	TOKEN_STRING_INITIALIZER
16764 		(struct cmd_ptype_mapping_update_result,
16765 		 reset, "update");
16766 cmdline_parse_token_num_t cmd_ptype_mapping_update_port_id =
16767 	TOKEN_NUM_INITIALIZER
16768 		(struct cmd_ptype_mapping_update_result,
16769 		 port_id, UINT16);
16770 cmdline_parse_token_num_t cmd_ptype_mapping_update_hw_ptype =
16771 	TOKEN_NUM_INITIALIZER
16772 		(struct cmd_ptype_mapping_update_result,
16773 		 hw_ptype, UINT8);
16774 cmdline_parse_token_num_t cmd_ptype_mapping_update_sw_ptype =
16775 	TOKEN_NUM_INITIALIZER
16776 		(struct cmd_ptype_mapping_update_result,
16777 		 sw_ptype, UINT32);
16778 
16779 static void
16780 cmd_ptype_mapping_update_parsed(
16781 	void *parsed_result,
16782 	__rte_unused struct cmdline *cl,
16783 	__rte_unused void *data)
16784 {
16785 	struct cmd_ptype_mapping_update_result *res = parsed_result;
16786 	int ret = -ENOTSUP;
16787 #ifdef RTE_NET_I40E
16788 	struct rte_pmd_i40e_ptype_mapping mapping;
16789 #endif
16790 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
16791 		return;
16792 
16793 #ifdef RTE_NET_I40E
16794 	mapping.hw_ptype = res->hw_ptype;
16795 	mapping.sw_ptype = res->sw_ptype;
16796 	ret = rte_pmd_i40e_ptype_mapping_update(res->port_id,
16797 						&mapping,
16798 						1,
16799 						0);
16800 #endif
16801 
16802 	switch (ret) {
16803 	case 0:
16804 		break;
16805 	case -EINVAL:
16806 		printf("invalid ptype 0x%8x\n", res->sw_ptype);
16807 		break;
16808 	case -ENODEV:
16809 		printf("invalid port_id %d\n", res->port_id);
16810 		break;
16811 	case -ENOTSUP:
16812 		printf("function not implemented\n");
16813 		break;
16814 	default:
16815 		printf("programming error: (%s)\n", strerror(-ret));
16816 	}
16817 }
16818 
16819 cmdline_parse_inst_t cmd_ptype_mapping_update = {
16820 	.f = cmd_ptype_mapping_update_parsed,
16821 	.data = NULL,
16822 	.help_str = "ptype mapping update <port_id> <hw_ptype> <sw_ptype>",
16823 	.tokens = {
16824 		(void *)&cmd_ptype_mapping_update_ptype,
16825 		(void *)&cmd_ptype_mapping_update_mapping,
16826 		(void *)&cmd_ptype_mapping_update_update,
16827 		(void *)&cmd_ptype_mapping_update_port_id,
16828 		(void *)&cmd_ptype_mapping_update_hw_ptype,
16829 		(void *)&cmd_ptype_mapping_update_sw_ptype,
16830 		NULL,
16831 	},
16832 };
16833 
16834 /* Common result structure for file commands */
16835 struct cmd_cmdfile_result {
16836 	cmdline_fixed_string_t load;
16837 	cmdline_fixed_string_t filename;
16838 };
16839 
16840 /* Common CLI fields for file commands */
16841 cmdline_parse_token_string_t cmd_load_cmdfile =
16842 	TOKEN_STRING_INITIALIZER(struct cmd_cmdfile_result, load, "load");
16843 cmdline_parse_token_string_t cmd_load_cmdfile_filename =
16844 	TOKEN_STRING_INITIALIZER(struct cmd_cmdfile_result, filename, NULL);
16845 
16846 static void
16847 cmd_load_from_file_parsed(
16848 	void *parsed_result,
16849 	__rte_unused struct cmdline *cl,
16850 	__rte_unused void *data)
16851 {
16852 	struct cmd_cmdfile_result *res = parsed_result;
16853 
16854 	cmdline_read_from_file(res->filename);
16855 }
16856 
16857 cmdline_parse_inst_t cmd_load_from_file = {
16858 	.f = cmd_load_from_file_parsed,
16859 	.data = NULL,
16860 	.help_str = "load <filename>",
16861 	.tokens = {
16862 		(void *)&cmd_load_cmdfile,
16863 		(void *)&cmd_load_cmdfile_filename,
16864 		NULL,
16865 	},
16866 };
16867 
16868 /* Get Rx offloads capabilities */
16869 struct cmd_rx_offload_get_capa_result {
16870 	cmdline_fixed_string_t show;
16871 	cmdline_fixed_string_t port;
16872 	portid_t port_id;
16873 	cmdline_fixed_string_t rx_offload;
16874 	cmdline_fixed_string_t capabilities;
16875 };
16876 
16877 cmdline_parse_token_string_t cmd_rx_offload_get_capa_show =
16878 	TOKEN_STRING_INITIALIZER
16879 		(struct cmd_rx_offload_get_capa_result,
16880 		 show, "show");
16881 cmdline_parse_token_string_t cmd_rx_offload_get_capa_port =
16882 	TOKEN_STRING_INITIALIZER
16883 		(struct cmd_rx_offload_get_capa_result,
16884 		 port, "port");
16885 cmdline_parse_token_num_t cmd_rx_offload_get_capa_port_id =
16886 	TOKEN_NUM_INITIALIZER
16887 		(struct cmd_rx_offload_get_capa_result,
16888 		 port_id, UINT16);
16889 cmdline_parse_token_string_t cmd_rx_offload_get_capa_rx_offload =
16890 	TOKEN_STRING_INITIALIZER
16891 		(struct cmd_rx_offload_get_capa_result,
16892 		 rx_offload, "rx_offload");
16893 cmdline_parse_token_string_t cmd_rx_offload_get_capa_capabilities =
16894 	TOKEN_STRING_INITIALIZER
16895 		(struct cmd_rx_offload_get_capa_result,
16896 		 capabilities, "capabilities");
16897 
16898 static void
16899 print_rx_offloads(uint64_t offloads)
16900 {
16901 	uint64_t single_offload;
16902 	int begin;
16903 	int end;
16904 	int bit;
16905 
16906 	if (offloads == 0)
16907 		return;
16908 
16909 	begin = __builtin_ctzll(offloads);
16910 	end = sizeof(offloads) * CHAR_BIT - __builtin_clzll(offloads);
16911 
16912 	single_offload = 1ULL << begin;
16913 	for (bit = begin; bit < end; bit++) {
16914 		if (offloads & single_offload)
16915 			printf(" %s",
16916 			       rte_eth_dev_rx_offload_name(single_offload));
16917 		single_offload <<= 1;
16918 	}
16919 }
16920 
16921 static void
16922 cmd_rx_offload_get_capa_parsed(
16923 	void *parsed_result,
16924 	__rte_unused struct cmdline *cl,
16925 	__rte_unused void *data)
16926 {
16927 	struct cmd_rx_offload_get_capa_result *res = parsed_result;
16928 	struct rte_eth_dev_info dev_info;
16929 	portid_t port_id = res->port_id;
16930 	uint64_t queue_offloads;
16931 	uint64_t port_offloads;
16932 	int ret;
16933 
16934 	ret = eth_dev_info_get_print_err(port_id, &dev_info);
16935 	if (ret != 0)
16936 		return;
16937 
16938 	queue_offloads = dev_info.rx_queue_offload_capa;
16939 	port_offloads = dev_info.rx_offload_capa ^ queue_offloads;
16940 
16941 	printf("Rx Offloading Capabilities of port %d :\n", port_id);
16942 	printf("  Per Queue :");
16943 	print_rx_offloads(queue_offloads);
16944 
16945 	printf("\n");
16946 	printf("  Per Port  :");
16947 	print_rx_offloads(port_offloads);
16948 	printf("\n\n");
16949 }
16950 
16951 cmdline_parse_inst_t cmd_rx_offload_get_capa = {
16952 	.f = cmd_rx_offload_get_capa_parsed,
16953 	.data = NULL,
16954 	.help_str = "show port <port_id> rx_offload capabilities",
16955 	.tokens = {
16956 		(void *)&cmd_rx_offload_get_capa_show,
16957 		(void *)&cmd_rx_offload_get_capa_port,
16958 		(void *)&cmd_rx_offload_get_capa_port_id,
16959 		(void *)&cmd_rx_offload_get_capa_rx_offload,
16960 		(void *)&cmd_rx_offload_get_capa_capabilities,
16961 		NULL,
16962 	}
16963 };
16964 
16965 /* Get Rx offloads configuration */
16966 struct cmd_rx_offload_get_configuration_result {
16967 	cmdline_fixed_string_t show;
16968 	cmdline_fixed_string_t port;
16969 	portid_t port_id;
16970 	cmdline_fixed_string_t rx_offload;
16971 	cmdline_fixed_string_t configuration;
16972 };
16973 
16974 cmdline_parse_token_string_t cmd_rx_offload_get_configuration_show =
16975 	TOKEN_STRING_INITIALIZER
16976 		(struct cmd_rx_offload_get_configuration_result,
16977 		 show, "show");
16978 cmdline_parse_token_string_t cmd_rx_offload_get_configuration_port =
16979 	TOKEN_STRING_INITIALIZER
16980 		(struct cmd_rx_offload_get_configuration_result,
16981 		 port, "port");
16982 cmdline_parse_token_num_t cmd_rx_offload_get_configuration_port_id =
16983 	TOKEN_NUM_INITIALIZER
16984 		(struct cmd_rx_offload_get_configuration_result,
16985 		 port_id, UINT16);
16986 cmdline_parse_token_string_t cmd_rx_offload_get_configuration_rx_offload =
16987 	TOKEN_STRING_INITIALIZER
16988 		(struct cmd_rx_offload_get_configuration_result,
16989 		 rx_offload, "rx_offload");
16990 cmdline_parse_token_string_t cmd_rx_offload_get_configuration_configuration =
16991 	TOKEN_STRING_INITIALIZER
16992 		(struct cmd_rx_offload_get_configuration_result,
16993 		 configuration, "configuration");
16994 
16995 static void
16996 cmd_rx_offload_get_configuration_parsed(
16997 	void *parsed_result,
16998 	__rte_unused struct cmdline *cl,
16999 	__rte_unused void *data)
17000 {
17001 	struct cmd_rx_offload_get_configuration_result *res = parsed_result;
17002 	struct rte_eth_dev_info dev_info;
17003 	portid_t port_id = res->port_id;
17004 	struct rte_port *port = &ports[port_id];
17005 	uint64_t port_offloads;
17006 	uint64_t queue_offloads;
17007 	uint16_t nb_rx_queues;
17008 	int q;
17009 	int ret;
17010 
17011 	printf("Rx Offloading Configuration of port %d :\n", port_id);
17012 
17013 	port_offloads = port->dev_conf.rxmode.offloads;
17014 	printf("  Port :");
17015 	print_rx_offloads(port_offloads);
17016 	printf("\n");
17017 
17018 	ret = eth_dev_info_get_print_err(port_id, &dev_info);
17019 	if (ret != 0)
17020 		return;
17021 
17022 	nb_rx_queues = dev_info.nb_rx_queues;
17023 	for (q = 0; q < nb_rx_queues; q++) {
17024 		queue_offloads = port->rx_conf[q].offloads;
17025 		printf("  Queue[%2d] :", q);
17026 		print_rx_offloads(queue_offloads);
17027 		printf("\n");
17028 	}
17029 	printf("\n");
17030 }
17031 
17032 cmdline_parse_inst_t cmd_rx_offload_get_configuration = {
17033 	.f = cmd_rx_offload_get_configuration_parsed,
17034 	.data = NULL,
17035 	.help_str = "show port <port_id> rx_offload configuration",
17036 	.tokens = {
17037 		(void *)&cmd_rx_offload_get_configuration_show,
17038 		(void *)&cmd_rx_offload_get_configuration_port,
17039 		(void *)&cmd_rx_offload_get_configuration_port_id,
17040 		(void *)&cmd_rx_offload_get_configuration_rx_offload,
17041 		(void *)&cmd_rx_offload_get_configuration_configuration,
17042 		NULL,
17043 	}
17044 };
17045 
17046 /* Enable/Disable a per port offloading */
17047 struct cmd_config_per_port_rx_offload_result {
17048 	cmdline_fixed_string_t port;
17049 	cmdline_fixed_string_t config;
17050 	portid_t port_id;
17051 	cmdline_fixed_string_t rx_offload;
17052 	cmdline_fixed_string_t offload;
17053 	cmdline_fixed_string_t on_off;
17054 };
17055 
17056 cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_port =
17057 	TOKEN_STRING_INITIALIZER
17058 		(struct cmd_config_per_port_rx_offload_result,
17059 		 port, "port");
17060 cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_config =
17061 	TOKEN_STRING_INITIALIZER
17062 		(struct cmd_config_per_port_rx_offload_result,
17063 		 config, "config");
17064 cmdline_parse_token_num_t cmd_config_per_port_rx_offload_result_port_id =
17065 	TOKEN_NUM_INITIALIZER
17066 		(struct cmd_config_per_port_rx_offload_result,
17067 		 port_id, UINT16);
17068 cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_rx_offload =
17069 	TOKEN_STRING_INITIALIZER
17070 		(struct cmd_config_per_port_rx_offload_result,
17071 		 rx_offload, "rx_offload");
17072 cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_offload =
17073 	TOKEN_STRING_INITIALIZER
17074 		(struct cmd_config_per_port_rx_offload_result,
17075 		 offload, "vlan_strip#ipv4_cksum#udp_cksum#tcp_cksum#tcp_lro#"
17076 			   "qinq_strip#outer_ipv4_cksum#macsec_strip#"
17077 			   "header_split#vlan_filter#vlan_extend#jumbo_frame#"
17078 			   "scatter#buffer_split#timestamp#security#"
17079 			   "keep_crc#rss_hash");
17080 cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_on_off =
17081 	TOKEN_STRING_INITIALIZER
17082 		(struct cmd_config_per_port_rx_offload_result,
17083 		 on_off, "on#off");
17084 
17085 static uint64_t
17086 search_rx_offload(const char *name)
17087 {
17088 	uint64_t single_offload;
17089 	const char *single_name;
17090 	int found = 0;
17091 	unsigned int bit;
17092 
17093 	single_offload = 1;
17094 	for (bit = 0; bit < sizeof(single_offload) * CHAR_BIT; bit++) {
17095 		single_name = rte_eth_dev_rx_offload_name(single_offload);
17096 		if (!strcasecmp(single_name, name)) {
17097 			found = 1;
17098 			break;
17099 		}
17100 		single_offload <<= 1;
17101 	}
17102 
17103 	if (found)
17104 		return single_offload;
17105 
17106 	return 0;
17107 }
17108 
17109 static void
17110 cmd_config_per_port_rx_offload_parsed(void *parsed_result,
17111 				__rte_unused struct cmdline *cl,
17112 				__rte_unused void *data)
17113 {
17114 	struct cmd_config_per_port_rx_offload_result *res = parsed_result;
17115 	portid_t port_id = res->port_id;
17116 	struct rte_eth_dev_info dev_info;
17117 	struct rte_port *port = &ports[port_id];
17118 	uint64_t single_offload;
17119 	uint16_t nb_rx_queues;
17120 	int q;
17121 	int ret;
17122 
17123 	if (port->port_status != RTE_PORT_STOPPED) {
17124 		printf("Error: Can't config offload when Port %d "
17125 		       "is not stopped\n", port_id);
17126 		return;
17127 	}
17128 
17129 	single_offload = search_rx_offload(res->offload);
17130 	if (single_offload == 0) {
17131 		printf("Unknown offload name: %s\n", res->offload);
17132 		return;
17133 	}
17134 
17135 	ret = eth_dev_info_get_print_err(port_id, &dev_info);
17136 	if (ret != 0)
17137 		return;
17138 
17139 	nb_rx_queues = dev_info.nb_rx_queues;
17140 	if (!strcmp(res->on_off, "on")) {
17141 		port->dev_conf.rxmode.offloads |= single_offload;
17142 		for (q = 0; q < nb_rx_queues; q++)
17143 			port->rx_conf[q].offloads |= single_offload;
17144 	} else {
17145 		port->dev_conf.rxmode.offloads &= ~single_offload;
17146 		for (q = 0; q < nb_rx_queues; q++)
17147 			port->rx_conf[q].offloads &= ~single_offload;
17148 	}
17149 
17150 	cmd_reconfig_device_queue(port_id, 1, 1);
17151 }
17152 
17153 cmdline_parse_inst_t cmd_config_per_port_rx_offload = {
17154 	.f = cmd_config_per_port_rx_offload_parsed,
17155 	.data = NULL,
17156 	.help_str = "port config <port_id> rx_offload vlan_strip|ipv4_cksum|"
17157 		    "udp_cksum|tcp_cksum|tcp_lro|qinq_strip|outer_ipv4_cksum|"
17158 		    "macsec_strip|header_split|vlan_filter|vlan_extend|"
17159 		    "jumbo_frame|scatter|buffer_split|timestamp|security|"
17160 		    "keep_crc|rss_hash on|off",
17161 	.tokens = {
17162 		(void *)&cmd_config_per_port_rx_offload_result_port,
17163 		(void *)&cmd_config_per_port_rx_offload_result_config,
17164 		(void *)&cmd_config_per_port_rx_offload_result_port_id,
17165 		(void *)&cmd_config_per_port_rx_offload_result_rx_offload,
17166 		(void *)&cmd_config_per_port_rx_offload_result_offload,
17167 		(void *)&cmd_config_per_port_rx_offload_result_on_off,
17168 		NULL,
17169 	}
17170 };
17171 
17172 /* Enable/Disable a per queue offloading */
17173 struct cmd_config_per_queue_rx_offload_result {
17174 	cmdline_fixed_string_t port;
17175 	portid_t port_id;
17176 	cmdline_fixed_string_t rxq;
17177 	uint16_t queue_id;
17178 	cmdline_fixed_string_t rx_offload;
17179 	cmdline_fixed_string_t offload;
17180 	cmdline_fixed_string_t on_off;
17181 };
17182 
17183 cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_port =
17184 	TOKEN_STRING_INITIALIZER
17185 		(struct cmd_config_per_queue_rx_offload_result,
17186 		 port, "port");
17187 cmdline_parse_token_num_t cmd_config_per_queue_rx_offload_result_port_id =
17188 	TOKEN_NUM_INITIALIZER
17189 		(struct cmd_config_per_queue_rx_offload_result,
17190 		 port_id, UINT16);
17191 cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_rxq =
17192 	TOKEN_STRING_INITIALIZER
17193 		(struct cmd_config_per_queue_rx_offload_result,
17194 		 rxq, "rxq");
17195 cmdline_parse_token_num_t cmd_config_per_queue_rx_offload_result_queue_id =
17196 	TOKEN_NUM_INITIALIZER
17197 		(struct cmd_config_per_queue_rx_offload_result,
17198 		 queue_id, UINT16);
17199 cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_rxoffload =
17200 	TOKEN_STRING_INITIALIZER
17201 		(struct cmd_config_per_queue_rx_offload_result,
17202 		 rx_offload, "rx_offload");
17203 cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_offload =
17204 	TOKEN_STRING_INITIALIZER
17205 		(struct cmd_config_per_queue_rx_offload_result,
17206 		 offload, "vlan_strip#ipv4_cksum#udp_cksum#tcp_cksum#tcp_lro#"
17207 			   "qinq_strip#outer_ipv4_cksum#macsec_strip#"
17208 			   "header_split#vlan_filter#vlan_extend#jumbo_frame#"
17209 			   "scatter#buffer_split#timestamp#security#keep_crc");
17210 cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_on_off =
17211 	TOKEN_STRING_INITIALIZER
17212 		(struct cmd_config_per_queue_rx_offload_result,
17213 		 on_off, "on#off");
17214 
17215 static void
17216 cmd_config_per_queue_rx_offload_parsed(void *parsed_result,
17217 				__rte_unused struct cmdline *cl,
17218 				__rte_unused void *data)
17219 {
17220 	struct cmd_config_per_queue_rx_offload_result *res = parsed_result;
17221 	struct rte_eth_dev_info dev_info;
17222 	portid_t port_id = res->port_id;
17223 	uint16_t queue_id = res->queue_id;
17224 	struct rte_port *port = &ports[port_id];
17225 	uint64_t single_offload;
17226 	int ret;
17227 
17228 	if (port->port_status != RTE_PORT_STOPPED) {
17229 		printf("Error: Can't config offload when Port %d "
17230 		       "is not stopped\n", port_id);
17231 		return;
17232 	}
17233 
17234 	ret = eth_dev_info_get_print_err(port_id, &dev_info);
17235 	if (ret != 0)
17236 		return;
17237 
17238 	if (queue_id >= dev_info.nb_rx_queues) {
17239 		printf("Error: input queue_id should be 0 ... "
17240 		       "%d\n", dev_info.nb_rx_queues - 1);
17241 		return;
17242 	}
17243 
17244 	single_offload = search_rx_offload(res->offload);
17245 	if (single_offload == 0) {
17246 		printf("Unknown offload name: %s\n", res->offload);
17247 		return;
17248 	}
17249 
17250 	if (!strcmp(res->on_off, "on"))
17251 		port->rx_conf[queue_id].offloads |= single_offload;
17252 	else
17253 		port->rx_conf[queue_id].offloads &= ~single_offload;
17254 
17255 	cmd_reconfig_device_queue(port_id, 1, 1);
17256 }
17257 
17258 cmdline_parse_inst_t cmd_config_per_queue_rx_offload = {
17259 	.f = cmd_config_per_queue_rx_offload_parsed,
17260 	.data = NULL,
17261 	.help_str = "port <port_id> rxq <queue_id> rx_offload "
17262 		    "vlan_strip|ipv4_cksum|"
17263 		    "udp_cksum|tcp_cksum|tcp_lro|qinq_strip|outer_ipv4_cksum|"
17264 		    "macsec_strip|header_split|vlan_filter|vlan_extend|"
17265 		    "jumbo_frame|scatter|buffer_split|timestamp|security|"
17266 		    "keep_crc on|off",
17267 	.tokens = {
17268 		(void *)&cmd_config_per_queue_rx_offload_result_port,
17269 		(void *)&cmd_config_per_queue_rx_offload_result_port_id,
17270 		(void *)&cmd_config_per_queue_rx_offload_result_rxq,
17271 		(void *)&cmd_config_per_queue_rx_offload_result_queue_id,
17272 		(void *)&cmd_config_per_queue_rx_offload_result_rxoffload,
17273 		(void *)&cmd_config_per_queue_rx_offload_result_offload,
17274 		(void *)&cmd_config_per_queue_rx_offload_result_on_off,
17275 		NULL,
17276 	}
17277 };
17278 
17279 /* Get Tx offloads capabilities */
17280 struct cmd_tx_offload_get_capa_result {
17281 	cmdline_fixed_string_t show;
17282 	cmdline_fixed_string_t port;
17283 	portid_t port_id;
17284 	cmdline_fixed_string_t tx_offload;
17285 	cmdline_fixed_string_t capabilities;
17286 };
17287 
17288 cmdline_parse_token_string_t cmd_tx_offload_get_capa_show =
17289 	TOKEN_STRING_INITIALIZER
17290 		(struct cmd_tx_offload_get_capa_result,
17291 		 show, "show");
17292 cmdline_parse_token_string_t cmd_tx_offload_get_capa_port =
17293 	TOKEN_STRING_INITIALIZER
17294 		(struct cmd_tx_offload_get_capa_result,
17295 		 port, "port");
17296 cmdline_parse_token_num_t cmd_tx_offload_get_capa_port_id =
17297 	TOKEN_NUM_INITIALIZER
17298 		(struct cmd_tx_offload_get_capa_result,
17299 		 port_id, UINT16);
17300 cmdline_parse_token_string_t cmd_tx_offload_get_capa_tx_offload =
17301 	TOKEN_STRING_INITIALIZER
17302 		(struct cmd_tx_offload_get_capa_result,
17303 		 tx_offload, "tx_offload");
17304 cmdline_parse_token_string_t cmd_tx_offload_get_capa_capabilities =
17305 	TOKEN_STRING_INITIALIZER
17306 		(struct cmd_tx_offload_get_capa_result,
17307 		 capabilities, "capabilities");
17308 
17309 static void
17310 print_tx_offloads(uint64_t offloads)
17311 {
17312 	uint64_t single_offload;
17313 	int begin;
17314 	int end;
17315 	int bit;
17316 
17317 	if (offloads == 0)
17318 		return;
17319 
17320 	begin = __builtin_ctzll(offloads);
17321 	end = sizeof(offloads) * CHAR_BIT - __builtin_clzll(offloads);
17322 
17323 	single_offload = 1ULL << begin;
17324 	for (bit = begin; bit < end; bit++) {
17325 		if (offloads & single_offload)
17326 			printf(" %s",
17327 			       rte_eth_dev_tx_offload_name(single_offload));
17328 		single_offload <<= 1;
17329 	}
17330 }
17331 
17332 static void
17333 cmd_tx_offload_get_capa_parsed(
17334 	void *parsed_result,
17335 	__rte_unused struct cmdline *cl,
17336 	__rte_unused void *data)
17337 {
17338 	struct cmd_tx_offload_get_capa_result *res = parsed_result;
17339 	struct rte_eth_dev_info dev_info;
17340 	portid_t port_id = res->port_id;
17341 	uint64_t queue_offloads;
17342 	uint64_t port_offloads;
17343 	int ret;
17344 
17345 	ret = eth_dev_info_get_print_err(port_id, &dev_info);
17346 	if (ret != 0)
17347 		return;
17348 
17349 	queue_offloads = dev_info.tx_queue_offload_capa;
17350 	port_offloads = dev_info.tx_offload_capa ^ queue_offloads;
17351 
17352 	printf("Tx Offloading Capabilities of port %d :\n", port_id);
17353 	printf("  Per Queue :");
17354 	print_tx_offloads(queue_offloads);
17355 
17356 	printf("\n");
17357 	printf("  Per Port  :");
17358 	print_tx_offloads(port_offloads);
17359 	printf("\n\n");
17360 }
17361 
17362 cmdline_parse_inst_t cmd_tx_offload_get_capa = {
17363 	.f = cmd_tx_offload_get_capa_parsed,
17364 	.data = NULL,
17365 	.help_str = "show port <port_id> tx_offload capabilities",
17366 	.tokens = {
17367 		(void *)&cmd_tx_offload_get_capa_show,
17368 		(void *)&cmd_tx_offload_get_capa_port,
17369 		(void *)&cmd_tx_offload_get_capa_port_id,
17370 		(void *)&cmd_tx_offload_get_capa_tx_offload,
17371 		(void *)&cmd_tx_offload_get_capa_capabilities,
17372 		NULL,
17373 	}
17374 };
17375 
17376 /* Get Tx offloads configuration */
17377 struct cmd_tx_offload_get_configuration_result {
17378 	cmdline_fixed_string_t show;
17379 	cmdline_fixed_string_t port;
17380 	portid_t port_id;
17381 	cmdline_fixed_string_t tx_offload;
17382 	cmdline_fixed_string_t configuration;
17383 };
17384 
17385 cmdline_parse_token_string_t cmd_tx_offload_get_configuration_show =
17386 	TOKEN_STRING_INITIALIZER
17387 		(struct cmd_tx_offload_get_configuration_result,
17388 		 show, "show");
17389 cmdline_parse_token_string_t cmd_tx_offload_get_configuration_port =
17390 	TOKEN_STRING_INITIALIZER
17391 		(struct cmd_tx_offload_get_configuration_result,
17392 		 port, "port");
17393 cmdline_parse_token_num_t cmd_tx_offload_get_configuration_port_id =
17394 	TOKEN_NUM_INITIALIZER
17395 		(struct cmd_tx_offload_get_configuration_result,
17396 		 port_id, UINT16);
17397 cmdline_parse_token_string_t cmd_tx_offload_get_configuration_tx_offload =
17398 	TOKEN_STRING_INITIALIZER
17399 		(struct cmd_tx_offload_get_configuration_result,
17400 		 tx_offload, "tx_offload");
17401 cmdline_parse_token_string_t cmd_tx_offload_get_configuration_configuration =
17402 	TOKEN_STRING_INITIALIZER
17403 		(struct cmd_tx_offload_get_configuration_result,
17404 		 configuration, "configuration");
17405 
17406 static void
17407 cmd_tx_offload_get_configuration_parsed(
17408 	void *parsed_result,
17409 	__rte_unused struct cmdline *cl,
17410 	__rte_unused void *data)
17411 {
17412 	struct cmd_tx_offload_get_configuration_result *res = parsed_result;
17413 	struct rte_eth_dev_info dev_info;
17414 	portid_t port_id = res->port_id;
17415 	struct rte_port *port = &ports[port_id];
17416 	uint64_t port_offloads;
17417 	uint64_t queue_offloads;
17418 	uint16_t nb_tx_queues;
17419 	int q;
17420 	int ret;
17421 
17422 	printf("Tx Offloading Configuration of port %d :\n", port_id);
17423 
17424 	port_offloads = port->dev_conf.txmode.offloads;
17425 	printf("  Port :");
17426 	print_tx_offloads(port_offloads);
17427 	printf("\n");
17428 
17429 	ret = eth_dev_info_get_print_err(port_id, &dev_info);
17430 	if (ret != 0)
17431 		return;
17432 
17433 	nb_tx_queues = dev_info.nb_tx_queues;
17434 	for (q = 0; q < nb_tx_queues; q++) {
17435 		queue_offloads = port->tx_conf[q].offloads;
17436 		printf("  Queue[%2d] :", q);
17437 		print_tx_offloads(queue_offloads);
17438 		printf("\n");
17439 	}
17440 	printf("\n");
17441 }
17442 
17443 cmdline_parse_inst_t cmd_tx_offload_get_configuration = {
17444 	.f = cmd_tx_offload_get_configuration_parsed,
17445 	.data = NULL,
17446 	.help_str = "show port <port_id> tx_offload configuration",
17447 	.tokens = {
17448 		(void *)&cmd_tx_offload_get_configuration_show,
17449 		(void *)&cmd_tx_offload_get_configuration_port,
17450 		(void *)&cmd_tx_offload_get_configuration_port_id,
17451 		(void *)&cmd_tx_offload_get_configuration_tx_offload,
17452 		(void *)&cmd_tx_offload_get_configuration_configuration,
17453 		NULL,
17454 	}
17455 };
17456 
17457 /* Enable/Disable a per port offloading */
17458 struct cmd_config_per_port_tx_offload_result {
17459 	cmdline_fixed_string_t port;
17460 	cmdline_fixed_string_t config;
17461 	portid_t port_id;
17462 	cmdline_fixed_string_t tx_offload;
17463 	cmdline_fixed_string_t offload;
17464 	cmdline_fixed_string_t on_off;
17465 };
17466 
17467 cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_port =
17468 	TOKEN_STRING_INITIALIZER
17469 		(struct cmd_config_per_port_tx_offload_result,
17470 		 port, "port");
17471 cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_config =
17472 	TOKEN_STRING_INITIALIZER
17473 		(struct cmd_config_per_port_tx_offload_result,
17474 		 config, "config");
17475 cmdline_parse_token_num_t cmd_config_per_port_tx_offload_result_port_id =
17476 	TOKEN_NUM_INITIALIZER
17477 		(struct cmd_config_per_port_tx_offload_result,
17478 		 port_id, UINT16);
17479 cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_tx_offload =
17480 	TOKEN_STRING_INITIALIZER
17481 		(struct cmd_config_per_port_tx_offload_result,
17482 		 tx_offload, "tx_offload");
17483 cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_offload =
17484 	TOKEN_STRING_INITIALIZER
17485 		(struct cmd_config_per_port_tx_offload_result,
17486 		 offload, "vlan_insert#ipv4_cksum#udp_cksum#tcp_cksum#"
17487 			  "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
17488 			  "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
17489 			  "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
17490 			  "mt_lockfree#multi_segs#mbuf_fast_free#security#"
17491 			  "send_on_timestamp");
17492 cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_on_off =
17493 	TOKEN_STRING_INITIALIZER
17494 		(struct cmd_config_per_port_tx_offload_result,
17495 		 on_off, "on#off");
17496 
17497 static uint64_t
17498 search_tx_offload(const char *name)
17499 {
17500 	uint64_t single_offload;
17501 	const char *single_name;
17502 	int found = 0;
17503 	unsigned int bit;
17504 
17505 	single_offload = 1;
17506 	for (bit = 0; bit < sizeof(single_offload) * CHAR_BIT; bit++) {
17507 		single_name = rte_eth_dev_tx_offload_name(single_offload);
17508 		if (single_name == NULL)
17509 			break;
17510 		if (!strcasecmp(single_name, name)) {
17511 			found = 1;
17512 			break;
17513 		} else if (!strcasecmp(single_name, "UNKNOWN"))
17514 			break;
17515 		single_offload <<= 1;
17516 	}
17517 
17518 	if (found)
17519 		return single_offload;
17520 
17521 	return 0;
17522 }
17523 
17524 static void
17525 cmd_config_per_port_tx_offload_parsed(void *parsed_result,
17526 				__rte_unused struct cmdline *cl,
17527 				__rte_unused void *data)
17528 {
17529 	struct cmd_config_per_port_tx_offload_result *res = parsed_result;
17530 	portid_t port_id = res->port_id;
17531 	struct rte_eth_dev_info dev_info;
17532 	struct rte_port *port = &ports[port_id];
17533 	uint64_t single_offload;
17534 	uint16_t nb_tx_queues;
17535 	int q;
17536 	int ret;
17537 
17538 	if (port->port_status != RTE_PORT_STOPPED) {
17539 		printf("Error: Can't config offload when Port %d "
17540 		       "is not stopped\n", port_id);
17541 		return;
17542 	}
17543 
17544 	single_offload = search_tx_offload(res->offload);
17545 	if (single_offload == 0) {
17546 		printf("Unknown offload name: %s\n", res->offload);
17547 		return;
17548 	}
17549 
17550 	ret = eth_dev_info_get_print_err(port_id, &dev_info);
17551 	if (ret != 0)
17552 		return;
17553 
17554 	nb_tx_queues = dev_info.nb_tx_queues;
17555 	if (!strcmp(res->on_off, "on")) {
17556 		port->dev_conf.txmode.offloads |= single_offload;
17557 		for (q = 0; q < nb_tx_queues; q++)
17558 			port->tx_conf[q].offloads |= single_offload;
17559 	} else {
17560 		port->dev_conf.txmode.offloads &= ~single_offload;
17561 		for (q = 0; q < nb_tx_queues; q++)
17562 			port->tx_conf[q].offloads &= ~single_offload;
17563 	}
17564 
17565 	cmd_reconfig_device_queue(port_id, 1, 1);
17566 }
17567 
17568 cmdline_parse_inst_t cmd_config_per_port_tx_offload = {
17569 	.f = cmd_config_per_port_tx_offload_parsed,
17570 	.data = NULL,
17571 	.help_str = "port config <port_id> tx_offload "
17572 		    "vlan_insert|ipv4_cksum|udp_cksum|tcp_cksum|"
17573 		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
17574 		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
17575 		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
17576 		    "mt_lockfree|multi_segs|mbuf_fast_free|security|"
17577 		    "send_on_timestamp on|off",
17578 	.tokens = {
17579 		(void *)&cmd_config_per_port_tx_offload_result_port,
17580 		(void *)&cmd_config_per_port_tx_offload_result_config,
17581 		(void *)&cmd_config_per_port_tx_offload_result_port_id,
17582 		(void *)&cmd_config_per_port_tx_offload_result_tx_offload,
17583 		(void *)&cmd_config_per_port_tx_offload_result_offload,
17584 		(void *)&cmd_config_per_port_tx_offload_result_on_off,
17585 		NULL,
17586 	}
17587 };
17588 
17589 /* Enable/Disable a per queue offloading */
17590 struct cmd_config_per_queue_tx_offload_result {
17591 	cmdline_fixed_string_t port;
17592 	portid_t port_id;
17593 	cmdline_fixed_string_t txq;
17594 	uint16_t queue_id;
17595 	cmdline_fixed_string_t tx_offload;
17596 	cmdline_fixed_string_t offload;
17597 	cmdline_fixed_string_t on_off;
17598 };
17599 
17600 cmdline_parse_token_string_t cmd_config_per_queue_tx_offload_result_port =
17601 	TOKEN_STRING_INITIALIZER
17602 		(struct cmd_config_per_queue_tx_offload_result,
17603 		 port, "port");
17604 cmdline_parse_token_num_t cmd_config_per_queue_tx_offload_result_port_id =
17605 	TOKEN_NUM_INITIALIZER
17606 		(struct cmd_config_per_queue_tx_offload_result,
17607 		 port_id, UINT16);
17608 cmdline_parse_token_string_t cmd_config_per_queue_tx_offload_result_txq =
17609 	TOKEN_STRING_INITIALIZER
17610 		(struct cmd_config_per_queue_tx_offload_result,
17611 		 txq, "txq");
17612 cmdline_parse_token_num_t cmd_config_per_queue_tx_offload_result_queue_id =
17613 	TOKEN_NUM_INITIALIZER
17614 		(struct cmd_config_per_queue_tx_offload_result,
17615 		 queue_id, UINT16);
17616 cmdline_parse_token_string_t cmd_config_per_queue_tx_offload_result_txoffload =
17617 	TOKEN_STRING_INITIALIZER
17618 		(struct cmd_config_per_queue_tx_offload_result,
17619 		 tx_offload, "tx_offload");
17620 cmdline_parse_token_string_t cmd_config_per_queue_tx_offload_result_offload =
17621 	TOKEN_STRING_INITIALIZER
17622 		(struct cmd_config_per_queue_tx_offload_result,
17623 		 offload, "vlan_insert#ipv4_cksum#udp_cksum#tcp_cksum#"
17624 			  "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#"
17625 			  "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#"
17626 			  "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#"
17627 			  "mt_lockfree#multi_segs#mbuf_fast_free#security");
17628 cmdline_parse_token_string_t cmd_config_per_queue_tx_offload_result_on_off =
17629 	TOKEN_STRING_INITIALIZER
17630 		(struct cmd_config_per_queue_tx_offload_result,
17631 		 on_off, "on#off");
17632 
17633 static void
17634 cmd_config_per_queue_tx_offload_parsed(void *parsed_result,
17635 				__rte_unused struct cmdline *cl,
17636 				__rte_unused void *data)
17637 {
17638 	struct cmd_config_per_queue_tx_offload_result *res = parsed_result;
17639 	struct rte_eth_dev_info dev_info;
17640 	portid_t port_id = res->port_id;
17641 	uint16_t queue_id = res->queue_id;
17642 	struct rte_port *port = &ports[port_id];
17643 	uint64_t single_offload;
17644 	int ret;
17645 
17646 	if (port->port_status != RTE_PORT_STOPPED) {
17647 		printf("Error: Can't config offload when Port %d "
17648 		       "is not stopped\n", port_id);
17649 		return;
17650 	}
17651 
17652 	ret = eth_dev_info_get_print_err(port_id, &dev_info);
17653 	if (ret != 0)
17654 		return;
17655 
17656 	if (queue_id >= dev_info.nb_tx_queues) {
17657 		printf("Error: input queue_id should be 0 ... "
17658 		       "%d\n", dev_info.nb_tx_queues - 1);
17659 		return;
17660 	}
17661 
17662 	single_offload = search_tx_offload(res->offload);
17663 	if (single_offload == 0) {
17664 		printf("Unknown offload name: %s\n", res->offload);
17665 		return;
17666 	}
17667 
17668 	if (!strcmp(res->on_off, "on"))
17669 		port->tx_conf[queue_id].offloads |= single_offload;
17670 	else
17671 		port->tx_conf[queue_id].offloads &= ~single_offload;
17672 
17673 	cmd_reconfig_device_queue(port_id, 1, 1);
17674 }
17675 
17676 cmdline_parse_inst_t cmd_config_per_queue_tx_offload = {
17677 	.f = cmd_config_per_queue_tx_offload_parsed,
17678 	.data = NULL,
17679 	.help_str = "port <port_id> txq <queue_id> tx_offload "
17680 		    "vlan_insert|ipv4_cksum|udp_cksum|tcp_cksum|"
17681 		    "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|"
17682 		    "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|"
17683 		    "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|"
17684 		    "mt_lockfree|multi_segs|mbuf_fast_free|security "
17685 		    "on|off",
17686 	.tokens = {
17687 		(void *)&cmd_config_per_queue_tx_offload_result_port,
17688 		(void *)&cmd_config_per_queue_tx_offload_result_port_id,
17689 		(void *)&cmd_config_per_queue_tx_offload_result_txq,
17690 		(void *)&cmd_config_per_queue_tx_offload_result_queue_id,
17691 		(void *)&cmd_config_per_queue_tx_offload_result_txoffload,
17692 		(void *)&cmd_config_per_queue_tx_offload_result_offload,
17693 		(void *)&cmd_config_per_queue_tx_offload_result_on_off,
17694 		NULL,
17695 	}
17696 };
17697 
17698 /* *** configure tx_metadata for specific port *** */
17699 struct cmd_config_tx_metadata_specific_result {
17700 	cmdline_fixed_string_t port;
17701 	cmdline_fixed_string_t keyword;
17702 	uint16_t port_id;
17703 	cmdline_fixed_string_t item;
17704 	uint32_t value;
17705 };
17706 
17707 static void
17708 cmd_config_tx_metadata_specific_parsed(void *parsed_result,
17709 				__rte_unused struct cmdline *cl,
17710 				__rte_unused void *data)
17711 {
17712 	struct cmd_config_tx_metadata_specific_result *res = parsed_result;
17713 
17714 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
17715 		return;
17716 	ports[res->port_id].tx_metadata = res->value;
17717 	/* Add/remove callback to insert valid metadata in every Tx packet. */
17718 	if (ports[res->port_id].tx_metadata)
17719 		add_tx_md_callback(res->port_id);
17720 	else
17721 		remove_tx_md_callback(res->port_id);
17722 	rte_flow_dynf_metadata_register();
17723 }
17724 
17725 cmdline_parse_token_string_t cmd_config_tx_metadata_specific_port =
17726 	TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
17727 			port, "port");
17728 cmdline_parse_token_string_t cmd_config_tx_metadata_specific_keyword =
17729 	TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
17730 			keyword, "config");
17731 cmdline_parse_token_num_t cmd_config_tx_metadata_specific_id =
17732 	TOKEN_NUM_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
17733 			port_id, UINT16);
17734 cmdline_parse_token_string_t cmd_config_tx_metadata_specific_item =
17735 	TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
17736 			item, "tx_metadata");
17737 cmdline_parse_token_num_t cmd_config_tx_metadata_specific_value =
17738 	TOKEN_NUM_INITIALIZER(struct cmd_config_tx_metadata_specific_result,
17739 			value, UINT32);
17740 
17741 cmdline_parse_inst_t cmd_config_tx_metadata_specific = {
17742 	.f = cmd_config_tx_metadata_specific_parsed,
17743 	.data = NULL,
17744 	.help_str = "port config <port_id> tx_metadata <value>",
17745 	.tokens = {
17746 		(void *)&cmd_config_tx_metadata_specific_port,
17747 		(void *)&cmd_config_tx_metadata_specific_keyword,
17748 		(void *)&cmd_config_tx_metadata_specific_id,
17749 		(void *)&cmd_config_tx_metadata_specific_item,
17750 		(void *)&cmd_config_tx_metadata_specific_value,
17751 		NULL,
17752 	},
17753 };
17754 
17755 /* *** set dynf *** */
17756 struct cmd_config_tx_dynf_specific_result {
17757 	cmdline_fixed_string_t port;
17758 	cmdline_fixed_string_t keyword;
17759 	uint16_t port_id;
17760 	cmdline_fixed_string_t item;
17761 	cmdline_fixed_string_t name;
17762 	cmdline_fixed_string_t value;
17763 };
17764 
17765 static void
17766 cmd_config_dynf_specific_parsed(void *parsed_result,
17767 				__rte_unused struct cmdline *cl,
17768 				__rte_unused void *data)
17769 {
17770 	struct cmd_config_tx_dynf_specific_result *res = parsed_result;
17771 	struct rte_mbuf_dynflag desc_flag;
17772 	int flag;
17773 	uint64_t old_port_flags;
17774 
17775 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
17776 		return;
17777 	flag = rte_mbuf_dynflag_lookup(res->name, NULL);
17778 	if (flag <= 0) {
17779 		if (strlcpy(desc_flag.name, res->name,
17780 			    RTE_MBUF_DYN_NAMESIZE) >= RTE_MBUF_DYN_NAMESIZE) {
17781 			printf("Flag name too long\n");
17782 			return;
17783 		}
17784 		desc_flag.flags = 0;
17785 		flag = rte_mbuf_dynflag_register(&desc_flag);
17786 		if (flag < 0) {
17787 			printf("Can't register flag\n");
17788 			return;
17789 		}
17790 		strcpy(dynf_names[flag], desc_flag.name);
17791 	}
17792 	old_port_flags = ports[res->port_id].mbuf_dynf;
17793 	if (!strcmp(res->value, "set")) {
17794 		ports[res->port_id].mbuf_dynf |= 1UL << flag;
17795 		if (old_port_flags == 0)
17796 			add_tx_dynf_callback(res->port_id);
17797 	} else {
17798 		ports[res->port_id].mbuf_dynf &= ~(1UL << flag);
17799 		if (ports[res->port_id].mbuf_dynf == 0)
17800 			remove_tx_dynf_callback(res->port_id);
17801 	}
17802 }
17803 
17804 cmdline_parse_token_string_t cmd_config_tx_dynf_specific_port =
17805 	TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result,
17806 			keyword, "port");
17807 cmdline_parse_token_string_t cmd_config_tx_dynf_specific_keyword =
17808 	TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result,
17809 			keyword, "config");
17810 cmdline_parse_token_num_t cmd_config_tx_dynf_specific_port_id =
17811 	TOKEN_NUM_INITIALIZER(struct cmd_config_tx_dynf_specific_result,
17812 			port_id, UINT16);
17813 cmdline_parse_token_string_t cmd_config_tx_dynf_specific_item =
17814 	TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result,
17815 			item, "dynf");
17816 cmdline_parse_token_string_t cmd_config_tx_dynf_specific_name =
17817 	TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result,
17818 			name, NULL);
17819 cmdline_parse_token_string_t cmd_config_tx_dynf_specific_value =
17820 	TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result,
17821 			value, "set#clear");
17822 
17823 cmdline_parse_inst_t cmd_config_tx_dynf_specific = {
17824 	.f = cmd_config_dynf_specific_parsed,
17825 	.data = NULL,
17826 	.help_str = "port config <port id> dynf <name> set|clear",
17827 	.tokens = {
17828 		(void *)&cmd_config_tx_dynf_specific_port,
17829 		(void *)&cmd_config_tx_dynf_specific_keyword,
17830 		(void *)&cmd_config_tx_dynf_specific_port_id,
17831 		(void *)&cmd_config_tx_dynf_specific_item,
17832 		(void *)&cmd_config_tx_dynf_specific_name,
17833 		(void *)&cmd_config_tx_dynf_specific_value,
17834 		NULL,
17835 	},
17836 };
17837 
17838 /* *** display tx_metadata per port configuration *** */
17839 struct cmd_show_tx_metadata_result {
17840 	cmdline_fixed_string_t cmd_show;
17841 	cmdline_fixed_string_t cmd_port;
17842 	cmdline_fixed_string_t cmd_keyword;
17843 	portid_t cmd_pid;
17844 };
17845 
17846 static void
17847 cmd_show_tx_metadata_parsed(void *parsed_result,
17848 		__rte_unused struct cmdline *cl,
17849 		__rte_unused void *data)
17850 {
17851 	struct cmd_show_tx_metadata_result *res = parsed_result;
17852 
17853 	if (!rte_eth_dev_is_valid_port(res->cmd_pid)) {
17854 		printf("invalid port id %u\n", res->cmd_pid);
17855 		return;
17856 	}
17857 	if (!strcmp(res->cmd_keyword, "tx_metadata")) {
17858 		printf("Port %u tx_metadata: %u\n", res->cmd_pid,
17859 		       ports[res->cmd_pid].tx_metadata);
17860 	}
17861 }
17862 
17863 cmdline_parse_token_string_t cmd_show_tx_metadata_show =
17864 	TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result,
17865 			cmd_show, "show");
17866 cmdline_parse_token_string_t cmd_show_tx_metadata_port =
17867 	TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result,
17868 			cmd_port, "port");
17869 cmdline_parse_token_num_t cmd_show_tx_metadata_pid =
17870 	TOKEN_NUM_INITIALIZER(struct cmd_show_tx_metadata_result,
17871 			cmd_pid, UINT16);
17872 cmdline_parse_token_string_t cmd_show_tx_metadata_keyword =
17873 	TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result,
17874 			cmd_keyword, "tx_metadata");
17875 
17876 cmdline_parse_inst_t cmd_show_tx_metadata = {
17877 	.f = cmd_show_tx_metadata_parsed,
17878 	.data = NULL,
17879 	.help_str = "show port <port_id> tx_metadata",
17880 	.tokens = {
17881 		(void *)&cmd_show_tx_metadata_show,
17882 		(void *)&cmd_show_tx_metadata_port,
17883 		(void *)&cmd_show_tx_metadata_pid,
17884 		(void *)&cmd_show_tx_metadata_keyword,
17885 		NULL,
17886 	},
17887 };
17888 
17889 /* *** show fec capability per port configuration *** */
17890 struct cmd_show_fec_capability_result {
17891 	cmdline_fixed_string_t cmd_show;
17892 	cmdline_fixed_string_t cmd_port;
17893 	cmdline_fixed_string_t cmd_fec;
17894 	cmdline_fixed_string_t cmd_keyword;
17895 	portid_t cmd_pid;
17896 };
17897 
17898 static void
17899 cmd_show_fec_capability_parsed(void *parsed_result,
17900 		__rte_unused struct cmdline *cl,
17901 		__rte_unused void *data)
17902 {
17903 #define FEC_CAP_NUM 2
17904 	struct cmd_show_fec_capability_result *res = parsed_result;
17905 	struct rte_eth_fec_capa speed_fec_capa[FEC_CAP_NUM];
17906 	unsigned int num = FEC_CAP_NUM;
17907 	unsigned int ret_num;
17908 	int ret;
17909 
17910 	if (!rte_eth_dev_is_valid_port(res->cmd_pid)) {
17911 		printf("Invalid port id %u\n", res->cmd_pid);
17912 		return;
17913 	}
17914 
17915 	ret = rte_eth_fec_get_capability(res->cmd_pid, speed_fec_capa, num);
17916 	if (ret == -ENOTSUP) {
17917 		printf("Function not implemented\n");
17918 		return;
17919 	} else if (ret < 0) {
17920 		printf("Get FEC capability failed\n");
17921 		return;
17922 	}
17923 
17924 	ret_num = (unsigned int)ret;
17925 	show_fec_capability(ret_num, speed_fec_capa);
17926 }
17927 
17928 cmdline_parse_token_string_t cmd_show_fec_capability_show =
17929 	TOKEN_STRING_INITIALIZER(struct cmd_show_fec_capability_result,
17930 			cmd_show, "show");
17931 cmdline_parse_token_string_t cmd_show_fec_capability_port =
17932 	TOKEN_STRING_INITIALIZER(struct cmd_show_fec_capability_result,
17933 			cmd_port, "port");
17934 cmdline_parse_token_num_t cmd_show_fec_capability_pid =
17935 	TOKEN_NUM_INITIALIZER(struct cmd_show_fec_capability_result,
17936 			cmd_pid, UINT16);
17937 cmdline_parse_token_string_t cmd_show_fec_capability_fec =
17938 	TOKEN_STRING_INITIALIZER(struct cmd_show_fec_capability_result,
17939 			cmd_fec, "fec");
17940 cmdline_parse_token_string_t cmd_show_fec_capability_keyword =
17941 	TOKEN_STRING_INITIALIZER(struct cmd_show_fec_capability_result,
17942 			cmd_keyword, "capabilities");
17943 
17944 cmdline_parse_inst_t cmd_show_capability = {
17945 	.f = cmd_show_fec_capability_parsed,
17946 	.data = NULL,
17947 	.help_str = "show port <port_id> fec capabilities",
17948 	.tokens = {
17949 		(void *)&cmd_show_fec_capability_show,
17950 		(void *)&cmd_show_fec_capability_port,
17951 		(void *)&cmd_show_fec_capability_pid,
17952 		(void *)&cmd_show_fec_capability_fec,
17953 		(void *)&cmd_show_fec_capability_keyword,
17954 		NULL,
17955 	},
17956 };
17957 
17958 /* *** show fec mode per port configuration *** */
17959 struct cmd_show_fec_metadata_result {
17960 	cmdline_fixed_string_t cmd_show;
17961 	cmdline_fixed_string_t cmd_port;
17962 	cmdline_fixed_string_t cmd_keyword;
17963 	portid_t cmd_pid;
17964 };
17965 
17966 static void
17967 cmd_show_fec_mode_parsed(void *parsed_result,
17968 		__rte_unused struct cmdline *cl,
17969 		__rte_unused void *data)
17970 {
17971 #define FEC_NAME_SIZE 16
17972 	struct cmd_show_fec_metadata_result *res = parsed_result;
17973 	uint32_t mode;
17974 	char buf[FEC_NAME_SIZE];
17975 	int ret;
17976 
17977 	if (!rte_eth_dev_is_valid_port(res->cmd_pid)) {
17978 		printf("Invalid port id %u\n", res->cmd_pid);
17979 		return;
17980 	}
17981 	ret = rte_eth_fec_get(res->cmd_pid, &mode);
17982 	if (ret == -ENOTSUP) {
17983 		printf("Function not implemented\n");
17984 		return;
17985 	} else if (ret < 0) {
17986 		printf("Get FEC mode failed\n");
17987 		return;
17988 	}
17989 
17990 	switch (mode) {
17991 	case RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC):
17992 		strlcpy(buf, "off", sizeof(buf));
17993 		break;
17994 	case RTE_ETH_FEC_MODE_CAPA_MASK(AUTO):
17995 		strlcpy(buf, "auto", sizeof(buf));
17996 		break;
17997 	case RTE_ETH_FEC_MODE_CAPA_MASK(BASER):
17998 		strlcpy(buf, "baser", sizeof(buf));
17999 		break;
18000 	case RTE_ETH_FEC_MODE_CAPA_MASK(RS):
18001 		strlcpy(buf, "rs", sizeof(buf));
18002 		break;
18003 	default:
18004 		return;
18005 	}
18006 
18007 	printf("%s\n", buf);
18008 }
18009 
18010 cmdline_parse_token_string_t cmd_show_fec_mode_show =
18011 	TOKEN_STRING_INITIALIZER(struct cmd_show_fec_metadata_result,
18012 			cmd_show, "show");
18013 cmdline_parse_token_string_t cmd_show_fec_mode_port =
18014 	TOKEN_STRING_INITIALIZER(struct cmd_show_fec_metadata_result,
18015 			cmd_port, "port");
18016 cmdline_parse_token_num_t cmd_show_fec_mode_pid =
18017 	TOKEN_NUM_INITIALIZER(struct cmd_show_fec_metadata_result,
18018 			cmd_pid, UINT16);
18019 cmdline_parse_token_string_t cmd_show_fec_mode_keyword =
18020 	TOKEN_STRING_INITIALIZER(struct cmd_show_fec_metadata_result,
18021 			cmd_keyword, "fec_mode");
18022 
18023 cmdline_parse_inst_t cmd_show_fec_mode = {
18024 	.f = cmd_show_fec_mode_parsed,
18025 	.data = NULL,
18026 	.help_str = "show port <port_id> fec_mode",
18027 	.tokens = {
18028 		(void *)&cmd_show_fec_mode_show,
18029 		(void *)&cmd_show_fec_mode_port,
18030 		(void *)&cmd_show_fec_mode_pid,
18031 		(void *)&cmd_show_fec_mode_keyword,
18032 		NULL,
18033 	},
18034 };
18035 
18036 /* *** set fec mode per port configuration *** */
18037 struct cmd_set_port_fec_mode {
18038 	cmdline_fixed_string_t set;
18039 	cmdline_fixed_string_t port;
18040 	portid_t port_id;
18041 	cmdline_fixed_string_t fec_mode;
18042 	cmdline_fixed_string_t fec_value;
18043 };
18044 
18045 /* Common CLI fields for set fec mode */
18046 cmdline_parse_token_string_t cmd_set_port_fec_mode_set =
18047 	TOKEN_STRING_INITIALIZER
18048 		(struct cmd_set_port_fec_mode,
18049 		 set, "set");
18050 cmdline_parse_token_string_t cmd_set_port_fec_mode_port =
18051 	TOKEN_STRING_INITIALIZER
18052 		(struct cmd_set_port_fec_mode,
18053 		 port, "port");
18054 cmdline_parse_token_num_t cmd_set_port_fec_mode_port_id =
18055 	TOKEN_NUM_INITIALIZER
18056 		(struct cmd_set_port_fec_mode,
18057 		 port_id, UINT16);
18058 cmdline_parse_token_string_t cmd_set_port_fec_mode_str =
18059 	TOKEN_STRING_INITIALIZER
18060 		(struct cmd_set_port_fec_mode,
18061 		 fec_mode, "fec_mode");
18062 cmdline_parse_token_string_t cmd_set_port_fec_mode_value =
18063 	TOKEN_STRING_INITIALIZER
18064 		(struct cmd_set_port_fec_mode,
18065 		 fec_value, NULL);
18066 
18067 static void
18068 cmd_set_port_fec_mode_parsed(
18069 	void *parsed_result,
18070 	__rte_unused struct cmdline *cl,
18071 	__rte_unused void *data)
18072 {
18073 	struct cmd_set_port_fec_mode *res = parsed_result;
18074 	uint16_t port_id = res->port_id;
18075 	uint32_t mode;
18076 	int ret;
18077 
18078 	ret = parse_fec_mode(res->fec_value, &mode);
18079 	if (ret < 0) {
18080 		printf("Unknown fec mode: %s for Port %d\n", res->fec_value,
18081 			port_id);
18082 		return;
18083 	}
18084 
18085 	ret = rte_eth_fec_set(port_id, mode);
18086 	if (ret == -ENOTSUP) {
18087 		printf("Function not implemented\n");
18088 		return;
18089 	} else if (ret < 0) {
18090 		printf("Set FEC mode failed\n");
18091 		return;
18092 	}
18093 }
18094 
18095 cmdline_parse_inst_t cmd_set_fec_mode = {
18096 	.f = cmd_set_port_fec_mode_parsed,
18097 	.data = NULL,
18098 	.help_str = "set port <port_id> fec_mode auto|off|rs|baser",
18099 	.tokens = {
18100 		(void *)&cmd_set_port_fec_mode_set,
18101 		(void *)&cmd_set_port_fec_mode_port,
18102 		(void *)&cmd_set_port_fec_mode_port_id,
18103 		(void *)&cmd_set_port_fec_mode_str,
18104 		(void *)&cmd_set_port_fec_mode_value,
18105 		NULL,
18106 	},
18107 };
18108 
18109 /* show port supported ptypes */
18110 
18111 /* Common result structure for show port ptypes */
18112 struct cmd_show_port_supported_ptypes_result {
18113 	cmdline_fixed_string_t show;
18114 	cmdline_fixed_string_t port;
18115 	portid_t port_id;
18116 	cmdline_fixed_string_t ptypes;
18117 };
18118 
18119 /* Common CLI fields for show port ptypes */
18120 cmdline_parse_token_string_t cmd_show_port_supported_ptypes_show =
18121 	TOKEN_STRING_INITIALIZER
18122 		(struct cmd_show_port_supported_ptypes_result,
18123 		 show, "show");
18124 cmdline_parse_token_string_t cmd_show_port_supported_ptypes_port =
18125 	TOKEN_STRING_INITIALIZER
18126 		(struct cmd_show_port_supported_ptypes_result,
18127 		 port, "port");
18128 cmdline_parse_token_num_t cmd_show_port_supported_ptypes_port_id =
18129 	TOKEN_NUM_INITIALIZER
18130 		(struct cmd_show_port_supported_ptypes_result,
18131 		 port_id, UINT16);
18132 cmdline_parse_token_string_t cmd_show_port_supported_ptypes_ptypes =
18133 	TOKEN_STRING_INITIALIZER
18134 		(struct cmd_show_port_supported_ptypes_result,
18135 		 ptypes, "ptypes");
18136 
18137 static void
18138 cmd_show_port_supported_ptypes_parsed(
18139 	void *parsed_result,
18140 	__rte_unused struct cmdline *cl,
18141 	__rte_unused void *data)
18142 {
18143 #define RSVD_PTYPE_MASK       0xf0000000
18144 #define MAX_PTYPES_PER_LAYER  16
18145 #define LTYPE_NAMESIZE        32
18146 #define PTYPE_NAMESIZE        256
18147 	struct cmd_show_port_supported_ptypes_result *res = parsed_result;
18148 	char buf[PTYPE_NAMESIZE], ltype[LTYPE_NAMESIZE];
18149 	uint32_t ptype_mask = RTE_PTYPE_L2_MASK;
18150 	uint32_t ptypes[MAX_PTYPES_PER_LAYER];
18151 	uint16_t port_id = res->port_id;
18152 	int ret, i;
18153 
18154 	ret = rte_eth_dev_get_supported_ptypes(port_id, ptype_mask, NULL, 0);
18155 	if (ret < 0)
18156 		return;
18157 
18158 	while (ptype_mask != RSVD_PTYPE_MASK) {
18159 
18160 		switch (ptype_mask) {
18161 		case RTE_PTYPE_L2_MASK:
18162 			strlcpy(ltype, "L2", sizeof(ltype));
18163 			break;
18164 		case RTE_PTYPE_L3_MASK:
18165 			strlcpy(ltype, "L3", sizeof(ltype));
18166 			break;
18167 		case RTE_PTYPE_L4_MASK:
18168 			strlcpy(ltype, "L4", sizeof(ltype));
18169 			break;
18170 		case RTE_PTYPE_TUNNEL_MASK:
18171 			strlcpy(ltype, "Tunnel", sizeof(ltype));
18172 			break;
18173 		case RTE_PTYPE_INNER_L2_MASK:
18174 			strlcpy(ltype, "Inner L2", sizeof(ltype));
18175 			break;
18176 		case RTE_PTYPE_INNER_L3_MASK:
18177 			strlcpy(ltype, "Inner L3", sizeof(ltype));
18178 			break;
18179 		case RTE_PTYPE_INNER_L4_MASK:
18180 			strlcpy(ltype, "Inner L4", sizeof(ltype));
18181 			break;
18182 		default:
18183 			return;
18184 		}
18185 
18186 		ret = rte_eth_dev_get_supported_ptypes(res->port_id,
18187 						       ptype_mask, ptypes,
18188 						       MAX_PTYPES_PER_LAYER);
18189 
18190 		if (ret > 0)
18191 			printf("Supported %s ptypes:\n", ltype);
18192 		else
18193 			printf("%s ptypes unsupported\n", ltype);
18194 
18195 		for (i = 0; i < ret; ++i) {
18196 			rte_get_ptype_name(ptypes[i], buf, sizeof(buf));
18197 			printf("%s\n", buf);
18198 		}
18199 
18200 		ptype_mask <<= 4;
18201 	}
18202 }
18203 
18204 cmdline_parse_inst_t cmd_show_port_supported_ptypes = {
18205 	.f = cmd_show_port_supported_ptypes_parsed,
18206 	.data = NULL,
18207 	.help_str = "show port <port_id> ptypes",
18208 	.tokens = {
18209 		(void *)&cmd_show_port_supported_ptypes_show,
18210 		(void *)&cmd_show_port_supported_ptypes_port,
18211 		(void *)&cmd_show_port_supported_ptypes_port_id,
18212 		(void *)&cmd_show_port_supported_ptypes_ptypes,
18213 		NULL,
18214 	},
18215 };
18216 
18217 /* *** display rx/tx descriptor status *** */
18218 struct cmd_show_rx_tx_desc_status_result {
18219 	cmdline_fixed_string_t cmd_show;
18220 	cmdline_fixed_string_t cmd_port;
18221 	cmdline_fixed_string_t cmd_keyword;
18222 	cmdline_fixed_string_t cmd_desc;
18223 	cmdline_fixed_string_t cmd_status;
18224 	portid_t cmd_pid;
18225 	portid_t cmd_qid;
18226 	portid_t cmd_did;
18227 };
18228 
18229 static void
18230 cmd_show_rx_tx_desc_status_parsed(void *parsed_result,
18231 		__rte_unused struct cmdline *cl,
18232 		__rte_unused void *data)
18233 {
18234 	struct cmd_show_rx_tx_desc_status_result *res = parsed_result;
18235 	int rc;
18236 
18237 	if (!rte_eth_dev_is_valid_port(res->cmd_pid)) {
18238 		printf("invalid port id %u\n", res->cmd_pid);
18239 		return;
18240 	}
18241 
18242 	if (!strcmp(res->cmd_keyword, "rxq")) {
18243 		rc = rte_eth_rx_descriptor_status(res->cmd_pid, res->cmd_qid,
18244 					     res->cmd_did);
18245 		if (rc < 0) {
18246 			printf("Invalid queueid = %d\n", res->cmd_qid);
18247 			return;
18248 		}
18249 		if (rc == RTE_ETH_RX_DESC_AVAIL)
18250 			printf("Desc status = AVAILABLE\n");
18251 		else if (rc == RTE_ETH_RX_DESC_DONE)
18252 			printf("Desc status = DONE\n");
18253 		else
18254 			printf("Desc status = UNAVAILABLE\n");
18255 	} else if (!strcmp(res->cmd_keyword, "txq")) {
18256 		rc = rte_eth_tx_descriptor_status(res->cmd_pid, res->cmd_qid,
18257 					     res->cmd_did);
18258 		if (rc < 0) {
18259 			printf("Invalid queueid = %d\n", res->cmd_qid);
18260 			return;
18261 		}
18262 		if (rc == RTE_ETH_TX_DESC_FULL)
18263 			printf("Desc status = FULL\n");
18264 		else if (rc == RTE_ETH_TX_DESC_DONE)
18265 			printf("Desc status = DONE\n");
18266 		else
18267 			printf("Desc status = UNAVAILABLE\n");
18268 	}
18269 }
18270 
18271 cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_show =
18272 	TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result,
18273 			cmd_show, "show");
18274 cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_port =
18275 	TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result,
18276 			cmd_port, "port");
18277 cmdline_parse_token_num_t cmd_show_rx_tx_desc_status_pid =
18278 	TOKEN_NUM_INITIALIZER(struct cmd_show_rx_tx_desc_status_result,
18279 			cmd_pid, UINT16);
18280 cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_keyword =
18281 	TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result,
18282 			cmd_keyword, "rxq#txq");
18283 cmdline_parse_token_num_t cmd_show_rx_tx_desc_status_qid =
18284 	TOKEN_NUM_INITIALIZER(struct cmd_show_rx_tx_desc_status_result,
18285 			cmd_qid, UINT16);
18286 cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_desc =
18287 	TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result,
18288 			cmd_desc, "desc");
18289 cmdline_parse_token_num_t cmd_show_rx_tx_desc_status_did =
18290 	TOKEN_NUM_INITIALIZER(struct cmd_show_rx_tx_desc_status_result,
18291 			cmd_did, UINT16);
18292 cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_status =
18293 	TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result,
18294 			cmd_status, "status");
18295 cmdline_parse_inst_t cmd_show_rx_tx_desc_status = {
18296 	.f = cmd_show_rx_tx_desc_status_parsed,
18297 	.data = NULL,
18298 	.help_str = "show port <port_id> rxq|txq <queue_id> desc <desc_id> "
18299 		"status",
18300 	.tokens = {
18301 		(void *)&cmd_show_rx_tx_desc_status_show,
18302 		(void *)&cmd_show_rx_tx_desc_status_port,
18303 		(void *)&cmd_show_rx_tx_desc_status_pid,
18304 		(void *)&cmd_show_rx_tx_desc_status_keyword,
18305 		(void *)&cmd_show_rx_tx_desc_status_qid,
18306 		(void *)&cmd_show_rx_tx_desc_status_desc,
18307 		(void *)&cmd_show_rx_tx_desc_status_did,
18308 		(void *)&cmd_show_rx_tx_desc_status_status,
18309 		NULL,
18310 	},
18311 };
18312 
18313 /* Common result structure for set port ptypes */
18314 struct cmd_set_port_ptypes_result {
18315 	cmdline_fixed_string_t set;
18316 	cmdline_fixed_string_t port;
18317 	portid_t port_id;
18318 	cmdline_fixed_string_t ptype_mask;
18319 	uint32_t mask;
18320 };
18321 
18322 /* Common CLI fields for set port ptypes */
18323 cmdline_parse_token_string_t cmd_set_port_ptypes_set =
18324 	TOKEN_STRING_INITIALIZER
18325 		(struct cmd_set_port_ptypes_result,
18326 		 set, "set");
18327 cmdline_parse_token_string_t cmd_set_port_ptypes_port =
18328 	TOKEN_STRING_INITIALIZER
18329 		(struct cmd_set_port_ptypes_result,
18330 		 port, "port");
18331 cmdline_parse_token_num_t cmd_set_port_ptypes_port_id =
18332 	TOKEN_NUM_INITIALIZER
18333 		(struct cmd_set_port_ptypes_result,
18334 		 port_id, UINT16);
18335 cmdline_parse_token_string_t cmd_set_port_ptypes_mask_str =
18336 	TOKEN_STRING_INITIALIZER
18337 		(struct cmd_set_port_ptypes_result,
18338 		 ptype_mask, "ptype_mask");
18339 cmdline_parse_token_num_t cmd_set_port_ptypes_mask_u32 =
18340 	TOKEN_NUM_INITIALIZER
18341 		(struct cmd_set_port_ptypes_result,
18342 		 mask, UINT32);
18343 
18344 static void
18345 cmd_set_port_ptypes_parsed(
18346 	void *parsed_result,
18347 	__rte_unused struct cmdline *cl,
18348 	__rte_unused void *data)
18349 {
18350 	struct cmd_set_port_ptypes_result *res = parsed_result;
18351 #define PTYPE_NAMESIZE        256
18352 	char ptype_name[PTYPE_NAMESIZE];
18353 	uint16_t port_id = res->port_id;
18354 	uint32_t ptype_mask = res->mask;
18355 	int ret, i;
18356 
18357 	ret = rte_eth_dev_get_supported_ptypes(port_id, RTE_PTYPE_ALL_MASK,
18358 					       NULL, 0);
18359 	if (ret <= 0) {
18360 		printf("Port %d doesn't support any ptypes.\n", port_id);
18361 		return;
18362 	}
18363 
18364 	uint32_t ptypes[ret];
18365 
18366 	ret = rte_eth_dev_set_ptypes(port_id, ptype_mask, ptypes, ret);
18367 	if (ret < 0) {
18368 		printf("Unable to set requested ptypes for Port %d\n", port_id);
18369 		return;
18370 	}
18371 
18372 	printf("Successfully set following ptypes for Port %d\n", port_id);
18373 	for (i = 0; i < ret && ptypes[i] != RTE_PTYPE_UNKNOWN; i++) {
18374 		rte_get_ptype_name(ptypes[i], ptype_name, sizeof(ptype_name));
18375 		printf("%s\n", ptype_name);
18376 	}
18377 
18378 	clear_ptypes = false;
18379 }
18380 
18381 cmdline_parse_inst_t cmd_set_port_ptypes = {
18382 	.f = cmd_set_port_ptypes_parsed,
18383 	.data = NULL,
18384 	.help_str = "set port <port_id> ptype_mask <mask>",
18385 	.tokens = {
18386 		(void *)&cmd_set_port_ptypes_set,
18387 		(void *)&cmd_set_port_ptypes_port,
18388 		(void *)&cmd_set_port_ptypes_port_id,
18389 		(void *)&cmd_set_port_ptypes_mask_str,
18390 		(void *)&cmd_set_port_ptypes_mask_u32,
18391 		NULL,
18392 	},
18393 };
18394 
18395 /* *** display mac addresses added to a port *** */
18396 struct cmd_showport_macs_result {
18397 	cmdline_fixed_string_t cmd_show;
18398 	cmdline_fixed_string_t cmd_port;
18399 	cmdline_fixed_string_t cmd_keyword;
18400 	portid_t cmd_pid;
18401 };
18402 
18403 static void
18404 cmd_showport_macs_parsed(void *parsed_result,
18405 		__rte_unused struct cmdline *cl,
18406 		__rte_unused void *data)
18407 {
18408 	struct cmd_showport_macs_result *res = parsed_result;
18409 
18410 	if (port_id_is_invalid(res->cmd_pid, ENABLED_WARN))
18411 		return;
18412 
18413 	if (!strcmp(res->cmd_keyword, "macs"))
18414 		show_macs(res->cmd_pid);
18415 	else if (!strcmp(res->cmd_keyword, "mcast_macs"))
18416 		show_mcast_macs(res->cmd_pid);
18417 }
18418 
18419 cmdline_parse_token_string_t cmd_showport_macs_show =
18420 	TOKEN_STRING_INITIALIZER(struct cmd_showport_macs_result,
18421 			cmd_show, "show");
18422 cmdline_parse_token_string_t cmd_showport_macs_port =
18423 	TOKEN_STRING_INITIALIZER(struct cmd_showport_macs_result,
18424 			cmd_port, "port");
18425 cmdline_parse_token_num_t cmd_showport_macs_pid =
18426 	TOKEN_NUM_INITIALIZER(struct cmd_showport_macs_result,
18427 			cmd_pid, UINT16);
18428 cmdline_parse_token_string_t cmd_showport_macs_keyword =
18429 	TOKEN_STRING_INITIALIZER(struct cmd_showport_macs_result,
18430 			cmd_keyword, "macs#mcast_macs");
18431 
18432 cmdline_parse_inst_t cmd_showport_macs = {
18433 	.f = cmd_showport_macs_parsed,
18434 	.data = NULL,
18435 	.help_str = "show port <port_id> macs|mcast_macs",
18436 	.tokens = {
18437 		(void *)&cmd_showport_macs_show,
18438 		(void *)&cmd_showport_macs_port,
18439 		(void *)&cmd_showport_macs_pid,
18440 		(void *)&cmd_showport_macs_keyword,
18441 		NULL,
18442 	},
18443 };
18444 
18445 /* ******************************************************************************** */
18446 
18447 /* list of instructions */
18448 cmdline_parse_ctx_t main_ctx[] = {
18449 	(cmdline_parse_inst_t *)&cmd_help_brief,
18450 	(cmdline_parse_inst_t *)&cmd_help_long,
18451 	(cmdline_parse_inst_t *)&cmd_quit,
18452 	(cmdline_parse_inst_t *)&cmd_load_from_file,
18453 	(cmdline_parse_inst_t *)&cmd_showport,
18454 	(cmdline_parse_inst_t *)&cmd_showqueue,
18455 	(cmdline_parse_inst_t *)&cmd_showeeprom,
18456 	(cmdline_parse_inst_t *)&cmd_showportall,
18457 	(cmdline_parse_inst_t *)&cmd_showdevice,
18458 	(cmdline_parse_inst_t *)&cmd_showcfg,
18459 	(cmdline_parse_inst_t *)&cmd_showfwdall,
18460 	(cmdline_parse_inst_t *)&cmd_start,
18461 	(cmdline_parse_inst_t *)&cmd_start_tx_first,
18462 	(cmdline_parse_inst_t *)&cmd_start_tx_first_n,
18463 	(cmdline_parse_inst_t *)&cmd_set_link_up,
18464 	(cmdline_parse_inst_t *)&cmd_set_link_down,
18465 	(cmdline_parse_inst_t *)&cmd_reset,
18466 	(cmdline_parse_inst_t *)&cmd_set_numbers,
18467 	(cmdline_parse_inst_t *)&cmd_set_log,
18468 	(cmdline_parse_inst_t *)&cmd_set_rxoffs,
18469 	(cmdline_parse_inst_t *)&cmd_set_rxpkts,
18470 	(cmdline_parse_inst_t *)&cmd_set_txpkts,
18471 	(cmdline_parse_inst_t *)&cmd_set_txsplit,
18472 	(cmdline_parse_inst_t *)&cmd_set_txtimes,
18473 	(cmdline_parse_inst_t *)&cmd_set_fwd_list,
18474 	(cmdline_parse_inst_t *)&cmd_set_fwd_mask,
18475 	(cmdline_parse_inst_t *)&cmd_set_fwd_mode,
18476 	(cmdline_parse_inst_t *)&cmd_set_fwd_retry_mode,
18477 	(cmdline_parse_inst_t *)&cmd_set_burst_tx_retry,
18478 	(cmdline_parse_inst_t *)&cmd_set_promisc_mode_one,
18479 	(cmdline_parse_inst_t *)&cmd_set_promisc_mode_all,
18480 	(cmdline_parse_inst_t *)&cmd_set_allmulti_mode_one,
18481 	(cmdline_parse_inst_t *)&cmd_set_allmulti_mode_all,
18482 	(cmdline_parse_inst_t *)&cmd_set_flush_rx,
18483 	(cmdline_parse_inst_t *)&cmd_set_link_check,
18484 	(cmdline_parse_inst_t *)&cmd_set_bypass_mode,
18485 	(cmdline_parse_inst_t *)&cmd_set_bypass_event,
18486 	(cmdline_parse_inst_t *)&cmd_set_bypass_timeout,
18487 	(cmdline_parse_inst_t *)&cmd_show_bypass_config,
18488 #ifdef RTE_NET_BOND
18489 	(cmdline_parse_inst_t *) &cmd_set_bonding_mode,
18490 	(cmdline_parse_inst_t *) &cmd_show_bonding_config,
18491 	(cmdline_parse_inst_t *) &cmd_set_bonding_primary,
18492 	(cmdline_parse_inst_t *) &cmd_add_bonding_slave,
18493 	(cmdline_parse_inst_t *) &cmd_remove_bonding_slave,
18494 	(cmdline_parse_inst_t *) &cmd_create_bonded_device,
18495 	(cmdline_parse_inst_t *) &cmd_set_bond_mac_addr,
18496 	(cmdline_parse_inst_t *) &cmd_set_balance_xmit_policy,
18497 	(cmdline_parse_inst_t *) &cmd_set_bond_mon_period,
18498 	(cmdline_parse_inst_t *) &cmd_set_lacp_dedicated_queues,
18499 	(cmdline_parse_inst_t *) &cmd_set_bonding_agg_mode_policy,
18500 #endif
18501 	(cmdline_parse_inst_t *)&cmd_vlan_offload,
18502 	(cmdline_parse_inst_t *)&cmd_vlan_tpid,
18503 	(cmdline_parse_inst_t *)&cmd_rx_vlan_filter_all,
18504 	(cmdline_parse_inst_t *)&cmd_rx_vlan_filter,
18505 	(cmdline_parse_inst_t *)&cmd_tx_vlan_set,
18506 	(cmdline_parse_inst_t *)&cmd_tx_vlan_set_qinq,
18507 	(cmdline_parse_inst_t *)&cmd_tx_vlan_reset,
18508 	(cmdline_parse_inst_t *)&cmd_tx_vlan_set_pvid,
18509 	(cmdline_parse_inst_t *)&cmd_csum_set,
18510 	(cmdline_parse_inst_t *)&cmd_csum_show,
18511 	(cmdline_parse_inst_t *)&cmd_csum_tunnel,
18512 	(cmdline_parse_inst_t *)&cmd_tso_set,
18513 	(cmdline_parse_inst_t *)&cmd_tso_show,
18514 	(cmdline_parse_inst_t *)&cmd_tunnel_tso_set,
18515 	(cmdline_parse_inst_t *)&cmd_tunnel_tso_show,
18516 	(cmdline_parse_inst_t *)&cmd_gro_enable,
18517 	(cmdline_parse_inst_t *)&cmd_gro_flush,
18518 	(cmdline_parse_inst_t *)&cmd_gro_show,
18519 	(cmdline_parse_inst_t *)&cmd_gso_enable,
18520 	(cmdline_parse_inst_t *)&cmd_gso_size,
18521 	(cmdline_parse_inst_t *)&cmd_gso_show,
18522 	(cmdline_parse_inst_t *)&cmd_link_flow_control_set,
18523 	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_rx,
18524 	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_tx,
18525 	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_hw,
18526 	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_lw,
18527 	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_pt,
18528 	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_xon,
18529 	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_macfwd,
18530 	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_autoneg,
18531 	(cmdline_parse_inst_t *)&cmd_priority_flow_control_set,
18532 	(cmdline_parse_inst_t *)&cmd_config_dcb,
18533 	(cmdline_parse_inst_t *)&cmd_read_reg,
18534 	(cmdline_parse_inst_t *)&cmd_read_reg_bit_field,
18535 	(cmdline_parse_inst_t *)&cmd_read_reg_bit,
18536 	(cmdline_parse_inst_t *)&cmd_write_reg,
18537 	(cmdline_parse_inst_t *)&cmd_write_reg_bit_field,
18538 	(cmdline_parse_inst_t *)&cmd_write_reg_bit,
18539 	(cmdline_parse_inst_t *)&cmd_read_rxd_txd,
18540 	(cmdline_parse_inst_t *)&cmd_stop,
18541 	(cmdline_parse_inst_t *)&cmd_mac_addr,
18542 	(cmdline_parse_inst_t *)&cmd_set_fwd_eth_peer,
18543 	(cmdline_parse_inst_t *)&cmd_set_qmap,
18544 	(cmdline_parse_inst_t *)&cmd_set_xstats_hide_zero,
18545 	(cmdline_parse_inst_t *)&cmd_set_record_core_cycles,
18546 	(cmdline_parse_inst_t *)&cmd_set_record_burst_stats,
18547 	(cmdline_parse_inst_t *)&cmd_operate_port,
18548 	(cmdline_parse_inst_t *)&cmd_operate_specific_port,
18549 	(cmdline_parse_inst_t *)&cmd_operate_attach_port,
18550 	(cmdline_parse_inst_t *)&cmd_operate_detach_port,
18551 	(cmdline_parse_inst_t *)&cmd_operate_detach_device,
18552 	(cmdline_parse_inst_t *)&cmd_set_port_setup_on,
18553 	(cmdline_parse_inst_t *)&cmd_config_speed_all,
18554 	(cmdline_parse_inst_t *)&cmd_config_speed_specific,
18555 	(cmdline_parse_inst_t *)&cmd_config_loopback_all,
18556 	(cmdline_parse_inst_t *)&cmd_config_loopback_specific,
18557 	(cmdline_parse_inst_t *)&cmd_config_rx_tx,
18558 	(cmdline_parse_inst_t *)&cmd_config_mtu,
18559 	(cmdline_parse_inst_t *)&cmd_config_max_pkt_len,
18560 	(cmdline_parse_inst_t *)&cmd_config_max_lro_pkt_size,
18561 	(cmdline_parse_inst_t *)&cmd_config_rx_mode_flag,
18562 	(cmdline_parse_inst_t *)&cmd_config_rss,
18563 	(cmdline_parse_inst_t *)&cmd_config_rxtx_ring_size,
18564 	(cmdline_parse_inst_t *)&cmd_config_rxtx_queue,
18565 	(cmdline_parse_inst_t *)&cmd_config_deferred_start_rxtx_queue,
18566 	(cmdline_parse_inst_t *)&cmd_setup_rxtx_queue,
18567 	(cmdline_parse_inst_t *)&cmd_config_rss_reta,
18568 	(cmdline_parse_inst_t *)&cmd_showport_reta,
18569 	(cmdline_parse_inst_t *)&cmd_showport_macs,
18570 	(cmdline_parse_inst_t *)&cmd_config_burst,
18571 	(cmdline_parse_inst_t *)&cmd_config_thresh,
18572 	(cmdline_parse_inst_t *)&cmd_config_threshold,
18573 	(cmdline_parse_inst_t *)&cmd_set_uc_hash_filter,
18574 	(cmdline_parse_inst_t *)&cmd_set_uc_all_hash_filter,
18575 	(cmdline_parse_inst_t *)&cmd_vf_mac_addr_filter,
18576 	(cmdline_parse_inst_t *)&cmd_queue_rate_limit,
18577 	(cmdline_parse_inst_t *)&cmd_tunnel_udp_config,
18578 	(cmdline_parse_inst_t *)&cmd_global_config,
18579 	(cmdline_parse_inst_t *)&cmd_set_mirror_mask,
18580 	(cmdline_parse_inst_t *)&cmd_set_mirror_link,
18581 	(cmdline_parse_inst_t *)&cmd_reset_mirror_rule,
18582 	(cmdline_parse_inst_t *)&cmd_showport_rss_hash,
18583 	(cmdline_parse_inst_t *)&cmd_showport_rss_hash_key,
18584 	(cmdline_parse_inst_t *)&cmd_config_rss_hash_key,
18585 	(cmdline_parse_inst_t *)&cmd_dump,
18586 	(cmdline_parse_inst_t *)&cmd_dump_one,
18587 	(cmdline_parse_inst_t *)&cmd_add_del_ip_flow_director,
18588 	(cmdline_parse_inst_t *)&cmd_add_del_udp_flow_director,
18589 	(cmdline_parse_inst_t *)&cmd_add_del_sctp_flow_director,
18590 	(cmdline_parse_inst_t *)&cmd_add_del_l2_flow_director,
18591 	(cmdline_parse_inst_t *)&cmd_add_del_mac_vlan_flow_director,
18592 	(cmdline_parse_inst_t *)&cmd_add_del_tunnel_flow_director,
18593 	(cmdline_parse_inst_t *)&cmd_add_del_raw_flow_director,
18594 	(cmdline_parse_inst_t *)&cmd_flush_flow_director,
18595 	(cmdline_parse_inst_t *)&cmd_set_flow_director_ip_mask,
18596 	(cmdline_parse_inst_t *)&cmd_set_flow_director_mac_vlan_mask,
18597 	(cmdline_parse_inst_t *)&cmd_set_flow_director_tunnel_mask,
18598 	(cmdline_parse_inst_t *)&cmd_set_flow_director_flex_mask,
18599 	(cmdline_parse_inst_t *)&cmd_set_flow_director_flex_payload,
18600 	(cmdline_parse_inst_t *)&cmd_set_fdir_input_set,
18601 	(cmdline_parse_inst_t *)&cmd_flow,
18602 	(cmdline_parse_inst_t *)&cmd_show_port_meter_cap,
18603 	(cmdline_parse_inst_t *)&cmd_add_port_meter_profile_srtcm,
18604 	(cmdline_parse_inst_t *)&cmd_add_port_meter_profile_trtcm,
18605 	(cmdline_parse_inst_t *)&cmd_del_port_meter_profile,
18606 	(cmdline_parse_inst_t *)&cmd_create_port_meter,
18607 	(cmdline_parse_inst_t *)&cmd_enable_port_meter,
18608 	(cmdline_parse_inst_t *)&cmd_disable_port_meter,
18609 	(cmdline_parse_inst_t *)&cmd_del_port_meter,
18610 	(cmdline_parse_inst_t *)&cmd_set_port_meter_profile,
18611 	(cmdline_parse_inst_t *)&cmd_set_port_meter_dscp_table,
18612 	(cmdline_parse_inst_t *)&cmd_set_port_meter_policer_action,
18613 	(cmdline_parse_inst_t *)&cmd_set_port_meter_stats_mask,
18614 	(cmdline_parse_inst_t *)&cmd_show_port_meter_stats,
18615 	(cmdline_parse_inst_t *)&cmd_mcast_addr,
18616 	(cmdline_parse_inst_t *)&cmd_config_l2_tunnel_eth_type_all,
18617 	(cmdline_parse_inst_t *)&cmd_config_l2_tunnel_eth_type_specific,
18618 	(cmdline_parse_inst_t *)&cmd_config_l2_tunnel_en_dis_all,
18619 	(cmdline_parse_inst_t *)&cmd_config_l2_tunnel_en_dis_specific,
18620 	(cmdline_parse_inst_t *)&cmd_config_e_tag_insertion_en,
18621 	(cmdline_parse_inst_t *)&cmd_config_e_tag_insertion_dis,
18622 	(cmdline_parse_inst_t *)&cmd_config_e_tag_stripping_en_dis,
18623 	(cmdline_parse_inst_t *)&cmd_config_e_tag_forwarding_en_dis,
18624 	(cmdline_parse_inst_t *)&cmd_config_e_tag_filter_add,
18625 	(cmdline_parse_inst_t *)&cmd_config_e_tag_filter_del,
18626 	(cmdline_parse_inst_t *)&cmd_set_vf_vlan_anti_spoof,
18627 	(cmdline_parse_inst_t *)&cmd_set_vf_mac_anti_spoof,
18628 	(cmdline_parse_inst_t *)&cmd_set_vf_vlan_stripq,
18629 	(cmdline_parse_inst_t *)&cmd_set_vf_vlan_insert,
18630 	(cmdline_parse_inst_t *)&cmd_set_tx_loopback,
18631 	(cmdline_parse_inst_t *)&cmd_set_all_queues_drop_en,
18632 	(cmdline_parse_inst_t *)&cmd_set_vf_split_drop_en,
18633 	(cmdline_parse_inst_t *)&cmd_set_macsec_offload_on,
18634 	(cmdline_parse_inst_t *)&cmd_set_macsec_offload_off,
18635 	(cmdline_parse_inst_t *)&cmd_set_macsec_sc,
18636 	(cmdline_parse_inst_t *)&cmd_set_macsec_sa,
18637 	(cmdline_parse_inst_t *)&cmd_set_vf_traffic,
18638 	(cmdline_parse_inst_t *)&cmd_set_vf_rxmode,
18639 	(cmdline_parse_inst_t *)&cmd_vf_rate_limit,
18640 	(cmdline_parse_inst_t *)&cmd_vf_rxvlan_filter,
18641 	(cmdline_parse_inst_t *)&cmd_set_vf_mac_addr,
18642 	(cmdline_parse_inst_t *)&cmd_set_vf_promisc,
18643 	(cmdline_parse_inst_t *)&cmd_set_vf_allmulti,
18644 	(cmdline_parse_inst_t *)&cmd_set_vf_broadcast,
18645 	(cmdline_parse_inst_t *)&cmd_set_vf_vlan_tag,
18646 	(cmdline_parse_inst_t *)&cmd_vf_max_bw,
18647 	(cmdline_parse_inst_t *)&cmd_vf_tc_min_bw,
18648 	(cmdline_parse_inst_t *)&cmd_vf_tc_max_bw,
18649 	(cmdline_parse_inst_t *)&cmd_strict_link_prio,
18650 	(cmdline_parse_inst_t *)&cmd_tc_min_bw,
18651 	(cmdline_parse_inst_t *)&cmd_set_vxlan,
18652 	(cmdline_parse_inst_t *)&cmd_set_vxlan_tos_ttl,
18653 	(cmdline_parse_inst_t *)&cmd_set_vxlan_with_vlan,
18654 	(cmdline_parse_inst_t *)&cmd_set_nvgre,
18655 	(cmdline_parse_inst_t *)&cmd_set_nvgre_with_vlan,
18656 	(cmdline_parse_inst_t *)&cmd_set_l2_encap,
18657 	(cmdline_parse_inst_t *)&cmd_set_l2_encap_with_vlan,
18658 	(cmdline_parse_inst_t *)&cmd_set_l2_decap,
18659 	(cmdline_parse_inst_t *)&cmd_set_l2_decap_with_vlan,
18660 	(cmdline_parse_inst_t *)&cmd_set_mplsogre_encap,
18661 	(cmdline_parse_inst_t *)&cmd_set_mplsogre_encap_with_vlan,
18662 	(cmdline_parse_inst_t *)&cmd_set_mplsogre_decap,
18663 	(cmdline_parse_inst_t *)&cmd_set_mplsogre_decap_with_vlan,
18664 	(cmdline_parse_inst_t *)&cmd_set_mplsoudp_encap,
18665 	(cmdline_parse_inst_t *)&cmd_set_mplsoudp_encap_with_vlan,
18666 	(cmdline_parse_inst_t *)&cmd_set_mplsoudp_decap,
18667 	(cmdline_parse_inst_t *)&cmd_set_mplsoudp_decap_with_vlan,
18668 	(cmdline_parse_inst_t *)&cmd_ddp_add,
18669 	(cmdline_parse_inst_t *)&cmd_ddp_del,
18670 	(cmdline_parse_inst_t *)&cmd_ddp_get_list,
18671 	(cmdline_parse_inst_t *)&cmd_ddp_get_info,
18672 	(cmdline_parse_inst_t *)&cmd_cfg_input_set,
18673 	(cmdline_parse_inst_t *)&cmd_clear_input_set,
18674 	(cmdline_parse_inst_t *)&cmd_show_vf_stats,
18675 	(cmdline_parse_inst_t *)&cmd_clear_vf_stats,
18676 	(cmdline_parse_inst_t *)&cmd_show_port_supported_ptypes,
18677 	(cmdline_parse_inst_t *)&cmd_set_port_ptypes,
18678 	(cmdline_parse_inst_t *)&cmd_ptype_mapping_get,
18679 	(cmdline_parse_inst_t *)&cmd_ptype_mapping_replace,
18680 	(cmdline_parse_inst_t *)&cmd_ptype_mapping_reset,
18681 	(cmdline_parse_inst_t *)&cmd_ptype_mapping_update,
18682 
18683 	(cmdline_parse_inst_t *)&cmd_pctype_mapping_get,
18684 	(cmdline_parse_inst_t *)&cmd_pctype_mapping_reset,
18685 	(cmdline_parse_inst_t *)&cmd_pctype_mapping_update,
18686 	(cmdline_parse_inst_t *)&cmd_queue_region,
18687 	(cmdline_parse_inst_t *)&cmd_region_flowtype,
18688 	(cmdline_parse_inst_t *)&cmd_user_priority_region,
18689 	(cmdline_parse_inst_t *)&cmd_flush_queue_region,
18690 	(cmdline_parse_inst_t *)&cmd_show_queue_region_info_all,
18691 	(cmdline_parse_inst_t *)&cmd_show_port_tm_cap,
18692 	(cmdline_parse_inst_t *)&cmd_show_port_tm_level_cap,
18693 	(cmdline_parse_inst_t *)&cmd_show_port_tm_node_cap,
18694 	(cmdline_parse_inst_t *)&cmd_show_port_tm_node_type,
18695 	(cmdline_parse_inst_t *)&cmd_show_port_tm_node_stats,
18696 	(cmdline_parse_inst_t *)&cmd_add_port_tm_node_shaper_profile,
18697 	(cmdline_parse_inst_t *)&cmd_del_port_tm_node_shaper_profile,
18698 	(cmdline_parse_inst_t *)&cmd_add_port_tm_node_shared_shaper,
18699 	(cmdline_parse_inst_t *)&cmd_del_port_tm_node_shared_shaper,
18700 	(cmdline_parse_inst_t *)&cmd_add_port_tm_node_wred_profile,
18701 	(cmdline_parse_inst_t *)&cmd_del_port_tm_node_wred_profile,
18702 	(cmdline_parse_inst_t *)&cmd_set_port_tm_node_shaper_profile,
18703 	(cmdline_parse_inst_t *)&cmd_add_port_tm_nonleaf_node,
18704 	(cmdline_parse_inst_t *)&cmd_add_port_tm_nonleaf_node_pmode,
18705 	(cmdline_parse_inst_t *)&cmd_add_port_tm_leaf_node,
18706 	(cmdline_parse_inst_t *)&cmd_del_port_tm_node,
18707 	(cmdline_parse_inst_t *)&cmd_set_port_tm_node_parent,
18708 	(cmdline_parse_inst_t *)&cmd_suspend_port_tm_node,
18709 	(cmdline_parse_inst_t *)&cmd_resume_port_tm_node,
18710 	(cmdline_parse_inst_t *)&cmd_port_tm_hierarchy_commit,
18711 	(cmdline_parse_inst_t *)&cmd_port_tm_mark_ip_ecn,
18712 	(cmdline_parse_inst_t *)&cmd_port_tm_mark_ip_dscp,
18713 	(cmdline_parse_inst_t *)&cmd_port_tm_mark_vlan_dei,
18714 	(cmdline_parse_inst_t *)&cmd_cfg_tunnel_udp_port,
18715 	(cmdline_parse_inst_t *)&cmd_rx_offload_get_capa,
18716 	(cmdline_parse_inst_t *)&cmd_rx_offload_get_configuration,
18717 	(cmdline_parse_inst_t *)&cmd_config_per_port_rx_offload,
18718 	(cmdline_parse_inst_t *)&cmd_config_per_queue_rx_offload,
18719 	(cmdline_parse_inst_t *)&cmd_tx_offload_get_capa,
18720 	(cmdline_parse_inst_t *)&cmd_tx_offload_get_configuration,
18721 	(cmdline_parse_inst_t *)&cmd_config_per_port_tx_offload,
18722 	(cmdline_parse_inst_t *)&cmd_config_per_queue_tx_offload,
18723 #ifdef RTE_LIB_BPF
18724 	(cmdline_parse_inst_t *)&cmd_operate_bpf_ld_parse,
18725 	(cmdline_parse_inst_t *)&cmd_operate_bpf_unld_parse,
18726 #endif
18727 	(cmdline_parse_inst_t *)&cmd_config_tx_metadata_specific,
18728 	(cmdline_parse_inst_t *)&cmd_show_tx_metadata,
18729 	(cmdline_parse_inst_t *)&cmd_show_rx_tx_desc_status,
18730 	(cmdline_parse_inst_t *)&cmd_set_raw,
18731 	(cmdline_parse_inst_t *)&cmd_show_set_raw,
18732 	(cmdline_parse_inst_t *)&cmd_show_set_raw_all,
18733 	(cmdline_parse_inst_t *)&cmd_config_tx_dynf_specific,
18734 	(cmdline_parse_inst_t *)&cmd_show_fec_mode,
18735 	(cmdline_parse_inst_t *)&cmd_set_fec_mode,
18736 	(cmdline_parse_inst_t *)&cmd_show_capability,
18737 	NULL,
18738 };
18739 
18740 /* read cmdline commands from file */
18741 void
18742 cmdline_read_from_file(const char *filename)
18743 {
18744 	struct cmdline *cl;
18745 
18746 	cl = cmdline_file_new(main_ctx, "testpmd> ", filename);
18747 	if (cl == NULL) {
18748 		printf("Failed to create file based cmdline context: %s\n",
18749 		       filename);
18750 		return;
18751 	}
18752 
18753 	cmdline_interact(cl);
18754 	cmdline_quit(cl);
18755 
18756 	cmdline_free(cl);
18757 
18758 	printf("Read CLI commands from %s\n", filename);
18759 }
18760 
18761 /* prompt function, called from main on MAIN lcore */
18762 void
18763 prompt(void)
18764 {
18765 	/* initialize non-constant commands */
18766 	cmd_set_fwd_mode_init();
18767 	cmd_set_fwd_retry_mode_init();
18768 
18769 	testpmd_cl = cmdline_stdin_new(main_ctx, "testpmd> ");
18770 	if (testpmd_cl == NULL)
18771 		return;
18772 	cmdline_interact(testpmd_cl);
18773 	cmdline_stdin_exit(testpmd_cl);
18774 }
18775 
18776 void
18777 prompt_exit(void)
18778 {
18779 	if (testpmd_cl != NULL)
18780 		cmdline_quit(testpmd_cl);
18781 }
18782 
18783 static void
18784 cmd_reconfig_device_queue(portid_t id, uint8_t dev, uint8_t queue)
18785 {
18786 	if (id == (portid_t)RTE_PORT_ALL) {
18787 		portid_t pid;
18788 
18789 		RTE_ETH_FOREACH_DEV(pid) {
18790 			/* check if need_reconfig has been set to 1 */
18791 			if (ports[pid].need_reconfig == 0)
18792 				ports[pid].need_reconfig = dev;
18793 			/* check if need_reconfig_queues has been set to 1 */
18794 			if (ports[pid].need_reconfig_queues == 0)
18795 				ports[pid].need_reconfig_queues = queue;
18796 		}
18797 	} else if (!port_id_is_invalid(id, DISABLED_WARN)) {
18798 		/* check if need_reconfig has been set to 1 */
18799 		if (ports[id].need_reconfig == 0)
18800 			ports[id].need_reconfig = dev;
18801 		/* check if need_reconfig_queues has been set to 1 */
18802 		if (ports[id].need_reconfig_queues == 0)
18803 			ports[id].need_reconfig_queues = queue;
18804 	}
18805 }
18806