1 /*- 2 * BSD LICENSE 3 * 4 * Copyright(c) 2010-2016 Intel Corporation. All rights reserved. 5 * Copyright(c) 2014 6WIND S.A. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * * Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * * Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in 16 * the documentation and/or other materials provided with the 17 * distribution. 18 * * Neither the name of Intel Corporation nor the names of its 19 * contributors may be used to endorse or promote products derived 20 * from this software without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 */ 34 35 #include <stdarg.h> 36 #include <errno.h> 37 #include <stdio.h> 38 #include <stdint.h> 39 #include <string.h> 40 #include <termios.h> 41 #include <unistd.h> 42 #include <inttypes.h> 43 #ifndef __linux__ 44 #ifndef __FreeBSD__ 45 #include <net/socket.h> 46 #else 47 #include <sys/socket.h> 48 #endif 49 #endif 50 #include <netinet/in.h> 51 52 #include <sys/queue.h> 53 54 #include <rte_common.h> 55 #include <rte_byteorder.h> 56 #include <rte_log.h> 57 #include <rte_debug.h> 58 #include <rte_cycles.h> 59 #include <rte_memory.h> 60 #include <rte_memzone.h> 61 #include <rte_malloc.h> 62 #include <rte_launch.h> 63 #include <rte_eal.h> 64 #include <rte_per_lcore.h> 65 #include <rte_lcore.h> 66 #include <rte_atomic.h> 67 #include <rte_branch_prediction.h> 68 #include <rte_ring.h> 69 #include <rte_mempool.h> 70 #include <rte_interrupts.h> 71 #include <rte_pci.h> 72 #include <rte_ether.h> 73 #include <rte_ethdev.h> 74 #include <rte_string_fns.h> 75 #include <rte_devargs.h> 76 #include <rte_eth_ctrl.h> 77 #include <rte_flow.h> 78 #include <rte_gro.h> 79 80 #include <cmdline_rdline.h> 81 #include <cmdline_parse.h> 82 #include <cmdline_parse_num.h> 83 #include <cmdline_parse_string.h> 84 #include <cmdline_parse_ipaddr.h> 85 #include <cmdline_parse_etheraddr.h> 86 #include <cmdline_socket.h> 87 #include <cmdline.h> 88 #ifdef RTE_LIBRTE_PMD_BOND 89 #include <rte_eth_bond.h> 90 #include <rte_eth_bond_8023ad.h> 91 #endif 92 #ifdef RTE_LIBRTE_IXGBE_PMD 93 #include <rte_pmd_ixgbe.h> 94 #endif 95 #ifdef RTE_LIBRTE_I40E_PMD 96 #include <rte_pmd_i40e.h> 97 #endif 98 #ifdef RTE_LIBRTE_BNXT_PMD 99 #include <rte_pmd_bnxt.h> 100 #endif 101 #include "testpmd.h" 102 103 static struct cmdline *testpmd_cl; 104 105 static void cmd_reconfig_device_queue(portid_t id, uint8_t dev, uint8_t queue); 106 107 /* *** Help command with introduction. *** */ 108 struct cmd_help_brief_result { 109 cmdline_fixed_string_t help; 110 }; 111 112 static void cmd_help_brief_parsed(__attribute__((unused)) void *parsed_result, 113 struct cmdline *cl, 114 __attribute__((unused)) void *data) 115 { 116 cmdline_printf( 117 cl, 118 "\n" 119 "Help is available for the following sections:\n\n" 120 " help control : Start and stop forwarding.\n" 121 " help display : Displaying port, stats and config " 122 "information.\n" 123 " help config : Configuration information.\n" 124 " help ports : Configuring ports.\n" 125 " help registers : Reading and setting port registers.\n" 126 " help filters : Filters configuration help.\n" 127 " help all : All of the above sections.\n\n" 128 ); 129 130 } 131 132 cmdline_parse_token_string_t cmd_help_brief_help = 133 TOKEN_STRING_INITIALIZER(struct cmd_help_brief_result, help, "help"); 134 135 cmdline_parse_inst_t cmd_help_brief = { 136 .f = cmd_help_brief_parsed, 137 .data = NULL, 138 .help_str = "help: Show help", 139 .tokens = { 140 (void *)&cmd_help_brief_help, 141 NULL, 142 }, 143 }; 144 145 /* *** Help command with help sections. *** */ 146 struct cmd_help_long_result { 147 cmdline_fixed_string_t help; 148 cmdline_fixed_string_t section; 149 }; 150 151 static void cmd_help_long_parsed(void *parsed_result, 152 struct cmdline *cl, 153 __attribute__((unused)) void *data) 154 { 155 int show_all = 0; 156 struct cmd_help_long_result *res = parsed_result; 157 158 if (!strcmp(res->section, "all")) 159 show_all = 1; 160 161 if (show_all || !strcmp(res->section, "control")) { 162 163 cmdline_printf( 164 cl, 165 "\n" 166 "Control forwarding:\n" 167 "-------------------\n\n" 168 169 "start\n" 170 " Start packet forwarding with current configuration.\n\n" 171 172 "start tx_first\n" 173 " Start packet forwarding with current config" 174 " after sending one burst of packets.\n\n" 175 176 "stop\n" 177 " Stop packet forwarding, and display accumulated" 178 " statistics.\n\n" 179 180 "quit\n" 181 " Quit to prompt.\n\n" 182 ); 183 } 184 185 if (show_all || !strcmp(res->section, "display")) { 186 187 cmdline_printf( 188 cl, 189 "\n" 190 "Display:\n" 191 "--------\n\n" 192 193 "show port (info|stats|xstats|fdir|stat_qmap|dcb_tc|cap) (port_id|all)\n" 194 " Display information for port_id, or all.\n\n" 195 196 "show port X rss reta (size) (mask0,mask1,...)\n" 197 " Display the rss redirection table entry indicated" 198 " by masks on port X. size is used to indicate the" 199 " hardware supported reta size\n\n" 200 201 "show port rss-hash ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|" 202 "ipv4-sctp|ipv4-other|ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|" 203 "ipv6-other|l2-payload|ipv6-ex|ipv6-tcp-ex|ipv6-udp-ex [key]\n" 204 " Display the RSS hash functions and RSS hash key" 205 " of port X\n\n" 206 207 "clear port (info|stats|xstats|fdir|stat_qmap) (port_id|all)\n" 208 " Clear information for port_id, or all.\n\n" 209 210 "show (rxq|txq) info (port_id) (queue_id)\n" 211 " Display information for configured RX/TX queue.\n\n" 212 213 "show config (rxtx|cores|fwd|txpkts)\n" 214 " Display the given configuration.\n\n" 215 216 "read rxd (port_id) (queue_id) (rxd_id)\n" 217 " Display an RX descriptor of a port RX queue.\n\n" 218 219 "read txd (port_id) (queue_id) (txd_id)\n" 220 " Display a TX descriptor of a port TX queue.\n\n" 221 222 "ddp get list (port_id)\n" 223 " Get ddp profile info list\n\n" 224 225 "ddp get info (profile_path)\n" 226 " Get ddp profile information.\n\n" 227 228 "show vf stats (port_id) (vf_id)\n" 229 " Display a VF's statistics.\n\n" 230 231 "clear vf stats (port_id) (vf_id)\n" 232 " Reset a VF's statistics.\n\n" 233 234 "show port (port_id) pctype mapping\n" 235 " Get flow ptype to pctype mapping on a port\n\n" 236 237 ); 238 } 239 240 if (show_all || !strcmp(res->section, "config")) { 241 cmdline_printf( 242 cl, 243 "\n" 244 "Configuration:\n" 245 "--------------\n" 246 "Configuration changes only become active when" 247 " forwarding is started/restarted.\n\n" 248 249 "set default\n" 250 " Reset forwarding to the default configuration.\n\n" 251 252 "set verbose (level)\n" 253 " Set the debug verbosity level X.\n\n" 254 255 "set nbport (num)\n" 256 " Set number of ports.\n\n" 257 258 "set nbcore (num)\n" 259 " Set number of cores.\n\n" 260 261 "set coremask (mask)\n" 262 " Set the forwarding cores hexadecimal mask.\n\n" 263 264 "set portmask (mask)\n" 265 " Set the forwarding ports hexadecimal mask.\n\n" 266 267 "set burst (num)\n" 268 " Set number of packets per burst.\n\n" 269 270 "set burst tx delay (microseconds) retry (num)\n" 271 " Set the transmit delay time and number of retries," 272 " effective when retry is enabled.\n\n" 273 274 "set txpkts (x[,y]*)\n" 275 " Set the length of each segment of TXONLY" 276 " and optionally CSUM packets.\n\n" 277 278 "set txsplit (off|on|rand)\n" 279 " Set the split policy for the TX packets." 280 " Right now only applicable for CSUM and TXONLY" 281 " modes\n\n" 282 283 "set corelist (x[,y]*)\n" 284 " Set the list of forwarding cores.\n\n" 285 286 "set portlist (x[,y]*)\n" 287 " Set the list of forwarding ports.\n\n" 288 289 "set tx loopback (port_id) (on|off)\n" 290 " Enable or disable tx loopback.\n\n" 291 292 "set all queues drop (port_id) (on|off)\n" 293 " Set drop enable bit for all queues.\n\n" 294 295 "set vf split drop (port_id) (vf_id) (on|off)\n" 296 " Set split drop enable bit for a VF from the PF.\n\n" 297 298 "set vf mac antispoof (port_id) (vf_id) (on|off).\n" 299 " Set MAC antispoof for a VF from the PF.\n\n" 300 301 "set macsec offload (port_id) on encrypt (on|off) replay-protect (on|off)\n" 302 " Enable MACsec offload.\n\n" 303 304 "set macsec offload (port_id) off\n" 305 " Disable MACsec offload.\n\n" 306 307 "set macsec sc (tx|rx) (port_id) (mac) (pi)\n" 308 " Configure MACsec secure connection (SC).\n\n" 309 310 "set macsec sa (tx|rx) (port_id) (idx) (an) (pn) (key)\n" 311 " Configure MACsec secure association (SA).\n\n" 312 313 "set vf broadcast (port_id) (vf_id) (on|off)\n" 314 " Set VF broadcast for a VF from the PF.\n\n" 315 316 "vlan set strip (on|off) (port_id)\n" 317 " Set the VLAN strip on a port.\n\n" 318 319 "vlan set stripq (on|off) (port_id,queue_id)\n" 320 " Set the VLAN strip for a queue on a port.\n\n" 321 322 "set vf vlan stripq (port_id) (vf_id) (on|off)\n" 323 " Set the VLAN strip for all queues in a pool for a VF from the PF.\n\n" 324 325 "set vf vlan insert (port_id) (vf_id) (vlan_id)\n" 326 " Set VLAN insert for a VF from the PF.\n\n" 327 328 "set vf vlan antispoof (port_id) (vf_id) (on|off)\n" 329 " Set VLAN antispoof for a VF from the PF.\n\n" 330 331 "set vf vlan tag (port_id) (vf_id) (on|off)\n" 332 " Set VLAN tag for a VF from the PF.\n\n" 333 334 "set vf tx max-bandwidth (port_id) (vf_id) (bandwidth)\n" 335 " Set a VF's max bandwidth(Mbps).\n\n" 336 337 "set vf tc tx min-bandwidth (port_id) (vf_id) (bw1, bw2, ...)\n" 338 " Set all TCs' min bandwidth(%%) on a VF.\n\n" 339 340 "set vf tc tx max-bandwidth (port_id) (vf_id) (tc_no) (bandwidth)\n" 341 " Set a TC's max bandwidth(Mbps) on a VF.\n\n" 342 343 "set tx strict-link-priority (port_id) (tc_bitmap)\n" 344 " Set some TCs' strict link priority mode on a physical port.\n\n" 345 346 "set tc tx min-bandwidth (port_id) (bw1, bw2, ...)\n" 347 " Set all TCs' min bandwidth(%%) for all PF and VFs.\n\n" 348 349 "vlan set filter (on|off) (port_id)\n" 350 " Set the VLAN filter on a port.\n\n" 351 352 "vlan set qinq (on|off) (port_id)\n" 353 " Set the VLAN QinQ (extended queue in queue)" 354 " on a port.\n\n" 355 356 "vlan set (inner|outer) tpid (value) (port_id)\n" 357 " Set the VLAN TPID for Packet Filtering on" 358 " a port\n\n" 359 360 "rx_vlan add (vlan_id|all) (port_id)\n" 361 " Add a vlan_id, or all identifiers, to the set" 362 " of VLAN identifiers filtered by port_id.\n\n" 363 364 "rx_vlan rm (vlan_id|all) (port_id)\n" 365 " Remove a vlan_id, or all identifiers, from the set" 366 " of VLAN identifiers filtered by port_id.\n\n" 367 368 "rx_vlan add (vlan_id) port (port_id) vf (vf_mask)\n" 369 " Add a vlan_id, to the set of VLAN identifiers" 370 "filtered for VF(s) from port_id.\n\n" 371 372 "rx_vlan rm (vlan_id) port (port_id) vf (vf_mask)\n" 373 " Remove a vlan_id, to the set of VLAN identifiers" 374 "filtered for VF(s) from port_id.\n\n" 375 376 "tunnel_filter add (port_id) (outer_mac) (inner_mac) (ip_addr) " 377 "(inner_vlan) (vxlan|nvgre|ipingre) (imac-ivlan|imac-ivlan-tenid|" 378 "imac-tenid|imac|omac-imac-tenid|oip|iip) (tenant_id) (queue_id)\n" 379 " add a tunnel filter of a port.\n\n" 380 381 "tunnel_filter rm (port_id) (outer_mac) (inner_mac) (ip_addr) " 382 "(inner_vlan) (vxlan|nvgre|ipingre) (imac-ivlan|imac-ivlan-tenid|" 383 "imac-tenid|imac|omac-imac-tenid|oip|iip) (tenant_id) (queue_id)\n" 384 " remove a tunnel filter of a port.\n\n" 385 386 "rx_vxlan_port add (udp_port) (port_id)\n" 387 " Add an UDP port for VXLAN packet filter on a port\n\n" 388 389 "rx_vxlan_port rm (udp_port) (port_id)\n" 390 " Remove an UDP port for VXLAN packet filter on a port\n\n" 391 392 "tx_vlan set (port_id) vlan_id[, vlan_id_outer]\n" 393 " Set hardware insertion of VLAN IDs (single or double VLAN " 394 "depends on the number of VLAN IDs) in packets sent on a port.\n\n" 395 396 "tx_vlan set pvid port_id vlan_id (on|off)\n" 397 " Set port based TX VLAN insertion.\n\n" 398 399 "tx_vlan reset (port_id)\n" 400 " Disable hardware insertion of a VLAN header in" 401 " packets sent on a port.\n\n" 402 403 "csum set (ip|udp|tcp|sctp|outer-ip) (hw|sw) (port_id)\n" 404 " Select hardware or software calculation of the" 405 " checksum when transmitting a packet using the" 406 " csum forward engine.\n" 407 " ip|udp|tcp|sctp always concern the inner layer.\n" 408 " outer-ip concerns the outer IP layer in" 409 " case the packet is recognized as a tunnel packet by" 410 " the forward engine (vxlan, gre and ipip are supported)\n" 411 " Please check the NIC datasheet for HW limits.\n\n" 412 413 "csum parse-tunnel (on|off) (tx_port_id)\n" 414 " If disabled, treat tunnel packets as non-tunneled" 415 " packets (treat inner headers as payload). The port\n" 416 " argument is the port used for TX in csum forward" 417 " engine.\n\n" 418 419 "csum show (port_id)\n" 420 " Display tx checksum offload configuration\n\n" 421 422 "tso set (segsize) (portid)\n" 423 " Enable TCP Segmentation Offload in csum forward" 424 " engine.\n" 425 " Please check the NIC datasheet for HW limits.\n\n" 426 427 "tso show (portid)" 428 " Display the status of TCP Segmentation Offload.\n\n" 429 430 "set port (port_id) gro on|off\n" 431 " Enable or disable Generic Receive Offload in" 432 " csum forwarding engine.\n\n" 433 434 "show port (port_id) gro\n" 435 " Display GRO configuration.\n\n" 436 437 "set gro flush (cycles)\n" 438 " Set the cycle to flush GROed packets from" 439 " reassembly tables.\n\n" 440 441 "set port (port_id) gso (on|off)" 442 " Enable or disable Generic Segmentation Offload in" 443 " csum forwarding engine.\n\n" 444 445 "set gso segsz (length)\n" 446 " Set max packet length for output GSO segments," 447 " including packet header and payload.\n\n" 448 449 "show port (port_id) gso\n" 450 " Show GSO configuration.\n\n" 451 452 "set fwd (%s)\n" 453 " Set packet forwarding mode.\n\n" 454 455 "mac_addr add (port_id) (XX:XX:XX:XX:XX:XX)\n" 456 " Add a MAC address on port_id.\n\n" 457 458 "mac_addr remove (port_id) (XX:XX:XX:XX:XX:XX)\n" 459 " Remove a MAC address from port_id.\n\n" 460 461 "mac_addr set (port_id) (XX:XX:XX:XX:XX:XX)\n" 462 " Set the default MAC address for port_id.\n\n" 463 464 "mac_addr add port (port_id) vf (vf_id) (mac_address)\n" 465 " Add a MAC address for a VF on the port.\n\n" 466 467 "set vf mac addr (port_id) (vf_id) (XX:XX:XX:XX:XX:XX)\n" 468 " Set the MAC address for a VF from the PF.\n\n" 469 470 "set port (port_id) uta (mac_address|all) (on|off)\n" 471 " Add/Remove a or all unicast hash filter(s)" 472 "from port X.\n\n" 473 474 "set promisc (port_id|all) (on|off)\n" 475 " Set the promiscuous mode on port_id, or all.\n\n" 476 477 "set allmulti (port_id|all) (on|off)\n" 478 " Set the allmulti mode on port_id, or all.\n\n" 479 480 "set vf promisc (port_id) (vf_id) (on|off)\n" 481 " Set unicast promiscuous mode for a VF from the PF.\n\n" 482 483 "set vf allmulti (port_id) (vf_id) (on|off)\n" 484 " Set multicast promiscuous mode for a VF from the PF.\n\n" 485 486 "set flow_ctrl rx (on|off) tx (on|off) (high_water)" 487 " (low_water) (pause_time) (send_xon) mac_ctrl_frame_fwd" 488 " (on|off) autoneg (on|off) (port_id)\n" 489 "set flow_ctrl rx (on|off) (portid)\n" 490 "set flow_ctrl tx (on|off) (portid)\n" 491 "set flow_ctrl high_water (high_water) (portid)\n" 492 "set flow_ctrl low_water (low_water) (portid)\n" 493 "set flow_ctrl pause_time (pause_time) (portid)\n" 494 "set flow_ctrl send_xon (send_xon) (portid)\n" 495 "set flow_ctrl mac_ctrl_frame_fwd (on|off) (portid)\n" 496 "set flow_ctrl autoneg (on|off) (port_id)\n" 497 " Set the link flow control parameter on a port.\n\n" 498 499 "set pfc_ctrl rx (on|off) tx (on|off) (high_water)" 500 " (low_water) (pause_time) (priority) (port_id)\n" 501 " Set the priority flow control parameter on a" 502 " port.\n\n" 503 504 "set stat_qmap (tx|rx) (port_id) (queue_id) (qmapping)\n" 505 " Set statistics mapping (qmapping 0..15) for RX/TX" 506 " queue on port.\n" 507 " e.g., 'set stat_qmap rx 0 2 5' sets rx queue 2" 508 " on port 0 to mapping 5.\n\n" 509 510 "set port (port_id) vf (vf_id) rx|tx on|off\n" 511 " Enable/Disable a VF receive/tranmit from a port\n\n" 512 513 "set port (port_id) vf (vf_id) (mac_addr)" 514 " (exact-mac#exact-mac-vlan#hashmac|hashmac-vlan) on|off\n" 515 " Add/Remove unicast or multicast MAC addr filter" 516 " for a VF.\n\n" 517 518 "set port (port_id) vf (vf_id) rxmode (AUPE|ROPE|BAM" 519 "|MPE) (on|off)\n" 520 " AUPE:accepts untagged VLAN;" 521 "ROPE:accept unicast hash\n\n" 522 " BAM:accepts broadcast packets;" 523 "MPE:accepts all multicast packets\n\n" 524 " Enable/Disable a VF receive mode of a port\n\n" 525 526 "set port (port_id) queue (queue_id) rate (rate_num)\n" 527 " Set rate limit for a queue of a port\n\n" 528 529 "set port (port_id) vf (vf_id) rate (rate_num) " 530 "queue_mask (queue_mask_value)\n" 531 " Set rate limit for queues in VF of a port\n\n" 532 533 "set port (port_id) mirror-rule (rule_id)" 534 " (pool-mirror-up|pool-mirror-down|vlan-mirror)" 535 " (poolmask|vlanid[,vlanid]*) dst-pool (pool_id) (on|off)\n" 536 " Set pool or vlan type mirror rule on a port.\n" 537 " e.g., 'set port 0 mirror-rule 0 vlan-mirror 0,1" 538 " dst-pool 0 on' enable mirror traffic with vlan 0,1" 539 " to pool 0.\n\n" 540 541 "set port (port_id) mirror-rule (rule_id)" 542 " (uplink-mirror|downlink-mirror) dst-pool" 543 " (pool_id) (on|off)\n" 544 " Set uplink or downlink type mirror rule on a port.\n" 545 " e.g., 'set port 0 mirror-rule 0 uplink-mirror dst-pool" 546 " 0 on' enable mirror income traffic to pool 0.\n\n" 547 548 "reset port (port_id) mirror-rule (rule_id)\n" 549 " Reset a mirror rule.\n\n" 550 551 "set flush_rx (on|off)\n" 552 " Flush (default) or don't flush RX streams before" 553 " forwarding. Mainly used with PCAP drivers.\n\n" 554 555 "set bypass mode (normal|bypass|isolate) (port_id)\n" 556 " Set the bypass mode for the lowest port on bypass enabled" 557 " NIC.\n\n" 558 559 "set bypass event (timeout|os_on|os_off|power_on|power_off) " 560 "mode (normal|bypass|isolate) (port_id)\n" 561 " Set the event required to initiate specified bypass mode for" 562 " the lowest port on a bypass enabled NIC where:\n" 563 " timeout = enable bypass after watchdog timeout.\n" 564 " os_on = enable bypass when OS/board is powered on.\n" 565 " os_off = enable bypass when OS/board is powered off.\n" 566 " power_on = enable bypass when power supply is turned on.\n" 567 " power_off = enable bypass when power supply is turned off." 568 "\n\n" 569 570 "set bypass timeout (0|1.5|2|3|4|8|16|32)\n" 571 " Set the bypass watchdog timeout to 'n' seconds" 572 " where 0 = instant.\n\n" 573 574 "show bypass config (port_id)\n" 575 " Show the bypass configuration for a bypass enabled NIC" 576 " using the lowest port on the NIC.\n\n" 577 578 #ifdef RTE_LIBRTE_PMD_BOND 579 "create bonded device (mode) (socket)\n" 580 " Create a new bonded device with specific bonding mode and socket.\n\n" 581 582 "add bonding slave (slave_id) (port_id)\n" 583 " Add a slave device to a bonded device.\n\n" 584 585 "remove bonding slave (slave_id) (port_id)\n" 586 " Remove a slave device from a bonded device.\n\n" 587 588 "set bonding mode (value) (port_id)\n" 589 " Set the bonding mode on a bonded device.\n\n" 590 591 "set bonding primary (slave_id) (port_id)\n" 592 " Set the primary slave for a bonded device.\n\n" 593 594 "show bonding config (port_id)\n" 595 " Show the bonding config for port_id.\n\n" 596 597 "set bonding mac_addr (port_id) (address)\n" 598 " Set the MAC address of a bonded device.\n\n" 599 600 "set bonding mode IEEE802.3AD aggregator policy (port_id) (agg_name)" 601 " Set Aggregation mode for IEEE802.3AD (mode 4)" 602 603 "set bonding xmit_balance_policy (port_id) (l2|l23|l34)\n" 604 " Set the transmit balance policy for bonded device running in balance mode.\n\n" 605 606 "set bonding mon_period (port_id) (value)\n" 607 " Set the bonding link status monitoring polling period in ms.\n\n" 608 609 "set bonding lacp dedicated_queues <port_id> (enable|disable)\n" 610 " Enable/disable dedicated queues for LACP control traffic.\n\n" 611 612 #endif 613 "set link-up port (port_id)\n" 614 " Set link up for a port.\n\n" 615 616 "set link-down port (port_id)\n" 617 " Set link down for a port.\n\n" 618 619 "E-tag set insertion on port-tag-id (value)" 620 " port (port_id) vf (vf_id)\n" 621 " Enable E-tag insertion for a VF on a port\n\n" 622 623 "E-tag set insertion off port (port_id) vf (vf_id)\n" 624 " Disable E-tag insertion for a VF on a port\n\n" 625 626 "E-tag set stripping (on|off) port (port_id)\n" 627 " Enable/disable E-tag stripping on a port\n\n" 628 629 "E-tag set forwarding (on|off) port (port_id)\n" 630 " Enable/disable E-tag based forwarding" 631 " on a port\n\n" 632 633 "E-tag set filter add e-tag-id (value) dst-pool" 634 " (pool_id) port (port_id)\n" 635 " Add an E-tag forwarding filter on a port\n\n" 636 637 "E-tag set filter del e-tag-id (value) port (port_id)\n" 638 " Delete an E-tag forwarding filter on a port\n\n" 639 640 #if defined RTE_LIBRTE_PMD_SOFTNIC && defined RTE_LIBRTE_SCHED 641 "set port tm hierarchy default (port_id)\n" 642 " Set default traffic Management hierarchy on a port\n\n" 643 644 #endif 645 "ddp add (port_id) (profile_path[,output_path])\n" 646 " Load a profile package on a port\n\n" 647 648 "ddp del (port_id) (profile_path)\n" 649 " Delete a profile package from a port\n\n" 650 651 "ptype mapping get (port_id) (valid_only)\n" 652 " Get ptype mapping on a port\n\n" 653 654 "ptype mapping replace (port_id) (target) (mask) (pky_type)\n" 655 " Replace target with the pkt_type in ptype mapping\n\n" 656 657 "ptype mapping reset (port_id)\n" 658 " Reset ptype mapping on a port\n\n" 659 660 "ptype mapping update (port_id) (hw_ptype) (sw_ptype)\n" 661 " Update a ptype mapping item on a port\n\n" 662 663 , list_pkt_forwarding_modes() 664 ); 665 } 666 667 if (show_all || !strcmp(res->section, "ports")) { 668 669 cmdline_printf( 670 cl, 671 "\n" 672 "Port Operations:\n" 673 "----------------\n\n" 674 675 "port start (port_id|all)\n" 676 " Start all ports or port_id.\n\n" 677 678 "port stop (port_id|all)\n" 679 " Stop all ports or port_id.\n\n" 680 681 "port close (port_id|all)\n" 682 " Close all ports or port_id.\n\n" 683 684 "port attach (ident)\n" 685 " Attach physical or virtual dev by pci address or virtual device name\n\n" 686 687 "port detach (port_id)\n" 688 " Detach physical or virtual dev by port_id\n\n" 689 690 "port config (port_id|all)" 691 " speed (10|100|1000|10000|25000|40000|50000|100000|auto)" 692 " duplex (half|full|auto)\n" 693 " Set speed and duplex for all ports or port_id\n\n" 694 695 "port config all (rxq|txq|rxd|txd) (value)\n" 696 " Set number for rxq/txq/rxd/txd.\n\n" 697 698 "port config all max-pkt-len (value)\n" 699 " Set the max packet length.\n\n" 700 701 "port config all (crc-strip|scatter|rx-cksum|rx-timestamp|hw-vlan|hw-vlan-filter|" 702 "hw-vlan-strip|hw-vlan-extend|drop-en)" 703 " (on|off)\n" 704 " Set crc-strip/scatter/rx-checksum/hardware-vlan/drop_en" 705 " for ports.\n\n" 706 707 "port config all rss (all|ip|tcp|udp|sctp|ether|port|vxlan|" 708 "geneve|nvgre|none|<flowtype_id>)\n" 709 " Set the RSS mode.\n\n" 710 711 "port config port-id rss reta (hash,queue)[,(hash,queue)]\n" 712 " Set the RSS redirection table.\n\n" 713 714 "port config (port_id) dcb vt (on|off) (traffic_class)" 715 " pfc (on|off)\n" 716 " Set the DCB mode.\n\n" 717 718 "port config all burst (value)\n" 719 " Set the number of packets per burst.\n\n" 720 721 "port config all (txpt|txht|txwt|rxpt|rxht|rxwt)" 722 " (value)\n" 723 " Set the ring prefetch/host/writeback threshold" 724 " for tx/rx queue.\n\n" 725 726 "port config all (txfreet|txrst|rxfreet) (value)\n" 727 " Set free threshold for rx/tx, or set" 728 " tx rs bit threshold.\n\n" 729 "port config mtu X value\n" 730 " Set the MTU of port X to a given value\n\n" 731 732 "port (port_id) (rxq|txq) (queue_id) (start|stop)\n" 733 " Start/stop a rx/tx queue of port X. Only take effect" 734 " when port X is started\n\n" 735 736 "port config (port_id|all) l2-tunnel E-tag ether-type" 737 " (value)\n" 738 " Set the value of E-tag ether-type.\n\n" 739 740 "port config (port_id|all) l2-tunnel E-tag" 741 " (enable|disable)\n" 742 " Enable/disable the E-tag support.\n\n" 743 744 "port config (port_id) pctype mapping reset\n" 745 " Reset flow type to pctype mapping on a port\n\n" 746 747 "port config (port_id) pctype mapping update" 748 " (pctype_id_0[,pctype_id_1]*) (flow_type_id)\n" 749 " Update a flow type to pctype mapping item on a port\n\n" 750 ); 751 } 752 753 if (show_all || !strcmp(res->section, "registers")) { 754 755 cmdline_printf( 756 cl, 757 "\n" 758 "Registers:\n" 759 "----------\n\n" 760 761 "read reg (port_id) (address)\n" 762 " Display value of a port register.\n\n" 763 764 "read regfield (port_id) (address) (bit_x) (bit_y)\n" 765 " Display a port register bit field.\n\n" 766 767 "read regbit (port_id) (address) (bit_x)\n" 768 " Display a single port register bit.\n\n" 769 770 "write reg (port_id) (address) (value)\n" 771 " Set value of a port register.\n\n" 772 773 "write regfield (port_id) (address) (bit_x) (bit_y)" 774 " (value)\n" 775 " Set bit field of a port register.\n\n" 776 777 "write regbit (port_id) (address) (bit_x) (value)\n" 778 " Set single bit value of a port register.\n\n" 779 ); 780 } 781 if (show_all || !strcmp(res->section, "filters")) { 782 783 cmdline_printf( 784 cl, 785 "\n" 786 "filters:\n" 787 "--------\n\n" 788 789 "ethertype_filter (port_id) (add|del)" 790 " (mac_addr|mac_ignr) (mac_address) ethertype" 791 " (ether_type) (drop|fwd) queue (queue_id)\n" 792 " Add/Del an ethertype filter.\n\n" 793 794 "2tuple_filter (port_id) (add|del)" 795 " dst_port (dst_port_value) protocol (protocol_value)" 796 " mask (mask_value) tcp_flags (tcp_flags_value)" 797 " priority (prio_value) queue (queue_id)\n" 798 " Add/Del a 2tuple filter.\n\n" 799 800 "5tuple_filter (port_id) (add|del)" 801 " dst_ip (dst_address) src_ip (src_address)" 802 " dst_port (dst_port_value) src_port (src_port_value)" 803 " protocol (protocol_value)" 804 " mask (mask_value) tcp_flags (tcp_flags_value)" 805 " priority (prio_value) queue (queue_id)\n" 806 " Add/Del a 5tuple filter.\n\n" 807 808 "syn_filter (port_id) (add|del) priority (high|low) queue (queue_id)" 809 " Add/Del syn filter.\n\n" 810 811 "flex_filter (port_id) (add|del) len (len_value)" 812 " bytes (bytes_value) mask (mask_value)" 813 " priority (prio_value) queue (queue_id)\n" 814 " Add/Del a flex filter.\n\n" 815 816 "flow_director_filter (port_id) mode IP (add|del|update)" 817 " flow (ipv4-other|ipv4-frag|ipv6-other|ipv6-frag)" 818 " src (src_ip_address) dst (dst_ip_address)" 819 " tos (tos_value) proto (proto_value) ttl (ttl_value)" 820 " vlan (vlan_value) flexbytes (flexbytes_value)" 821 " (drop|fwd) pf|vf(vf_id) queue (queue_id)" 822 " fd_id (fd_id_value)\n" 823 " Add/Del an IP type flow director filter.\n\n" 824 825 "flow_director_filter (port_id) mode IP (add|del|update)" 826 " flow (ipv4-tcp|ipv4-udp|ipv6-tcp|ipv6-udp)" 827 " src (src_ip_address) (src_port)" 828 " dst (dst_ip_address) (dst_port)" 829 " tos (tos_value) ttl (ttl_value)" 830 " vlan (vlan_value) flexbytes (flexbytes_value)" 831 " (drop|fwd) pf|vf(vf_id) queue (queue_id)" 832 " fd_id (fd_id_value)\n" 833 " Add/Del an UDP/TCP type flow director filter.\n\n" 834 835 "flow_director_filter (port_id) mode IP (add|del|update)" 836 " flow (ipv4-sctp|ipv6-sctp)" 837 " src (src_ip_address) (src_port)" 838 " dst (dst_ip_address) (dst_port)" 839 " tag (verification_tag) " 840 " tos (tos_value) ttl (ttl_value)" 841 " vlan (vlan_value)" 842 " flexbytes (flexbytes_value) (drop|fwd)" 843 " pf|vf(vf_id) queue (queue_id) fd_id (fd_id_value)\n" 844 " Add/Del a SCTP type flow director filter.\n\n" 845 846 "flow_director_filter (port_id) mode IP (add|del|update)" 847 " flow l2_payload ether (ethertype)" 848 " flexbytes (flexbytes_value) (drop|fwd)" 849 " pf|vf(vf_id) queue (queue_id) fd_id (fd_id_value)\n" 850 " Add/Del a l2 payload type flow director filter.\n\n" 851 852 "flow_director_filter (port_id) mode MAC-VLAN (add|del|update)" 853 " mac (mac_address) vlan (vlan_value)" 854 " flexbytes (flexbytes_value) (drop|fwd)" 855 " queue (queue_id) fd_id (fd_id_value)\n" 856 " Add/Del a MAC-VLAN flow director filter.\n\n" 857 858 "flow_director_filter (port_id) mode Tunnel (add|del|update)" 859 " mac (mac_address) vlan (vlan_value)" 860 " tunnel (NVGRE|VxLAN) tunnel-id (tunnel_id_value)" 861 " flexbytes (flexbytes_value) (drop|fwd)" 862 " queue (queue_id) fd_id (fd_id_value)\n" 863 " Add/Del a Tunnel flow director filter.\n\n" 864 865 "flush_flow_director (port_id)\n" 866 " Flush all flow director entries of a device.\n\n" 867 868 "flow_director_mask (port_id) mode IP vlan (vlan_value)" 869 " src_mask (ipv4_src) (ipv6_src) (src_port)" 870 " dst_mask (ipv4_dst) (ipv6_dst) (dst_port)\n" 871 " Set flow director IP mask.\n\n" 872 873 "flow_director_mask (port_id) mode MAC-VLAN" 874 " vlan (vlan_value)\n" 875 " Set flow director MAC-VLAN mask.\n\n" 876 877 "flow_director_mask (port_id) mode Tunnel" 878 " vlan (vlan_value) mac (mac_value)" 879 " tunnel-type (tunnel_type_value)" 880 " tunnel-id (tunnel_id_value)\n" 881 " Set flow director Tunnel mask.\n\n" 882 883 "flow_director_flex_mask (port_id)" 884 " flow (none|ipv4-other|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|" 885 "ipv6-other|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|l2_payload|all)" 886 " (mask)\n" 887 " Configure mask of flex payload.\n\n" 888 889 "flow_director_flex_payload (port_id)" 890 " (raw|l2|l3|l4) (config)\n" 891 " Configure flex payload selection.\n\n" 892 893 "get_sym_hash_ena_per_port (port_id)\n" 894 " get symmetric hash enable configuration per port.\n\n" 895 896 "set_sym_hash_ena_per_port (port_id) (enable|disable)\n" 897 " set symmetric hash enable configuration per port" 898 " to enable or disable.\n\n" 899 900 "get_hash_global_config (port_id)\n" 901 " Get the global configurations of hash filters.\n\n" 902 903 "set_hash_global_config (port_id) (toeplitz|simple_xor|default)" 904 " (ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|ipv6|" 905 "ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|l2_payload)" 906 " (enable|disable)\n" 907 " Set the global configurations of hash filters.\n\n" 908 909 "set_hash_input_set (port_id) (ipv4|ipv4-frag|" 910 "ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|ipv6|" 911 "ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|" 912 "l2_payload|<flowtype_id>) (ovlan|ivlan|src-ipv4|dst-ipv4|" 913 "src-ipv6|dst-ipv6|ipv4-tos|ipv4-proto|ipv6-tc|" 914 "ipv6-next-header|udp-src-port|udp-dst-port|" 915 "tcp-src-port|tcp-dst-port|sctp-src-port|" 916 "sctp-dst-port|sctp-veri-tag|udp-key|gre-key|fld-1st|" 917 "fld-2nd|fld-3rd|fld-4th|fld-5th|fld-6th|fld-7th|" 918 "fld-8th|none) (select|add)\n" 919 " Set the input set for hash.\n\n" 920 921 "set_fdir_input_set (port_id) " 922 "(ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|" 923 "ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|" 924 "l2_payload) (ivlan|ethertype|src-ipv4|dst-ipv4|src-ipv6|" 925 "dst-ipv6|ipv4-tos|ipv4-proto|ipv4-ttl|ipv6-tc|" 926 "ipv6-next-header|ipv6-hop-limits|udp-src-port|" 927 "udp-dst-port|tcp-src-port|tcp-dst-port|" 928 "sctp-src-port|sctp-dst-port|sctp-veri-tag|none)" 929 " (select|add)\n" 930 " Set the input set for FDir.\n\n" 931 932 "flow validate {port_id}" 933 " [group {group_id}] [priority {level}]" 934 " [ingress] [egress]" 935 " pattern {item} [/ {item} [...]] / end" 936 " actions {action} [/ {action} [...]] / end\n" 937 " Check whether a flow rule can be created.\n\n" 938 939 "flow create {port_id}" 940 " [group {group_id}] [priority {level}]" 941 " [ingress] [egress]" 942 " pattern {item} [/ {item} [...]] / end" 943 " actions {action} [/ {action} [...]] / end\n" 944 " Create a flow rule.\n\n" 945 946 "flow destroy {port_id} rule {rule_id} [...]\n" 947 " Destroy specific flow rules.\n\n" 948 949 "flow flush {port_id}\n" 950 " Destroy all flow rules.\n\n" 951 952 "flow query {port_id} {rule_id} {action}\n" 953 " Query an existing flow rule.\n\n" 954 955 "flow list {port_id} [group {group_id}] [...]\n" 956 " List existing flow rules sorted by priority," 957 " filtered by group identifiers.\n\n" 958 959 "flow isolate {port_id} {boolean}\n" 960 " Restrict ingress traffic to the defined" 961 " flow rules\n\n" 962 ); 963 } 964 } 965 966 cmdline_parse_token_string_t cmd_help_long_help = 967 TOKEN_STRING_INITIALIZER(struct cmd_help_long_result, help, "help"); 968 969 cmdline_parse_token_string_t cmd_help_long_section = 970 TOKEN_STRING_INITIALIZER(struct cmd_help_long_result, section, 971 "all#control#display#config#" 972 "ports#registers#filters"); 973 974 cmdline_parse_inst_t cmd_help_long = { 975 .f = cmd_help_long_parsed, 976 .data = NULL, 977 .help_str = "help all|control|display|config|ports|register|filters: " 978 "Show help", 979 .tokens = { 980 (void *)&cmd_help_long_help, 981 (void *)&cmd_help_long_section, 982 NULL, 983 }, 984 }; 985 986 987 /* *** start/stop/close all ports *** */ 988 struct cmd_operate_port_result { 989 cmdline_fixed_string_t keyword; 990 cmdline_fixed_string_t name; 991 cmdline_fixed_string_t value; 992 }; 993 994 static void cmd_operate_port_parsed(void *parsed_result, 995 __attribute__((unused)) struct cmdline *cl, 996 __attribute__((unused)) void *data) 997 { 998 struct cmd_operate_port_result *res = parsed_result; 999 1000 if (!strcmp(res->name, "start")) 1001 start_port(RTE_PORT_ALL); 1002 else if (!strcmp(res->name, "stop")) 1003 stop_port(RTE_PORT_ALL); 1004 else if (!strcmp(res->name, "close")) 1005 close_port(RTE_PORT_ALL); 1006 else if (!strcmp(res->name, "reset")) 1007 reset_port(RTE_PORT_ALL); 1008 else 1009 printf("Unknown parameter\n"); 1010 } 1011 1012 cmdline_parse_token_string_t cmd_operate_port_all_cmd = 1013 TOKEN_STRING_INITIALIZER(struct cmd_operate_port_result, keyword, 1014 "port"); 1015 cmdline_parse_token_string_t cmd_operate_port_all_port = 1016 TOKEN_STRING_INITIALIZER(struct cmd_operate_port_result, name, 1017 "start#stop#close#reset"); 1018 cmdline_parse_token_string_t cmd_operate_port_all_all = 1019 TOKEN_STRING_INITIALIZER(struct cmd_operate_port_result, value, "all"); 1020 1021 cmdline_parse_inst_t cmd_operate_port = { 1022 .f = cmd_operate_port_parsed, 1023 .data = NULL, 1024 .help_str = "port start|stop|close all: Start/Stop/Close/Reset all ports", 1025 .tokens = { 1026 (void *)&cmd_operate_port_all_cmd, 1027 (void *)&cmd_operate_port_all_port, 1028 (void *)&cmd_operate_port_all_all, 1029 NULL, 1030 }, 1031 }; 1032 1033 /* *** start/stop/close specific port *** */ 1034 struct cmd_operate_specific_port_result { 1035 cmdline_fixed_string_t keyword; 1036 cmdline_fixed_string_t name; 1037 uint8_t value; 1038 }; 1039 1040 static void cmd_operate_specific_port_parsed(void *parsed_result, 1041 __attribute__((unused)) struct cmdline *cl, 1042 __attribute__((unused)) void *data) 1043 { 1044 struct cmd_operate_specific_port_result *res = parsed_result; 1045 1046 if (!strcmp(res->name, "start")) 1047 start_port(res->value); 1048 else if (!strcmp(res->name, "stop")) 1049 stop_port(res->value); 1050 else if (!strcmp(res->name, "close")) 1051 close_port(res->value); 1052 else if (!strcmp(res->name, "reset")) 1053 reset_port(res->value); 1054 else 1055 printf("Unknown parameter\n"); 1056 } 1057 1058 cmdline_parse_token_string_t cmd_operate_specific_port_cmd = 1059 TOKEN_STRING_INITIALIZER(struct cmd_operate_specific_port_result, 1060 keyword, "port"); 1061 cmdline_parse_token_string_t cmd_operate_specific_port_port = 1062 TOKEN_STRING_INITIALIZER(struct cmd_operate_specific_port_result, 1063 name, "start#stop#close#reset"); 1064 cmdline_parse_token_num_t cmd_operate_specific_port_id = 1065 TOKEN_NUM_INITIALIZER(struct cmd_operate_specific_port_result, 1066 value, UINT8); 1067 1068 cmdline_parse_inst_t cmd_operate_specific_port = { 1069 .f = cmd_operate_specific_port_parsed, 1070 .data = NULL, 1071 .help_str = "port start|stop|close <port_id>: Start/Stop/Close/Reset port_id", 1072 .tokens = { 1073 (void *)&cmd_operate_specific_port_cmd, 1074 (void *)&cmd_operate_specific_port_port, 1075 (void *)&cmd_operate_specific_port_id, 1076 NULL, 1077 }, 1078 }; 1079 1080 /* *** attach a specified port *** */ 1081 struct cmd_operate_attach_port_result { 1082 cmdline_fixed_string_t port; 1083 cmdline_fixed_string_t keyword; 1084 cmdline_fixed_string_t identifier; 1085 }; 1086 1087 static void cmd_operate_attach_port_parsed(void *parsed_result, 1088 __attribute__((unused)) struct cmdline *cl, 1089 __attribute__((unused)) void *data) 1090 { 1091 struct cmd_operate_attach_port_result *res = parsed_result; 1092 1093 if (!strcmp(res->keyword, "attach")) 1094 attach_port(res->identifier); 1095 else 1096 printf("Unknown parameter\n"); 1097 } 1098 1099 cmdline_parse_token_string_t cmd_operate_attach_port_port = 1100 TOKEN_STRING_INITIALIZER(struct cmd_operate_attach_port_result, 1101 port, "port"); 1102 cmdline_parse_token_string_t cmd_operate_attach_port_keyword = 1103 TOKEN_STRING_INITIALIZER(struct cmd_operate_attach_port_result, 1104 keyword, "attach"); 1105 cmdline_parse_token_string_t cmd_operate_attach_port_identifier = 1106 TOKEN_STRING_INITIALIZER(struct cmd_operate_attach_port_result, 1107 identifier, NULL); 1108 1109 cmdline_parse_inst_t cmd_operate_attach_port = { 1110 .f = cmd_operate_attach_port_parsed, 1111 .data = NULL, 1112 .help_str = "port attach <identifier>: " 1113 "(identifier: pci address or virtual dev name)", 1114 .tokens = { 1115 (void *)&cmd_operate_attach_port_port, 1116 (void *)&cmd_operate_attach_port_keyword, 1117 (void *)&cmd_operate_attach_port_identifier, 1118 NULL, 1119 }, 1120 }; 1121 1122 /* *** detach a specified port *** */ 1123 struct cmd_operate_detach_port_result { 1124 cmdline_fixed_string_t port; 1125 cmdline_fixed_string_t keyword; 1126 uint8_t port_id; 1127 }; 1128 1129 static void cmd_operate_detach_port_parsed(void *parsed_result, 1130 __attribute__((unused)) struct cmdline *cl, 1131 __attribute__((unused)) void *data) 1132 { 1133 struct cmd_operate_detach_port_result *res = parsed_result; 1134 1135 if (!strcmp(res->keyword, "detach")) 1136 detach_port(res->port_id); 1137 else 1138 printf("Unknown parameter\n"); 1139 } 1140 1141 cmdline_parse_token_string_t cmd_operate_detach_port_port = 1142 TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_port_result, 1143 port, "port"); 1144 cmdline_parse_token_string_t cmd_operate_detach_port_keyword = 1145 TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_port_result, 1146 keyword, "detach"); 1147 cmdline_parse_token_num_t cmd_operate_detach_port_port_id = 1148 TOKEN_NUM_INITIALIZER(struct cmd_operate_detach_port_result, 1149 port_id, UINT8); 1150 1151 cmdline_parse_inst_t cmd_operate_detach_port = { 1152 .f = cmd_operate_detach_port_parsed, 1153 .data = NULL, 1154 .help_str = "port detach <port_id>", 1155 .tokens = { 1156 (void *)&cmd_operate_detach_port_port, 1157 (void *)&cmd_operate_detach_port_keyword, 1158 (void *)&cmd_operate_detach_port_port_id, 1159 NULL, 1160 }, 1161 }; 1162 1163 /* *** configure speed for all ports *** */ 1164 struct cmd_config_speed_all { 1165 cmdline_fixed_string_t port; 1166 cmdline_fixed_string_t keyword; 1167 cmdline_fixed_string_t all; 1168 cmdline_fixed_string_t item1; 1169 cmdline_fixed_string_t item2; 1170 cmdline_fixed_string_t value1; 1171 cmdline_fixed_string_t value2; 1172 }; 1173 1174 static int 1175 parse_and_check_speed_duplex(char *speedstr, char *duplexstr, uint32_t *speed) 1176 { 1177 1178 int duplex; 1179 1180 if (!strcmp(duplexstr, "half")) { 1181 duplex = ETH_LINK_HALF_DUPLEX; 1182 } else if (!strcmp(duplexstr, "full")) { 1183 duplex = ETH_LINK_FULL_DUPLEX; 1184 } else if (!strcmp(duplexstr, "auto")) { 1185 duplex = ETH_LINK_FULL_DUPLEX; 1186 } else { 1187 printf("Unknown duplex parameter\n"); 1188 return -1; 1189 } 1190 1191 if (!strcmp(speedstr, "10")) { 1192 *speed = (duplex == ETH_LINK_HALF_DUPLEX) ? 1193 ETH_LINK_SPEED_10M_HD : ETH_LINK_SPEED_10M; 1194 } else if (!strcmp(speedstr, "100")) { 1195 *speed = (duplex == ETH_LINK_HALF_DUPLEX) ? 1196 ETH_LINK_SPEED_100M_HD : ETH_LINK_SPEED_100M; 1197 } else { 1198 if (duplex != ETH_LINK_FULL_DUPLEX) { 1199 printf("Invalid speed/duplex parameters\n"); 1200 return -1; 1201 } 1202 if (!strcmp(speedstr, "1000")) { 1203 *speed = ETH_LINK_SPEED_1G; 1204 } else if (!strcmp(speedstr, "10000")) { 1205 *speed = ETH_LINK_SPEED_10G; 1206 } else if (!strcmp(speedstr, "25000")) { 1207 *speed = ETH_LINK_SPEED_25G; 1208 } else if (!strcmp(speedstr, "40000")) { 1209 *speed = ETH_LINK_SPEED_40G; 1210 } else if (!strcmp(speedstr, "50000")) { 1211 *speed = ETH_LINK_SPEED_50G; 1212 } else if (!strcmp(speedstr, "100000")) { 1213 *speed = ETH_LINK_SPEED_100G; 1214 } else if (!strcmp(speedstr, "auto")) { 1215 *speed = ETH_LINK_SPEED_AUTONEG; 1216 } else { 1217 printf("Unknown speed parameter\n"); 1218 return -1; 1219 } 1220 } 1221 1222 return 0; 1223 } 1224 1225 static void 1226 cmd_config_speed_all_parsed(void *parsed_result, 1227 __attribute__((unused)) struct cmdline *cl, 1228 __attribute__((unused)) void *data) 1229 { 1230 struct cmd_config_speed_all *res = parsed_result; 1231 uint32_t link_speed; 1232 portid_t pid; 1233 1234 if (!all_ports_stopped()) { 1235 printf("Please stop all ports first\n"); 1236 return; 1237 } 1238 1239 if (parse_and_check_speed_duplex(res->value1, res->value2, 1240 &link_speed) < 0) 1241 return; 1242 1243 RTE_ETH_FOREACH_DEV(pid) { 1244 ports[pid].dev_conf.link_speeds = link_speed; 1245 } 1246 1247 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 1248 } 1249 1250 cmdline_parse_token_string_t cmd_config_speed_all_port = 1251 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, port, "port"); 1252 cmdline_parse_token_string_t cmd_config_speed_all_keyword = 1253 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, keyword, 1254 "config"); 1255 cmdline_parse_token_string_t cmd_config_speed_all_all = 1256 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, all, "all"); 1257 cmdline_parse_token_string_t cmd_config_speed_all_item1 = 1258 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, item1, "speed"); 1259 cmdline_parse_token_string_t cmd_config_speed_all_value1 = 1260 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, value1, 1261 "10#100#1000#10000#25000#40000#50000#100000#auto"); 1262 cmdline_parse_token_string_t cmd_config_speed_all_item2 = 1263 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, item2, "duplex"); 1264 cmdline_parse_token_string_t cmd_config_speed_all_value2 = 1265 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, value2, 1266 "half#full#auto"); 1267 1268 cmdline_parse_inst_t cmd_config_speed_all = { 1269 .f = cmd_config_speed_all_parsed, 1270 .data = NULL, 1271 .help_str = "port config all speed " 1272 "10|100|1000|10000|25000|40000|50000|100000|auto duplex " 1273 "half|full|auto", 1274 .tokens = { 1275 (void *)&cmd_config_speed_all_port, 1276 (void *)&cmd_config_speed_all_keyword, 1277 (void *)&cmd_config_speed_all_all, 1278 (void *)&cmd_config_speed_all_item1, 1279 (void *)&cmd_config_speed_all_value1, 1280 (void *)&cmd_config_speed_all_item2, 1281 (void *)&cmd_config_speed_all_value2, 1282 NULL, 1283 }, 1284 }; 1285 1286 /* *** configure speed for specific port *** */ 1287 struct cmd_config_speed_specific { 1288 cmdline_fixed_string_t port; 1289 cmdline_fixed_string_t keyword; 1290 uint8_t id; 1291 cmdline_fixed_string_t item1; 1292 cmdline_fixed_string_t item2; 1293 cmdline_fixed_string_t value1; 1294 cmdline_fixed_string_t value2; 1295 }; 1296 1297 static void 1298 cmd_config_speed_specific_parsed(void *parsed_result, 1299 __attribute__((unused)) struct cmdline *cl, 1300 __attribute__((unused)) void *data) 1301 { 1302 struct cmd_config_speed_specific *res = parsed_result; 1303 uint32_t link_speed; 1304 1305 if (!all_ports_stopped()) { 1306 printf("Please stop all ports first\n"); 1307 return; 1308 } 1309 1310 if (port_id_is_invalid(res->id, ENABLED_WARN)) 1311 return; 1312 1313 if (parse_and_check_speed_duplex(res->value1, res->value2, 1314 &link_speed) < 0) 1315 return; 1316 1317 ports[res->id].dev_conf.link_speeds = link_speed; 1318 1319 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 1320 } 1321 1322 1323 cmdline_parse_token_string_t cmd_config_speed_specific_port = 1324 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, port, 1325 "port"); 1326 cmdline_parse_token_string_t cmd_config_speed_specific_keyword = 1327 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, keyword, 1328 "config"); 1329 cmdline_parse_token_num_t cmd_config_speed_specific_id = 1330 TOKEN_NUM_INITIALIZER(struct cmd_config_speed_specific, id, UINT8); 1331 cmdline_parse_token_string_t cmd_config_speed_specific_item1 = 1332 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, item1, 1333 "speed"); 1334 cmdline_parse_token_string_t cmd_config_speed_specific_value1 = 1335 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, value1, 1336 "10#100#1000#10000#25000#40000#50000#100000#auto"); 1337 cmdline_parse_token_string_t cmd_config_speed_specific_item2 = 1338 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, item2, 1339 "duplex"); 1340 cmdline_parse_token_string_t cmd_config_speed_specific_value2 = 1341 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, value2, 1342 "half#full#auto"); 1343 1344 cmdline_parse_inst_t cmd_config_speed_specific = { 1345 .f = cmd_config_speed_specific_parsed, 1346 .data = NULL, 1347 .help_str = "port config <port_id> speed " 1348 "10|100|1000|10000|25000|40000|50000|100000|auto duplex " 1349 "half|full|auto", 1350 .tokens = { 1351 (void *)&cmd_config_speed_specific_port, 1352 (void *)&cmd_config_speed_specific_keyword, 1353 (void *)&cmd_config_speed_specific_id, 1354 (void *)&cmd_config_speed_specific_item1, 1355 (void *)&cmd_config_speed_specific_value1, 1356 (void *)&cmd_config_speed_specific_item2, 1357 (void *)&cmd_config_speed_specific_value2, 1358 NULL, 1359 }, 1360 }; 1361 1362 /* *** configure txq/rxq, txd/rxd *** */ 1363 struct cmd_config_rx_tx { 1364 cmdline_fixed_string_t port; 1365 cmdline_fixed_string_t keyword; 1366 cmdline_fixed_string_t all; 1367 cmdline_fixed_string_t name; 1368 uint16_t value; 1369 }; 1370 1371 static void 1372 cmd_config_rx_tx_parsed(void *parsed_result, 1373 __attribute__((unused)) struct cmdline *cl, 1374 __attribute__((unused)) void *data) 1375 { 1376 struct cmd_config_rx_tx *res = parsed_result; 1377 1378 if (!all_ports_stopped()) { 1379 printf("Please stop all ports first\n"); 1380 return; 1381 } 1382 if (!strcmp(res->name, "rxq")) { 1383 if (!res->value && !nb_txq) { 1384 printf("Warning: Either rx or tx queues should be non zero\n"); 1385 return; 1386 } 1387 nb_rxq = res->value; 1388 } 1389 else if (!strcmp(res->name, "txq")) { 1390 if (!res->value && !nb_rxq) { 1391 printf("Warning: Either rx or tx queues should be non zero\n"); 1392 return; 1393 } 1394 nb_txq = res->value; 1395 } 1396 else if (!strcmp(res->name, "rxd")) { 1397 if (res->value <= 0 || res->value > RTE_TEST_RX_DESC_MAX) { 1398 printf("rxd %d invalid - must be > 0 && <= %d\n", 1399 res->value, RTE_TEST_RX_DESC_MAX); 1400 return; 1401 } 1402 nb_rxd = res->value; 1403 } else if (!strcmp(res->name, "txd")) { 1404 if (res->value <= 0 || res->value > RTE_TEST_TX_DESC_MAX) { 1405 printf("txd %d invalid - must be > 0 && <= %d\n", 1406 res->value, RTE_TEST_TX_DESC_MAX); 1407 return; 1408 } 1409 nb_txd = res->value; 1410 } else { 1411 printf("Unknown parameter\n"); 1412 return; 1413 } 1414 1415 fwd_config_setup(); 1416 1417 init_port_config(); 1418 1419 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 1420 } 1421 1422 cmdline_parse_token_string_t cmd_config_rx_tx_port = 1423 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_tx, port, "port"); 1424 cmdline_parse_token_string_t cmd_config_rx_tx_keyword = 1425 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_tx, keyword, "config"); 1426 cmdline_parse_token_string_t cmd_config_rx_tx_all = 1427 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_tx, all, "all"); 1428 cmdline_parse_token_string_t cmd_config_rx_tx_name = 1429 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_tx, name, 1430 "rxq#txq#rxd#txd"); 1431 cmdline_parse_token_num_t cmd_config_rx_tx_value = 1432 TOKEN_NUM_INITIALIZER(struct cmd_config_rx_tx, value, UINT16); 1433 1434 cmdline_parse_inst_t cmd_config_rx_tx = { 1435 .f = cmd_config_rx_tx_parsed, 1436 .data = NULL, 1437 .help_str = "port config all rxq|txq|rxd|txd <value>", 1438 .tokens = { 1439 (void *)&cmd_config_rx_tx_port, 1440 (void *)&cmd_config_rx_tx_keyword, 1441 (void *)&cmd_config_rx_tx_all, 1442 (void *)&cmd_config_rx_tx_name, 1443 (void *)&cmd_config_rx_tx_value, 1444 NULL, 1445 }, 1446 }; 1447 1448 /* *** config max packet length *** */ 1449 struct cmd_config_max_pkt_len_result { 1450 cmdline_fixed_string_t port; 1451 cmdline_fixed_string_t keyword; 1452 cmdline_fixed_string_t all; 1453 cmdline_fixed_string_t name; 1454 uint32_t value; 1455 }; 1456 1457 static void 1458 cmd_config_max_pkt_len_parsed(void *parsed_result, 1459 __attribute__((unused)) struct cmdline *cl, 1460 __attribute__((unused)) void *data) 1461 { 1462 struct cmd_config_max_pkt_len_result *res = parsed_result; 1463 1464 if (!all_ports_stopped()) { 1465 printf("Please stop all ports first\n"); 1466 return; 1467 } 1468 1469 if (!strcmp(res->name, "max-pkt-len")) { 1470 if (res->value < ETHER_MIN_LEN) { 1471 printf("max-pkt-len can not be less than %d\n", 1472 ETHER_MIN_LEN); 1473 return; 1474 } 1475 if (res->value == rx_mode.max_rx_pkt_len) 1476 return; 1477 1478 rx_mode.max_rx_pkt_len = res->value; 1479 if (res->value > ETHER_MAX_LEN) 1480 rx_mode.jumbo_frame = 1; 1481 else 1482 rx_mode.jumbo_frame = 0; 1483 } else { 1484 printf("Unknown parameter\n"); 1485 return; 1486 } 1487 1488 init_port_config(); 1489 1490 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 1491 } 1492 1493 cmdline_parse_token_string_t cmd_config_max_pkt_len_port = 1494 TOKEN_STRING_INITIALIZER(struct cmd_config_max_pkt_len_result, port, 1495 "port"); 1496 cmdline_parse_token_string_t cmd_config_max_pkt_len_keyword = 1497 TOKEN_STRING_INITIALIZER(struct cmd_config_max_pkt_len_result, keyword, 1498 "config"); 1499 cmdline_parse_token_string_t cmd_config_max_pkt_len_all = 1500 TOKEN_STRING_INITIALIZER(struct cmd_config_max_pkt_len_result, all, 1501 "all"); 1502 cmdline_parse_token_string_t cmd_config_max_pkt_len_name = 1503 TOKEN_STRING_INITIALIZER(struct cmd_config_max_pkt_len_result, name, 1504 "max-pkt-len"); 1505 cmdline_parse_token_num_t cmd_config_max_pkt_len_value = 1506 TOKEN_NUM_INITIALIZER(struct cmd_config_max_pkt_len_result, value, 1507 UINT32); 1508 1509 cmdline_parse_inst_t cmd_config_max_pkt_len = { 1510 .f = cmd_config_max_pkt_len_parsed, 1511 .data = NULL, 1512 .help_str = "port config all max-pkt-len <value>", 1513 .tokens = { 1514 (void *)&cmd_config_max_pkt_len_port, 1515 (void *)&cmd_config_max_pkt_len_keyword, 1516 (void *)&cmd_config_max_pkt_len_all, 1517 (void *)&cmd_config_max_pkt_len_name, 1518 (void *)&cmd_config_max_pkt_len_value, 1519 NULL, 1520 }, 1521 }; 1522 1523 /* *** configure port MTU *** */ 1524 struct cmd_config_mtu_result { 1525 cmdline_fixed_string_t port; 1526 cmdline_fixed_string_t keyword; 1527 cmdline_fixed_string_t mtu; 1528 uint8_t port_id; 1529 uint16_t value; 1530 }; 1531 1532 static void 1533 cmd_config_mtu_parsed(void *parsed_result, 1534 __attribute__((unused)) struct cmdline *cl, 1535 __attribute__((unused)) void *data) 1536 { 1537 struct cmd_config_mtu_result *res = parsed_result; 1538 1539 if (res->value < ETHER_MIN_LEN) { 1540 printf("mtu cannot be less than %d\n", ETHER_MIN_LEN); 1541 return; 1542 } 1543 port_mtu_set(res->port_id, res->value); 1544 } 1545 1546 cmdline_parse_token_string_t cmd_config_mtu_port = 1547 TOKEN_STRING_INITIALIZER(struct cmd_config_mtu_result, port, 1548 "port"); 1549 cmdline_parse_token_string_t cmd_config_mtu_keyword = 1550 TOKEN_STRING_INITIALIZER(struct cmd_config_mtu_result, keyword, 1551 "config"); 1552 cmdline_parse_token_string_t cmd_config_mtu_mtu = 1553 TOKEN_STRING_INITIALIZER(struct cmd_config_mtu_result, keyword, 1554 "mtu"); 1555 cmdline_parse_token_num_t cmd_config_mtu_port_id = 1556 TOKEN_NUM_INITIALIZER(struct cmd_config_mtu_result, port_id, UINT8); 1557 cmdline_parse_token_num_t cmd_config_mtu_value = 1558 TOKEN_NUM_INITIALIZER(struct cmd_config_mtu_result, value, UINT16); 1559 1560 cmdline_parse_inst_t cmd_config_mtu = { 1561 .f = cmd_config_mtu_parsed, 1562 .data = NULL, 1563 .help_str = "port config mtu <port_id> <value>", 1564 .tokens = { 1565 (void *)&cmd_config_mtu_port, 1566 (void *)&cmd_config_mtu_keyword, 1567 (void *)&cmd_config_mtu_mtu, 1568 (void *)&cmd_config_mtu_port_id, 1569 (void *)&cmd_config_mtu_value, 1570 NULL, 1571 }, 1572 }; 1573 1574 /* *** configure rx mode *** */ 1575 struct cmd_config_rx_mode_flag { 1576 cmdline_fixed_string_t port; 1577 cmdline_fixed_string_t keyword; 1578 cmdline_fixed_string_t all; 1579 cmdline_fixed_string_t name; 1580 cmdline_fixed_string_t value; 1581 }; 1582 1583 static void 1584 cmd_config_rx_mode_flag_parsed(void *parsed_result, 1585 __attribute__((unused)) struct cmdline *cl, 1586 __attribute__((unused)) void *data) 1587 { 1588 struct cmd_config_rx_mode_flag *res = parsed_result; 1589 1590 if (!all_ports_stopped()) { 1591 printf("Please stop all ports first\n"); 1592 return; 1593 } 1594 1595 if (!strcmp(res->name, "crc-strip")) { 1596 if (!strcmp(res->value, "on")) 1597 rx_mode.hw_strip_crc = 1; 1598 else if (!strcmp(res->value, "off")) 1599 rx_mode.hw_strip_crc = 0; 1600 else { 1601 printf("Unknown parameter\n"); 1602 return; 1603 } 1604 } else if (!strcmp(res->name, "scatter")) { 1605 if (!strcmp(res->value, "on")) 1606 rx_mode.enable_scatter = 1; 1607 else if (!strcmp(res->value, "off")) 1608 rx_mode.enable_scatter = 0; 1609 else { 1610 printf("Unknown parameter\n"); 1611 return; 1612 } 1613 } else if (!strcmp(res->name, "rx-cksum")) { 1614 if (!strcmp(res->value, "on")) 1615 rx_mode.hw_ip_checksum = 1; 1616 else if (!strcmp(res->value, "off")) 1617 rx_mode.hw_ip_checksum = 0; 1618 else { 1619 printf("Unknown parameter\n"); 1620 return; 1621 } 1622 } else if (!strcmp(res->name, "rx-timestamp")) { 1623 if (!strcmp(res->value, "on")) 1624 rx_mode.hw_timestamp = 1; 1625 else if (!strcmp(res->value, "off")) 1626 rx_mode.hw_timestamp = 0; 1627 else { 1628 printf("Unknown parameter\n"); 1629 return; 1630 } 1631 } else if (!strcmp(res->name, "hw-vlan")) { 1632 if (!strcmp(res->value, "on")) { 1633 rx_mode.hw_vlan_filter = 1; 1634 rx_mode.hw_vlan_strip = 1; 1635 } 1636 else if (!strcmp(res->value, "off")) { 1637 rx_mode.hw_vlan_filter = 0; 1638 rx_mode.hw_vlan_strip = 0; 1639 } 1640 else { 1641 printf("Unknown parameter\n"); 1642 return; 1643 } 1644 } else if (!strcmp(res->name, "hw-vlan-filter")) { 1645 if (!strcmp(res->value, "on")) 1646 rx_mode.hw_vlan_filter = 1; 1647 else if (!strcmp(res->value, "off")) 1648 rx_mode.hw_vlan_filter = 0; 1649 else { 1650 printf("Unknown parameter\n"); 1651 return; 1652 } 1653 } else if (!strcmp(res->name, "hw-vlan-strip")) { 1654 if (!strcmp(res->value, "on")) 1655 rx_mode.hw_vlan_strip = 1; 1656 else if (!strcmp(res->value, "off")) 1657 rx_mode.hw_vlan_strip = 0; 1658 else { 1659 printf("Unknown parameter\n"); 1660 return; 1661 } 1662 } else if (!strcmp(res->name, "hw-vlan-extend")) { 1663 if (!strcmp(res->value, "on")) 1664 rx_mode.hw_vlan_extend = 1; 1665 else if (!strcmp(res->value, "off")) 1666 rx_mode.hw_vlan_extend = 0; 1667 else { 1668 printf("Unknown parameter\n"); 1669 return; 1670 } 1671 } else if (!strcmp(res->name, "drop-en")) { 1672 if (!strcmp(res->value, "on")) 1673 rx_drop_en = 1; 1674 else if (!strcmp(res->value, "off")) 1675 rx_drop_en = 0; 1676 else { 1677 printf("Unknown parameter\n"); 1678 return; 1679 } 1680 } else { 1681 printf("Unknown parameter\n"); 1682 return; 1683 } 1684 1685 init_port_config(); 1686 1687 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 1688 } 1689 1690 cmdline_parse_token_string_t cmd_config_rx_mode_flag_port = 1691 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, port, "port"); 1692 cmdline_parse_token_string_t cmd_config_rx_mode_flag_keyword = 1693 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, keyword, 1694 "config"); 1695 cmdline_parse_token_string_t cmd_config_rx_mode_flag_all = 1696 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, all, "all"); 1697 cmdline_parse_token_string_t cmd_config_rx_mode_flag_name = 1698 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, name, 1699 "crc-strip#scatter#rx-cksum#rx-timestamp#hw-vlan#" 1700 "hw-vlan-filter#hw-vlan-strip#hw-vlan-extend"); 1701 cmdline_parse_token_string_t cmd_config_rx_mode_flag_value = 1702 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, value, 1703 "on#off"); 1704 1705 cmdline_parse_inst_t cmd_config_rx_mode_flag = { 1706 .f = cmd_config_rx_mode_flag_parsed, 1707 .data = NULL, 1708 .help_str = "port config all crc-strip|scatter|rx-cksum|rx-timestamp|hw-vlan|" 1709 "hw-vlan-filter|hw-vlan-strip|hw-vlan-extend on|off", 1710 .tokens = { 1711 (void *)&cmd_config_rx_mode_flag_port, 1712 (void *)&cmd_config_rx_mode_flag_keyword, 1713 (void *)&cmd_config_rx_mode_flag_all, 1714 (void *)&cmd_config_rx_mode_flag_name, 1715 (void *)&cmd_config_rx_mode_flag_value, 1716 NULL, 1717 }, 1718 }; 1719 1720 /* *** configure rss *** */ 1721 struct cmd_config_rss { 1722 cmdline_fixed_string_t port; 1723 cmdline_fixed_string_t keyword; 1724 cmdline_fixed_string_t all; 1725 cmdline_fixed_string_t name; 1726 cmdline_fixed_string_t value; 1727 }; 1728 1729 static void 1730 cmd_config_rss_parsed(void *parsed_result, 1731 __attribute__((unused)) struct cmdline *cl, 1732 __attribute__((unused)) void *data) 1733 { 1734 struct cmd_config_rss *res = parsed_result; 1735 struct rte_eth_rss_conf rss_conf; 1736 int diag; 1737 uint8_t i; 1738 1739 if (!strcmp(res->value, "all")) 1740 rss_conf.rss_hf = ETH_RSS_IP | ETH_RSS_TCP | 1741 ETH_RSS_UDP | ETH_RSS_SCTP | 1742 ETH_RSS_L2_PAYLOAD; 1743 else if (!strcmp(res->value, "ip")) 1744 rss_conf.rss_hf = ETH_RSS_IP; 1745 else if (!strcmp(res->value, "udp")) 1746 rss_conf.rss_hf = ETH_RSS_UDP; 1747 else if (!strcmp(res->value, "tcp")) 1748 rss_conf.rss_hf = ETH_RSS_TCP; 1749 else if (!strcmp(res->value, "sctp")) 1750 rss_conf.rss_hf = ETH_RSS_SCTP; 1751 else if (!strcmp(res->value, "ether")) 1752 rss_conf.rss_hf = ETH_RSS_L2_PAYLOAD; 1753 else if (!strcmp(res->value, "port")) 1754 rss_conf.rss_hf = ETH_RSS_PORT; 1755 else if (!strcmp(res->value, "vxlan")) 1756 rss_conf.rss_hf = ETH_RSS_VXLAN; 1757 else if (!strcmp(res->value, "geneve")) 1758 rss_conf.rss_hf = ETH_RSS_GENEVE; 1759 else if (!strcmp(res->value, "nvgre")) 1760 rss_conf.rss_hf = ETH_RSS_NVGRE; 1761 else if (!strcmp(res->value, "none")) 1762 rss_conf.rss_hf = 0; 1763 else if (isdigit(res->value[0]) && atoi(res->value) > 0 && 1764 atoi(res->value) < 64) 1765 rss_conf.rss_hf = 1ULL << atoi(res->value); 1766 else { 1767 printf("Unknown parameter\n"); 1768 return; 1769 } 1770 rss_conf.rss_key = NULL; 1771 for (i = 0; i < rte_eth_dev_count(); i++) { 1772 diag = rte_eth_dev_rss_hash_update(i, &rss_conf); 1773 if (diag < 0) 1774 printf("Configuration of RSS hash at ethernet port %d " 1775 "failed with error (%d): %s.\n", 1776 i, -diag, strerror(-diag)); 1777 } 1778 } 1779 1780 cmdline_parse_token_string_t cmd_config_rss_port = 1781 TOKEN_STRING_INITIALIZER(struct cmd_config_rss, port, "port"); 1782 cmdline_parse_token_string_t cmd_config_rss_keyword = 1783 TOKEN_STRING_INITIALIZER(struct cmd_config_rss, keyword, "config"); 1784 cmdline_parse_token_string_t cmd_config_rss_all = 1785 TOKEN_STRING_INITIALIZER(struct cmd_config_rss, all, "all"); 1786 cmdline_parse_token_string_t cmd_config_rss_name = 1787 TOKEN_STRING_INITIALIZER(struct cmd_config_rss, name, "rss"); 1788 cmdline_parse_token_string_t cmd_config_rss_value = 1789 TOKEN_STRING_INITIALIZER(struct cmd_config_rss, value, NULL); 1790 1791 cmdline_parse_inst_t cmd_config_rss = { 1792 .f = cmd_config_rss_parsed, 1793 .data = NULL, 1794 .help_str = "port config all rss " 1795 "all|ip|tcp|udp|sctp|ether|port|vxlan|geneve|nvgre|none|<flowtype_id>", 1796 .tokens = { 1797 (void *)&cmd_config_rss_port, 1798 (void *)&cmd_config_rss_keyword, 1799 (void *)&cmd_config_rss_all, 1800 (void *)&cmd_config_rss_name, 1801 (void *)&cmd_config_rss_value, 1802 NULL, 1803 }, 1804 }; 1805 1806 /* *** configure rss hash key *** */ 1807 struct cmd_config_rss_hash_key { 1808 cmdline_fixed_string_t port; 1809 cmdline_fixed_string_t config; 1810 uint8_t port_id; 1811 cmdline_fixed_string_t rss_hash_key; 1812 cmdline_fixed_string_t rss_type; 1813 cmdline_fixed_string_t key; 1814 }; 1815 1816 static uint8_t 1817 hexa_digit_to_value(char hexa_digit) 1818 { 1819 if ((hexa_digit >= '0') && (hexa_digit <= '9')) 1820 return (uint8_t) (hexa_digit - '0'); 1821 if ((hexa_digit >= 'a') && (hexa_digit <= 'f')) 1822 return (uint8_t) ((hexa_digit - 'a') + 10); 1823 if ((hexa_digit >= 'A') && (hexa_digit <= 'F')) 1824 return (uint8_t) ((hexa_digit - 'A') + 10); 1825 /* Invalid hexa digit */ 1826 return 0xFF; 1827 } 1828 1829 static uint8_t 1830 parse_and_check_key_hexa_digit(char *key, int idx) 1831 { 1832 uint8_t hexa_v; 1833 1834 hexa_v = hexa_digit_to_value(key[idx]); 1835 if (hexa_v == 0xFF) 1836 printf("invalid key: character %c at position %d is not a " 1837 "valid hexa digit\n", key[idx], idx); 1838 return hexa_v; 1839 } 1840 1841 static void 1842 cmd_config_rss_hash_key_parsed(void *parsed_result, 1843 __attribute__((unused)) struct cmdline *cl, 1844 __attribute__((unused)) void *data) 1845 { 1846 struct cmd_config_rss_hash_key *res = parsed_result; 1847 uint8_t hash_key[RSS_HASH_KEY_LENGTH]; 1848 uint8_t xdgt0; 1849 uint8_t xdgt1; 1850 int i; 1851 struct rte_eth_dev_info dev_info; 1852 uint8_t hash_key_size; 1853 uint32_t key_len; 1854 1855 memset(&dev_info, 0, sizeof(dev_info)); 1856 rte_eth_dev_info_get(res->port_id, &dev_info); 1857 if (dev_info.hash_key_size > 0 && 1858 dev_info.hash_key_size <= sizeof(hash_key)) 1859 hash_key_size = dev_info.hash_key_size; 1860 else { 1861 printf("dev_info did not provide a valid hash key size\n"); 1862 return; 1863 } 1864 /* Check the length of the RSS hash key */ 1865 key_len = strlen(res->key); 1866 if (key_len != (hash_key_size * 2)) { 1867 printf("key length: %d invalid - key must be a string of %d" 1868 " hexa-decimal numbers\n", 1869 (int) key_len, hash_key_size * 2); 1870 return; 1871 } 1872 /* Translate RSS hash key into binary representation */ 1873 for (i = 0; i < hash_key_size; i++) { 1874 xdgt0 = parse_and_check_key_hexa_digit(res->key, (i * 2)); 1875 if (xdgt0 == 0xFF) 1876 return; 1877 xdgt1 = parse_and_check_key_hexa_digit(res->key, (i * 2) + 1); 1878 if (xdgt1 == 0xFF) 1879 return; 1880 hash_key[i] = (uint8_t) ((xdgt0 * 16) + xdgt1); 1881 } 1882 port_rss_hash_key_update(res->port_id, res->rss_type, hash_key, 1883 hash_key_size); 1884 } 1885 1886 cmdline_parse_token_string_t cmd_config_rss_hash_key_port = 1887 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, port, "port"); 1888 cmdline_parse_token_string_t cmd_config_rss_hash_key_config = 1889 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, config, 1890 "config"); 1891 cmdline_parse_token_num_t cmd_config_rss_hash_key_port_id = 1892 TOKEN_NUM_INITIALIZER(struct cmd_config_rss_hash_key, port_id, UINT8); 1893 cmdline_parse_token_string_t cmd_config_rss_hash_key_rss_hash_key = 1894 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, 1895 rss_hash_key, "rss-hash-key"); 1896 cmdline_parse_token_string_t cmd_config_rss_hash_key_rss_type = 1897 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, rss_type, 1898 "ipv4#ipv4-frag#ipv4-tcp#ipv4-udp#ipv4-sctp#" 1899 "ipv4-other#ipv6#ipv6-frag#ipv6-tcp#ipv6-udp#" 1900 "ipv6-sctp#ipv6-other#l2-payload#ipv6-ex#" 1901 "ipv6-tcp-ex#ipv6-udp-ex"); 1902 cmdline_parse_token_string_t cmd_config_rss_hash_key_value = 1903 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, key, NULL); 1904 1905 cmdline_parse_inst_t cmd_config_rss_hash_key = { 1906 .f = cmd_config_rss_hash_key_parsed, 1907 .data = NULL, 1908 .help_str = "port config <port_id> rss-hash-key " 1909 "ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|" 1910 "ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|" 1911 "l2-payload|ipv6-ex|ipv6-tcp-ex|ipv6-udp-ex " 1912 "<string of hex digits (variable length, NIC dependent)>", 1913 .tokens = { 1914 (void *)&cmd_config_rss_hash_key_port, 1915 (void *)&cmd_config_rss_hash_key_config, 1916 (void *)&cmd_config_rss_hash_key_port_id, 1917 (void *)&cmd_config_rss_hash_key_rss_hash_key, 1918 (void *)&cmd_config_rss_hash_key_rss_type, 1919 (void *)&cmd_config_rss_hash_key_value, 1920 NULL, 1921 }, 1922 }; 1923 1924 /* *** configure port rxq/txq start/stop *** */ 1925 struct cmd_config_rxtx_queue { 1926 cmdline_fixed_string_t port; 1927 uint8_t portid; 1928 cmdline_fixed_string_t rxtxq; 1929 uint16_t qid; 1930 cmdline_fixed_string_t opname; 1931 }; 1932 1933 static void 1934 cmd_config_rxtx_queue_parsed(void *parsed_result, 1935 __attribute__((unused)) struct cmdline *cl, 1936 __attribute__((unused)) void *data) 1937 { 1938 struct cmd_config_rxtx_queue *res = parsed_result; 1939 uint8_t isrx; 1940 uint8_t isstart; 1941 int ret = 0; 1942 1943 if (test_done == 0) { 1944 printf("Please stop forwarding first\n"); 1945 return; 1946 } 1947 1948 if (port_id_is_invalid(res->portid, ENABLED_WARN)) 1949 return; 1950 1951 if (port_is_started(res->portid) != 1) { 1952 printf("Please start port %u first\n", res->portid); 1953 return; 1954 } 1955 1956 if (!strcmp(res->rxtxq, "rxq")) 1957 isrx = 1; 1958 else if (!strcmp(res->rxtxq, "txq")) 1959 isrx = 0; 1960 else { 1961 printf("Unknown parameter\n"); 1962 return; 1963 } 1964 1965 if (isrx && rx_queue_id_is_invalid(res->qid)) 1966 return; 1967 else if (!isrx && tx_queue_id_is_invalid(res->qid)) 1968 return; 1969 1970 if (!strcmp(res->opname, "start")) 1971 isstart = 1; 1972 else if (!strcmp(res->opname, "stop")) 1973 isstart = 0; 1974 else { 1975 printf("Unknown parameter\n"); 1976 return; 1977 } 1978 1979 if (isstart && isrx) 1980 ret = rte_eth_dev_rx_queue_start(res->portid, res->qid); 1981 else if (!isstart && isrx) 1982 ret = rte_eth_dev_rx_queue_stop(res->portid, res->qid); 1983 else if (isstart && !isrx) 1984 ret = rte_eth_dev_tx_queue_start(res->portid, res->qid); 1985 else 1986 ret = rte_eth_dev_tx_queue_stop(res->portid, res->qid); 1987 1988 if (ret == -ENOTSUP) 1989 printf("Function not supported in PMD driver\n"); 1990 } 1991 1992 cmdline_parse_token_string_t cmd_config_rxtx_queue_port = 1993 TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_queue, port, "port"); 1994 cmdline_parse_token_num_t cmd_config_rxtx_queue_portid = 1995 TOKEN_NUM_INITIALIZER(struct cmd_config_rxtx_queue, portid, UINT8); 1996 cmdline_parse_token_string_t cmd_config_rxtx_queue_rxtxq = 1997 TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_queue, rxtxq, "rxq#txq"); 1998 cmdline_parse_token_num_t cmd_config_rxtx_queue_qid = 1999 TOKEN_NUM_INITIALIZER(struct cmd_config_rxtx_queue, qid, UINT16); 2000 cmdline_parse_token_string_t cmd_config_rxtx_queue_opname = 2001 TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_queue, opname, 2002 "start#stop"); 2003 2004 cmdline_parse_inst_t cmd_config_rxtx_queue = { 2005 .f = cmd_config_rxtx_queue_parsed, 2006 .data = NULL, 2007 .help_str = "port <port_id> rxq|txq <queue_id> start|stop", 2008 .tokens = { 2009 (void *)&cmd_config_speed_all_port, 2010 (void *)&cmd_config_rxtx_queue_portid, 2011 (void *)&cmd_config_rxtx_queue_rxtxq, 2012 (void *)&cmd_config_rxtx_queue_qid, 2013 (void *)&cmd_config_rxtx_queue_opname, 2014 NULL, 2015 }, 2016 }; 2017 2018 /* *** Configure RSS RETA *** */ 2019 struct cmd_config_rss_reta { 2020 cmdline_fixed_string_t port; 2021 cmdline_fixed_string_t keyword; 2022 uint8_t port_id; 2023 cmdline_fixed_string_t name; 2024 cmdline_fixed_string_t list_name; 2025 cmdline_fixed_string_t list_of_items; 2026 }; 2027 2028 static int 2029 parse_reta_config(const char *str, 2030 struct rte_eth_rss_reta_entry64 *reta_conf, 2031 uint16_t nb_entries) 2032 { 2033 int i; 2034 unsigned size; 2035 uint16_t hash_index, idx, shift; 2036 uint16_t nb_queue; 2037 char s[256]; 2038 const char *p, *p0 = str; 2039 char *end; 2040 enum fieldnames { 2041 FLD_HASH_INDEX = 0, 2042 FLD_QUEUE, 2043 _NUM_FLD 2044 }; 2045 unsigned long int_fld[_NUM_FLD]; 2046 char *str_fld[_NUM_FLD]; 2047 2048 while ((p = strchr(p0,'(')) != NULL) { 2049 ++p; 2050 if((p0 = strchr(p,')')) == NULL) 2051 return -1; 2052 2053 size = p0 - p; 2054 if(size >= sizeof(s)) 2055 return -1; 2056 2057 snprintf(s, sizeof(s), "%.*s", size, p); 2058 if (rte_strsplit(s, sizeof(s), str_fld, _NUM_FLD, ',') != _NUM_FLD) 2059 return -1; 2060 for (i = 0; i < _NUM_FLD; i++) { 2061 errno = 0; 2062 int_fld[i] = strtoul(str_fld[i], &end, 0); 2063 if (errno != 0 || end == str_fld[i] || 2064 int_fld[i] > 65535) 2065 return -1; 2066 } 2067 2068 hash_index = (uint16_t)int_fld[FLD_HASH_INDEX]; 2069 nb_queue = (uint16_t)int_fld[FLD_QUEUE]; 2070 2071 if (hash_index >= nb_entries) { 2072 printf("Invalid RETA hash index=%d\n", hash_index); 2073 return -1; 2074 } 2075 2076 idx = hash_index / RTE_RETA_GROUP_SIZE; 2077 shift = hash_index % RTE_RETA_GROUP_SIZE; 2078 reta_conf[idx].mask |= (1ULL << shift); 2079 reta_conf[idx].reta[shift] = nb_queue; 2080 } 2081 2082 return 0; 2083 } 2084 2085 static void 2086 cmd_set_rss_reta_parsed(void *parsed_result, 2087 __attribute__((unused)) struct cmdline *cl, 2088 __attribute__((unused)) void *data) 2089 { 2090 int ret; 2091 struct rte_eth_dev_info dev_info; 2092 struct rte_eth_rss_reta_entry64 reta_conf[8]; 2093 struct cmd_config_rss_reta *res = parsed_result; 2094 2095 memset(&dev_info, 0, sizeof(dev_info)); 2096 rte_eth_dev_info_get(res->port_id, &dev_info); 2097 if (dev_info.reta_size == 0) { 2098 printf("Redirection table size is 0 which is " 2099 "invalid for RSS\n"); 2100 return; 2101 } else 2102 printf("The reta size of port %d is %u\n", 2103 res->port_id, dev_info.reta_size); 2104 if (dev_info.reta_size > ETH_RSS_RETA_SIZE_512) { 2105 printf("Currently do not support more than %u entries of " 2106 "redirection table\n", ETH_RSS_RETA_SIZE_512); 2107 return; 2108 } 2109 2110 memset(reta_conf, 0, sizeof(reta_conf)); 2111 if (!strcmp(res->list_name, "reta")) { 2112 if (parse_reta_config(res->list_of_items, reta_conf, 2113 dev_info.reta_size)) { 2114 printf("Invalid RSS Redirection Table " 2115 "config entered\n"); 2116 return; 2117 } 2118 ret = rte_eth_dev_rss_reta_update(res->port_id, 2119 reta_conf, dev_info.reta_size); 2120 if (ret != 0) 2121 printf("Bad redirection table parameter, " 2122 "return code = %d \n", ret); 2123 } 2124 } 2125 2126 cmdline_parse_token_string_t cmd_config_rss_reta_port = 2127 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_reta, port, "port"); 2128 cmdline_parse_token_string_t cmd_config_rss_reta_keyword = 2129 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_reta, keyword, "config"); 2130 cmdline_parse_token_num_t cmd_config_rss_reta_port_id = 2131 TOKEN_NUM_INITIALIZER(struct cmd_config_rss_reta, port_id, UINT8); 2132 cmdline_parse_token_string_t cmd_config_rss_reta_name = 2133 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_reta, name, "rss"); 2134 cmdline_parse_token_string_t cmd_config_rss_reta_list_name = 2135 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_reta, list_name, "reta"); 2136 cmdline_parse_token_string_t cmd_config_rss_reta_list_of_items = 2137 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_reta, list_of_items, 2138 NULL); 2139 cmdline_parse_inst_t cmd_config_rss_reta = { 2140 .f = cmd_set_rss_reta_parsed, 2141 .data = NULL, 2142 .help_str = "port config <port_id> rss reta <hash,queue[,hash,queue]*>", 2143 .tokens = { 2144 (void *)&cmd_config_rss_reta_port, 2145 (void *)&cmd_config_rss_reta_keyword, 2146 (void *)&cmd_config_rss_reta_port_id, 2147 (void *)&cmd_config_rss_reta_name, 2148 (void *)&cmd_config_rss_reta_list_name, 2149 (void *)&cmd_config_rss_reta_list_of_items, 2150 NULL, 2151 }, 2152 }; 2153 2154 /* *** SHOW PORT RETA INFO *** */ 2155 struct cmd_showport_reta { 2156 cmdline_fixed_string_t show; 2157 cmdline_fixed_string_t port; 2158 uint8_t port_id; 2159 cmdline_fixed_string_t rss; 2160 cmdline_fixed_string_t reta; 2161 uint16_t size; 2162 cmdline_fixed_string_t list_of_items; 2163 }; 2164 2165 static int 2166 showport_parse_reta_config(struct rte_eth_rss_reta_entry64 *conf, 2167 uint16_t nb_entries, 2168 char *str) 2169 { 2170 uint32_t size; 2171 const char *p, *p0 = str; 2172 char s[256]; 2173 char *end; 2174 char *str_fld[8]; 2175 uint16_t i; 2176 uint16_t num = (nb_entries + RTE_RETA_GROUP_SIZE - 1) / 2177 RTE_RETA_GROUP_SIZE; 2178 int ret; 2179 2180 p = strchr(p0, '('); 2181 if (p == NULL) 2182 return -1; 2183 p++; 2184 p0 = strchr(p, ')'); 2185 if (p0 == NULL) 2186 return -1; 2187 size = p0 - p; 2188 if (size >= sizeof(s)) { 2189 printf("The string size exceeds the internal buffer size\n"); 2190 return -1; 2191 } 2192 snprintf(s, sizeof(s), "%.*s", size, p); 2193 ret = rte_strsplit(s, sizeof(s), str_fld, num, ','); 2194 if (ret <= 0 || ret != num) { 2195 printf("The bits of masks do not match the number of " 2196 "reta entries: %u\n", num); 2197 return -1; 2198 } 2199 for (i = 0; i < ret; i++) 2200 conf[i].mask = (uint64_t)strtoul(str_fld[i], &end, 0); 2201 2202 return 0; 2203 } 2204 2205 static void 2206 cmd_showport_reta_parsed(void *parsed_result, 2207 __attribute__((unused)) struct cmdline *cl, 2208 __attribute__((unused)) void *data) 2209 { 2210 struct cmd_showport_reta *res = parsed_result; 2211 struct rte_eth_rss_reta_entry64 reta_conf[8]; 2212 struct rte_eth_dev_info dev_info; 2213 uint16_t max_reta_size; 2214 2215 memset(&dev_info, 0, sizeof(dev_info)); 2216 rte_eth_dev_info_get(res->port_id, &dev_info); 2217 max_reta_size = RTE_MIN(dev_info.reta_size, ETH_RSS_RETA_SIZE_512); 2218 if (res->size == 0 || res->size > max_reta_size) { 2219 printf("Invalid redirection table size: %u (1-%u)\n", 2220 res->size, max_reta_size); 2221 return; 2222 } 2223 2224 memset(reta_conf, 0, sizeof(reta_conf)); 2225 if (showport_parse_reta_config(reta_conf, res->size, 2226 res->list_of_items) < 0) { 2227 printf("Invalid string: %s for reta masks\n", 2228 res->list_of_items); 2229 return; 2230 } 2231 port_rss_reta_info(res->port_id, reta_conf, res->size); 2232 } 2233 2234 cmdline_parse_token_string_t cmd_showport_reta_show = 2235 TOKEN_STRING_INITIALIZER(struct cmd_showport_reta, show, "show"); 2236 cmdline_parse_token_string_t cmd_showport_reta_port = 2237 TOKEN_STRING_INITIALIZER(struct cmd_showport_reta, port, "port"); 2238 cmdline_parse_token_num_t cmd_showport_reta_port_id = 2239 TOKEN_NUM_INITIALIZER(struct cmd_showport_reta, port_id, UINT8); 2240 cmdline_parse_token_string_t cmd_showport_reta_rss = 2241 TOKEN_STRING_INITIALIZER(struct cmd_showport_reta, rss, "rss"); 2242 cmdline_parse_token_string_t cmd_showport_reta_reta = 2243 TOKEN_STRING_INITIALIZER(struct cmd_showport_reta, reta, "reta"); 2244 cmdline_parse_token_num_t cmd_showport_reta_size = 2245 TOKEN_NUM_INITIALIZER(struct cmd_showport_reta, size, UINT16); 2246 cmdline_parse_token_string_t cmd_showport_reta_list_of_items = 2247 TOKEN_STRING_INITIALIZER(struct cmd_showport_reta, 2248 list_of_items, NULL); 2249 2250 cmdline_parse_inst_t cmd_showport_reta = { 2251 .f = cmd_showport_reta_parsed, 2252 .data = NULL, 2253 .help_str = "show port <port_id> rss reta <size> <mask0[,mask1]*>", 2254 .tokens = { 2255 (void *)&cmd_showport_reta_show, 2256 (void *)&cmd_showport_reta_port, 2257 (void *)&cmd_showport_reta_port_id, 2258 (void *)&cmd_showport_reta_rss, 2259 (void *)&cmd_showport_reta_reta, 2260 (void *)&cmd_showport_reta_size, 2261 (void *)&cmd_showport_reta_list_of_items, 2262 NULL, 2263 }, 2264 }; 2265 2266 /* *** Show RSS hash configuration *** */ 2267 struct cmd_showport_rss_hash { 2268 cmdline_fixed_string_t show; 2269 cmdline_fixed_string_t port; 2270 uint8_t port_id; 2271 cmdline_fixed_string_t rss_hash; 2272 cmdline_fixed_string_t rss_type; 2273 cmdline_fixed_string_t key; /* optional argument */ 2274 }; 2275 2276 static void cmd_showport_rss_hash_parsed(void *parsed_result, 2277 __attribute__((unused)) struct cmdline *cl, 2278 void *show_rss_key) 2279 { 2280 struct cmd_showport_rss_hash *res = parsed_result; 2281 2282 port_rss_hash_conf_show(res->port_id, res->rss_type, 2283 show_rss_key != NULL); 2284 } 2285 2286 cmdline_parse_token_string_t cmd_showport_rss_hash_show = 2287 TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, show, "show"); 2288 cmdline_parse_token_string_t cmd_showport_rss_hash_port = 2289 TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, port, "port"); 2290 cmdline_parse_token_num_t cmd_showport_rss_hash_port_id = 2291 TOKEN_NUM_INITIALIZER(struct cmd_showport_rss_hash, port_id, UINT8); 2292 cmdline_parse_token_string_t cmd_showport_rss_hash_rss_hash = 2293 TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, rss_hash, 2294 "rss-hash"); 2295 cmdline_parse_token_string_t cmd_showport_rss_hash_rss_hash_info = 2296 TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, rss_type, 2297 "ipv4#ipv4-frag#ipv4-tcp#ipv4-udp#ipv4-sctp#" 2298 "ipv4-other#ipv6#ipv6-frag#ipv6-tcp#ipv6-udp#" 2299 "ipv6-sctp#ipv6-other#l2-payload#ipv6-ex#" 2300 "ipv6-tcp-ex#ipv6-udp-ex"); 2301 cmdline_parse_token_string_t cmd_showport_rss_hash_rss_key = 2302 TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, key, "key"); 2303 2304 cmdline_parse_inst_t cmd_showport_rss_hash = { 2305 .f = cmd_showport_rss_hash_parsed, 2306 .data = NULL, 2307 .help_str = "show port <port_id> rss-hash " 2308 "ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|" 2309 "ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|" 2310 "l2-payload|ipv6-ex|ipv6-tcp-ex|ipv6-udp-ex", 2311 .tokens = { 2312 (void *)&cmd_showport_rss_hash_show, 2313 (void *)&cmd_showport_rss_hash_port, 2314 (void *)&cmd_showport_rss_hash_port_id, 2315 (void *)&cmd_showport_rss_hash_rss_hash, 2316 (void *)&cmd_showport_rss_hash_rss_hash_info, 2317 NULL, 2318 }, 2319 }; 2320 2321 cmdline_parse_inst_t cmd_showport_rss_hash_key = { 2322 .f = cmd_showport_rss_hash_parsed, 2323 .data = (void *)1, 2324 .help_str = "show port <port_id> rss-hash " 2325 "ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|" 2326 "ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|" 2327 "l2-payload|ipv6-ex|ipv6-tcp-ex|ipv6-udp-ex key", 2328 .tokens = { 2329 (void *)&cmd_showport_rss_hash_show, 2330 (void *)&cmd_showport_rss_hash_port, 2331 (void *)&cmd_showport_rss_hash_port_id, 2332 (void *)&cmd_showport_rss_hash_rss_hash, 2333 (void *)&cmd_showport_rss_hash_rss_hash_info, 2334 (void *)&cmd_showport_rss_hash_rss_key, 2335 NULL, 2336 }, 2337 }; 2338 2339 /* *** Configure DCB *** */ 2340 struct cmd_config_dcb { 2341 cmdline_fixed_string_t port; 2342 cmdline_fixed_string_t config; 2343 uint8_t port_id; 2344 cmdline_fixed_string_t dcb; 2345 cmdline_fixed_string_t vt; 2346 cmdline_fixed_string_t vt_en; 2347 uint8_t num_tcs; 2348 cmdline_fixed_string_t pfc; 2349 cmdline_fixed_string_t pfc_en; 2350 }; 2351 2352 static void 2353 cmd_config_dcb_parsed(void *parsed_result, 2354 __attribute__((unused)) struct cmdline *cl, 2355 __attribute__((unused)) void *data) 2356 { 2357 struct cmd_config_dcb *res = parsed_result; 2358 portid_t port_id = res->port_id; 2359 struct rte_port *port; 2360 uint8_t pfc_en; 2361 int ret; 2362 2363 port = &ports[port_id]; 2364 /** Check if the port is not started **/ 2365 if (port->port_status != RTE_PORT_STOPPED) { 2366 printf("Please stop port %d first\n", port_id); 2367 return; 2368 } 2369 2370 if ((res->num_tcs != ETH_4_TCS) && (res->num_tcs != ETH_8_TCS)) { 2371 printf("The invalid number of traffic class," 2372 " only 4 or 8 allowed.\n"); 2373 return; 2374 } 2375 2376 if (nb_fwd_lcores < res->num_tcs) { 2377 printf("nb_cores shouldn't be less than number of TCs.\n"); 2378 return; 2379 } 2380 if (!strncmp(res->pfc_en, "on", 2)) 2381 pfc_en = 1; 2382 else 2383 pfc_en = 0; 2384 2385 /* DCB in VT mode */ 2386 if (!strncmp(res->vt_en, "on", 2)) 2387 ret = init_port_dcb_config(port_id, DCB_VT_ENABLED, 2388 (enum rte_eth_nb_tcs)res->num_tcs, 2389 pfc_en); 2390 else 2391 ret = init_port_dcb_config(port_id, DCB_ENABLED, 2392 (enum rte_eth_nb_tcs)res->num_tcs, 2393 pfc_en); 2394 2395 2396 if (ret != 0) { 2397 printf("Cannot initialize network ports.\n"); 2398 return; 2399 } 2400 2401 cmd_reconfig_device_queue(port_id, 1, 1); 2402 } 2403 2404 cmdline_parse_token_string_t cmd_config_dcb_port = 2405 TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, port, "port"); 2406 cmdline_parse_token_string_t cmd_config_dcb_config = 2407 TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, config, "config"); 2408 cmdline_parse_token_num_t cmd_config_dcb_port_id = 2409 TOKEN_NUM_INITIALIZER(struct cmd_config_dcb, port_id, UINT8); 2410 cmdline_parse_token_string_t cmd_config_dcb_dcb = 2411 TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, dcb, "dcb"); 2412 cmdline_parse_token_string_t cmd_config_dcb_vt = 2413 TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, vt, "vt"); 2414 cmdline_parse_token_string_t cmd_config_dcb_vt_en = 2415 TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, vt_en, "on#off"); 2416 cmdline_parse_token_num_t cmd_config_dcb_num_tcs = 2417 TOKEN_NUM_INITIALIZER(struct cmd_config_dcb, num_tcs, UINT8); 2418 cmdline_parse_token_string_t cmd_config_dcb_pfc= 2419 TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, pfc, "pfc"); 2420 cmdline_parse_token_string_t cmd_config_dcb_pfc_en = 2421 TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, pfc_en, "on#off"); 2422 2423 cmdline_parse_inst_t cmd_config_dcb = { 2424 .f = cmd_config_dcb_parsed, 2425 .data = NULL, 2426 .help_str = "port config <port-id> dcb vt on|off <num_tcs> pfc on|off", 2427 .tokens = { 2428 (void *)&cmd_config_dcb_port, 2429 (void *)&cmd_config_dcb_config, 2430 (void *)&cmd_config_dcb_port_id, 2431 (void *)&cmd_config_dcb_dcb, 2432 (void *)&cmd_config_dcb_vt, 2433 (void *)&cmd_config_dcb_vt_en, 2434 (void *)&cmd_config_dcb_num_tcs, 2435 (void *)&cmd_config_dcb_pfc, 2436 (void *)&cmd_config_dcb_pfc_en, 2437 NULL, 2438 }, 2439 }; 2440 2441 /* *** configure number of packets per burst *** */ 2442 struct cmd_config_burst { 2443 cmdline_fixed_string_t port; 2444 cmdline_fixed_string_t keyword; 2445 cmdline_fixed_string_t all; 2446 cmdline_fixed_string_t name; 2447 uint16_t value; 2448 }; 2449 2450 static void 2451 cmd_config_burst_parsed(void *parsed_result, 2452 __attribute__((unused)) struct cmdline *cl, 2453 __attribute__((unused)) void *data) 2454 { 2455 struct cmd_config_burst *res = parsed_result; 2456 2457 if (!all_ports_stopped()) { 2458 printf("Please stop all ports first\n"); 2459 return; 2460 } 2461 2462 if (!strcmp(res->name, "burst")) { 2463 if (res->value < 1 || res->value > MAX_PKT_BURST) { 2464 printf("burst must be >= 1 && <= %d\n", MAX_PKT_BURST); 2465 return; 2466 } 2467 nb_pkt_per_burst = res->value; 2468 } else { 2469 printf("Unknown parameter\n"); 2470 return; 2471 } 2472 2473 init_port_config(); 2474 2475 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 2476 } 2477 2478 cmdline_parse_token_string_t cmd_config_burst_port = 2479 TOKEN_STRING_INITIALIZER(struct cmd_config_burst, port, "port"); 2480 cmdline_parse_token_string_t cmd_config_burst_keyword = 2481 TOKEN_STRING_INITIALIZER(struct cmd_config_burst, keyword, "config"); 2482 cmdline_parse_token_string_t cmd_config_burst_all = 2483 TOKEN_STRING_INITIALIZER(struct cmd_config_burst, all, "all"); 2484 cmdline_parse_token_string_t cmd_config_burst_name = 2485 TOKEN_STRING_INITIALIZER(struct cmd_config_burst, name, "burst"); 2486 cmdline_parse_token_num_t cmd_config_burst_value = 2487 TOKEN_NUM_INITIALIZER(struct cmd_config_burst, value, UINT16); 2488 2489 cmdline_parse_inst_t cmd_config_burst = { 2490 .f = cmd_config_burst_parsed, 2491 .data = NULL, 2492 .help_str = "port config all burst <value>", 2493 .tokens = { 2494 (void *)&cmd_config_burst_port, 2495 (void *)&cmd_config_burst_keyword, 2496 (void *)&cmd_config_burst_all, 2497 (void *)&cmd_config_burst_name, 2498 (void *)&cmd_config_burst_value, 2499 NULL, 2500 }, 2501 }; 2502 2503 /* *** configure rx/tx queues *** */ 2504 struct cmd_config_thresh { 2505 cmdline_fixed_string_t port; 2506 cmdline_fixed_string_t keyword; 2507 cmdline_fixed_string_t all; 2508 cmdline_fixed_string_t name; 2509 uint8_t value; 2510 }; 2511 2512 static void 2513 cmd_config_thresh_parsed(void *parsed_result, 2514 __attribute__((unused)) struct cmdline *cl, 2515 __attribute__((unused)) void *data) 2516 { 2517 struct cmd_config_thresh *res = parsed_result; 2518 2519 if (!all_ports_stopped()) { 2520 printf("Please stop all ports first\n"); 2521 return; 2522 } 2523 2524 if (!strcmp(res->name, "txpt")) 2525 tx_pthresh = res->value; 2526 else if(!strcmp(res->name, "txht")) 2527 tx_hthresh = res->value; 2528 else if(!strcmp(res->name, "txwt")) 2529 tx_wthresh = res->value; 2530 else if(!strcmp(res->name, "rxpt")) 2531 rx_pthresh = res->value; 2532 else if(!strcmp(res->name, "rxht")) 2533 rx_hthresh = res->value; 2534 else if(!strcmp(res->name, "rxwt")) 2535 rx_wthresh = res->value; 2536 else { 2537 printf("Unknown parameter\n"); 2538 return; 2539 } 2540 2541 init_port_config(); 2542 2543 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 2544 } 2545 2546 cmdline_parse_token_string_t cmd_config_thresh_port = 2547 TOKEN_STRING_INITIALIZER(struct cmd_config_thresh, port, "port"); 2548 cmdline_parse_token_string_t cmd_config_thresh_keyword = 2549 TOKEN_STRING_INITIALIZER(struct cmd_config_thresh, keyword, "config"); 2550 cmdline_parse_token_string_t cmd_config_thresh_all = 2551 TOKEN_STRING_INITIALIZER(struct cmd_config_thresh, all, "all"); 2552 cmdline_parse_token_string_t cmd_config_thresh_name = 2553 TOKEN_STRING_INITIALIZER(struct cmd_config_thresh, name, 2554 "txpt#txht#txwt#rxpt#rxht#rxwt"); 2555 cmdline_parse_token_num_t cmd_config_thresh_value = 2556 TOKEN_NUM_INITIALIZER(struct cmd_config_thresh, value, UINT8); 2557 2558 cmdline_parse_inst_t cmd_config_thresh = { 2559 .f = cmd_config_thresh_parsed, 2560 .data = NULL, 2561 .help_str = "port config all txpt|txht|txwt|rxpt|rxht|rxwt <value>", 2562 .tokens = { 2563 (void *)&cmd_config_thresh_port, 2564 (void *)&cmd_config_thresh_keyword, 2565 (void *)&cmd_config_thresh_all, 2566 (void *)&cmd_config_thresh_name, 2567 (void *)&cmd_config_thresh_value, 2568 NULL, 2569 }, 2570 }; 2571 2572 /* *** configure free/rs threshold *** */ 2573 struct cmd_config_threshold { 2574 cmdline_fixed_string_t port; 2575 cmdline_fixed_string_t keyword; 2576 cmdline_fixed_string_t all; 2577 cmdline_fixed_string_t name; 2578 uint16_t value; 2579 }; 2580 2581 static void 2582 cmd_config_threshold_parsed(void *parsed_result, 2583 __attribute__((unused)) struct cmdline *cl, 2584 __attribute__((unused)) void *data) 2585 { 2586 struct cmd_config_threshold *res = parsed_result; 2587 2588 if (!all_ports_stopped()) { 2589 printf("Please stop all ports first\n"); 2590 return; 2591 } 2592 2593 if (!strcmp(res->name, "txfreet")) 2594 tx_free_thresh = res->value; 2595 else if (!strcmp(res->name, "txrst")) 2596 tx_rs_thresh = res->value; 2597 else if (!strcmp(res->name, "rxfreet")) 2598 rx_free_thresh = res->value; 2599 else { 2600 printf("Unknown parameter\n"); 2601 return; 2602 } 2603 2604 init_port_config(); 2605 2606 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 2607 } 2608 2609 cmdline_parse_token_string_t cmd_config_threshold_port = 2610 TOKEN_STRING_INITIALIZER(struct cmd_config_threshold, port, "port"); 2611 cmdline_parse_token_string_t cmd_config_threshold_keyword = 2612 TOKEN_STRING_INITIALIZER(struct cmd_config_threshold, keyword, 2613 "config"); 2614 cmdline_parse_token_string_t cmd_config_threshold_all = 2615 TOKEN_STRING_INITIALIZER(struct cmd_config_threshold, all, "all"); 2616 cmdline_parse_token_string_t cmd_config_threshold_name = 2617 TOKEN_STRING_INITIALIZER(struct cmd_config_threshold, name, 2618 "txfreet#txrst#rxfreet"); 2619 cmdline_parse_token_num_t cmd_config_threshold_value = 2620 TOKEN_NUM_INITIALIZER(struct cmd_config_threshold, value, UINT16); 2621 2622 cmdline_parse_inst_t cmd_config_threshold = { 2623 .f = cmd_config_threshold_parsed, 2624 .data = NULL, 2625 .help_str = "port config all txfreet|txrst|rxfreet <value>", 2626 .tokens = { 2627 (void *)&cmd_config_threshold_port, 2628 (void *)&cmd_config_threshold_keyword, 2629 (void *)&cmd_config_threshold_all, 2630 (void *)&cmd_config_threshold_name, 2631 (void *)&cmd_config_threshold_value, 2632 NULL, 2633 }, 2634 }; 2635 2636 /* *** stop *** */ 2637 struct cmd_stop_result { 2638 cmdline_fixed_string_t stop; 2639 }; 2640 2641 static void cmd_stop_parsed(__attribute__((unused)) void *parsed_result, 2642 __attribute__((unused)) struct cmdline *cl, 2643 __attribute__((unused)) void *data) 2644 { 2645 stop_packet_forwarding(); 2646 } 2647 2648 cmdline_parse_token_string_t cmd_stop_stop = 2649 TOKEN_STRING_INITIALIZER(struct cmd_stop_result, stop, "stop"); 2650 2651 cmdline_parse_inst_t cmd_stop = { 2652 .f = cmd_stop_parsed, 2653 .data = NULL, 2654 .help_str = "stop: Stop packet forwarding", 2655 .tokens = { 2656 (void *)&cmd_stop_stop, 2657 NULL, 2658 }, 2659 }; 2660 2661 /* *** SET CORELIST and PORTLIST CONFIGURATION *** */ 2662 2663 unsigned int 2664 parse_item_list(char* str, const char* item_name, unsigned int max_items, 2665 unsigned int *parsed_items, int check_unique_values) 2666 { 2667 unsigned int nb_item; 2668 unsigned int value; 2669 unsigned int i; 2670 unsigned int j; 2671 int value_ok; 2672 char c; 2673 2674 /* 2675 * First parse all items in the list and store their value. 2676 */ 2677 value = 0; 2678 nb_item = 0; 2679 value_ok = 0; 2680 for (i = 0; i < strnlen(str, STR_TOKEN_SIZE); i++) { 2681 c = str[i]; 2682 if ((c >= '0') && (c <= '9')) { 2683 value = (unsigned int) (value * 10 + (c - '0')); 2684 value_ok = 1; 2685 continue; 2686 } 2687 if (c != ',') { 2688 printf("character %c is not a decimal digit\n", c); 2689 return 0; 2690 } 2691 if (! value_ok) { 2692 printf("No valid value before comma\n"); 2693 return 0; 2694 } 2695 if (nb_item < max_items) { 2696 parsed_items[nb_item] = value; 2697 value_ok = 0; 2698 value = 0; 2699 } 2700 nb_item++; 2701 } 2702 if (nb_item >= max_items) { 2703 printf("Number of %s = %u > %u (maximum items)\n", 2704 item_name, nb_item + 1, max_items); 2705 return 0; 2706 } 2707 parsed_items[nb_item++] = value; 2708 if (! check_unique_values) 2709 return nb_item; 2710 2711 /* 2712 * Then, check that all values in the list are differents. 2713 * No optimization here... 2714 */ 2715 for (i = 0; i < nb_item; i++) { 2716 for (j = i + 1; j < nb_item; j++) { 2717 if (parsed_items[j] == parsed_items[i]) { 2718 printf("duplicated %s %u at index %u and %u\n", 2719 item_name, parsed_items[i], i, j); 2720 return 0; 2721 } 2722 } 2723 } 2724 return nb_item; 2725 } 2726 2727 struct cmd_set_list_result { 2728 cmdline_fixed_string_t cmd_keyword; 2729 cmdline_fixed_string_t list_name; 2730 cmdline_fixed_string_t list_of_items; 2731 }; 2732 2733 static void cmd_set_list_parsed(void *parsed_result, 2734 __attribute__((unused)) struct cmdline *cl, 2735 __attribute__((unused)) void *data) 2736 { 2737 struct cmd_set_list_result *res; 2738 union { 2739 unsigned int lcorelist[RTE_MAX_LCORE]; 2740 unsigned int portlist[RTE_MAX_ETHPORTS]; 2741 } parsed_items; 2742 unsigned int nb_item; 2743 2744 if (test_done == 0) { 2745 printf("Please stop forwarding first\n"); 2746 return; 2747 } 2748 2749 res = parsed_result; 2750 if (!strcmp(res->list_name, "corelist")) { 2751 nb_item = parse_item_list(res->list_of_items, "core", 2752 RTE_MAX_LCORE, 2753 parsed_items.lcorelist, 1); 2754 if (nb_item > 0) { 2755 set_fwd_lcores_list(parsed_items.lcorelist, nb_item); 2756 fwd_config_setup(); 2757 } 2758 return; 2759 } 2760 if (!strcmp(res->list_name, "portlist")) { 2761 nb_item = parse_item_list(res->list_of_items, "port", 2762 RTE_MAX_ETHPORTS, 2763 parsed_items.portlist, 1); 2764 if (nb_item > 0) { 2765 set_fwd_ports_list(parsed_items.portlist, nb_item); 2766 fwd_config_setup(); 2767 } 2768 } 2769 } 2770 2771 cmdline_parse_token_string_t cmd_set_list_keyword = 2772 TOKEN_STRING_INITIALIZER(struct cmd_set_list_result, cmd_keyword, 2773 "set"); 2774 cmdline_parse_token_string_t cmd_set_list_name = 2775 TOKEN_STRING_INITIALIZER(struct cmd_set_list_result, list_name, 2776 "corelist#portlist"); 2777 cmdline_parse_token_string_t cmd_set_list_of_items = 2778 TOKEN_STRING_INITIALIZER(struct cmd_set_list_result, list_of_items, 2779 NULL); 2780 2781 cmdline_parse_inst_t cmd_set_fwd_list = { 2782 .f = cmd_set_list_parsed, 2783 .data = NULL, 2784 .help_str = "set corelist|portlist <list0[,list1]*>", 2785 .tokens = { 2786 (void *)&cmd_set_list_keyword, 2787 (void *)&cmd_set_list_name, 2788 (void *)&cmd_set_list_of_items, 2789 NULL, 2790 }, 2791 }; 2792 2793 /* *** SET COREMASK and PORTMASK CONFIGURATION *** */ 2794 2795 struct cmd_setmask_result { 2796 cmdline_fixed_string_t set; 2797 cmdline_fixed_string_t mask; 2798 uint64_t hexavalue; 2799 }; 2800 2801 static void cmd_set_mask_parsed(void *parsed_result, 2802 __attribute__((unused)) struct cmdline *cl, 2803 __attribute__((unused)) void *data) 2804 { 2805 struct cmd_setmask_result *res = parsed_result; 2806 2807 if (test_done == 0) { 2808 printf("Please stop forwarding first\n"); 2809 return; 2810 } 2811 if (!strcmp(res->mask, "coremask")) { 2812 set_fwd_lcores_mask(res->hexavalue); 2813 fwd_config_setup(); 2814 } else if (!strcmp(res->mask, "portmask")) { 2815 set_fwd_ports_mask(res->hexavalue); 2816 fwd_config_setup(); 2817 } 2818 } 2819 2820 cmdline_parse_token_string_t cmd_setmask_set = 2821 TOKEN_STRING_INITIALIZER(struct cmd_setmask_result, set, "set"); 2822 cmdline_parse_token_string_t cmd_setmask_mask = 2823 TOKEN_STRING_INITIALIZER(struct cmd_setmask_result, mask, 2824 "coremask#portmask"); 2825 cmdline_parse_token_num_t cmd_setmask_value = 2826 TOKEN_NUM_INITIALIZER(struct cmd_setmask_result, hexavalue, UINT64); 2827 2828 cmdline_parse_inst_t cmd_set_fwd_mask = { 2829 .f = cmd_set_mask_parsed, 2830 .data = NULL, 2831 .help_str = "set coremask|portmask <hexadecimal value>", 2832 .tokens = { 2833 (void *)&cmd_setmask_set, 2834 (void *)&cmd_setmask_mask, 2835 (void *)&cmd_setmask_value, 2836 NULL, 2837 }, 2838 }; 2839 2840 /* 2841 * SET NBPORT, NBCORE, PACKET BURST, and VERBOSE LEVEL CONFIGURATION 2842 */ 2843 struct cmd_set_result { 2844 cmdline_fixed_string_t set; 2845 cmdline_fixed_string_t what; 2846 uint16_t value; 2847 }; 2848 2849 static void cmd_set_parsed(void *parsed_result, 2850 __attribute__((unused)) struct cmdline *cl, 2851 __attribute__((unused)) void *data) 2852 { 2853 struct cmd_set_result *res = parsed_result; 2854 if (!strcmp(res->what, "nbport")) { 2855 set_fwd_ports_number(res->value); 2856 fwd_config_setup(); 2857 } else if (!strcmp(res->what, "nbcore")) { 2858 set_fwd_lcores_number(res->value); 2859 fwd_config_setup(); 2860 } else if (!strcmp(res->what, "burst")) 2861 set_nb_pkt_per_burst(res->value); 2862 else if (!strcmp(res->what, "verbose")) 2863 set_verbose_level(res->value); 2864 } 2865 2866 cmdline_parse_token_string_t cmd_set_set = 2867 TOKEN_STRING_INITIALIZER(struct cmd_set_result, set, "set"); 2868 cmdline_parse_token_string_t cmd_set_what = 2869 TOKEN_STRING_INITIALIZER(struct cmd_set_result, what, 2870 "nbport#nbcore#burst#verbose"); 2871 cmdline_parse_token_num_t cmd_set_value = 2872 TOKEN_NUM_INITIALIZER(struct cmd_set_result, value, UINT16); 2873 2874 cmdline_parse_inst_t cmd_set_numbers = { 2875 .f = cmd_set_parsed, 2876 .data = NULL, 2877 .help_str = "set nbport|nbcore|burst|verbose <value>", 2878 .tokens = { 2879 (void *)&cmd_set_set, 2880 (void *)&cmd_set_what, 2881 (void *)&cmd_set_value, 2882 NULL, 2883 }, 2884 }; 2885 2886 /* *** SET SEGMENT LENGTHS OF TXONLY PACKETS *** */ 2887 2888 struct cmd_set_txpkts_result { 2889 cmdline_fixed_string_t cmd_keyword; 2890 cmdline_fixed_string_t txpkts; 2891 cmdline_fixed_string_t seg_lengths; 2892 }; 2893 2894 static void 2895 cmd_set_txpkts_parsed(void *parsed_result, 2896 __attribute__((unused)) struct cmdline *cl, 2897 __attribute__((unused)) void *data) 2898 { 2899 struct cmd_set_txpkts_result *res; 2900 unsigned seg_lengths[RTE_MAX_SEGS_PER_PKT]; 2901 unsigned int nb_segs; 2902 2903 res = parsed_result; 2904 nb_segs = parse_item_list(res->seg_lengths, "segment lengths", 2905 RTE_MAX_SEGS_PER_PKT, seg_lengths, 0); 2906 if (nb_segs > 0) 2907 set_tx_pkt_segments(seg_lengths, nb_segs); 2908 } 2909 2910 cmdline_parse_token_string_t cmd_set_txpkts_keyword = 2911 TOKEN_STRING_INITIALIZER(struct cmd_set_txpkts_result, 2912 cmd_keyword, "set"); 2913 cmdline_parse_token_string_t cmd_set_txpkts_name = 2914 TOKEN_STRING_INITIALIZER(struct cmd_set_txpkts_result, 2915 txpkts, "txpkts"); 2916 cmdline_parse_token_string_t cmd_set_txpkts_lengths = 2917 TOKEN_STRING_INITIALIZER(struct cmd_set_txpkts_result, 2918 seg_lengths, NULL); 2919 2920 cmdline_parse_inst_t cmd_set_txpkts = { 2921 .f = cmd_set_txpkts_parsed, 2922 .data = NULL, 2923 .help_str = "set txpkts <len0[,len1]*>", 2924 .tokens = { 2925 (void *)&cmd_set_txpkts_keyword, 2926 (void *)&cmd_set_txpkts_name, 2927 (void *)&cmd_set_txpkts_lengths, 2928 NULL, 2929 }, 2930 }; 2931 2932 /* *** SET COPY AND SPLIT POLICY ON TX PACKETS *** */ 2933 2934 struct cmd_set_txsplit_result { 2935 cmdline_fixed_string_t cmd_keyword; 2936 cmdline_fixed_string_t txsplit; 2937 cmdline_fixed_string_t mode; 2938 }; 2939 2940 static void 2941 cmd_set_txsplit_parsed(void *parsed_result, 2942 __attribute__((unused)) struct cmdline *cl, 2943 __attribute__((unused)) void *data) 2944 { 2945 struct cmd_set_txsplit_result *res; 2946 2947 res = parsed_result; 2948 set_tx_pkt_split(res->mode); 2949 } 2950 2951 cmdline_parse_token_string_t cmd_set_txsplit_keyword = 2952 TOKEN_STRING_INITIALIZER(struct cmd_set_txsplit_result, 2953 cmd_keyword, "set"); 2954 cmdline_parse_token_string_t cmd_set_txsplit_name = 2955 TOKEN_STRING_INITIALIZER(struct cmd_set_txsplit_result, 2956 txsplit, "txsplit"); 2957 cmdline_parse_token_string_t cmd_set_txsplit_mode = 2958 TOKEN_STRING_INITIALIZER(struct cmd_set_txsplit_result, 2959 mode, NULL); 2960 2961 cmdline_parse_inst_t cmd_set_txsplit = { 2962 .f = cmd_set_txsplit_parsed, 2963 .data = NULL, 2964 .help_str = "set txsplit on|off|rand", 2965 .tokens = { 2966 (void *)&cmd_set_txsplit_keyword, 2967 (void *)&cmd_set_txsplit_name, 2968 (void *)&cmd_set_txsplit_mode, 2969 NULL, 2970 }, 2971 }; 2972 2973 /* *** CONFIG TX QUEUE FLAGS *** */ 2974 2975 struct cmd_config_txqflags_result { 2976 cmdline_fixed_string_t port; 2977 cmdline_fixed_string_t config; 2978 cmdline_fixed_string_t all; 2979 cmdline_fixed_string_t what; 2980 int32_t hexvalue; 2981 }; 2982 2983 static void cmd_config_txqflags_parsed(void *parsed_result, 2984 __attribute__((unused)) struct cmdline *cl, 2985 __attribute__((unused)) void *data) 2986 { 2987 struct cmd_config_txqflags_result *res = parsed_result; 2988 2989 if (!all_ports_stopped()) { 2990 printf("Please stop all ports first\n"); 2991 return; 2992 } 2993 2994 if (strcmp(res->what, "txqflags")) { 2995 printf("Unknown parameter\n"); 2996 return; 2997 } 2998 2999 if (res->hexvalue >= 0) { 3000 txq_flags = res->hexvalue; 3001 } else { 3002 printf("txqflags must be >= 0\n"); 3003 return; 3004 } 3005 3006 init_port_config(); 3007 3008 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 3009 } 3010 3011 cmdline_parse_token_string_t cmd_config_txqflags_port = 3012 TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, port, 3013 "port"); 3014 cmdline_parse_token_string_t cmd_config_txqflags_config = 3015 TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, config, 3016 "config"); 3017 cmdline_parse_token_string_t cmd_config_txqflags_all = 3018 TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, all, 3019 "all"); 3020 cmdline_parse_token_string_t cmd_config_txqflags_what = 3021 TOKEN_STRING_INITIALIZER(struct cmd_config_txqflags_result, what, 3022 "txqflags"); 3023 cmdline_parse_token_num_t cmd_config_txqflags_value = 3024 TOKEN_NUM_INITIALIZER(struct cmd_config_txqflags_result, 3025 hexvalue, INT32); 3026 3027 cmdline_parse_inst_t cmd_config_txqflags = { 3028 .f = cmd_config_txqflags_parsed, 3029 .data = NULL, 3030 .help_str = "port config all txqflags <value>", 3031 .tokens = { 3032 (void *)&cmd_config_txqflags_port, 3033 (void *)&cmd_config_txqflags_config, 3034 (void *)&cmd_config_txqflags_all, 3035 (void *)&cmd_config_txqflags_what, 3036 (void *)&cmd_config_txqflags_value, 3037 NULL, 3038 }, 3039 }; 3040 3041 /* *** ADD/REMOVE ALL VLAN IDENTIFIERS TO/FROM A PORT VLAN RX FILTER *** */ 3042 struct cmd_rx_vlan_filter_all_result { 3043 cmdline_fixed_string_t rx_vlan; 3044 cmdline_fixed_string_t what; 3045 cmdline_fixed_string_t all; 3046 uint8_t port_id; 3047 }; 3048 3049 static void 3050 cmd_rx_vlan_filter_all_parsed(void *parsed_result, 3051 __attribute__((unused)) struct cmdline *cl, 3052 __attribute__((unused)) void *data) 3053 { 3054 struct cmd_rx_vlan_filter_all_result *res = parsed_result; 3055 3056 if (!strcmp(res->what, "add")) 3057 rx_vlan_all_filter_set(res->port_id, 1); 3058 else 3059 rx_vlan_all_filter_set(res->port_id, 0); 3060 } 3061 3062 cmdline_parse_token_string_t cmd_rx_vlan_filter_all_rx_vlan = 3063 TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_all_result, 3064 rx_vlan, "rx_vlan"); 3065 cmdline_parse_token_string_t cmd_rx_vlan_filter_all_what = 3066 TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_all_result, 3067 what, "add#rm"); 3068 cmdline_parse_token_string_t cmd_rx_vlan_filter_all_all = 3069 TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_all_result, 3070 all, "all"); 3071 cmdline_parse_token_num_t cmd_rx_vlan_filter_all_portid = 3072 TOKEN_NUM_INITIALIZER(struct cmd_rx_vlan_filter_all_result, 3073 port_id, UINT8); 3074 3075 cmdline_parse_inst_t cmd_rx_vlan_filter_all = { 3076 .f = cmd_rx_vlan_filter_all_parsed, 3077 .data = NULL, 3078 .help_str = "rx_vlan add|rm all <port_id>: " 3079 "Add/Remove all identifiers to/from the set of VLAN " 3080 "identifiers filtered by a port", 3081 .tokens = { 3082 (void *)&cmd_rx_vlan_filter_all_rx_vlan, 3083 (void *)&cmd_rx_vlan_filter_all_what, 3084 (void *)&cmd_rx_vlan_filter_all_all, 3085 (void *)&cmd_rx_vlan_filter_all_portid, 3086 NULL, 3087 }, 3088 }; 3089 3090 /* *** VLAN OFFLOAD SET ON A PORT *** */ 3091 struct cmd_vlan_offload_result { 3092 cmdline_fixed_string_t vlan; 3093 cmdline_fixed_string_t set; 3094 cmdline_fixed_string_t vlan_type; 3095 cmdline_fixed_string_t what; 3096 cmdline_fixed_string_t on; 3097 cmdline_fixed_string_t port_id; 3098 }; 3099 3100 static void 3101 cmd_vlan_offload_parsed(void *parsed_result, 3102 __attribute__((unused)) struct cmdline *cl, 3103 __attribute__((unused)) void *data) 3104 { 3105 int on; 3106 struct cmd_vlan_offload_result *res = parsed_result; 3107 char *str; 3108 int i, len = 0; 3109 portid_t port_id = 0; 3110 unsigned int tmp; 3111 3112 str = res->port_id; 3113 len = strnlen(str, STR_TOKEN_SIZE); 3114 i = 0; 3115 /* Get port_id first */ 3116 while(i < len){ 3117 if(str[i] == ',') 3118 break; 3119 3120 i++; 3121 } 3122 str[i]='\0'; 3123 tmp = strtoul(str, NULL, 0); 3124 /* If port_id greater that what portid_t can represent, return */ 3125 if(tmp >= RTE_MAX_ETHPORTS) 3126 return; 3127 port_id = (portid_t)tmp; 3128 3129 if (!strcmp(res->on, "on")) 3130 on = 1; 3131 else 3132 on = 0; 3133 3134 if (!strcmp(res->what, "strip")) 3135 rx_vlan_strip_set(port_id, on); 3136 else if(!strcmp(res->what, "stripq")){ 3137 uint16_t queue_id = 0; 3138 3139 /* No queue_id, return */ 3140 if(i + 1 >= len) { 3141 printf("must specify (port,queue_id)\n"); 3142 return; 3143 } 3144 tmp = strtoul(str + i + 1, NULL, 0); 3145 /* If queue_id greater that what 16-bits can represent, return */ 3146 if(tmp > 0xffff) 3147 return; 3148 3149 queue_id = (uint16_t)tmp; 3150 rx_vlan_strip_set_on_queue(port_id, queue_id, on); 3151 } 3152 else if (!strcmp(res->what, "filter")) 3153 rx_vlan_filter_set(port_id, on); 3154 else 3155 vlan_extend_set(port_id, on); 3156 3157 return; 3158 } 3159 3160 cmdline_parse_token_string_t cmd_vlan_offload_vlan = 3161 TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result, 3162 vlan, "vlan"); 3163 cmdline_parse_token_string_t cmd_vlan_offload_set = 3164 TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result, 3165 set, "set"); 3166 cmdline_parse_token_string_t cmd_vlan_offload_what = 3167 TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result, 3168 what, "strip#filter#qinq#stripq"); 3169 cmdline_parse_token_string_t cmd_vlan_offload_on = 3170 TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result, 3171 on, "on#off"); 3172 cmdline_parse_token_string_t cmd_vlan_offload_portid = 3173 TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result, 3174 port_id, NULL); 3175 3176 cmdline_parse_inst_t cmd_vlan_offload = { 3177 .f = cmd_vlan_offload_parsed, 3178 .data = NULL, 3179 .help_str = "vlan set strip|filter|qinq|stripq on|off " 3180 "<port_id[,queue_id]>: " 3181 "Filter/Strip for rx side qinq(extended) for both rx/tx sides", 3182 .tokens = { 3183 (void *)&cmd_vlan_offload_vlan, 3184 (void *)&cmd_vlan_offload_set, 3185 (void *)&cmd_vlan_offload_what, 3186 (void *)&cmd_vlan_offload_on, 3187 (void *)&cmd_vlan_offload_portid, 3188 NULL, 3189 }, 3190 }; 3191 3192 /* *** VLAN TPID SET ON A PORT *** */ 3193 struct cmd_vlan_tpid_result { 3194 cmdline_fixed_string_t vlan; 3195 cmdline_fixed_string_t set; 3196 cmdline_fixed_string_t vlan_type; 3197 cmdline_fixed_string_t what; 3198 uint16_t tp_id; 3199 uint8_t port_id; 3200 }; 3201 3202 static void 3203 cmd_vlan_tpid_parsed(void *parsed_result, 3204 __attribute__((unused)) struct cmdline *cl, 3205 __attribute__((unused)) void *data) 3206 { 3207 struct cmd_vlan_tpid_result *res = parsed_result; 3208 enum rte_vlan_type vlan_type; 3209 3210 if (!strcmp(res->vlan_type, "inner")) 3211 vlan_type = ETH_VLAN_TYPE_INNER; 3212 else if (!strcmp(res->vlan_type, "outer")) 3213 vlan_type = ETH_VLAN_TYPE_OUTER; 3214 else { 3215 printf("Unknown vlan type\n"); 3216 return; 3217 } 3218 vlan_tpid_set(res->port_id, vlan_type, res->tp_id); 3219 } 3220 3221 cmdline_parse_token_string_t cmd_vlan_tpid_vlan = 3222 TOKEN_STRING_INITIALIZER(struct cmd_vlan_tpid_result, 3223 vlan, "vlan"); 3224 cmdline_parse_token_string_t cmd_vlan_tpid_set = 3225 TOKEN_STRING_INITIALIZER(struct cmd_vlan_tpid_result, 3226 set, "set"); 3227 cmdline_parse_token_string_t cmd_vlan_type = 3228 TOKEN_STRING_INITIALIZER(struct cmd_vlan_tpid_result, 3229 vlan_type, "inner#outer"); 3230 cmdline_parse_token_string_t cmd_vlan_tpid_what = 3231 TOKEN_STRING_INITIALIZER(struct cmd_vlan_tpid_result, 3232 what, "tpid"); 3233 cmdline_parse_token_num_t cmd_vlan_tpid_tpid = 3234 TOKEN_NUM_INITIALIZER(struct cmd_vlan_tpid_result, 3235 tp_id, UINT16); 3236 cmdline_parse_token_num_t cmd_vlan_tpid_portid = 3237 TOKEN_NUM_INITIALIZER(struct cmd_vlan_tpid_result, 3238 port_id, UINT8); 3239 3240 cmdline_parse_inst_t cmd_vlan_tpid = { 3241 .f = cmd_vlan_tpid_parsed, 3242 .data = NULL, 3243 .help_str = "vlan set inner|outer tpid <tp_id> <port_id>: " 3244 "Set the VLAN Ether type", 3245 .tokens = { 3246 (void *)&cmd_vlan_tpid_vlan, 3247 (void *)&cmd_vlan_tpid_set, 3248 (void *)&cmd_vlan_type, 3249 (void *)&cmd_vlan_tpid_what, 3250 (void *)&cmd_vlan_tpid_tpid, 3251 (void *)&cmd_vlan_tpid_portid, 3252 NULL, 3253 }, 3254 }; 3255 3256 /* *** ADD/REMOVE A VLAN IDENTIFIER TO/FROM A PORT VLAN RX FILTER *** */ 3257 struct cmd_rx_vlan_filter_result { 3258 cmdline_fixed_string_t rx_vlan; 3259 cmdline_fixed_string_t what; 3260 uint16_t vlan_id; 3261 uint8_t port_id; 3262 }; 3263 3264 static void 3265 cmd_rx_vlan_filter_parsed(void *parsed_result, 3266 __attribute__((unused)) struct cmdline *cl, 3267 __attribute__((unused)) void *data) 3268 { 3269 struct cmd_rx_vlan_filter_result *res = parsed_result; 3270 3271 if (!strcmp(res->what, "add")) 3272 rx_vft_set(res->port_id, res->vlan_id, 1); 3273 else 3274 rx_vft_set(res->port_id, res->vlan_id, 0); 3275 } 3276 3277 cmdline_parse_token_string_t cmd_rx_vlan_filter_rx_vlan = 3278 TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_result, 3279 rx_vlan, "rx_vlan"); 3280 cmdline_parse_token_string_t cmd_rx_vlan_filter_what = 3281 TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_result, 3282 what, "add#rm"); 3283 cmdline_parse_token_num_t cmd_rx_vlan_filter_vlanid = 3284 TOKEN_NUM_INITIALIZER(struct cmd_rx_vlan_filter_result, 3285 vlan_id, UINT16); 3286 cmdline_parse_token_num_t cmd_rx_vlan_filter_portid = 3287 TOKEN_NUM_INITIALIZER(struct cmd_rx_vlan_filter_result, 3288 port_id, UINT8); 3289 3290 cmdline_parse_inst_t cmd_rx_vlan_filter = { 3291 .f = cmd_rx_vlan_filter_parsed, 3292 .data = NULL, 3293 .help_str = "rx_vlan add|rm <vlan_id> <port_id>: " 3294 "Add/Remove a VLAN identifier to/from the set of VLAN " 3295 "identifiers filtered by a port", 3296 .tokens = { 3297 (void *)&cmd_rx_vlan_filter_rx_vlan, 3298 (void *)&cmd_rx_vlan_filter_what, 3299 (void *)&cmd_rx_vlan_filter_vlanid, 3300 (void *)&cmd_rx_vlan_filter_portid, 3301 NULL, 3302 }, 3303 }; 3304 3305 /* *** ENABLE HARDWARE INSERTION OF VLAN HEADER IN TX PACKETS *** */ 3306 struct cmd_tx_vlan_set_result { 3307 cmdline_fixed_string_t tx_vlan; 3308 cmdline_fixed_string_t set; 3309 uint8_t port_id; 3310 uint16_t vlan_id; 3311 }; 3312 3313 static void 3314 cmd_tx_vlan_set_parsed(void *parsed_result, 3315 __attribute__((unused)) struct cmdline *cl, 3316 __attribute__((unused)) void *data) 3317 { 3318 struct cmd_tx_vlan_set_result *res = parsed_result; 3319 3320 tx_vlan_set(res->port_id, res->vlan_id); 3321 } 3322 3323 cmdline_parse_token_string_t cmd_tx_vlan_set_tx_vlan = 3324 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_result, 3325 tx_vlan, "tx_vlan"); 3326 cmdline_parse_token_string_t cmd_tx_vlan_set_set = 3327 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_result, 3328 set, "set"); 3329 cmdline_parse_token_num_t cmd_tx_vlan_set_portid = 3330 TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_result, 3331 port_id, UINT8); 3332 cmdline_parse_token_num_t cmd_tx_vlan_set_vlanid = 3333 TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_result, 3334 vlan_id, UINT16); 3335 3336 cmdline_parse_inst_t cmd_tx_vlan_set = { 3337 .f = cmd_tx_vlan_set_parsed, 3338 .data = NULL, 3339 .help_str = "tx_vlan set <port_id> <vlan_id>: " 3340 "Enable hardware insertion of a single VLAN header " 3341 "with a given TAG Identifier in packets sent on a port", 3342 .tokens = { 3343 (void *)&cmd_tx_vlan_set_tx_vlan, 3344 (void *)&cmd_tx_vlan_set_set, 3345 (void *)&cmd_tx_vlan_set_portid, 3346 (void *)&cmd_tx_vlan_set_vlanid, 3347 NULL, 3348 }, 3349 }; 3350 3351 /* *** ENABLE HARDWARE INSERTION OF Double VLAN HEADER IN TX PACKETS *** */ 3352 struct cmd_tx_vlan_set_qinq_result { 3353 cmdline_fixed_string_t tx_vlan; 3354 cmdline_fixed_string_t set; 3355 uint8_t port_id; 3356 uint16_t vlan_id; 3357 uint16_t vlan_id_outer; 3358 }; 3359 3360 static void 3361 cmd_tx_vlan_set_qinq_parsed(void *parsed_result, 3362 __attribute__((unused)) struct cmdline *cl, 3363 __attribute__((unused)) void *data) 3364 { 3365 struct cmd_tx_vlan_set_qinq_result *res = parsed_result; 3366 3367 tx_qinq_set(res->port_id, res->vlan_id, res->vlan_id_outer); 3368 } 3369 3370 cmdline_parse_token_string_t cmd_tx_vlan_set_qinq_tx_vlan = 3371 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_qinq_result, 3372 tx_vlan, "tx_vlan"); 3373 cmdline_parse_token_string_t cmd_tx_vlan_set_qinq_set = 3374 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_qinq_result, 3375 set, "set"); 3376 cmdline_parse_token_num_t cmd_tx_vlan_set_qinq_portid = 3377 TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_qinq_result, 3378 port_id, UINT8); 3379 cmdline_parse_token_num_t cmd_tx_vlan_set_qinq_vlanid = 3380 TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_qinq_result, 3381 vlan_id, UINT16); 3382 cmdline_parse_token_num_t cmd_tx_vlan_set_qinq_vlanid_outer = 3383 TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_qinq_result, 3384 vlan_id_outer, UINT16); 3385 3386 cmdline_parse_inst_t cmd_tx_vlan_set_qinq = { 3387 .f = cmd_tx_vlan_set_qinq_parsed, 3388 .data = NULL, 3389 .help_str = "tx_vlan set <port_id> <vlan_id> <outer_vlan_id>: " 3390 "Enable hardware insertion of double VLAN header " 3391 "with given TAG Identifiers in packets sent on a port", 3392 .tokens = { 3393 (void *)&cmd_tx_vlan_set_qinq_tx_vlan, 3394 (void *)&cmd_tx_vlan_set_qinq_set, 3395 (void *)&cmd_tx_vlan_set_qinq_portid, 3396 (void *)&cmd_tx_vlan_set_qinq_vlanid, 3397 (void *)&cmd_tx_vlan_set_qinq_vlanid_outer, 3398 NULL, 3399 }, 3400 }; 3401 3402 /* *** ENABLE/DISABLE PORT BASED TX VLAN INSERTION *** */ 3403 struct cmd_tx_vlan_set_pvid_result { 3404 cmdline_fixed_string_t tx_vlan; 3405 cmdline_fixed_string_t set; 3406 cmdline_fixed_string_t pvid; 3407 uint8_t port_id; 3408 uint16_t vlan_id; 3409 cmdline_fixed_string_t mode; 3410 }; 3411 3412 static void 3413 cmd_tx_vlan_set_pvid_parsed(void *parsed_result, 3414 __attribute__((unused)) struct cmdline *cl, 3415 __attribute__((unused)) void *data) 3416 { 3417 struct cmd_tx_vlan_set_pvid_result *res = parsed_result; 3418 3419 if (strcmp(res->mode, "on") == 0) 3420 tx_vlan_pvid_set(res->port_id, res->vlan_id, 1); 3421 else 3422 tx_vlan_pvid_set(res->port_id, res->vlan_id, 0); 3423 } 3424 3425 cmdline_parse_token_string_t cmd_tx_vlan_set_pvid_tx_vlan = 3426 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_pvid_result, 3427 tx_vlan, "tx_vlan"); 3428 cmdline_parse_token_string_t cmd_tx_vlan_set_pvid_set = 3429 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_pvid_result, 3430 set, "set"); 3431 cmdline_parse_token_string_t cmd_tx_vlan_set_pvid_pvid = 3432 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_pvid_result, 3433 pvid, "pvid"); 3434 cmdline_parse_token_num_t cmd_tx_vlan_set_pvid_port_id = 3435 TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_pvid_result, 3436 port_id, UINT8); 3437 cmdline_parse_token_num_t cmd_tx_vlan_set_pvid_vlan_id = 3438 TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_pvid_result, 3439 vlan_id, UINT16); 3440 cmdline_parse_token_string_t cmd_tx_vlan_set_pvid_mode = 3441 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_pvid_result, 3442 mode, "on#off"); 3443 3444 cmdline_parse_inst_t cmd_tx_vlan_set_pvid = { 3445 .f = cmd_tx_vlan_set_pvid_parsed, 3446 .data = NULL, 3447 .help_str = "tx_vlan set pvid <port_id> <vlan_id> on|off", 3448 .tokens = { 3449 (void *)&cmd_tx_vlan_set_pvid_tx_vlan, 3450 (void *)&cmd_tx_vlan_set_pvid_set, 3451 (void *)&cmd_tx_vlan_set_pvid_pvid, 3452 (void *)&cmd_tx_vlan_set_pvid_port_id, 3453 (void *)&cmd_tx_vlan_set_pvid_vlan_id, 3454 (void *)&cmd_tx_vlan_set_pvid_mode, 3455 NULL, 3456 }, 3457 }; 3458 3459 /* *** DISABLE HARDWARE INSERTION OF VLAN HEADER IN TX PACKETS *** */ 3460 struct cmd_tx_vlan_reset_result { 3461 cmdline_fixed_string_t tx_vlan; 3462 cmdline_fixed_string_t reset; 3463 uint8_t port_id; 3464 }; 3465 3466 static void 3467 cmd_tx_vlan_reset_parsed(void *parsed_result, 3468 __attribute__((unused)) struct cmdline *cl, 3469 __attribute__((unused)) void *data) 3470 { 3471 struct cmd_tx_vlan_reset_result *res = parsed_result; 3472 3473 tx_vlan_reset(res->port_id); 3474 } 3475 3476 cmdline_parse_token_string_t cmd_tx_vlan_reset_tx_vlan = 3477 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_reset_result, 3478 tx_vlan, "tx_vlan"); 3479 cmdline_parse_token_string_t cmd_tx_vlan_reset_reset = 3480 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_reset_result, 3481 reset, "reset"); 3482 cmdline_parse_token_num_t cmd_tx_vlan_reset_portid = 3483 TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_reset_result, 3484 port_id, UINT8); 3485 3486 cmdline_parse_inst_t cmd_tx_vlan_reset = { 3487 .f = cmd_tx_vlan_reset_parsed, 3488 .data = NULL, 3489 .help_str = "tx_vlan reset <port_id>: Disable hardware insertion of a " 3490 "VLAN header in packets sent on a port", 3491 .tokens = { 3492 (void *)&cmd_tx_vlan_reset_tx_vlan, 3493 (void *)&cmd_tx_vlan_reset_reset, 3494 (void *)&cmd_tx_vlan_reset_portid, 3495 NULL, 3496 }, 3497 }; 3498 3499 3500 /* *** ENABLE HARDWARE INSERTION OF CHECKSUM IN TX PACKETS *** */ 3501 struct cmd_csum_result { 3502 cmdline_fixed_string_t csum; 3503 cmdline_fixed_string_t mode; 3504 cmdline_fixed_string_t proto; 3505 cmdline_fixed_string_t hwsw; 3506 uint8_t port_id; 3507 }; 3508 3509 static void 3510 csum_show(int port_id) 3511 { 3512 struct rte_eth_dev_info dev_info; 3513 uint16_t ol_flags; 3514 3515 ol_flags = ports[port_id].tx_ol_flags; 3516 printf("Parse tunnel is %s\n", 3517 (ol_flags & TESTPMD_TX_OFFLOAD_PARSE_TUNNEL) ? "on" : "off"); 3518 printf("IP checksum offload is %s\n", 3519 (ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM) ? "hw" : "sw"); 3520 printf("UDP checksum offload is %s\n", 3521 (ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM) ? "hw" : "sw"); 3522 printf("TCP checksum offload is %s\n", 3523 (ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM) ? "hw" : "sw"); 3524 printf("SCTP checksum offload is %s\n", 3525 (ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM) ? "hw" : "sw"); 3526 printf("Outer-Ip checksum offload is %s\n", 3527 (ol_flags & TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) ? "hw" : "sw"); 3528 3529 /* display warnings if configuration is not supported by the NIC */ 3530 rte_eth_dev_info_get(port_id, &dev_info); 3531 if ((ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM) && 3532 (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) == 0) { 3533 printf("Warning: hardware IP checksum enabled but not " 3534 "supported by port %d\n", port_id); 3535 } 3536 if ((ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM) && 3537 (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) == 0) { 3538 printf("Warning: hardware UDP checksum enabled but not " 3539 "supported by port %d\n", port_id); 3540 } 3541 if ((ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM) && 3542 (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) == 0) { 3543 printf("Warning: hardware TCP checksum enabled but not " 3544 "supported by port %d\n", port_id); 3545 } 3546 if ((ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM) && 3547 (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) == 0) { 3548 printf("Warning: hardware SCTP checksum enabled but not " 3549 "supported by port %d\n", port_id); 3550 } 3551 if ((ol_flags & TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM) && 3552 (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) == 0) { 3553 printf("Warning: hardware outer IP checksum enabled but not " 3554 "supported by port %d\n", port_id); 3555 } 3556 } 3557 3558 static void 3559 cmd_csum_parsed(void *parsed_result, 3560 __attribute__((unused)) struct cmdline *cl, 3561 __attribute__((unused)) void *data) 3562 { 3563 struct cmd_csum_result *res = parsed_result; 3564 int hw = 0; 3565 uint16_t mask = 0; 3566 3567 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) { 3568 printf("invalid port %d\n", res->port_id); 3569 return; 3570 } 3571 3572 if (!strcmp(res->mode, "set")) { 3573 3574 if (!strcmp(res->hwsw, "hw")) 3575 hw = 1; 3576 3577 if (!strcmp(res->proto, "ip")) { 3578 mask = TESTPMD_TX_OFFLOAD_IP_CKSUM; 3579 } else if (!strcmp(res->proto, "udp")) { 3580 mask = TESTPMD_TX_OFFLOAD_UDP_CKSUM; 3581 } else if (!strcmp(res->proto, "tcp")) { 3582 mask = TESTPMD_TX_OFFLOAD_TCP_CKSUM; 3583 } else if (!strcmp(res->proto, "sctp")) { 3584 mask = TESTPMD_TX_OFFLOAD_SCTP_CKSUM; 3585 } else if (!strcmp(res->proto, "outer-ip")) { 3586 mask = TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM; 3587 } 3588 3589 if (hw) 3590 ports[res->port_id].tx_ol_flags |= mask; 3591 else 3592 ports[res->port_id].tx_ol_flags &= (~mask); 3593 } 3594 csum_show(res->port_id); 3595 } 3596 3597 cmdline_parse_token_string_t cmd_csum_csum = 3598 TOKEN_STRING_INITIALIZER(struct cmd_csum_result, 3599 csum, "csum"); 3600 cmdline_parse_token_string_t cmd_csum_mode = 3601 TOKEN_STRING_INITIALIZER(struct cmd_csum_result, 3602 mode, "set"); 3603 cmdline_parse_token_string_t cmd_csum_proto = 3604 TOKEN_STRING_INITIALIZER(struct cmd_csum_result, 3605 proto, "ip#tcp#udp#sctp#outer-ip"); 3606 cmdline_parse_token_string_t cmd_csum_hwsw = 3607 TOKEN_STRING_INITIALIZER(struct cmd_csum_result, 3608 hwsw, "hw#sw"); 3609 cmdline_parse_token_num_t cmd_csum_portid = 3610 TOKEN_NUM_INITIALIZER(struct cmd_csum_result, 3611 port_id, UINT8); 3612 3613 cmdline_parse_inst_t cmd_csum_set = { 3614 .f = cmd_csum_parsed, 3615 .data = NULL, 3616 .help_str = "csum set ip|tcp|udp|sctp|outer-ip hw|sw <port_id>: " 3617 "Enable/Disable hardware calculation of L3/L4 checksum when " 3618 "using csum forward engine", 3619 .tokens = { 3620 (void *)&cmd_csum_csum, 3621 (void *)&cmd_csum_mode, 3622 (void *)&cmd_csum_proto, 3623 (void *)&cmd_csum_hwsw, 3624 (void *)&cmd_csum_portid, 3625 NULL, 3626 }, 3627 }; 3628 3629 cmdline_parse_token_string_t cmd_csum_mode_show = 3630 TOKEN_STRING_INITIALIZER(struct cmd_csum_result, 3631 mode, "show"); 3632 3633 cmdline_parse_inst_t cmd_csum_show = { 3634 .f = cmd_csum_parsed, 3635 .data = NULL, 3636 .help_str = "csum show <port_id>: Show checksum offload configuration", 3637 .tokens = { 3638 (void *)&cmd_csum_csum, 3639 (void *)&cmd_csum_mode_show, 3640 (void *)&cmd_csum_portid, 3641 NULL, 3642 }, 3643 }; 3644 3645 /* Enable/disable tunnel parsing */ 3646 struct cmd_csum_tunnel_result { 3647 cmdline_fixed_string_t csum; 3648 cmdline_fixed_string_t parse; 3649 cmdline_fixed_string_t onoff; 3650 uint8_t port_id; 3651 }; 3652 3653 static void 3654 cmd_csum_tunnel_parsed(void *parsed_result, 3655 __attribute__((unused)) struct cmdline *cl, 3656 __attribute__((unused)) void *data) 3657 { 3658 struct cmd_csum_tunnel_result *res = parsed_result; 3659 3660 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 3661 return; 3662 3663 if (!strcmp(res->onoff, "on")) 3664 ports[res->port_id].tx_ol_flags |= 3665 TESTPMD_TX_OFFLOAD_PARSE_TUNNEL; 3666 else 3667 ports[res->port_id].tx_ol_flags &= 3668 (~TESTPMD_TX_OFFLOAD_PARSE_TUNNEL); 3669 3670 csum_show(res->port_id); 3671 } 3672 3673 cmdline_parse_token_string_t cmd_csum_tunnel_csum = 3674 TOKEN_STRING_INITIALIZER(struct cmd_csum_tunnel_result, 3675 csum, "csum"); 3676 cmdline_parse_token_string_t cmd_csum_tunnel_parse = 3677 TOKEN_STRING_INITIALIZER(struct cmd_csum_tunnel_result, 3678 parse, "parse_tunnel"); 3679 cmdline_parse_token_string_t cmd_csum_tunnel_onoff = 3680 TOKEN_STRING_INITIALIZER(struct cmd_csum_tunnel_result, 3681 onoff, "on#off"); 3682 cmdline_parse_token_num_t cmd_csum_tunnel_portid = 3683 TOKEN_NUM_INITIALIZER(struct cmd_csum_tunnel_result, 3684 port_id, UINT8); 3685 3686 cmdline_parse_inst_t cmd_csum_tunnel = { 3687 .f = cmd_csum_tunnel_parsed, 3688 .data = NULL, 3689 .help_str = "csum parse_tunnel on|off <port_id>: " 3690 "Enable/Disable parsing of tunnels for csum engine", 3691 .tokens = { 3692 (void *)&cmd_csum_tunnel_csum, 3693 (void *)&cmd_csum_tunnel_parse, 3694 (void *)&cmd_csum_tunnel_onoff, 3695 (void *)&cmd_csum_tunnel_portid, 3696 NULL, 3697 }, 3698 }; 3699 3700 /* *** ENABLE HARDWARE SEGMENTATION IN TX NON-TUNNELED PACKETS *** */ 3701 struct cmd_tso_set_result { 3702 cmdline_fixed_string_t tso; 3703 cmdline_fixed_string_t mode; 3704 uint16_t tso_segsz; 3705 uint8_t port_id; 3706 }; 3707 3708 static void 3709 cmd_tso_set_parsed(void *parsed_result, 3710 __attribute__((unused)) struct cmdline *cl, 3711 __attribute__((unused)) void *data) 3712 { 3713 struct cmd_tso_set_result *res = parsed_result; 3714 struct rte_eth_dev_info dev_info; 3715 3716 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 3717 return; 3718 3719 if (!strcmp(res->mode, "set")) 3720 ports[res->port_id].tso_segsz = res->tso_segsz; 3721 3722 if (ports[res->port_id].tso_segsz == 0) 3723 printf("TSO for non-tunneled packets is disabled\n"); 3724 else 3725 printf("TSO segment size for non-tunneled packets is %d\n", 3726 ports[res->port_id].tso_segsz); 3727 3728 /* display warnings if configuration is not supported by the NIC */ 3729 rte_eth_dev_info_get(res->port_id, &dev_info); 3730 if ((ports[res->port_id].tso_segsz != 0) && 3731 (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) { 3732 printf("Warning: TSO enabled but not " 3733 "supported by port %d\n", res->port_id); 3734 } 3735 } 3736 3737 cmdline_parse_token_string_t cmd_tso_set_tso = 3738 TOKEN_STRING_INITIALIZER(struct cmd_tso_set_result, 3739 tso, "tso"); 3740 cmdline_parse_token_string_t cmd_tso_set_mode = 3741 TOKEN_STRING_INITIALIZER(struct cmd_tso_set_result, 3742 mode, "set"); 3743 cmdline_parse_token_num_t cmd_tso_set_tso_segsz = 3744 TOKEN_NUM_INITIALIZER(struct cmd_tso_set_result, 3745 tso_segsz, UINT16); 3746 cmdline_parse_token_num_t cmd_tso_set_portid = 3747 TOKEN_NUM_INITIALIZER(struct cmd_tso_set_result, 3748 port_id, UINT8); 3749 3750 cmdline_parse_inst_t cmd_tso_set = { 3751 .f = cmd_tso_set_parsed, 3752 .data = NULL, 3753 .help_str = "tso set <tso_segsz> <port_id>: " 3754 "Set TSO segment size of non-tunneled packets for csum engine " 3755 "(0 to disable)", 3756 .tokens = { 3757 (void *)&cmd_tso_set_tso, 3758 (void *)&cmd_tso_set_mode, 3759 (void *)&cmd_tso_set_tso_segsz, 3760 (void *)&cmd_tso_set_portid, 3761 NULL, 3762 }, 3763 }; 3764 3765 cmdline_parse_token_string_t cmd_tso_show_mode = 3766 TOKEN_STRING_INITIALIZER(struct cmd_tso_set_result, 3767 mode, "show"); 3768 3769 3770 cmdline_parse_inst_t cmd_tso_show = { 3771 .f = cmd_tso_set_parsed, 3772 .data = NULL, 3773 .help_str = "tso show <port_id>: " 3774 "Show TSO segment size of non-tunneled packets for csum engine", 3775 .tokens = { 3776 (void *)&cmd_tso_set_tso, 3777 (void *)&cmd_tso_show_mode, 3778 (void *)&cmd_tso_set_portid, 3779 NULL, 3780 }, 3781 }; 3782 3783 /* *** ENABLE HARDWARE SEGMENTATION IN TX TUNNELED PACKETS *** */ 3784 struct cmd_tunnel_tso_set_result { 3785 cmdline_fixed_string_t tso; 3786 cmdline_fixed_string_t mode; 3787 uint16_t tso_segsz; 3788 uint8_t port_id; 3789 }; 3790 3791 static void 3792 check_tunnel_tso_nic_support(uint8_t port_id) 3793 { 3794 struct rte_eth_dev_info dev_info; 3795 3796 rte_eth_dev_info_get(port_id, &dev_info); 3797 if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO)) 3798 printf("Warning: TSO enabled but VXLAN TUNNEL TSO not " 3799 "supported by port %d\n", port_id); 3800 if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO)) 3801 printf("Warning: TSO enabled but GRE TUNNEL TSO not " 3802 "supported by port %d\n", port_id); 3803 if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO)) 3804 printf("Warning: TSO enabled but IPIP TUNNEL TSO not " 3805 "supported by port %d\n", port_id); 3806 if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO)) 3807 printf("Warning: TSO enabled but GENEVE TUNNEL TSO not " 3808 "supported by port %d\n", port_id); 3809 } 3810 3811 static void 3812 cmd_tunnel_tso_set_parsed(void *parsed_result, 3813 __attribute__((unused)) struct cmdline *cl, 3814 __attribute__((unused)) void *data) 3815 { 3816 struct cmd_tunnel_tso_set_result *res = parsed_result; 3817 3818 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 3819 return; 3820 3821 if (!strcmp(res->mode, "set")) 3822 ports[res->port_id].tunnel_tso_segsz = res->tso_segsz; 3823 3824 if (ports[res->port_id].tunnel_tso_segsz == 0) 3825 printf("TSO for tunneled packets is disabled\n"); 3826 else { 3827 printf("TSO segment size for tunneled packets is %d\n", 3828 ports[res->port_id].tunnel_tso_segsz); 3829 3830 /* Below conditions are needed to make it work: 3831 * (1) tunnel TSO is supported by the NIC; 3832 * (2) "csum parse_tunnel" must be set so that tunneled pkts 3833 * are recognized; 3834 * (3) for tunneled pkts with outer L3 of IPv4, 3835 * "csum set outer-ip" must be set to hw, because after tso, 3836 * total_len of outer IP header is changed, and the checksum 3837 * of outer IP header calculated by sw should be wrong; that 3838 * is not necessary for IPv6 tunneled pkts because there's no 3839 * checksum in IP header anymore. 3840 */ 3841 check_tunnel_tso_nic_support(res->port_id); 3842 3843 if (!(ports[res->port_id].tx_ol_flags & 3844 TESTPMD_TX_OFFLOAD_PARSE_TUNNEL)) 3845 printf("Warning: csum parse_tunnel must be set " 3846 "so that tunneled packets are recognized\n"); 3847 if (!(ports[res->port_id].tx_ol_flags & 3848 TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM)) 3849 printf("Warning: csum set outer-ip must be set to hw " 3850 "if outer L3 is IPv4; not necessary for IPv6\n"); 3851 } 3852 } 3853 3854 cmdline_parse_token_string_t cmd_tunnel_tso_set_tso = 3855 TOKEN_STRING_INITIALIZER(struct cmd_tunnel_tso_set_result, 3856 tso, "tunnel_tso"); 3857 cmdline_parse_token_string_t cmd_tunnel_tso_set_mode = 3858 TOKEN_STRING_INITIALIZER(struct cmd_tunnel_tso_set_result, 3859 mode, "set"); 3860 cmdline_parse_token_num_t cmd_tunnel_tso_set_tso_segsz = 3861 TOKEN_NUM_INITIALIZER(struct cmd_tunnel_tso_set_result, 3862 tso_segsz, UINT16); 3863 cmdline_parse_token_num_t cmd_tunnel_tso_set_portid = 3864 TOKEN_NUM_INITIALIZER(struct cmd_tunnel_tso_set_result, 3865 port_id, UINT8); 3866 3867 cmdline_parse_inst_t cmd_tunnel_tso_set = { 3868 .f = cmd_tunnel_tso_set_parsed, 3869 .data = NULL, 3870 .help_str = "tunnel_tso set <tso_segsz> <port_id>: " 3871 "Set TSO segment size of tunneled packets for csum engine " 3872 "(0 to disable)", 3873 .tokens = { 3874 (void *)&cmd_tunnel_tso_set_tso, 3875 (void *)&cmd_tunnel_tso_set_mode, 3876 (void *)&cmd_tunnel_tso_set_tso_segsz, 3877 (void *)&cmd_tunnel_tso_set_portid, 3878 NULL, 3879 }, 3880 }; 3881 3882 cmdline_parse_token_string_t cmd_tunnel_tso_show_mode = 3883 TOKEN_STRING_INITIALIZER(struct cmd_tunnel_tso_set_result, 3884 mode, "show"); 3885 3886 3887 cmdline_parse_inst_t cmd_tunnel_tso_show = { 3888 .f = cmd_tunnel_tso_set_parsed, 3889 .data = NULL, 3890 .help_str = "tunnel_tso show <port_id> " 3891 "Show TSO segment size of tunneled packets for csum engine", 3892 .tokens = { 3893 (void *)&cmd_tunnel_tso_set_tso, 3894 (void *)&cmd_tunnel_tso_show_mode, 3895 (void *)&cmd_tunnel_tso_set_portid, 3896 NULL, 3897 }, 3898 }; 3899 3900 /* *** SET GRO FOR A PORT *** */ 3901 struct cmd_gro_enable_result { 3902 cmdline_fixed_string_t cmd_set; 3903 cmdline_fixed_string_t cmd_port; 3904 cmdline_fixed_string_t cmd_keyword; 3905 cmdline_fixed_string_t cmd_onoff; 3906 portid_t cmd_pid; 3907 }; 3908 3909 static void 3910 cmd_gro_enable_parsed(void *parsed_result, 3911 __attribute__((unused)) struct cmdline *cl, 3912 __attribute__((unused)) void *data) 3913 { 3914 struct cmd_gro_enable_result *res; 3915 3916 res = parsed_result; 3917 if (!strcmp(res->cmd_keyword, "gro")) 3918 setup_gro(res->cmd_onoff, res->cmd_pid); 3919 } 3920 3921 cmdline_parse_token_string_t cmd_gro_enable_set = 3922 TOKEN_STRING_INITIALIZER(struct cmd_gro_enable_result, 3923 cmd_set, "set"); 3924 cmdline_parse_token_string_t cmd_gro_enable_port = 3925 TOKEN_STRING_INITIALIZER(struct cmd_gro_enable_result, 3926 cmd_keyword, "port"); 3927 cmdline_parse_token_num_t cmd_gro_enable_pid = 3928 TOKEN_NUM_INITIALIZER(struct cmd_gro_enable_result, 3929 cmd_pid, UINT16); 3930 cmdline_parse_token_string_t cmd_gro_enable_keyword = 3931 TOKEN_STRING_INITIALIZER(struct cmd_gro_enable_result, 3932 cmd_keyword, "gro"); 3933 cmdline_parse_token_string_t cmd_gro_enable_onoff = 3934 TOKEN_STRING_INITIALIZER(struct cmd_gro_enable_result, 3935 cmd_onoff, "on#off"); 3936 3937 cmdline_parse_inst_t cmd_gro_enable = { 3938 .f = cmd_gro_enable_parsed, 3939 .data = NULL, 3940 .help_str = "set port <port_id> gro on|off", 3941 .tokens = { 3942 (void *)&cmd_gro_enable_set, 3943 (void *)&cmd_gro_enable_port, 3944 (void *)&cmd_gro_enable_pid, 3945 (void *)&cmd_gro_enable_keyword, 3946 (void *)&cmd_gro_enable_onoff, 3947 NULL, 3948 }, 3949 }; 3950 3951 /* *** DISPLAY GRO CONFIGURATION *** */ 3952 struct cmd_gro_show_result { 3953 cmdline_fixed_string_t cmd_show; 3954 cmdline_fixed_string_t cmd_port; 3955 cmdline_fixed_string_t cmd_keyword; 3956 portid_t cmd_pid; 3957 }; 3958 3959 static void 3960 cmd_gro_show_parsed(void *parsed_result, 3961 __attribute__((unused)) struct cmdline *cl, 3962 __attribute__((unused)) void *data) 3963 { 3964 struct cmd_gro_show_result *res; 3965 3966 res = parsed_result; 3967 if (!strcmp(res->cmd_keyword, "gro")) 3968 show_gro(res->cmd_pid); 3969 } 3970 3971 cmdline_parse_token_string_t cmd_gro_show_show = 3972 TOKEN_STRING_INITIALIZER(struct cmd_gro_show_result, 3973 cmd_show, "show"); 3974 cmdline_parse_token_string_t cmd_gro_show_port = 3975 TOKEN_STRING_INITIALIZER(struct cmd_gro_show_result, 3976 cmd_port, "port"); 3977 cmdline_parse_token_num_t cmd_gro_show_pid = 3978 TOKEN_NUM_INITIALIZER(struct cmd_gro_show_result, 3979 cmd_pid, UINT16); 3980 cmdline_parse_token_string_t cmd_gro_show_keyword = 3981 TOKEN_STRING_INITIALIZER(struct cmd_gro_show_result, 3982 cmd_keyword, "gro"); 3983 3984 cmdline_parse_inst_t cmd_gro_show = { 3985 .f = cmd_gro_show_parsed, 3986 .data = NULL, 3987 .help_str = "show port <port_id> gro", 3988 .tokens = { 3989 (void *)&cmd_gro_show_show, 3990 (void *)&cmd_gro_show_port, 3991 (void *)&cmd_gro_show_pid, 3992 (void *)&cmd_gro_show_keyword, 3993 NULL, 3994 }, 3995 }; 3996 3997 /* *** SET FLUSH CYCLES FOR GRO *** */ 3998 struct cmd_gro_flush_result { 3999 cmdline_fixed_string_t cmd_set; 4000 cmdline_fixed_string_t cmd_keyword; 4001 cmdline_fixed_string_t cmd_flush; 4002 uint8_t cmd_cycles; 4003 }; 4004 4005 static void 4006 cmd_gro_flush_parsed(void *parsed_result, 4007 __attribute__((unused)) struct cmdline *cl, 4008 __attribute__((unused)) void *data) 4009 { 4010 struct cmd_gro_flush_result *res; 4011 4012 res = parsed_result; 4013 if ((!strcmp(res->cmd_keyword, "gro")) && 4014 (!strcmp(res->cmd_flush, "flush"))) 4015 setup_gro_flush_cycles(res->cmd_cycles); 4016 } 4017 4018 cmdline_parse_token_string_t cmd_gro_flush_set = 4019 TOKEN_STRING_INITIALIZER(struct cmd_gro_flush_result, 4020 cmd_set, "set"); 4021 cmdline_parse_token_string_t cmd_gro_flush_keyword = 4022 TOKEN_STRING_INITIALIZER(struct cmd_gro_flush_result, 4023 cmd_keyword, "gro"); 4024 cmdline_parse_token_string_t cmd_gro_flush_flush = 4025 TOKEN_STRING_INITIALIZER(struct cmd_gro_flush_result, 4026 cmd_flush, "flush"); 4027 cmdline_parse_token_num_t cmd_gro_flush_cycles = 4028 TOKEN_NUM_INITIALIZER(struct cmd_gro_flush_result, 4029 cmd_cycles, UINT8); 4030 4031 cmdline_parse_inst_t cmd_gro_flush = { 4032 .f = cmd_gro_flush_parsed, 4033 .data = NULL, 4034 .help_str = "set gro flush <cycles>", 4035 .tokens = { 4036 (void *)&cmd_gro_flush_set, 4037 (void *)&cmd_gro_flush_keyword, 4038 (void *)&cmd_gro_flush_flush, 4039 (void *)&cmd_gro_flush_cycles, 4040 NULL, 4041 }, 4042 }; 4043 4044 /* *** ENABLE/DISABLE GSO *** */ 4045 struct cmd_gso_enable_result { 4046 cmdline_fixed_string_t cmd_set; 4047 cmdline_fixed_string_t cmd_port; 4048 cmdline_fixed_string_t cmd_keyword; 4049 cmdline_fixed_string_t cmd_mode; 4050 portid_t cmd_pid; 4051 }; 4052 4053 static void 4054 cmd_gso_enable_parsed(void *parsed_result, 4055 __attribute__((unused)) struct cmdline *cl, 4056 __attribute__((unused)) void *data) 4057 { 4058 struct cmd_gso_enable_result *res; 4059 4060 res = parsed_result; 4061 if (!strcmp(res->cmd_keyword, "gso")) 4062 setup_gso(res->cmd_mode, res->cmd_pid); 4063 } 4064 4065 cmdline_parse_token_string_t cmd_gso_enable_set = 4066 TOKEN_STRING_INITIALIZER(struct cmd_gso_enable_result, 4067 cmd_set, "set"); 4068 cmdline_parse_token_string_t cmd_gso_enable_port = 4069 TOKEN_STRING_INITIALIZER(struct cmd_gso_enable_result, 4070 cmd_port, "port"); 4071 cmdline_parse_token_string_t cmd_gso_enable_keyword = 4072 TOKEN_STRING_INITIALIZER(struct cmd_gso_enable_result, 4073 cmd_keyword, "gso"); 4074 cmdline_parse_token_string_t cmd_gso_enable_mode = 4075 TOKEN_STRING_INITIALIZER(struct cmd_gso_enable_result, 4076 cmd_mode, "on#off"); 4077 cmdline_parse_token_num_t cmd_gso_enable_pid = 4078 TOKEN_NUM_INITIALIZER(struct cmd_gso_enable_result, 4079 cmd_pid, UINT16); 4080 4081 cmdline_parse_inst_t cmd_gso_enable = { 4082 .f = cmd_gso_enable_parsed, 4083 .data = NULL, 4084 .help_str = "set port <port_id> gso on|off", 4085 .tokens = { 4086 (void *)&cmd_gso_enable_set, 4087 (void *)&cmd_gso_enable_port, 4088 (void *)&cmd_gso_enable_pid, 4089 (void *)&cmd_gso_enable_keyword, 4090 (void *)&cmd_gso_enable_mode, 4091 NULL, 4092 }, 4093 }; 4094 4095 /* *** SET MAX PACKET LENGTH FOR GSO SEGMENTS *** */ 4096 struct cmd_gso_size_result { 4097 cmdline_fixed_string_t cmd_set; 4098 cmdline_fixed_string_t cmd_keyword; 4099 cmdline_fixed_string_t cmd_segsz; 4100 uint16_t cmd_size; 4101 }; 4102 4103 static void 4104 cmd_gso_size_parsed(void *parsed_result, 4105 __attribute__((unused)) struct cmdline *cl, 4106 __attribute__((unused)) void *data) 4107 { 4108 struct cmd_gso_size_result *res = parsed_result; 4109 4110 if (test_done == 0) { 4111 printf("Before setting GSO segsz, please first" 4112 " stop fowarding\n"); 4113 return; 4114 } 4115 4116 if (!strcmp(res->cmd_keyword, "gso") && 4117 !strcmp(res->cmd_segsz, "segsz")) { 4118 if (res->cmd_size < RTE_GSO_SEG_SIZE_MIN) 4119 printf("gso_size should be larger than %zu." 4120 " Please input a legal value\n", 4121 RTE_GSO_SEG_SIZE_MIN); 4122 else 4123 gso_max_segment_size = res->cmd_size; 4124 } 4125 } 4126 4127 cmdline_parse_token_string_t cmd_gso_size_set = 4128 TOKEN_STRING_INITIALIZER(struct cmd_gso_size_result, 4129 cmd_set, "set"); 4130 cmdline_parse_token_string_t cmd_gso_size_keyword = 4131 TOKEN_STRING_INITIALIZER(struct cmd_gso_size_result, 4132 cmd_keyword, "gso"); 4133 cmdline_parse_token_string_t cmd_gso_size_segsz = 4134 TOKEN_STRING_INITIALIZER(struct cmd_gso_size_result, 4135 cmd_segsz, "segsz"); 4136 cmdline_parse_token_num_t cmd_gso_size_size = 4137 TOKEN_NUM_INITIALIZER(struct cmd_gso_size_result, 4138 cmd_size, UINT16); 4139 4140 cmdline_parse_inst_t cmd_gso_size = { 4141 .f = cmd_gso_size_parsed, 4142 .data = NULL, 4143 .help_str = "set gso segsz <length>", 4144 .tokens = { 4145 (void *)&cmd_gso_size_set, 4146 (void *)&cmd_gso_size_keyword, 4147 (void *)&cmd_gso_size_segsz, 4148 (void *)&cmd_gso_size_size, 4149 NULL, 4150 }, 4151 }; 4152 4153 /* *** SHOW GSO CONFIGURATION *** */ 4154 struct cmd_gso_show_result { 4155 cmdline_fixed_string_t cmd_show; 4156 cmdline_fixed_string_t cmd_port; 4157 cmdline_fixed_string_t cmd_keyword; 4158 portid_t cmd_pid; 4159 }; 4160 4161 static void 4162 cmd_gso_show_parsed(void *parsed_result, 4163 __attribute__((unused)) struct cmdline *cl, 4164 __attribute__((unused)) void *data) 4165 { 4166 struct cmd_gso_show_result *res = parsed_result; 4167 4168 if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { 4169 printf("invalid port id %u\n", res->cmd_pid); 4170 return; 4171 } 4172 if (!strcmp(res->cmd_keyword, "gso")) { 4173 if (gso_ports[res->cmd_pid].enable) { 4174 printf("Max GSO'd packet size: %uB\n" 4175 "Supported GSO types: TCP/IPv4, " 4176 "VxLAN with inner TCP/IPv4 packet, " 4177 "GRE with inner TCP/IPv4 packet\n", 4178 gso_max_segment_size); 4179 } else 4180 printf("GSO is not enabled on Port %u\n", res->cmd_pid); 4181 } 4182 } 4183 4184 cmdline_parse_token_string_t cmd_gso_show_show = 4185 TOKEN_STRING_INITIALIZER(struct cmd_gso_show_result, 4186 cmd_show, "show"); 4187 cmdline_parse_token_string_t cmd_gso_show_port = 4188 TOKEN_STRING_INITIALIZER(struct cmd_gso_show_result, 4189 cmd_port, "port"); 4190 cmdline_parse_token_string_t cmd_gso_show_keyword = 4191 TOKEN_STRING_INITIALIZER(struct cmd_gso_show_result, 4192 cmd_keyword, "gso"); 4193 cmdline_parse_token_num_t cmd_gso_show_pid = 4194 TOKEN_NUM_INITIALIZER(struct cmd_gso_show_result, 4195 cmd_pid, UINT16); 4196 4197 cmdline_parse_inst_t cmd_gso_show = { 4198 .f = cmd_gso_show_parsed, 4199 .data = NULL, 4200 .help_str = "show port <port_id> gso", 4201 .tokens = { 4202 (void *)&cmd_gso_show_show, 4203 (void *)&cmd_gso_show_port, 4204 (void *)&cmd_gso_show_pid, 4205 (void *)&cmd_gso_show_keyword, 4206 NULL, 4207 }, 4208 }; 4209 4210 /* *** ENABLE/DISABLE FLUSH ON RX STREAMS *** */ 4211 struct cmd_set_flush_rx { 4212 cmdline_fixed_string_t set; 4213 cmdline_fixed_string_t flush_rx; 4214 cmdline_fixed_string_t mode; 4215 }; 4216 4217 static void 4218 cmd_set_flush_rx_parsed(void *parsed_result, 4219 __attribute__((unused)) struct cmdline *cl, 4220 __attribute__((unused)) void *data) 4221 { 4222 struct cmd_set_flush_rx *res = parsed_result; 4223 no_flush_rx = (uint8_t)((strcmp(res->mode, "on") == 0) ? 0 : 1); 4224 } 4225 4226 cmdline_parse_token_string_t cmd_setflushrx_set = 4227 TOKEN_STRING_INITIALIZER(struct cmd_set_flush_rx, 4228 set, "set"); 4229 cmdline_parse_token_string_t cmd_setflushrx_flush_rx = 4230 TOKEN_STRING_INITIALIZER(struct cmd_set_flush_rx, 4231 flush_rx, "flush_rx"); 4232 cmdline_parse_token_string_t cmd_setflushrx_mode = 4233 TOKEN_STRING_INITIALIZER(struct cmd_set_flush_rx, 4234 mode, "on#off"); 4235 4236 4237 cmdline_parse_inst_t cmd_set_flush_rx = { 4238 .f = cmd_set_flush_rx_parsed, 4239 .help_str = "set flush_rx on|off: Enable/Disable flush on rx streams", 4240 .data = NULL, 4241 .tokens = { 4242 (void *)&cmd_setflushrx_set, 4243 (void *)&cmd_setflushrx_flush_rx, 4244 (void *)&cmd_setflushrx_mode, 4245 NULL, 4246 }, 4247 }; 4248 4249 /* *** ENABLE/DISABLE LINK STATUS CHECK *** */ 4250 struct cmd_set_link_check { 4251 cmdline_fixed_string_t set; 4252 cmdline_fixed_string_t link_check; 4253 cmdline_fixed_string_t mode; 4254 }; 4255 4256 static void 4257 cmd_set_link_check_parsed(void *parsed_result, 4258 __attribute__((unused)) struct cmdline *cl, 4259 __attribute__((unused)) void *data) 4260 { 4261 struct cmd_set_link_check *res = parsed_result; 4262 no_link_check = (uint8_t)((strcmp(res->mode, "on") == 0) ? 0 : 1); 4263 } 4264 4265 cmdline_parse_token_string_t cmd_setlinkcheck_set = 4266 TOKEN_STRING_INITIALIZER(struct cmd_set_link_check, 4267 set, "set"); 4268 cmdline_parse_token_string_t cmd_setlinkcheck_link_check = 4269 TOKEN_STRING_INITIALIZER(struct cmd_set_link_check, 4270 link_check, "link_check"); 4271 cmdline_parse_token_string_t cmd_setlinkcheck_mode = 4272 TOKEN_STRING_INITIALIZER(struct cmd_set_link_check, 4273 mode, "on#off"); 4274 4275 4276 cmdline_parse_inst_t cmd_set_link_check = { 4277 .f = cmd_set_link_check_parsed, 4278 .help_str = "set link_check on|off: Enable/Disable link status check " 4279 "when starting/stopping a port", 4280 .data = NULL, 4281 .tokens = { 4282 (void *)&cmd_setlinkcheck_set, 4283 (void *)&cmd_setlinkcheck_link_check, 4284 (void *)&cmd_setlinkcheck_mode, 4285 NULL, 4286 }, 4287 }; 4288 4289 /* *** SET NIC BYPASS MODE *** */ 4290 struct cmd_set_bypass_mode_result { 4291 cmdline_fixed_string_t set; 4292 cmdline_fixed_string_t bypass; 4293 cmdline_fixed_string_t mode; 4294 cmdline_fixed_string_t value; 4295 uint8_t port_id; 4296 }; 4297 4298 static void 4299 cmd_set_bypass_mode_parsed(void *parsed_result, 4300 __attribute__((unused)) struct cmdline *cl, 4301 __attribute__((unused)) void *data) 4302 { 4303 struct cmd_set_bypass_mode_result *res = parsed_result; 4304 portid_t port_id = res->port_id; 4305 int32_t rc = -EINVAL; 4306 4307 #if defined RTE_LIBRTE_IXGBE_PMD && defined RTE_LIBRTE_IXGBE_BYPASS 4308 uint32_t bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NORMAL; 4309 4310 if (!strcmp(res->value, "bypass")) 4311 bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_BYPASS; 4312 else if (!strcmp(res->value, "isolate")) 4313 bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_ISOLATE; 4314 else 4315 bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NORMAL; 4316 4317 /* Set the bypass mode for the relevant port. */ 4318 rc = rte_pmd_ixgbe_bypass_state_set(port_id, &bypass_mode); 4319 #endif 4320 if (rc != 0) 4321 printf("\t Failed to set bypass mode for port = %d.\n", port_id); 4322 } 4323 4324 cmdline_parse_token_string_t cmd_setbypass_mode_set = 4325 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_mode_result, 4326 set, "set"); 4327 cmdline_parse_token_string_t cmd_setbypass_mode_bypass = 4328 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_mode_result, 4329 bypass, "bypass"); 4330 cmdline_parse_token_string_t cmd_setbypass_mode_mode = 4331 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_mode_result, 4332 mode, "mode"); 4333 cmdline_parse_token_string_t cmd_setbypass_mode_value = 4334 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_mode_result, 4335 value, "normal#bypass#isolate"); 4336 cmdline_parse_token_num_t cmd_setbypass_mode_port = 4337 TOKEN_NUM_INITIALIZER(struct cmd_set_bypass_mode_result, 4338 port_id, UINT8); 4339 4340 cmdline_parse_inst_t cmd_set_bypass_mode = { 4341 .f = cmd_set_bypass_mode_parsed, 4342 .help_str = "set bypass mode normal|bypass|isolate <port_id>: " 4343 "Set the NIC bypass mode for port_id", 4344 .data = NULL, 4345 .tokens = { 4346 (void *)&cmd_setbypass_mode_set, 4347 (void *)&cmd_setbypass_mode_bypass, 4348 (void *)&cmd_setbypass_mode_mode, 4349 (void *)&cmd_setbypass_mode_value, 4350 (void *)&cmd_setbypass_mode_port, 4351 NULL, 4352 }, 4353 }; 4354 4355 /* *** SET NIC BYPASS EVENT *** */ 4356 struct cmd_set_bypass_event_result { 4357 cmdline_fixed_string_t set; 4358 cmdline_fixed_string_t bypass; 4359 cmdline_fixed_string_t event; 4360 cmdline_fixed_string_t event_value; 4361 cmdline_fixed_string_t mode; 4362 cmdline_fixed_string_t mode_value; 4363 uint8_t port_id; 4364 }; 4365 4366 static void 4367 cmd_set_bypass_event_parsed(void *parsed_result, 4368 __attribute__((unused)) struct cmdline *cl, 4369 __attribute__((unused)) void *data) 4370 { 4371 int32_t rc = -EINVAL; 4372 struct cmd_set_bypass_event_result *res = parsed_result; 4373 portid_t port_id = res->port_id; 4374 4375 #if defined RTE_LIBRTE_IXGBE_PMD && defined RTE_LIBRTE_IXGBE_BYPASS 4376 uint32_t bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_NONE; 4377 uint32_t bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NORMAL; 4378 4379 if (!strcmp(res->event_value, "timeout")) 4380 bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_TIMEOUT; 4381 else if (!strcmp(res->event_value, "os_on")) 4382 bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_OS_ON; 4383 else if (!strcmp(res->event_value, "os_off")) 4384 bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_OS_OFF; 4385 else if (!strcmp(res->event_value, "power_on")) 4386 bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_POWER_ON; 4387 else if (!strcmp(res->event_value, "power_off")) 4388 bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_POWER_OFF; 4389 else 4390 bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_NONE; 4391 4392 if (!strcmp(res->mode_value, "bypass")) 4393 bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_BYPASS; 4394 else if (!strcmp(res->mode_value, "isolate")) 4395 bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_ISOLATE; 4396 else 4397 bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NORMAL; 4398 4399 /* Set the watchdog timeout. */ 4400 if (bypass_event == RTE_PMD_IXGBE_BYPASS_EVENT_TIMEOUT) { 4401 4402 rc = -EINVAL; 4403 if (RTE_PMD_IXGBE_BYPASS_TMT_VALID(bypass_timeout)) { 4404 rc = rte_pmd_ixgbe_bypass_wd_timeout_store(port_id, 4405 bypass_timeout); 4406 } 4407 if (rc != 0) { 4408 printf("Failed to set timeout value %u " 4409 "for port %d, errto code: %d.\n", 4410 bypass_timeout, port_id, rc); 4411 } 4412 } 4413 4414 /* Set the bypass event to transition to bypass mode. */ 4415 rc = rte_pmd_ixgbe_bypass_event_store(port_id, bypass_event, 4416 bypass_mode); 4417 #endif 4418 4419 if (rc != 0) 4420 printf("\t Failed to set bypass event for port = %d.\n", 4421 port_id); 4422 } 4423 4424 cmdline_parse_token_string_t cmd_setbypass_event_set = 4425 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result, 4426 set, "set"); 4427 cmdline_parse_token_string_t cmd_setbypass_event_bypass = 4428 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result, 4429 bypass, "bypass"); 4430 cmdline_parse_token_string_t cmd_setbypass_event_event = 4431 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result, 4432 event, "event"); 4433 cmdline_parse_token_string_t cmd_setbypass_event_event_value = 4434 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result, 4435 event_value, "none#timeout#os_off#os_on#power_on#power_off"); 4436 cmdline_parse_token_string_t cmd_setbypass_event_mode = 4437 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result, 4438 mode, "mode"); 4439 cmdline_parse_token_string_t cmd_setbypass_event_mode_value = 4440 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result, 4441 mode_value, "normal#bypass#isolate"); 4442 cmdline_parse_token_num_t cmd_setbypass_event_port = 4443 TOKEN_NUM_INITIALIZER(struct cmd_set_bypass_event_result, 4444 port_id, UINT8); 4445 4446 cmdline_parse_inst_t cmd_set_bypass_event = { 4447 .f = cmd_set_bypass_event_parsed, 4448 .help_str = "set bypass event none|timeout|os_on|os_off|power_on|" 4449 "power_off mode normal|bypass|isolate <port_id>: " 4450 "Set the NIC bypass event mode for port_id", 4451 .data = NULL, 4452 .tokens = { 4453 (void *)&cmd_setbypass_event_set, 4454 (void *)&cmd_setbypass_event_bypass, 4455 (void *)&cmd_setbypass_event_event, 4456 (void *)&cmd_setbypass_event_event_value, 4457 (void *)&cmd_setbypass_event_mode, 4458 (void *)&cmd_setbypass_event_mode_value, 4459 (void *)&cmd_setbypass_event_port, 4460 NULL, 4461 }, 4462 }; 4463 4464 4465 /* *** SET NIC BYPASS TIMEOUT *** */ 4466 struct cmd_set_bypass_timeout_result { 4467 cmdline_fixed_string_t set; 4468 cmdline_fixed_string_t bypass; 4469 cmdline_fixed_string_t timeout; 4470 cmdline_fixed_string_t value; 4471 }; 4472 4473 static void 4474 cmd_set_bypass_timeout_parsed(void *parsed_result, 4475 __attribute__((unused)) struct cmdline *cl, 4476 __attribute__((unused)) void *data) 4477 { 4478 __rte_unused struct cmd_set_bypass_timeout_result *res = parsed_result; 4479 4480 #if defined RTE_LIBRTE_IXGBE_PMD && defined RTE_LIBRTE_IXGBE_BYPASS 4481 if (!strcmp(res->value, "1.5")) 4482 bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_1_5_SEC; 4483 else if (!strcmp(res->value, "2")) 4484 bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_2_SEC; 4485 else if (!strcmp(res->value, "3")) 4486 bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_3_SEC; 4487 else if (!strcmp(res->value, "4")) 4488 bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_4_SEC; 4489 else if (!strcmp(res->value, "8")) 4490 bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_8_SEC; 4491 else if (!strcmp(res->value, "16")) 4492 bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_16_SEC; 4493 else if (!strcmp(res->value, "32")) 4494 bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_32_SEC; 4495 else 4496 bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_OFF; 4497 #endif 4498 } 4499 4500 cmdline_parse_token_string_t cmd_setbypass_timeout_set = 4501 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_timeout_result, 4502 set, "set"); 4503 cmdline_parse_token_string_t cmd_setbypass_timeout_bypass = 4504 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_timeout_result, 4505 bypass, "bypass"); 4506 cmdline_parse_token_string_t cmd_setbypass_timeout_timeout = 4507 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_timeout_result, 4508 timeout, "timeout"); 4509 cmdline_parse_token_string_t cmd_setbypass_timeout_value = 4510 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_timeout_result, 4511 value, "0#1.5#2#3#4#8#16#32"); 4512 4513 cmdline_parse_inst_t cmd_set_bypass_timeout = { 4514 .f = cmd_set_bypass_timeout_parsed, 4515 .help_str = "set bypass timeout 0|1.5|2|3|4|8|16|32: " 4516 "Set the NIC bypass watchdog timeout in seconds", 4517 .data = NULL, 4518 .tokens = { 4519 (void *)&cmd_setbypass_timeout_set, 4520 (void *)&cmd_setbypass_timeout_bypass, 4521 (void *)&cmd_setbypass_timeout_timeout, 4522 (void *)&cmd_setbypass_timeout_value, 4523 NULL, 4524 }, 4525 }; 4526 4527 /* *** SHOW NIC BYPASS MODE *** */ 4528 struct cmd_show_bypass_config_result { 4529 cmdline_fixed_string_t show; 4530 cmdline_fixed_string_t bypass; 4531 cmdline_fixed_string_t config; 4532 uint8_t port_id; 4533 }; 4534 4535 static void 4536 cmd_show_bypass_config_parsed(void *parsed_result, 4537 __attribute__((unused)) struct cmdline *cl, 4538 __attribute__((unused)) void *data) 4539 { 4540 struct cmd_show_bypass_config_result *res = parsed_result; 4541 portid_t port_id = res->port_id; 4542 int rc = -EINVAL; 4543 #if defined RTE_LIBRTE_IXGBE_PMD && defined RTE_LIBRTE_IXGBE_BYPASS 4544 uint32_t event_mode; 4545 uint32_t bypass_mode; 4546 uint32_t timeout = bypass_timeout; 4547 int i; 4548 4549 static const char * const timeouts[RTE_PMD_IXGBE_BYPASS_TMT_NUM] = 4550 {"off", "1.5", "2", "3", "4", "8", "16", "32"}; 4551 static const char * const modes[RTE_PMD_IXGBE_BYPASS_MODE_NUM] = 4552 {"UNKNOWN", "normal", "bypass", "isolate"}; 4553 static const char * const events[RTE_PMD_IXGBE_BYPASS_EVENT_NUM] = { 4554 "NONE", 4555 "OS/board on", 4556 "power supply on", 4557 "OS/board off", 4558 "power supply off", 4559 "timeout"}; 4560 int num_events = (sizeof events) / (sizeof events[0]); 4561 4562 /* Display the bypass mode.*/ 4563 if (rte_pmd_ixgbe_bypass_state_show(port_id, &bypass_mode) != 0) { 4564 printf("\tFailed to get bypass mode for port = %d\n", port_id); 4565 return; 4566 } 4567 else { 4568 if (!RTE_PMD_IXGBE_BYPASS_MODE_VALID(bypass_mode)) 4569 bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NONE; 4570 4571 printf("\tbypass mode = %s\n", modes[bypass_mode]); 4572 } 4573 4574 /* Display the bypass timeout.*/ 4575 if (!RTE_PMD_IXGBE_BYPASS_TMT_VALID(timeout)) 4576 timeout = RTE_PMD_IXGBE_BYPASS_TMT_OFF; 4577 4578 printf("\tbypass timeout = %s\n", timeouts[timeout]); 4579 4580 /* Display the bypass events and associated modes. */ 4581 for (i = RTE_PMD_IXGBE_BYPASS_EVENT_START; i < num_events; i++) { 4582 4583 if (rte_pmd_ixgbe_bypass_event_show(port_id, i, &event_mode)) { 4584 printf("\tFailed to get bypass mode for event = %s\n", 4585 events[i]); 4586 } else { 4587 if (!RTE_PMD_IXGBE_BYPASS_MODE_VALID(event_mode)) 4588 event_mode = RTE_PMD_IXGBE_BYPASS_MODE_NONE; 4589 4590 printf("\tbypass event: %-16s = %s\n", events[i], 4591 modes[event_mode]); 4592 } 4593 } 4594 #endif 4595 if (rc != 0) 4596 printf("\tFailed to get bypass configuration for port = %d\n", 4597 port_id); 4598 } 4599 4600 cmdline_parse_token_string_t cmd_showbypass_config_show = 4601 TOKEN_STRING_INITIALIZER(struct cmd_show_bypass_config_result, 4602 show, "show"); 4603 cmdline_parse_token_string_t cmd_showbypass_config_bypass = 4604 TOKEN_STRING_INITIALIZER(struct cmd_show_bypass_config_result, 4605 bypass, "bypass"); 4606 cmdline_parse_token_string_t cmd_showbypass_config_config = 4607 TOKEN_STRING_INITIALIZER(struct cmd_show_bypass_config_result, 4608 config, "config"); 4609 cmdline_parse_token_num_t cmd_showbypass_config_port = 4610 TOKEN_NUM_INITIALIZER(struct cmd_show_bypass_config_result, 4611 port_id, UINT8); 4612 4613 cmdline_parse_inst_t cmd_show_bypass_config = { 4614 .f = cmd_show_bypass_config_parsed, 4615 .help_str = "show bypass config <port_id>: " 4616 "Show the NIC bypass config for port_id", 4617 .data = NULL, 4618 .tokens = { 4619 (void *)&cmd_showbypass_config_show, 4620 (void *)&cmd_showbypass_config_bypass, 4621 (void *)&cmd_showbypass_config_config, 4622 (void *)&cmd_showbypass_config_port, 4623 NULL, 4624 }, 4625 }; 4626 4627 #ifdef RTE_LIBRTE_PMD_BOND 4628 /* *** SET BONDING MODE *** */ 4629 struct cmd_set_bonding_mode_result { 4630 cmdline_fixed_string_t set; 4631 cmdline_fixed_string_t bonding; 4632 cmdline_fixed_string_t mode; 4633 uint8_t value; 4634 uint8_t port_id; 4635 }; 4636 4637 static void cmd_set_bonding_mode_parsed(void *parsed_result, 4638 __attribute__((unused)) struct cmdline *cl, 4639 __attribute__((unused)) void *data) 4640 { 4641 struct cmd_set_bonding_mode_result *res = parsed_result; 4642 portid_t port_id = res->port_id; 4643 4644 /* Set the bonding mode for the relevant port. */ 4645 if (0 != rte_eth_bond_mode_set(port_id, res->value)) 4646 printf("\t Failed to set bonding mode for port = %d.\n", port_id); 4647 } 4648 4649 cmdline_parse_token_string_t cmd_setbonding_mode_set = 4650 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result, 4651 set, "set"); 4652 cmdline_parse_token_string_t cmd_setbonding_mode_bonding = 4653 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result, 4654 bonding, "bonding"); 4655 cmdline_parse_token_string_t cmd_setbonding_mode_mode = 4656 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result, 4657 mode, "mode"); 4658 cmdline_parse_token_num_t cmd_setbonding_mode_value = 4659 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_mode_result, 4660 value, UINT8); 4661 cmdline_parse_token_num_t cmd_setbonding_mode_port = 4662 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_mode_result, 4663 port_id, UINT8); 4664 4665 cmdline_parse_inst_t cmd_set_bonding_mode = { 4666 .f = cmd_set_bonding_mode_parsed, 4667 .help_str = "set bonding mode <mode_value> <port_id>: " 4668 "Set the bonding mode for port_id", 4669 .data = NULL, 4670 .tokens = { 4671 (void *) &cmd_setbonding_mode_set, 4672 (void *) &cmd_setbonding_mode_bonding, 4673 (void *) &cmd_setbonding_mode_mode, 4674 (void *) &cmd_setbonding_mode_value, 4675 (void *) &cmd_setbonding_mode_port, 4676 NULL 4677 } 4678 }; 4679 4680 /* *** SET BONDING SLOW_QUEUE SW/HW *** */ 4681 struct cmd_set_bonding_lacp_dedicated_queues_result { 4682 cmdline_fixed_string_t set; 4683 cmdline_fixed_string_t bonding; 4684 cmdline_fixed_string_t lacp; 4685 cmdline_fixed_string_t dedicated_queues; 4686 uint8_t port_id; 4687 cmdline_fixed_string_t mode; 4688 }; 4689 4690 static void cmd_set_bonding_lacp_dedicated_queues_parsed(void *parsed_result, 4691 __attribute__((unused)) struct cmdline *cl, 4692 __attribute__((unused)) void *data) 4693 { 4694 struct cmd_set_bonding_lacp_dedicated_queues_result *res = parsed_result; 4695 portid_t port_id = res->port_id; 4696 struct rte_port *port; 4697 4698 port = &ports[port_id]; 4699 4700 /** Check if the port is not started **/ 4701 if (port->port_status != RTE_PORT_STOPPED) { 4702 printf("Please stop port %d first\n", port_id); 4703 return; 4704 } 4705 4706 if (!strcmp(res->mode, "enable")) { 4707 if (rte_eth_bond_8023ad_dedicated_queues_enable(port_id) == 0) 4708 printf("Dedicate queues for LACP control packets" 4709 " enabled\n"); 4710 else 4711 printf("Enabling dedicate queues for LACP control " 4712 "packets on port %d failed\n", port_id); 4713 } else if (!strcmp(res->mode, "disable")) { 4714 if (rte_eth_bond_8023ad_dedicated_queues_disable(port_id) == 0) 4715 printf("Dedicated queues for LACP control packets " 4716 "disabled\n"); 4717 else 4718 printf("Disabling dedicated queues for LACP control " 4719 "traffic on port %d failed\n", port_id); 4720 } 4721 } 4722 4723 cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_set = 4724 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result, 4725 set, "set"); 4726 cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_bonding = 4727 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result, 4728 bonding, "bonding"); 4729 cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_lacp = 4730 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result, 4731 lacp, "lacp"); 4732 cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_dedicated_queues = 4733 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result, 4734 dedicated_queues, "dedicated_queues"); 4735 cmdline_parse_token_num_t cmd_setbonding_lacp_dedicated_queues_port_id = 4736 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result, 4737 port_id, UINT8); 4738 cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_mode = 4739 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result, 4740 mode, "enable#disable"); 4741 4742 cmdline_parse_inst_t cmd_set_lacp_dedicated_queues = { 4743 .f = cmd_set_bonding_lacp_dedicated_queues_parsed, 4744 .help_str = "set bonding lacp dedicated_queues <port_id> " 4745 "enable|disable: " 4746 "Enable/disable dedicated queues for LACP control traffic for port_id", 4747 .data = NULL, 4748 .tokens = { 4749 (void *)&cmd_setbonding_lacp_dedicated_queues_set, 4750 (void *)&cmd_setbonding_lacp_dedicated_queues_bonding, 4751 (void *)&cmd_setbonding_lacp_dedicated_queues_lacp, 4752 (void *)&cmd_setbonding_lacp_dedicated_queues_dedicated_queues, 4753 (void *)&cmd_setbonding_lacp_dedicated_queues_port_id, 4754 (void *)&cmd_setbonding_lacp_dedicated_queues_mode, 4755 NULL 4756 } 4757 }; 4758 4759 /* *** SET BALANCE XMIT POLICY *** */ 4760 struct cmd_set_bonding_balance_xmit_policy_result { 4761 cmdline_fixed_string_t set; 4762 cmdline_fixed_string_t bonding; 4763 cmdline_fixed_string_t balance_xmit_policy; 4764 uint8_t port_id; 4765 cmdline_fixed_string_t policy; 4766 }; 4767 4768 static void cmd_set_bonding_balance_xmit_policy_parsed(void *parsed_result, 4769 __attribute__((unused)) struct cmdline *cl, 4770 __attribute__((unused)) void *data) 4771 { 4772 struct cmd_set_bonding_balance_xmit_policy_result *res = parsed_result; 4773 portid_t port_id = res->port_id; 4774 uint8_t policy; 4775 4776 if (!strcmp(res->policy, "l2")) { 4777 policy = BALANCE_XMIT_POLICY_LAYER2; 4778 } else if (!strcmp(res->policy, "l23")) { 4779 policy = BALANCE_XMIT_POLICY_LAYER23; 4780 } else if (!strcmp(res->policy, "l34")) { 4781 policy = BALANCE_XMIT_POLICY_LAYER34; 4782 } else { 4783 printf("\t Invalid xmit policy selection"); 4784 return; 4785 } 4786 4787 /* Set the bonding mode for the relevant port. */ 4788 if (0 != rte_eth_bond_xmit_policy_set(port_id, policy)) { 4789 printf("\t Failed to set bonding balance xmit policy for port = %d.\n", 4790 port_id); 4791 } 4792 } 4793 4794 cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_set = 4795 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result, 4796 set, "set"); 4797 cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_bonding = 4798 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result, 4799 bonding, "bonding"); 4800 cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_balance_xmit_policy = 4801 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result, 4802 balance_xmit_policy, "balance_xmit_policy"); 4803 cmdline_parse_token_num_t cmd_setbonding_balance_xmit_policy_port = 4804 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result, 4805 port_id, UINT8); 4806 cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_policy = 4807 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result, 4808 policy, "l2#l23#l34"); 4809 4810 cmdline_parse_inst_t cmd_set_balance_xmit_policy = { 4811 .f = cmd_set_bonding_balance_xmit_policy_parsed, 4812 .help_str = "set bonding balance_xmit_policy <port_id> " 4813 "l2|l23|l34: " 4814 "Set the bonding balance_xmit_policy for port_id", 4815 .data = NULL, 4816 .tokens = { 4817 (void *)&cmd_setbonding_balance_xmit_policy_set, 4818 (void *)&cmd_setbonding_balance_xmit_policy_bonding, 4819 (void *)&cmd_setbonding_balance_xmit_policy_balance_xmit_policy, 4820 (void *)&cmd_setbonding_balance_xmit_policy_port, 4821 (void *)&cmd_setbonding_balance_xmit_policy_policy, 4822 NULL 4823 } 4824 }; 4825 4826 /* *** SHOW NIC BONDING CONFIGURATION *** */ 4827 struct cmd_show_bonding_config_result { 4828 cmdline_fixed_string_t show; 4829 cmdline_fixed_string_t bonding; 4830 cmdline_fixed_string_t config; 4831 portid_t port_id; 4832 }; 4833 4834 static void cmd_show_bonding_config_parsed(void *parsed_result, 4835 __attribute__((unused)) struct cmdline *cl, 4836 __attribute__((unused)) void *data) 4837 { 4838 struct cmd_show_bonding_config_result *res = parsed_result; 4839 int bonding_mode, agg_mode; 4840 portid_t slaves[RTE_MAX_ETHPORTS]; 4841 int num_slaves, num_active_slaves; 4842 int primary_id; 4843 int i; 4844 portid_t port_id = res->port_id; 4845 4846 /* Display the bonding mode.*/ 4847 bonding_mode = rte_eth_bond_mode_get(port_id); 4848 if (bonding_mode < 0) { 4849 printf("\tFailed to get bonding mode for port = %d\n", port_id); 4850 return; 4851 } else 4852 printf("\tBonding mode: %d\n", bonding_mode); 4853 4854 if (bonding_mode == BONDING_MODE_BALANCE) { 4855 int balance_xmit_policy; 4856 4857 balance_xmit_policy = rte_eth_bond_xmit_policy_get(port_id); 4858 if (balance_xmit_policy < 0) { 4859 printf("\tFailed to get balance xmit policy for port = %d\n", 4860 port_id); 4861 return; 4862 } else { 4863 printf("\tBalance Xmit Policy: "); 4864 4865 switch (balance_xmit_policy) { 4866 case BALANCE_XMIT_POLICY_LAYER2: 4867 printf("BALANCE_XMIT_POLICY_LAYER2"); 4868 break; 4869 case BALANCE_XMIT_POLICY_LAYER23: 4870 printf("BALANCE_XMIT_POLICY_LAYER23"); 4871 break; 4872 case BALANCE_XMIT_POLICY_LAYER34: 4873 printf("BALANCE_XMIT_POLICY_LAYER34"); 4874 break; 4875 } 4876 printf("\n"); 4877 } 4878 } 4879 4880 if (bonding_mode == BONDING_MODE_8023AD) { 4881 agg_mode = rte_eth_bond_8023ad_agg_selection_get(port_id); 4882 printf("\tIEEE802.3AD Aggregator Mode: "); 4883 switch (agg_mode) { 4884 case AGG_BANDWIDTH: 4885 printf("bandwidth"); 4886 break; 4887 case AGG_STABLE: 4888 printf("stable"); 4889 break; 4890 case AGG_COUNT: 4891 printf("count"); 4892 break; 4893 } 4894 printf("\n"); 4895 } 4896 4897 num_slaves = rte_eth_bond_slaves_get(port_id, slaves, RTE_MAX_ETHPORTS); 4898 4899 if (num_slaves < 0) { 4900 printf("\tFailed to get slave list for port = %d\n", port_id); 4901 return; 4902 } 4903 if (num_slaves > 0) { 4904 printf("\tSlaves (%d): [", num_slaves); 4905 for (i = 0; i < num_slaves - 1; i++) 4906 printf("%d ", slaves[i]); 4907 4908 printf("%d]\n", slaves[num_slaves - 1]); 4909 } else { 4910 printf("\tSlaves: []\n"); 4911 4912 } 4913 4914 num_active_slaves = rte_eth_bond_active_slaves_get(port_id, slaves, 4915 RTE_MAX_ETHPORTS); 4916 4917 if (num_active_slaves < 0) { 4918 printf("\tFailed to get active slave list for port = %d\n", port_id); 4919 return; 4920 } 4921 if (num_active_slaves > 0) { 4922 printf("\tActive Slaves (%d): [", num_active_slaves); 4923 for (i = 0; i < num_active_slaves - 1; i++) 4924 printf("%d ", slaves[i]); 4925 4926 printf("%d]\n", slaves[num_active_slaves - 1]); 4927 4928 } else { 4929 printf("\tActive Slaves: []\n"); 4930 4931 } 4932 4933 primary_id = rte_eth_bond_primary_get(port_id); 4934 if (primary_id < 0) { 4935 printf("\tFailed to get primary slave for port = %d\n", port_id); 4936 return; 4937 } else 4938 printf("\tPrimary: [%d]\n", primary_id); 4939 4940 } 4941 4942 cmdline_parse_token_string_t cmd_showbonding_config_show = 4943 TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result, 4944 show, "show"); 4945 cmdline_parse_token_string_t cmd_showbonding_config_bonding = 4946 TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result, 4947 bonding, "bonding"); 4948 cmdline_parse_token_string_t cmd_showbonding_config_config = 4949 TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result, 4950 config, "config"); 4951 cmdline_parse_token_num_t cmd_showbonding_config_port = 4952 TOKEN_NUM_INITIALIZER(struct cmd_show_bonding_config_result, 4953 port_id, UINT8); 4954 4955 cmdline_parse_inst_t cmd_show_bonding_config = { 4956 .f = cmd_show_bonding_config_parsed, 4957 .help_str = "show bonding config <port_id>: " 4958 "Show the bonding config for port_id", 4959 .data = NULL, 4960 .tokens = { 4961 (void *)&cmd_showbonding_config_show, 4962 (void *)&cmd_showbonding_config_bonding, 4963 (void *)&cmd_showbonding_config_config, 4964 (void *)&cmd_showbonding_config_port, 4965 NULL 4966 } 4967 }; 4968 4969 /* *** SET BONDING PRIMARY *** */ 4970 struct cmd_set_bonding_primary_result { 4971 cmdline_fixed_string_t set; 4972 cmdline_fixed_string_t bonding; 4973 cmdline_fixed_string_t primary; 4974 uint8_t slave_id; 4975 uint8_t port_id; 4976 }; 4977 4978 static void cmd_set_bonding_primary_parsed(void *parsed_result, 4979 __attribute__((unused)) struct cmdline *cl, 4980 __attribute__((unused)) void *data) 4981 { 4982 struct cmd_set_bonding_primary_result *res = parsed_result; 4983 portid_t master_port_id = res->port_id; 4984 portid_t slave_port_id = res->slave_id; 4985 4986 /* Set the primary slave for a bonded device. */ 4987 if (0 != rte_eth_bond_primary_set(master_port_id, slave_port_id)) { 4988 printf("\t Failed to set primary slave for port = %d.\n", 4989 master_port_id); 4990 return; 4991 } 4992 init_port_config(); 4993 } 4994 4995 cmdline_parse_token_string_t cmd_setbonding_primary_set = 4996 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result, 4997 set, "set"); 4998 cmdline_parse_token_string_t cmd_setbonding_primary_bonding = 4999 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result, 5000 bonding, "bonding"); 5001 cmdline_parse_token_string_t cmd_setbonding_primary_primary = 5002 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result, 5003 primary, "primary"); 5004 cmdline_parse_token_num_t cmd_setbonding_primary_slave = 5005 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_primary_result, 5006 slave_id, UINT8); 5007 cmdline_parse_token_num_t cmd_setbonding_primary_port = 5008 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_primary_result, 5009 port_id, UINT8); 5010 5011 cmdline_parse_inst_t cmd_set_bonding_primary = { 5012 .f = cmd_set_bonding_primary_parsed, 5013 .help_str = "set bonding primary <slave_id> <port_id>: " 5014 "Set the primary slave for port_id", 5015 .data = NULL, 5016 .tokens = { 5017 (void *)&cmd_setbonding_primary_set, 5018 (void *)&cmd_setbonding_primary_bonding, 5019 (void *)&cmd_setbonding_primary_primary, 5020 (void *)&cmd_setbonding_primary_slave, 5021 (void *)&cmd_setbonding_primary_port, 5022 NULL 5023 } 5024 }; 5025 5026 /* *** ADD SLAVE *** */ 5027 struct cmd_add_bonding_slave_result { 5028 cmdline_fixed_string_t add; 5029 cmdline_fixed_string_t bonding; 5030 cmdline_fixed_string_t slave; 5031 uint8_t slave_id; 5032 uint8_t port_id; 5033 }; 5034 5035 static void cmd_add_bonding_slave_parsed(void *parsed_result, 5036 __attribute__((unused)) struct cmdline *cl, 5037 __attribute__((unused)) void *data) 5038 { 5039 struct cmd_add_bonding_slave_result *res = parsed_result; 5040 portid_t master_port_id = res->port_id; 5041 portid_t slave_port_id = res->slave_id; 5042 5043 /* add the slave for a bonded device. */ 5044 if (0 != rte_eth_bond_slave_add(master_port_id, slave_port_id)) { 5045 printf("\t Failed to add slave %d to master port = %d.\n", 5046 slave_port_id, master_port_id); 5047 return; 5048 } 5049 init_port_config(); 5050 set_port_slave_flag(slave_port_id); 5051 } 5052 5053 cmdline_parse_token_string_t cmd_addbonding_slave_add = 5054 TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result, 5055 add, "add"); 5056 cmdline_parse_token_string_t cmd_addbonding_slave_bonding = 5057 TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result, 5058 bonding, "bonding"); 5059 cmdline_parse_token_string_t cmd_addbonding_slave_slave = 5060 TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result, 5061 slave, "slave"); 5062 cmdline_parse_token_num_t cmd_addbonding_slave_slaveid = 5063 TOKEN_NUM_INITIALIZER(struct cmd_add_bonding_slave_result, 5064 slave_id, UINT8); 5065 cmdline_parse_token_num_t cmd_addbonding_slave_port = 5066 TOKEN_NUM_INITIALIZER(struct cmd_add_bonding_slave_result, 5067 port_id, UINT8); 5068 5069 cmdline_parse_inst_t cmd_add_bonding_slave = { 5070 .f = cmd_add_bonding_slave_parsed, 5071 .help_str = "add bonding slave <slave_id> <port_id>: " 5072 "Add a slave device to a bonded device", 5073 .data = NULL, 5074 .tokens = { 5075 (void *)&cmd_addbonding_slave_add, 5076 (void *)&cmd_addbonding_slave_bonding, 5077 (void *)&cmd_addbonding_slave_slave, 5078 (void *)&cmd_addbonding_slave_slaveid, 5079 (void *)&cmd_addbonding_slave_port, 5080 NULL 5081 } 5082 }; 5083 5084 /* *** REMOVE SLAVE *** */ 5085 struct cmd_remove_bonding_slave_result { 5086 cmdline_fixed_string_t remove; 5087 cmdline_fixed_string_t bonding; 5088 cmdline_fixed_string_t slave; 5089 uint8_t slave_id; 5090 uint8_t port_id; 5091 }; 5092 5093 static void cmd_remove_bonding_slave_parsed(void *parsed_result, 5094 __attribute__((unused)) struct cmdline *cl, 5095 __attribute__((unused)) void *data) 5096 { 5097 struct cmd_remove_bonding_slave_result *res = parsed_result; 5098 portid_t master_port_id = res->port_id; 5099 portid_t slave_port_id = res->slave_id; 5100 5101 /* remove the slave from a bonded device. */ 5102 if (0 != rte_eth_bond_slave_remove(master_port_id, slave_port_id)) { 5103 printf("\t Failed to remove slave %d from master port = %d.\n", 5104 slave_port_id, master_port_id); 5105 return; 5106 } 5107 init_port_config(); 5108 clear_port_slave_flag(slave_port_id); 5109 } 5110 5111 cmdline_parse_token_string_t cmd_removebonding_slave_remove = 5112 TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result, 5113 remove, "remove"); 5114 cmdline_parse_token_string_t cmd_removebonding_slave_bonding = 5115 TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result, 5116 bonding, "bonding"); 5117 cmdline_parse_token_string_t cmd_removebonding_slave_slave = 5118 TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result, 5119 slave, "slave"); 5120 cmdline_parse_token_num_t cmd_removebonding_slave_slaveid = 5121 TOKEN_NUM_INITIALIZER(struct cmd_remove_bonding_slave_result, 5122 slave_id, UINT8); 5123 cmdline_parse_token_num_t cmd_removebonding_slave_port = 5124 TOKEN_NUM_INITIALIZER(struct cmd_remove_bonding_slave_result, 5125 port_id, UINT8); 5126 5127 cmdline_parse_inst_t cmd_remove_bonding_slave = { 5128 .f = cmd_remove_bonding_slave_parsed, 5129 .help_str = "remove bonding slave <slave_id> <port_id>: " 5130 "Remove a slave device from a bonded device", 5131 .data = NULL, 5132 .tokens = { 5133 (void *)&cmd_removebonding_slave_remove, 5134 (void *)&cmd_removebonding_slave_bonding, 5135 (void *)&cmd_removebonding_slave_slave, 5136 (void *)&cmd_removebonding_slave_slaveid, 5137 (void *)&cmd_removebonding_slave_port, 5138 NULL 5139 } 5140 }; 5141 5142 /* *** CREATE BONDED DEVICE *** */ 5143 struct cmd_create_bonded_device_result { 5144 cmdline_fixed_string_t create; 5145 cmdline_fixed_string_t bonded; 5146 cmdline_fixed_string_t device; 5147 uint8_t mode; 5148 uint8_t socket; 5149 }; 5150 5151 static int bond_dev_num = 0; 5152 5153 static void cmd_create_bonded_device_parsed(void *parsed_result, 5154 __attribute__((unused)) struct cmdline *cl, 5155 __attribute__((unused)) void *data) 5156 { 5157 struct cmd_create_bonded_device_result *res = parsed_result; 5158 char ethdev_name[RTE_ETH_NAME_MAX_LEN]; 5159 int port_id; 5160 5161 if (test_done == 0) { 5162 printf("Please stop forwarding first\n"); 5163 return; 5164 } 5165 5166 snprintf(ethdev_name, RTE_ETH_NAME_MAX_LEN, "net_bonding_testpmd_%d", 5167 bond_dev_num++); 5168 5169 /* Create a new bonded device. */ 5170 port_id = rte_eth_bond_create(ethdev_name, res->mode, res->socket); 5171 if (port_id < 0) { 5172 printf("\t Failed to create bonded device.\n"); 5173 return; 5174 } else { 5175 printf("Created new bonded device %s on (port %d).\n", ethdev_name, 5176 port_id); 5177 5178 /* Update number of ports */ 5179 nb_ports = rte_eth_dev_count(); 5180 reconfig(port_id, res->socket); 5181 rte_eth_promiscuous_enable(port_id); 5182 } 5183 5184 } 5185 5186 cmdline_parse_token_string_t cmd_createbonded_device_create = 5187 TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result, 5188 create, "create"); 5189 cmdline_parse_token_string_t cmd_createbonded_device_bonded = 5190 TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result, 5191 bonded, "bonded"); 5192 cmdline_parse_token_string_t cmd_createbonded_device_device = 5193 TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result, 5194 device, "device"); 5195 cmdline_parse_token_num_t cmd_createbonded_device_mode = 5196 TOKEN_NUM_INITIALIZER(struct cmd_create_bonded_device_result, 5197 mode, UINT8); 5198 cmdline_parse_token_num_t cmd_createbonded_device_socket = 5199 TOKEN_NUM_INITIALIZER(struct cmd_create_bonded_device_result, 5200 socket, UINT8); 5201 5202 cmdline_parse_inst_t cmd_create_bonded_device = { 5203 .f = cmd_create_bonded_device_parsed, 5204 .help_str = "create bonded device <mode> <socket>: " 5205 "Create a new bonded device with specific bonding mode and socket", 5206 .data = NULL, 5207 .tokens = { 5208 (void *)&cmd_createbonded_device_create, 5209 (void *)&cmd_createbonded_device_bonded, 5210 (void *)&cmd_createbonded_device_device, 5211 (void *)&cmd_createbonded_device_mode, 5212 (void *)&cmd_createbonded_device_socket, 5213 NULL 5214 } 5215 }; 5216 5217 /* *** SET MAC ADDRESS IN BONDED DEVICE *** */ 5218 struct cmd_set_bond_mac_addr_result { 5219 cmdline_fixed_string_t set; 5220 cmdline_fixed_string_t bonding; 5221 cmdline_fixed_string_t mac_addr; 5222 uint8_t port_num; 5223 struct ether_addr address; 5224 }; 5225 5226 static void cmd_set_bond_mac_addr_parsed(void *parsed_result, 5227 __attribute__((unused)) struct cmdline *cl, 5228 __attribute__((unused)) void *data) 5229 { 5230 struct cmd_set_bond_mac_addr_result *res = parsed_result; 5231 int ret; 5232 5233 if (port_id_is_invalid(res->port_num, ENABLED_WARN)) 5234 return; 5235 5236 ret = rte_eth_bond_mac_address_set(res->port_num, &res->address); 5237 5238 /* check the return value and print it if is < 0 */ 5239 if (ret < 0) 5240 printf("set_bond_mac_addr error: (%s)\n", strerror(-ret)); 5241 } 5242 5243 cmdline_parse_token_string_t cmd_set_bond_mac_addr_set = 5244 TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, set, "set"); 5245 cmdline_parse_token_string_t cmd_set_bond_mac_addr_bonding = 5246 TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, bonding, 5247 "bonding"); 5248 cmdline_parse_token_string_t cmd_set_bond_mac_addr_mac = 5249 TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, mac_addr, 5250 "mac_addr"); 5251 cmdline_parse_token_num_t cmd_set_bond_mac_addr_portnum = 5252 TOKEN_NUM_INITIALIZER(struct cmd_set_bond_mac_addr_result, port_num, UINT8); 5253 cmdline_parse_token_etheraddr_t cmd_set_bond_mac_addr_addr = 5254 TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_bond_mac_addr_result, address); 5255 5256 cmdline_parse_inst_t cmd_set_bond_mac_addr = { 5257 .f = cmd_set_bond_mac_addr_parsed, 5258 .data = (void *) 0, 5259 .help_str = "set bonding mac_addr <port_id> <mac_addr>", 5260 .tokens = { 5261 (void *)&cmd_set_bond_mac_addr_set, 5262 (void *)&cmd_set_bond_mac_addr_bonding, 5263 (void *)&cmd_set_bond_mac_addr_mac, 5264 (void *)&cmd_set_bond_mac_addr_portnum, 5265 (void *)&cmd_set_bond_mac_addr_addr, 5266 NULL 5267 } 5268 }; 5269 5270 5271 /* *** SET LINK STATUS MONITORING POLLING PERIOD ON BONDED DEVICE *** */ 5272 struct cmd_set_bond_mon_period_result { 5273 cmdline_fixed_string_t set; 5274 cmdline_fixed_string_t bonding; 5275 cmdline_fixed_string_t mon_period; 5276 uint8_t port_num; 5277 uint32_t period_ms; 5278 }; 5279 5280 static void cmd_set_bond_mon_period_parsed(void *parsed_result, 5281 __attribute__((unused)) struct cmdline *cl, 5282 __attribute__((unused)) void *data) 5283 { 5284 struct cmd_set_bond_mon_period_result *res = parsed_result; 5285 int ret; 5286 5287 if (res->port_num >= nb_ports) { 5288 printf("Port id %d must be less than %d\n", res->port_num, nb_ports); 5289 return; 5290 } 5291 5292 ret = rte_eth_bond_link_monitoring_set(res->port_num, res->period_ms); 5293 5294 /* check the return value and print it if is < 0 */ 5295 if (ret < 0) 5296 printf("set_bond_mac_addr error: (%s)\n", strerror(-ret)); 5297 } 5298 5299 cmdline_parse_token_string_t cmd_set_bond_mon_period_set = 5300 TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mon_period_result, 5301 set, "set"); 5302 cmdline_parse_token_string_t cmd_set_bond_mon_period_bonding = 5303 TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mon_period_result, 5304 bonding, "bonding"); 5305 cmdline_parse_token_string_t cmd_set_bond_mon_period_mon_period = 5306 TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mon_period_result, 5307 mon_period, "mon_period"); 5308 cmdline_parse_token_num_t cmd_set_bond_mon_period_portnum = 5309 TOKEN_NUM_INITIALIZER(struct cmd_set_bond_mon_period_result, 5310 port_num, UINT8); 5311 cmdline_parse_token_num_t cmd_set_bond_mon_period_period_ms = 5312 TOKEN_NUM_INITIALIZER(struct cmd_set_bond_mon_period_result, 5313 period_ms, UINT32); 5314 5315 cmdline_parse_inst_t cmd_set_bond_mon_period = { 5316 .f = cmd_set_bond_mon_period_parsed, 5317 .data = (void *) 0, 5318 .help_str = "set bonding mon_period <port_id> <period_ms>", 5319 .tokens = { 5320 (void *)&cmd_set_bond_mon_period_set, 5321 (void *)&cmd_set_bond_mon_period_bonding, 5322 (void *)&cmd_set_bond_mon_period_mon_period, 5323 (void *)&cmd_set_bond_mon_period_portnum, 5324 (void *)&cmd_set_bond_mon_period_period_ms, 5325 NULL 5326 } 5327 }; 5328 5329 5330 5331 struct cmd_set_bonding_agg_mode_policy_result { 5332 cmdline_fixed_string_t set; 5333 cmdline_fixed_string_t bonding; 5334 cmdline_fixed_string_t agg_mode; 5335 uint8_t port_num; 5336 cmdline_fixed_string_t policy; 5337 }; 5338 5339 5340 static void 5341 cmd_set_bonding_agg_mode(void *parsed_result, 5342 __attribute__((unused)) struct cmdline *cl, 5343 __attribute__((unused)) void *data) 5344 { 5345 struct cmd_set_bonding_agg_mode_policy_result *res = parsed_result; 5346 uint8_t policy = AGG_BANDWIDTH; 5347 5348 if (res->port_num >= nb_ports) { 5349 printf("Port id %d must be less than %d\n", 5350 res->port_num, nb_ports); 5351 return; 5352 } 5353 5354 if (!strcmp(res->policy, "bandwidth")) 5355 policy = AGG_BANDWIDTH; 5356 else if (!strcmp(res->policy, "stable")) 5357 policy = AGG_STABLE; 5358 else if (!strcmp(res->policy, "count")) 5359 policy = AGG_COUNT; 5360 5361 rte_eth_bond_8023ad_agg_selection_set(res->port_num, policy); 5362 } 5363 5364 5365 cmdline_parse_token_string_t cmd_set_bonding_agg_mode_set = 5366 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result, 5367 set, "set"); 5368 cmdline_parse_token_string_t cmd_set_bonding_agg_mode_bonding = 5369 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result, 5370 bonding, "bonding"); 5371 5372 cmdline_parse_token_string_t cmd_set_bonding_agg_mode_agg_mode = 5373 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result, 5374 agg_mode, "agg_mode"); 5375 5376 cmdline_parse_token_num_t cmd_set_bonding_agg_mode_portnum = 5377 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result, 5378 port_num, UINT8); 5379 5380 cmdline_parse_token_string_t cmd_set_bonding_agg_mode_policy_string = 5381 TOKEN_STRING_INITIALIZER( 5382 struct cmd_set_bonding_balance_xmit_policy_result, 5383 policy, "stable#bandwidth#count"); 5384 5385 cmdline_parse_inst_t cmd_set_bonding_agg_mode_policy = { 5386 .f = cmd_set_bonding_agg_mode, 5387 .data = (void *) 0, 5388 .help_str = "set bonding mode IEEE802.3AD aggregator policy <port_id> <agg_name>", 5389 .tokens = { 5390 (void *)&cmd_set_bonding_agg_mode_set, 5391 (void *)&cmd_set_bonding_agg_mode_bonding, 5392 (void *)&cmd_set_bonding_agg_mode_agg_mode, 5393 (void *)&cmd_set_bonding_agg_mode_portnum, 5394 (void *)&cmd_set_bonding_agg_mode_policy_string, 5395 NULL 5396 } 5397 }; 5398 5399 5400 #endif /* RTE_LIBRTE_PMD_BOND */ 5401 5402 /* *** SET FORWARDING MODE *** */ 5403 struct cmd_set_fwd_mode_result { 5404 cmdline_fixed_string_t set; 5405 cmdline_fixed_string_t fwd; 5406 cmdline_fixed_string_t mode; 5407 }; 5408 5409 static void cmd_set_fwd_mode_parsed(void *parsed_result, 5410 __attribute__((unused)) struct cmdline *cl, 5411 __attribute__((unused)) void *data) 5412 { 5413 struct cmd_set_fwd_mode_result *res = parsed_result; 5414 5415 retry_enabled = 0; 5416 set_pkt_forwarding_mode(res->mode); 5417 } 5418 5419 cmdline_parse_token_string_t cmd_setfwd_set = 5420 TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_mode_result, set, "set"); 5421 cmdline_parse_token_string_t cmd_setfwd_fwd = 5422 TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_mode_result, fwd, "fwd"); 5423 cmdline_parse_token_string_t cmd_setfwd_mode = 5424 TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_mode_result, mode, 5425 "" /* defined at init */); 5426 5427 cmdline_parse_inst_t cmd_set_fwd_mode = { 5428 .f = cmd_set_fwd_mode_parsed, 5429 .data = NULL, 5430 .help_str = NULL, /* defined at init */ 5431 .tokens = { 5432 (void *)&cmd_setfwd_set, 5433 (void *)&cmd_setfwd_fwd, 5434 (void *)&cmd_setfwd_mode, 5435 NULL, 5436 }, 5437 }; 5438 5439 static void cmd_set_fwd_mode_init(void) 5440 { 5441 char *modes, *c; 5442 static char token[128]; 5443 static char help[256]; 5444 cmdline_parse_token_string_t *token_struct; 5445 5446 modes = list_pkt_forwarding_modes(); 5447 snprintf(help, sizeof(help), "set fwd %s: " 5448 "Set packet forwarding mode", modes); 5449 cmd_set_fwd_mode.help_str = help; 5450 5451 /* string token separator is # */ 5452 for (c = token; *modes != '\0'; modes++) 5453 if (*modes == '|') 5454 *c++ = '#'; 5455 else 5456 *c++ = *modes; 5457 token_struct = (cmdline_parse_token_string_t*)cmd_set_fwd_mode.tokens[2]; 5458 token_struct->string_data.str = token; 5459 } 5460 5461 /* *** SET RETRY FORWARDING MODE *** */ 5462 struct cmd_set_fwd_retry_mode_result { 5463 cmdline_fixed_string_t set; 5464 cmdline_fixed_string_t fwd; 5465 cmdline_fixed_string_t mode; 5466 cmdline_fixed_string_t retry; 5467 }; 5468 5469 static void cmd_set_fwd_retry_mode_parsed(void *parsed_result, 5470 __attribute__((unused)) struct cmdline *cl, 5471 __attribute__((unused)) void *data) 5472 { 5473 struct cmd_set_fwd_retry_mode_result *res = parsed_result; 5474 5475 retry_enabled = 1; 5476 set_pkt_forwarding_mode(res->mode); 5477 } 5478 5479 cmdline_parse_token_string_t cmd_setfwd_retry_set = 5480 TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_retry_mode_result, 5481 set, "set"); 5482 cmdline_parse_token_string_t cmd_setfwd_retry_fwd = 5483 TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_retry_mode_result, 5484 fwd, "fwd"); 5485 cmdline_parse_token_string_t cmd_setfwd_retry_mode = 5486 TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_retry_mode_result, 5487 mode, 5488 "" /* defined at init */); 5489 cmdline_parse_token_string_t cmd_setfwd_retry_retry = 5490 TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_retry_mode_result, 5491 retry, "retry"); 5492 5493 cmdline_parse_inst_t cmd_set_fwd_retry_mode = { 5494 .f = cmd_set_fwd_retry_mode_parsed, 5495 .data = NULL, 5496 .help_str = NULL, /* defined at init */ 5497 .tokens = { 5498 (void *)&cmd_setfwd_retry_set, 5499 (void *)&cmd_setfwd_retry_fwd, 5500 (void *)&cmd_setfwd_retry_mode, 5501 (void *)&cmd_setfwd_retry_retry, 5502 NULL, 5503 }, 5504 }; 5505 5506 static void cmd_set_fwd_retry_mode_init(void) 5507 { 5508 char *modes, *c; 5509 static char token[128]; 5510 static char help[256]; 5511 cmdline_parse_token_string_t *token_struct; 5512 5513 modes = list_pkt_forwarding_retry_modes(); 5514 snprintf(help, sizeof(help), "set fwd %s retry: " 5515 "Set packet forwarding mode with retry", modes); 5516 cmd_set_fwd_retry_mode.help_str = help; 5517 5518 /* string token separator is # */ 5519 for (c = token; *modes != '\0'; modes++) 5520 if (*modes == '|') 5521 *c++ = '#'; 5522 else 5523 *c++ = *modes; 5524 token_struct = (cmdline_parse_token_string_t *) 5525 cmd_set_fwd_retry_mode.tokens[2]; 5526 token_struct->string_data.str = token; 5527 } 5528 5529 /* *** SET BURST TX DELAY TIME RETRY NUMBER *** */ 5530 struct cmd_set_burst_tx_retry_result { 5531 cmdline_fixed_string_t set; 5532 cmdline_fixed_string_t burst; 5533 cmdline_fixed_string_t tx; 5534 cmdline_fixed_string_t delay; 5535 uint32_t time; 5536 cmdline_fixed_string_t retry; 5537 uint32_t retry_num; 5538 }; 5539 5540 static void cmd_set_burst_tx_retry_parsed(void *parsed_result, 5541 __attribute__((unused)) struct cmdline *cl, 5542 __attribute__((unused)) void *data) 5543 { 5544 struct cmd_set_burst_tx_retry_result *res = parsed_result; 5545 5546 if (!strcmp(res->set, "set") && !strcmp(res->burst, "burst") 5547 && !strcmp(res->tx, "tx")) { 5548 if (!strcmp(res->delay, "delay")) 5549 burst_tx_delay_time = res->time; 5550 if (!strcmp(res->retry, "retry")) 5551 burst_tx_retry_num = res->retry_num; 5552 } 5553 5554 } 5555 5556 cmdline_parse_token_string_t cmd_set_burst_tx_retry_set = 5557 TOKEN_STRING_INITIALIZER(struct cmd_set_burst_tx_retry_result, set, "set"); 5558 cmdline_parse_token_string_t cmd_set_burst_tx_retry_burst = 5559 TOKEN_STRING_INITIALIZER(struct cmd_set_burst_tx_retry_result, burst, 5560 "burst"); 5561 cmdline_parse_token_string_t cmd_set_burst_tx_retry_tx = 5562 TOKEN_STRING_INITIALIZER(struct cmd_set_burst_tx_retry_result, tx, "tx"); 5563 cmdline_parse_token_string_t cmd_set_burst_tx_retry_delay = 5564 TOKEN_STRING_INITIALIZER(struct cmd_set_burst_tx_retry_result, delay, "delay"); 5565 cmdline_parse_token_num_t cmd_set_burst_tx_retry_time = 5566 TOKEN_NUM_INITIALIZER(struct cmd_set_burst_tx_retry_result, time, UINT32); 5567 cmdline_parse_token_string_t cmd_set_burst_tx_retry_retry = 5568 TOKEN_STRING_INITIALIZER(struct cmd_set_burst_tx_retry_result, retry, "retry"); 5569 cmdline_parse_token_num_t cmd_set_burst_tx_retry_retry_num = 5570 TOKEN_NUM_INITIALIZER(struct cmd_set_burst_tx_retry_result, retry_num, UINT32); 5571 5572 cmdline_parse_inst_t cmd_set_burst_tx_retry = { 5573 .f = cmd_set_burst_tx_retry_parsed, 5574 .help_str = "set burst tx delay <delay_usec> retry <num_retry>", 5575 .tokens = { 5576 (void *)&cmd_set_burst_tx_retry_set, 5577 (void *)&cmd_set_burst_tx_retry_burst, 5578 (void *)&cmd_set_burst_tx_retry_tx, 5579 (void *)&cmd_set_burst_tx_retry_delay, 5580 (void *)&cmd_set_burst_tx_retry_time, 5581 (void *)&cmd_set_burst_tx_retry_retry, 5582 (void *)&cmd_set_burst_tx_retry_retry_num, 5583 NULL, 5584 }, 5585 }; 5586 5587 /* *** SET PROMISC MODE *** */ 5588 struct cmd_set_promisc_mode_result { 5589 cmdline_fixed_string_t set; 5590 cmdline_fixed_string_t promisc; 5591 cmdline_fixed_string_t port_all; /* valid if "allports" argument == 1 */ 5592 uint8_t port_num; /* valid if "allports" argument == 0 */ 5593 cmdline_fixed_string_t mode; 5594 }; 5595 5596 static void cmd_set_promisc_mode_parsed(void *parsed_result, 5597 __attribute__((unused)) struct cmdline *cl, 5598 void *allports) 5599 { 5600 struct cmd_set_promisc_mode_result *res = parsed_result; 5601 int enable; 5602 portid_t i; 5603 5604 if (!strcmp(res->mode, "on")) 5605 enable = 1; 5606 else 5607 enable = 0; 5608 5609 /* all ports */ 5610 if (allports) { 5611 RTE_ETH_FOREACH_DEV(i) { 5612 if (enable) 5613 rte_eth_promiscuous_enable(i); 5614 else 5615 rte_eth_promiscuous_disable(i); 5616 } 5617 } 5618 else { 5619 if (enable) 5620 rte_eth_promiscuous_enable(res->port_num); 5621 else 5622 rte_eth_promiscuous_disable(res->port_num); 5623 } 5624 } 5625 5626 cmdline_parse_token_string_t cmd_setpromisc_set = 5627 TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, set, "set"); 5628 cmdline_parse_token_string_t cmd_setpromisc_promisc = 5629 TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, promisc, 5630 "promisc"); 5631 cmdline_parse_token_string_t cmd_setpromisc_portall = 5632 TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, port_all, 5633 "all"); 5634 cmdline_parse_token_num_t cmd_setpromisc_portnum = 5635 TOKEN_NUM_INITIALIZER(struct cmd_set_promisc_mode_result, port_num, 5636 UINT8); 5637 cmdline_parse_token_string_t cmd_setpromisc_mode = 5638 TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, mode, 5639 "on#off"); 5640 5641 cmdline_parse_inst_t cmd_set_promisc_mode_all = { 5642 .f = cmd_set_promisc_mode_parsed, 5643 .data = (void *)1, 5644 .help_str = "set promisc all on|off: Set promisc mode for all ports", 5645 .tokens = { 5646 (void *)&cmd_setpromisc_set, 5647 (void *)&cmd_setpromisc_promisc, 5648 (void *)&cmd_setpromisc_portall, 5649 (void *)&cmd_setpromisc_mode, 5650 NULL, 5651 }, 5652 }; 5653 5654 cmdline_parse_inst_t cmd_set_promisc_mode_one = { 5655 .f = cmd_set_promisc_mode_parsed, 5656 .data = (void *)0, 5657 .help_str = "set promisc <port_id> on|off: Set promisc mode on port_id", 5658 .tokens = { 5659 (void *)&cmd_setpromisc_set, 5660 (void *)&cmd_setpromisc_promisc, 5661 (void *)&cmd_setpromisc_portnum, 5662 (void *)&cmd_setpromisc_mode, 5663 NULL, 5664 }, 5665 }; 5666 5667 /* *** SET ALLMULTI MODE *** */ 5668 struct cmd_set_allmulti_mode_result { 5669 cmdline_fixed_string_t set; 5670 cmdline_fixed_string_t allmulti; 5671 cmdline_fixed_string_t port_all; /* valid if "allports" argument == 1 */ 5672 uint8_t port_num; /* valid if "allports" argument == 0 */ 5673 cmdline_fixed_string_t mode; 5674 }; 5675 5676 static void cmd_set_allmulti_mode_parsed(void *parsed_result, 5677 __attribute__((unused)) struct cmdline *cl, 5678 void *allports) 5679 { 5680 struct cmd_set_allmulti_mode_result *res = parsed_result; 5681 int enable; 5682 portid_t i; 5683 5684 if (!strcmp(res->mode, "on")) 5685 enable = 1; 5686 else 5687 enable = 0; 5688 5689 /* all ports */ 5690 if (allports) { 5691 RTE_ETH_FOREACH_DEV(i) { 5692 if (enable) 5693 rte_eth_allmulticast_enable(i); 5694 else 5695 rte_eth_allmulticast_disable(i); 5696 } 5697 } 5698 else { 5699 if (enable) 5700 rte_eth_allmulticast_enable(res->port_num); 5701 else 5702 rte_eth_allmulticast_disable(res->port_num); 5703 } 5704 } 5705 5706 cmdline_parse_token_string_t cmd_setallmulti_set = 5707 TOKEN_STRING_INITIALIZER(struct cmd_set_allmulti_mode_result, set, "set"); 5708 cmdline_parse_token_string_t cmd_setallmulti_allmulti = 5709 TOKEN_STRING_INITIALIZER(struct cmd_set_allmulti_mode_result, allmulti, 5710 "allmulti"); 5711 cmdline_parse_token_string_t cmd_setallmulti_portall = 5712 TOKEN_STRING_INITIALIZER(struct cmd_set_allmulti_mode_result, port_all, 5713 "all"); 5714 cmdline_parse_token_num_t cmd_setallmulti_portnum = 5715 TOKEN_NUM_INITIALIZER(struct cmd_set_allmulti_mode_result, port_num, 5716 UINT8); 5717 cmdline_parse_token_string_t cmd_setallmulti_mode = 5718 TOKEN_STRING_INITIALIZER(struct cmd_set_allmulti_mode_result, mode, 5719 "on#off"); 5720 5721 cmdline_parse_inst_t cmd_set_allmulti_mode_all = { 5722 .f = cmd_set_allmulti_mode_parsed, 5723 .data = (void *)1, 5724 .help_str = "set allmulti all on|off: Set allmulti mode for all ports", 5725 .tokens = { 5726 (void *)&cmd_setallmulti_set, 5727 (void *)&cmd_setallmulti_allmulti, 5728 (void *)&cmd_setallmulti_portall, 5729 (void *)&cmd_setallmulti_mode, 5730 NULL, 5731 }, 5732 }; 5733 5734 cmdline_parse_inst_t cmd_set_allmulti_mode_one = { 5735 .f = cmd_set_allmulti_mode_parsed, 5736 .data = (void *)0, 5737 .help_str = "set allmulti <port_id> on|off: " 5738 "Set allmulti mode on port_id", 5739 .tokens = { 5740 (void *)&cmd_setallmulti_set, 5741 (void *)&cmd_setallmulti_allmulti, 5742 (void *)&cmd_setallmulti_portnum, 5743 (void *)&cmd_setallmulti_mode, 5744 NULL, 5745 }, 5746 }; 5747 5748 /* *** SETUP ETHERNET LINK FLOW CONTROL *** */ 5749 struct cmd_link_flow_ctrl_set_result { 5750 cmdline_fixed_string_t set; 5751 cmdline_fixed_string_t flow_ctrl; 5752 cmdline_fixed_string_t rx; 5753 cmdline_fixed_string_t rx_lfc_mode; 5754 cmdline_fixed_string_t tx; 5755 cmdline_fixed_string_t tx_lfc_mode; 5756 cmdline_fixed_string_t mac_ctrl_frame_fwd; 5757 cmdline_fixed_string_t mac_ctrl_frame_fwd_mode; 5758 cmdline_fixed_string_t autoneg_str; 5759 cmdline_fixed_string_t autoneg; 5760 cmdline_fixed_string_t hw_str; 5761 uint32_t high_water; 5762 cmdline_fixed_string_t lw_str; 5763 uint32_t low_water; 5764 cmdline_fixed_string_t pt_str; 5765 uint16_t pause_time; 5766 cmdline_fixed_string_t xon_str; 5767 uint16_t send_xon; 5768 uint8_t port_id; 5769 }; 5770 5771 cmdline_parse_token_string_t cmd_lfc_set_set = 5772 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5773 set, "set"); 5774 cmdline_parse_token_string_t cmd_lfc_set_flow_ctrl = 5775 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5776 flow_ctrl, "flow_ctrl"); 5777 cmdline_parse_token_string_t cmd_lfc_set_rx = 5778 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5779 rx, "rx"); 5780 cmdline_parse_token_string_t cmd_lfc_set_rx_mode = 5781 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5782 rx_lfc_mode, "on#off"); 5783 cmdline_parse_token_string_t cmd_lfc_set_tx = 5784 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5785 tx, "tx"); 5786 cmdline_parse_token_string_t cmd_lfc_set_tx_mode = 5787 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5788 tx_lfc_mode, "on#off"); 5789 cmdline_parse_token_string_t cmd_lfc_set_high_water_str = 5790 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5791 hw_str, "high_water"); 5792 cmdline_parse_token_num_t cmd_lfc_set_high_water = 5793 TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5794 high_water, UINT32); 5795 cmdline_parse_token_string_t cmd_lfc_set_low_water_str = 5796 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5797 lw_str, "low_water"); 5798 cmdline_parse_token_num_t cmd_lfc_set_low_water = 5799 TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5800 low_water, UINT32); 5801 cmdline_parse_token_string_t cmd_lfc_set_pause_time_str = 5802 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5803 pt_str, "pause_time"); 5804 cmdline_parse_token_num_t cmd_lfc_set_pause_time = 5805 TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5806 pause_time, UINT16); 5807 cmdline_parse_token_string_t cmd_lfc_set_send_xon_str = 5808 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5809 xon_str, "send_xon"); 5810 cmdline_parse_token_num_t cmd_lfc_set_send_xon = 5811 TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5812 send_xon, UINT16); 5813 cmdline_parse_token_string_t cmd_lfc_set_mac_ctrl_frame_fwd_mode = 5814 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5815 mac_ctrl_frame_fwd, "mac_ctrl_frame_fwd"); 5816 cmdline_parse_token_string_t cmd_lfc_set_mac_ctrl_frame_fwd = 5817 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5818 mac_ctrl_frame_fwd_mode, "on#off"); 5819 cmdline_parse_token_string_t cmd_lfc_set_autoneg_str = 5820 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5821 autoneg_str, "autoneg"); 5822 cmdline_parse_token_string_t cmd_lfc_set_autoneg = 5823 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5824 autoneg, "on#off"); 5825 cmdline_parse_token_num_t cmd_lfc_set_portid = 5826 TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 5827 port_id, UINT8); 5828 5829 /* forward declaration */ 5830 static void 5831 cmd_link_flow_ctrl_set_parsed(void *parsed_result, struct cmdline *cl, 5832 void *data); 5833 5834 cmdline_parse_inst_t cmd_link_flow_control_set = { 5835 .f = cmd_link_flow_ctrl_set_parsed, 5836 .data = NULL, 5837 .help_str = "set flow_ctrl rx on|off tx on|off <high_water> " 5838 "<low_water> <pause_time> <send_xon> mac_ctrl_frame_fwd on|off " 5839 "autoneg on|off <port_id>: Configure the Ethernet flow control", 5840 .tokens = { 5841 (void *)&cmd_lfc_set_set, 5842 (void *)&cmd_lfc_set_flow_ctrl, 5843 (void *)&cmd_lfc_set_rx, 5844 (void *)&cmd_lfc_set_rx_mode, 5845 (void *)&cmd_lfc_set_tx, 5846 (void *)&cmd_lfc_set_tx_mode, 5847 (void *)&cmd_lfc_set_high_water, 5848 (void *)&cmd_lfc_set_low_water, 5849 (void *)&cmd_lfc_set_pause_time, 5850 (void *)&cmd_lfc_set_send_xon, 5851 (void *)&cmd_lfc_set_mac_ctrl_frame_fwd_mode, 5852 (void *)&cmd_lfc_set_mac_ctrl_frame_fwd, 5853 (void *)&cmd_lfc_set_autoneg_str, 5854 (void *)&cmd_lfc_set_autoneg, 5855 (void *)&cmd_lfc_set_portid, 5856 NULL, 5857 }, 5858 }; 5859 5860 cmdline_parse_inst_t cmd_link_flow_control_set_rx = { 5861 .f = cmd_link_flow_ctrl_set_parsed, 5862 .data = (void *)&cmd_link_flow_control_set_rx, 5863 .help_str = "set flow_ctrl rx on|off <port_id>: " 5864 "Change rx flow control parameter", 5865 .tokens = { 5866 (void *)&cmd_lfc_set_set, 5867 (void *)&cmd_lfc_set_flow_ctrl, 5868 (void *)&cmd_lfc_set_rx, 5869 (void *)&cmd_lfc_set_rx_mode, 5870 (void *)&cmd_lfc_set_portid, 5871 NULL, 5872 }, 5873 }; 5874 5875 cmdline_parse_inst_t cmd_link_flow_control_set_tx = { 5876 .f = cmd_link_flow_ctrl_set_parsed, 5877 .data = (void *)&cmd_link_flow_control_set_tx, 5878 .help_str = "set flow_ctrl tx on|off <port_id>: " 5879 "Change tx flow control parameter", 5880 .tokens = { 5881 (void *)&cmd_lfc_set_set, 5882 (void *)&cmd_lfc_set_flow_ctrl, 5883 (void *)&cmd_lfc_set_tx, 5884 (void *)&cmd_lfc_set_tx_mode, 5885 (void *)&cmd_lfc_set_portid, 5886 NULL, 5887 }, 5888 }; 5889 5890 cmdline_parse_inst_t cmd_link_flow_control_set_hw = { 5891 .f = cmd_link_flow_ctrl_set_parsed, 5892 .data = (void *)&cmd_link_flow_control_set_hw, 5893 .help_str = "set flow_ctrl high_water <value> <port_id>: " 5894 "Change high water flow control parameter", 5895 .tokens = { 5896 (void *)&cmd_lfc_set_set, 5897 (void *)&cmd_lfc_set_flow_ctrl, 5898 (void *)&cmd_lfc_set_high_water_str, 5899 (void *)&cmd_lfc_set_high_water, 5900 (void *)&cmd_lfc_set_portid, 5901 NULL, 5902 }, 5903 }; 5904 5905 cmdline_parse_inst_t cmd_link_flow_control_set_lw = { 5906 .f = cmd_link_flow_ctrl_set_parsed, 5907 .data = (void *)&cmd_link_flow_control_set_lw, 5908 .help_str = "set flow_ctrl low_water <value> <port_id>: " 5909 "Change low water flow control parameter", 5910 .tokens = { 5911 (void *)&cmd_lfc_set_set, 5912 (void *)&cmd_lfc_set_flow_ctrl, 5913 (void *)&cmd_lfc_set_low_water_str, 5914 (void *)&cmd_lfc_set_low_water, 5915 (void *)&cmd_lfc_set_portid, 5916 NULL, 5917 }, 5918 }; 5919 5920 cmdline_parse_inst_t cmd_link_flow_control_set_pt = { 5921 .f = cmd_link_flow_ctrl_set_parsed, 5922 .data = (void *)&cmd_link_flow_control_set_pt, 5923 .help_str = "set flow_ctrl pause_time <value> <port_id>: " 5924 "Change pause time flow control parameter", 5925 .tokens = { 5926 (void *)&cmd_lfc_set_set, 5927 (void *)&cmd_lfc_set_flow_ctrl, 5928 (void *)&cmd_lfc_set_pause_time_str, 5929 (void *)&cmd_lfc_set_pause_time, 5930 (void *)&cmd_lfc_set_portid, 5931 NULL, 5932 }, 5933 }; 5934 5935 cmdline_parse_inst_t cmd_link_flow_control_set_xon = { 5936 .f = cmd_link_flow_ctrl_set_parsed, 5937 .data = (void *)&cmd_link_flow_control_set_xon, 5938 .help_str = "set flow_ctrl send_xon <value> <port_id>: " 5939 "Change send_xon flow control parameter", 5940 .tokens = { 5941 (void *)&cmd_lfc_set_set, 5942 (void *)&cmd_lfc_set_flow_ctrl, 5943 (void *)&cmd_lfc_set_send_xon_str, 5944 (void *)&cmd_lfc_set_send_xon, 5945 (void *)&cmd_lfc_set_portid, 5946 NULL, 5947 }, 5948 }; 5949 5950 cmdline_parse_inst_t cmd_link_flow_control_set_macfwd = { 5951 .f = cmd_link_flow_ctrl_set_parsed, 5952 .data = (void *)&cmd_link_flow_control_set_macfwd, 5953 .help_str = "set flow_ctrl mac_ctrl_frame_fwd on|off <port_id>: " 5954 "Change mac ctrl fwd flow control parameter", 5955 .tokens = { 5956 (void *)&cmd_lfc_set_set, 5957 (void *)&cmd_lfc_set_flow_ctrl, 5958 (void *)&cmd_lfc_set_mac_ctrl_frame_fwd_mode, 5959 (void *)&cmd_lfc_set_mac_ctrl_frame_fwd, 5960 (void *)&cmd_lfc_set_portid, 5961 NULL, 5962 }, 5963 }; 5964 5965 cmdline_parse_inst_t cmd_link_flow_control_set_autoneg = { 5966 .f = cmd_link_flow_ctrl_set_parsed, 5967 .data = (void *)&cmd_link_flow_control_set_autoneg, 5968 .help_str = "set flow_ctrl autoneg on|off <port_id>: " 5969 "Change autoneg flow control parameter", 5970 .tokens = { 5971 (void *)&cmd_lfc_set_set, 5972 (void *)&cmd_lfc_set_flow_ctrl, 5973 (void *)&cmd_lfc_set_autoneg_str, 5974 (void *)&cmd_lfc_set_autoneg, 5975 (void *)&cmd_lfc_set_portid, 5976 NULL, 5977 }, 5978 }; 5979 5980 static void 5981 cmd_link_flow_ctrl_set_parsed(void *parsed_result, 5982 __attribute__((unused)) struct cmdline *cl, 5983 void *data) 5984 { 5985 struct cmd_link_flow_ctrl_set_result *res = parsed_result; 5986 cmdline_parse_inst_t *cmd = data; 5987 struct rte_eth_fc_conf fc_conf; 5988 int rx_fc_en = 0; 5989 int tx_fc_en = 0; 5990 int ret; 5991 5992 /* 5993 * Rx on/off, flow control is enabled/disabled on RX side. This can indicate 5994 * the RTE_FC_TX_PAUSE, Transmit pause frame at the Rx side. 5995 * Tx on/off, flow control is enabled/disabled on TX side. This can indicate 5996 * the RTE_FC_RX_PAUSE, Respond to the pause frame at the Tx side. 5997 */ 5998 static enum rte_eth_fc_mode rx_tx_onoff_2_lfc_mode[2][2] = { 5999 {RTE_FC_NONE, RTE_FC_TX_PAUSE}, {RTE_FC_RX_PAUSE, RTE_FC_FULL} 6000 }; 6001 6002 /* Partial command line, retrieve current configuration */ 6003 if (cmd) { 6004 ret = rte_eth_dev_flow_ctrl_get(res->port_id, &fc_conf); 6005 if (ret != 0) { 6006 printf("cannot get current flow ctrl parameters, return" 6007 "code = %d\n", ret); 6008 return; 6009 } 6010 6011 if ((fc_conf.mode == RTE_FC_RX_PAUSE) || 6012 (fc_conf.mode == RTE_FC_FULL)) 6013 rx_fc_en = 1; 6014 if ((fc_conf.mode == RTE_FC_TX_PAUSE) || 6015 (fc_conf.mode == RTE_FC_FULL)) 6016 tx_fc_en = 1; 6017 } 6018 6019 if (!cmd || cmd == &cmd_link_flow_control_set_rx) 6020 rx_fc_en = (!strcmp(res->rx_lfc_mode, "on")) ? 1 : 0; 6021 6022 if (!cmd || cmd == &cmd_link_flow_control_set_tx) 6023 tx_fc_en = (!strcmp(res->tx_lfc_mode, "on")) ? 1 : 0; 6024 6025 fc_conf.mode = rx_tx_onoff_2_lfc_mode[rx_fc_en][tx_fc_en]; 6026 6027 if (!cmd || cmd == &cmd_link_flow_control_set_hw) 6028 fc_conf.high_water = res->high_water; 6029 6030 if (!cmd || cmd == &cmd_link_flow_control_set_lw) 6031 fc_conf.low_water = res->low_water; 6032 6033 if (!cmd || cmd == &cmd_link_flow_control_set_pt) 6034 fc_conf.pause_time = res->pause_time; 6035 6036 if (!cmd || cmd == &cmd_link_flow_control_set_xon) 6037 fc_conf.send_xon = res->send_xon; 6038 6039 if (!cmd || cmd == &cmd_link_flow_control_set_macfwd) { 6040 if (!strcmp(res->mac_ctrl_frame_fwd_mode, "on")) 6041 fc_conf.mac_ctrl_frame_fwd = 1; 6042 else 6043 fc_conf.mac_ctrl_frame_fwd = 0; 6044 } 6045 6046 if (!cmd || cmd == &cmd_link_flow_control_set_autoneg) 6047 fc_conf.autoneg = (!strcmp(res->autoneg, "on")) ? 1 : 0; 6048 6049 ret = rte_eth_dev_flow_ctrl_set(res->port_id, &fc_conf); 6050 if (ret != 0) 6051 printf("bad flow contrl parameter, return code = %d \n", ret); 6052 } 6053 6054 /* *** SETUP ETHERNET PRIORITY FLOW CONTROL *** */ 6055 struct cmd_priority_flow_ctrl_set_result { 6056 cmdline_fixed_string_t set; 6057 cmdline_fixed_string_t pfc_ctrl; 6058 cmdline_fixed_string_t rx; 6059 cmdline_fixed_string_t rx_pfc_mode; 6060 cmdline_fixed_string_t tx; 6061 cmdline_fixed_string_t tx_pfc_mode; 6062 uint32_t high_water; 6063 uint32_t low_water; 6064 uint16_t pause_time; 6065 uint8_t priority; 6066 uint8_t port_id; 6067 }; 6068 6069 static void 6070 cmd_priority_flow_ctrl_set_parsed(void *parsed_result, 6071 __attribute__((unused)) struct cmdline *cl, 6072 __attribute__((unused)) void *data) 6073 { 6074 struct cmd_priority_flow_ctrl_set_result *res = parsed_result; 6075 struct rte_eth_pfc_conf pfc_conf; 6076 int rx_fc_enable, tx_fc_enable; 6077 int ret; 6078 6079 /* 6080 * Rx on/off, flow control is enabled/disabled on RX side. This can indicate 6081 * the RTE_FC_TX_PAUSE, Transmit pause frame at the Rx side. 6082 * Tx on/off, flow control is enabled/disabled on TX side. This can indicate 6083 * the RTE_FC_RX_PAUSE, Respond to the pause frame at the Tx side. 6084 */ 6085 static enum rte_eth_fc_mode rx_tx_onoff_2_pfc_mode[2][2] = { 6086 {RTE_FC_NONE, RTE_FC_RX_PAUSE}, {RTE_FC_TX_PAUSE, RTE_FC_FULL} 6087 }; 6088 6089 rx_fc_enable = (!strncmp(res->rx_pfc_mode, "on",2)) ? 1 : 0; 6090 tx_fc_enable = (!strncmp(res->tx_pfc_mode, "on",2)) ? 1 : 0; 6091 pfc_conf.fc.mode = rx_tx_onoff_2_pfc_mode[rx_fc_enable][tx_fc_enable]; 6092 pfc_conf.fc.high_water = res->high_water; 6093 pfc_conf.fc.low_water = res->low_water; 6094 pfc_conf.fc.pause_time = res->pause_time; 6095 pfc_conf.priority = res->priority; 6096 6097 ret = rte_eth_dev_priority_flow_ctrl_set(res->port_id, &pfc_conf); 6098 if (ret != 0) 6099 printf("bad priority flow contrl parameter, return code = %d \n", ret); 6100 } 6101 6102 cmdline_parse_token_string_t cmd_pfc_set_set = 6103 TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 6104 set, "set"); 6105 cmdline_parse_token_string_t cmd_pfc_set_flow_ctrl = 6106 TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 6107 pfc_ctrl, "pfc_ctrl"); 6108 cmdline_parse_token_string_t cmd_pfc_set_rx = 6109 TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 6110 rx, "rx"); 6111 cmdline_parse_token_string_t cmd_pfc_set_rx_mode = 6112 TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 6113 rx_pfc_mode, "on#off"); 6114 cmdline_parse_token_string_t cmd_pfc_set_tx = 6115 TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 6116 tx, "tx"); 6117 cmdline_parse_token_string_t cmd_pfc_set_tx_mode = 6118 TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 6119 tx_pfc_mode, "on#off"); 6120 cmdline_parse_token_num_t cmd_pfc_set_high_water = 6121 TOKEN_NUM_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 6122 high_water, UINT32); 6123 cmdline_parse_token_num_t cmd_pfc_set_low_water = 6124 TOKEN_NUM_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 6125 low_water, UINT32); 6126 cmdline_parse_token_num_t cmd_pfc_set_pause_time = 6127 TOKEN_NUM_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 6128 pause_time, UINT16); 6129 cmdline_parse_token_num_t cmd_pfc_set_priority = 6130 TOKEN_NUM_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 6131 priority, UINT8); 6132 cmdline_parse_token_num_t cmd_pfc_set_portid = 6133 TOKEN_NUM_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 6134 port_id, UINT8); 6135 6136 cmdline_parse_inst_t cmd_priority_flow_control_set = { 6137 .f = cmd_priority_flow_ctrl_set_parsed, 6138 .data = NULL, 6139 .help_str = "set pfc_ctrl rx on|off tx on|off <high_water> <low_water> " 6140 "<pause_time> <priority> <port_id>: " 6141 "Configure the Ethernet priority flow control", 6142 .tokens = { 6143 (void *)&cmd_pfc_set_set, 6144 (void *)&cmd_pfc_set_flow_ctrl, 6145 (void *)&cmd_pfc_set_rx, 6146 (void *)&cmd_pfc_set_rx_mode, 6147 (void *)&cmd_pfc_set_tx, 6148 (void *)&cmd_pfc_set_tx_mode, 6149 (void *)&cmd_pfc_set_high_water, 6150 (void *)&cmd_pfc_set_low_water, 6151 (void *)&cmd_pfc_set_pause_time, 6152 (void *)&cmd_pfc_set_priority, 6153 (void *)&cmd_pfc_set_portid, 6154 NULL, 6155 }, 6156 }; 6157 6158 /* *** RESET CONFIGURATION *** */ 6159 struct cmd_reset_result { 6160 cmdline_fixed_string_t reset; 6161 cmdline_fixed_string_t def; 6162 }; 6163 6164 static void cmd_reset_parsed(__attribute__((unused)) void *parsed_result, 6165 struct cmdline *cl, 6166 __attribute__((unused)) void *data) 6167 { 6168 cmdline_printf(cl, "Reset to default forwarding configuration...\n"); 6169 set_def_fwd_config(); 6170 } 6171 6172 cmdline_parse_token_string_t cmd_reset_set = 6173 TOKEN_STRING_INITIALIZER(struct cmd_reset_result, reset, "set"); 6174 cmdline_parse_token_string_t cmd_reset_def = 6175 TOKEN_STRING_INITIALIZER(struct cmd_reset_result, def, 6176 "default"); 6177 6178 cmdline_parse_inst_t cmd_reset = { 6179 .f = cmd_reset_parsed, 6180 .data = NULL, 6181 .help_str = "set default: Reset default forwarding configuration", 6182 .tokens = { 6183 (void *)&cmd_reset_set, 6184 (void *)&cmd_reset_def, 6185 NULL, 6186 }, 6187 }; 6188 6189 /* *** START FORWARDING *** */ 6190 struct cmd_start_result { 6191 cmdline_fixed_string_t start; 6192 }; 6193 6194 cmdline_parse_token_string_t cmd_start_start = 6195 TOKEN_STRING_INITIALIZER(struct cmd_start_result, start, "start"); 6196 6197 static void cmd_start_parsed(__attribute__((unused)) void *parsed_result, 6198 __attribute__((unused)) struct cmdline *cl, 6199 __attribute__((unused)) void *data) 6200 { 6201 start_packet_forwarding(0); 6202 } 6203 6204 cmdline_parse_inst_t cmd_start = { 6205 .f = cmd_start_parsed, 6206 .data = NULL, 6207 .help_str = "start: Start packet forwarding", 6208 .tokens = { 6209 (void *)&cmd_start_start, 6210 NULL, 6211 }, 6212 }; 6213 6214 /* *** START FORWARDING WITH ONE TX BURST FIRST *** */ 6215 struct cmd_start_tx_first_result { 6216 cmdline_fixed_string_t start; 6217 cmdline_fixed_string_t tx_first; 6218 }; 6219 6220 static void 6221 cmd_start_tx_first_parsed(__attribute__((unused)) void *parsed_result, 6222 __attribute__((unused)) struct cmdline *cl, 6223 __attribute__((unused)) void *data) 6224 { 6225 start_packet_forwarding(1); 6226 } 6227 6228 cmdline_parse_token_string_t cmd_start_tx_first_start = 6229 TOKEN_STRING_INITIALIZER(struct cmd_start_tx_first_result, start, 6230 "start"); 6231 cmdline_parse_token_string_t cmd_start_tx_first_tx_first = 6232 TOKEN_STRING_INITIALIZER(struct cmd_start_tx_first_result, 6233 tx_first, "tx_first"); 6234 6235 cmdline_parse_inst_t cmd_start_tx_first = { 6236 .f = cmd_start_tx_first_parsed, 6237 .data = NULL, 6238 .help_str = "start tx_first: Start packet forwarding, " 6239 "after sending 1 burst of packets", 6240 .tokens = { 6241 (void *)&cmd_start_tx_first_start, 6242 (void *)&cmd_start_tx_first_tx_first, 6243 NULL, 6244 }, 6245 }; 6246 6247 /* *** START FORWARDING WITH N TX BURST FIRST *** */ 6248 struct cmd_start_tx_first_n_result { 6249 cmdline_fixed_string_t start; 6250 cmdline_fixed_string_t tx_first; 6251 uint32_t tx_num; 6252 }; 6253 6254 static void 6255 cmd_start_tx_first_n_parsed(void *parsed_result, 6256 __attribute__((unused)) struct cmdline *cl, 6257 __attribute__((unused)) void *data) 6258 { 6259 struct cmd_start_tx_first_n_result *res = parsed_result; 6260 6261 start_packet_forwarding(res->tx_num); 6262 } 6263 6264 cmdline_parse_token_string_t cmd_start_tx_first_n_start = 6265 TOKEN_STRING_INITIALIZER(struct cmd_start_tx_first_n_result, 6266 start, "start"); 6267 cmdline_parse_token_string_t cmd_start_tx_first_n_tx_first = 6268 TOKEN_STRING_INITIALIZER(struct cmd_start_tx_first_n_result, 6269 tx_first, "tx_first"); 6270 cmdline_parse_token_num_t cmd_start_tx_first_n_tx_num = 6271 TOKEN_NUM_INITIALIZER(struct cmd_start_tx_first_n_result, 6272 tx_num, UINT32); 6273 6274 cmdline_parse_inst_t cmd_start_tx_first_n = { 6275 .f = cmd_start_tx_first_n_parsed, 6276 .data = NULL, 6277 .help_str = "start tx_first <num>: " 6278 "packet forwarding, after sending <num> bursts of packets", 6279 .tokens = { 6280 (void *)&cmd_start_tx_first_n_start, 6281 (void *)&cmd_start_tx_first_n_tx_first, 6282 (void *)&cmd_start_tx_first_n_tx_num, 6283 NULL, 6284 }, 6285 }; 6286 6287 /* *** SET LINK UP *** */ 6288 struct cmd_set_link_up_result { 6289 cmdline_fixed_string_t set; 6290 cmdline_fixed_string_t link_up; 6291 cmdline_fixed_string_t port; 6292 uint8_t port_id; 6293 }; 6294 6295 cmdline_parse_token_string_t cmd_set_link_up_set = 6296 TOKEN_STRING_INITIALIZER(struct cmd_set_link_up_result, set, "set"); 6297 cmdline_parse_token_string_t cmd_set_link_up_link_up = 6298 TOKEN_STRING_INITIALIZER(struct cmd_set_link_up_result, link_up, 6299 "link-up"); 6300 cmdline_parse_token_string_t cmd_set_link_up_port = 6301 TOKEN_STRING_INITIALIZER(struct cmd_set_link_up_result, port, "port"); 6302 cmdline_parse_token_num_t cmd_set_link_up_port_id = 6303 TOKEN_NUM_INITIALIZER(struct cmd_set_link_up_result, port_id, UINT8); 6304 6305 static void cmd_set_link_up_parsed(__attribute__((unused)) void *parsed_result, 6306 __attribute__((unused)) struct cmdline *cl, 6307 __attribute__((unused)) void *data) 6308 { 6309 struct cmd_set_link_up_result *res = parsed_result; 6310 dev_set_link_up(res->port_id); 6311 } 6312 6313 cmdline_parse_inst_t cmd_set_link_up = { 6314 .f = cmd_set_link_up_parsed, 6315 .data = NULL, 6316 .help_str = "set link-up port <port id>", 6317 .tokens = { 6318 (void *)&cmd_set_link_up_set, 6319 (void *)&cmd_set_link_up_link_up, 6320 (void *)&cmd_set_link_up_port, 6321 (void *)&cmd_set_link_up_port_id, 6322 NULL, 6323 }, 6324 }; 6325 6326 /* *** SET LINK DOWN *** */ 6327 struct cmd_set_link_down_result { 6328 cmdline_fixed_string_t set; 6329 cmdline_fixed_string_t link_down; 6330 cmdline_fixed_string_t port; 6331 uint8_t port_id; 6332 }; 6333 6334 cmdline_parse_token_string_t cmd_set_link_down_set = 6335 TOKEN_STRING_INITIALIZER(struct cmd_set_link_down_result, set, "set"); 6336 cmdline_parse_token_string_t cmd_set_link_down_link_down = 6337 TOKEN_STRING_INITIALIZER(struct cmd_set_link_down_result, link_down, 6338 "link-down"); 6339 cmdline_parse_token_string_t cmd_set_link_down_port = 6340 TOKEN_STRING_INITIALIZER(struct cmd_set_link_down_result, port, "port"); 6341 cmdline_parse_token_num_t cmd_set_link_down_port_id = 6342 TOKEN_NUM_INITIALIZER(struct cmd_set_link_down_result, port_id, UINT8); 6343 6344 static void cmd_set_link_down_parsed( 6345 __attribute__((unused)) void *parsed_result, 6346 __attribute__((unused)) struct cmdline *cl, 6347 __attribute__((unused)) void *data) 6348 { 6349 struct cmd_set_link_down_result *res = parsed_result; 6350 dev_set_link_down(res->port_id); 6351 } 6352 6353 cmdline_parse_inst_t cmd_set_link_down = { 6354 .f = cmd_set_link_down_parsed, 6355 .data = NULL, 6356 .help_str = "set link-down port <port id>", 6357 .tokens = { 6358 (void *)&cmd_set_link_down_set, 6359 (void *)&cmd_set_link_down_link_down, 6360 (void *)&cmd_set_link_down_port, 6361 (void *)&cmd_set_link_down_port_id, 6362 NULL, 6363 }, 6364 }; 6365 6366 /* *** SHOW CFG *** */ 6367 struct cmd_showcfg_result { 6368 cmdline_fixed_string_t show; 6369 cmdline_fixed_string_t cfg; 6370 cmdline_fixed_string_t what; 6371 }; 6372 6373 static void cmd_showcfg_parsed(void *parsed_result, 6374 __attribute__((unused)) struct cmdline *cl, 6375 __attribute__((unused)) void *data) 6376 { 6377 struct cmd_showcfg_result *res = parsed_result; 6378 if (!strcmp(res->what, "rxtx")) 6379 rxtx_config_display(); 6380 else if (!strcmp(res->what, "cores")) 6381 fwd_lcores_config_display(); 6382 else if (!strcmp(res->what, "fwd")) 6383 pkt_fwd_config_display(&cur_fwd_config); 6384 else if (!strcmp(res->what, "txpkts")) 6385 show_tx_pkt_segments(); 6386 } 6387 6388 cmdline_parse_token_string_t cmd_showcfg_show = 6389 TOKEN_STRING_INITIALIZER(struct cmd_showcfg_result, show, "show"); 6390 cmdline_parse_token_string_t cmd_showcfg_port = 6391 TOKEN_STRING_INITIALIZER(struct cmd_showcfg_result, cfg, "config"); 6392 cmdline_parse_token_string_t cmd_showcfg_what = 6393 TOKEN_STRING_INITIALIZER(struct cmd_showcfg_result, what, 6394 "rxtx#cores#fwd#txpkts"); 6395 6396 cmdline_parse_inst_t cmd_showcfg = { 6397 .f = cmd_showcfg_parsed, 6398 .data = NULL, 6399 .help_str = "show config rxtx|cores|fwd|txpkts", 6400 .tokens = { 6401 (void *)&cmd_showcfg_show, 6402 (void *)&cmd_showcfg_port, 6403 (void *)&cmd_showcfg_what, 6404 NULL, 6405 }, 6406 }; 6407 6408 /* *** SHOW ALL PORT INFO *** */ 6409 struct cmd_showportall_result { 6410 cmdline_fixed_string_t show; 6411 cmdline_fixed_string_t port; 6412 cmdline_fixed_string_t what; 6413 cmdline_fixed_string_t all; 6414 }; 6415 6416 static void cmd_showportall_parsed(void *parsed_result, 6417 __attribute__((unused)) struct cmdline *cl, 6418 __attribute__((unused)) void *data) 6419 { 6420 portid_t i; 6421 6422 struct cmd_showportall_result *res = parsed_result; 6423 if (!strcmp(res->show, "clear")) { 6424 if (!strcmp(res->what, "stats")) 6425 RTE_ETH_FOREACH_DEV(i) 6426 nic_stats_clear(i); 6427 else if (!strcmp(res->what, "xstats")) 6428 RTE_ETH_FOREACH_DEV(i) 6429 nic_xstats_clear(i); 6430 } else if (!strcmp(res->what, "info")) 6431 RTE_ETH_FOREACH_DEV(i) 6432 port_infos_display(i); 6433 else if (!strcmp(res->what, "stats")) 6434 RTE_ETH_FOREACH_DEV(i) 6435 nic_stats_display(i); 6436 else if (!strcmp(res->what, "xstats")) 6437 RTE_ETH_FOREACH_DEV(i) 6438 nic_xstats_display(i); 6439 else if (!strcmp(res->what, "fdir")) 6440 RTE_ETH_FOREACH_DEV(i) 6441 fdir_get_infos(i); 6442 else if (!strcmp(res->what, "stat_qmap")) 6443 RTE_ETH_FOREACH_DEV(i) 6444 nic_stats_mapping_display(i); 6445 else if (!strcmp(res->what, "dcb_tc")) 6446 RTE_ETH_FOREACH_DEV(i) 6447 port_dcb_info_display(i); 6448 else if (!strcmp(res->what, "cap")) 6449 RTE_ETH_FOREACH_DEV(i) 6450 port_offload_cap_display(i); 6451 } 6452 6453 cmdline_parse_token_string_t cmd_showportall_show = 6454 TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, show, 6455 "show#clear"); 6456 cmdline_parse_token_string_t cmd_showportall_port = 6457 TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, port, "port"); 6458 cmdline_parse_token_string_t cmd_showportall_what = 6459 TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, what, 6460 "info#stats#xstats#fdir#stat_qmap#dcb_tc#cap"); 6461 cmdline_parse_token_string_t cmd_showportall_all = 6462 TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, all, "all"); 6463 cmdline_parse_inst_t cmd_showportall = { 6464 .f = cmd_showportall_parsed, 6465 .data = NULL, 6466 .help_str = "show|clear port " 6467 "info|stats|xstats|fdir|stat_qmap|dcb_tc|cap all", 6468 .tokens = { 6469 (void *)&cmd_showportall_show, 6470 (void *)&cmd_showportall_port, 6471 (void *)&cmd_showportall_what, 6472 (void *)&cmd_showportall_all, 6473 NULL, 6474 }, 6475 }; 6476 6477 /* *** SHOW PORT INFO *** */ 6478 struct cmd_showport_result { 6479 cmdline_fixed_string_t show; 6480 cmdline_fixed_string_t port; 6481 cmdline_fixed_string_t what; 6482 uint8_t portnum; 6483 }; 6484 6485 static void cmd_showport_parsed(void *parsed_result, 6486 __attribute__((unused)) struct cmdline *cl, 6487 __attribute__((unused)) void *data) 6488 { 6489 struct cmd_showport_result *res = parsed_result; 6490 if (!strcmp(res->show, "clear")) { 6491 if (!strcmp(res->what, "stats")) 6492 nic_stats_clear(res->portnum); 6493 else if (!strcmp(res->what, "xstats")) 6494 nic_xstats_clear(res->portnum); 6495 } else if (!strcmp(res->what, "info")) 6496 port_infos_display(res->portnum); 6497 else if (!strcmp(res->what, "stats")) 6498 nic_stats_display(res->portnum); 6499 else if (!strcmp(res->what, "xstats")) 6500 nic_xstats_display(res->portnum); 6501 else if (!strcmp(res->what, "fdir")) 6502 fdir_get_infos(res->portnum); 6503 else if (!strcmp(res->what, "stat_qmap")) 6504 nic_stats_mapping_display(res->portnum); 6505 else if (!strcmp(res->what, "dcb_tc")) 6506 port_dcb_info_display(res->portnum); 6507 else if (!strcmp(res->what, "cap")) 6508 port_offload_cap_display(res->portnum); 6509 } 6510 6511 cmdline_parse_token_string_t cmd_showport_show = 6512 TOKEN_STRING_INITIALIZER(struct cmd_showport_result, show, 6513 "show#clear"); 6514 cmdline_parse_token_string_t cmd_showport_port = 6515 TOKEN_STRING_INITIALIZER(struct cmd_showport_result, port, "port"); 6516 cmdline_parse_token_string_t cmd_showport_what = 6517 TOKEN_STRING_INITIALIZER(struct cmd_showport_result, what, 6518 "info#stats#xstats#fdir#stat_qmap#dcb_tc#cap"); 6519 cmdline_parse_token_num_t cmd_showport_portnum = 6520 TOKEN_NUM_INITIALIZER(struct cmd_showport_result, portnum, UINT8); 6521 6522 cmdline_parse_inst_t cmd_showport = { 6523 .f = cmd_showport_parsed, 6524 .data = NULL, 6525 .help_str = "show|clear port " 6526 "info|stats|xstats|fdir|stat_qmap|dcb_tc|cap " 6527 "<port_id>", 6528 .tokens = { 6529 (void *)&cmd_showport_show, 6530 (void *)&cmd_showport_port, 6531 (void *)&cmd_showport_what, 6532 (void *)&cmd_showport_portnum, 6533 NULL, 6534 }, 6535 }; 6536 6537 /* *** SHOW QUEUE INFO *** */ 6538 struct cmd_showqueue_result { 6539 cmdline_fixed_string_t show; 6540 cmdline_fixed_string_t type; 6541 cmdline_fixed_string_t what; 6542 uint8_t portnum; 6543 uint16_t queuenum; 6544 }; 6545 6546 static void 6547 cmd_showqueue_parsed(void *parsed_result, 6548 __attribute__((unused)) struct cmdline *cl, 6549 __attribute__((unused)) void *data) 6550 { 6551 struct cmd_showqueue_result *res = parsed_result; 6552 6553 if (!strcmp(res->type, "rxq")) 6554 rx_queue_infos_display(res->portnum, res->queuenum); 6555 else if (!strcmp(res->type, "txq")) 6556 tx_queue_infos_display(res->portnum, res->queuenum); 6557 } 6558 6559 cmdline_parse_token_string_t cmd_showqueue_show = 6560 TOKEN_STRING_INITIALIZER(struct cmd_showqueue_result, show, "show"); 6561 cmdline_parse_token_string_t cmd_showqueue_type = 6562 TOKEN_STRING_INITIALIZER(struct cmd_showqueue_result, type, "rxq#txq"); 6563 cmdline_parse_token_string_t cmd_showqueue_what = 6564 TOKEN_STRING_INITIALIZER(struct cmd_showqueue_result, what, "info"); 6565 cmdline_parse_token_num_t cmd_showqueue_portnum = 6566 TOKEN_NUM_INITIALIZER(struct cmd_showqueue_result, portnum, UINT8); 6567 cmdline_parse_token_num_t cmd_showqueue_queuenum = 6568 TOKEN_NUM_INITIALIZER(struct cmd_showqueue_result, queuenum, UINT16); 6569 6570 cmdline_parse_inst_t cmd_showqueue = { 6571 .f = cmd_showqueue_parsed, 6572 .data = NULL, 6573 .help_str = "show rxq|txq info <port_id> <queue_id>", 6574 .tokens = { 6575 (void *)&cmd_showqueue_show, 6576 (void *)&cmd_showqueue_type, 6577 (void *)&cmd_showqueue_what, 6578 (void *)&cmd_showqueue_portnum, 6579 (void *)&cmd_showqueue_queuenum, 6580 NULL, 6581 }, 6582 }; 6583 6584 /* *** READ PORT REGISTER *** */ 6585 struct cmd_read_reg_result { 6586 cmdline_fixed_string_t read; 6587 cmdline_fixed_string_t reg; 6588 uint8_t port_id; 6589 uint32_t reg_off; 6590 }; 6591 6592 static void 6593 cmd_read_reg_parsed(void *parsed_result, 6594 __attribute__((unused)) struct cmdline *cl, 6595 __attribute__((unused)) void *data) 6596 { 6597 struct cmd_read_reg_result *res = parsed_result; 6598 port_reg_display(res->port_id, res->reg_off); 6599 } 6600 6601 cmdline_parse_token_string_t cmd_read_reg_read = 6602 TOKEN_STRING_INITIALIZER(struct cmd_read_reg_result, read, "read"); 6603 cmdline_parse_token_string_t cmd_read_reg_reg = 6604 TOKEN_STRING_INITIALIZER(struct cmd_read_reg_result, reg, "reg"); 6605 cmdline_parse_token_num_t cmd_read_reg_port_id = 6606 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_result, port_id, UINT8); 6607 cmdline_parse_token_num_t cmd_read_reg_reg_off = 6608 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_result, reg_off, UINT32); 6609 6610 cmdline_parse_inst_t cmd_read_reg = { 6611 .f = cmd_read_reg_parsed, 6612 .data = NULL, 6613 .help_str = "read reg <port_id> <reg_off>", 6614 .tokens = { 6615 (void *)&cmd_read_reg_read, 6616 (void *)&cmd_read_reg_reg, 6617 (void *)&cmd_read_reg_port_id, 6618 (void *)&cmd_read_reg_reg_off, 6619 NULL, 6620 }, 6621 }; 6622 6623 /* *** READ PORT REGISTER BIT FIELD *** */ 6624 struct cmd_read_reg_bit_field_result { 6625 cmdline_fixed_string_t read; 6626 cmdline_fixed_string_t regfield; 6627 uint8_t port_id; 6628 uint32_t reg_off; 6629 uint8_t bit1_pos; 6630 uint8_t bit2_pos; 6631 }; 6632 6633 static void 6634 cmd_read_reg_bit_field_parsed(void *parsed_result, 6635 __attribute__((unused)) struct cmdline *cl, 6636 __attribute__((unused)) void *data) 6637 { 6638 struct cmd_read_reg_bit_field_result *res = parsed_result; 6639 port_reg_bit_field_display(res->port_id, res->reg_off, 6640 res->bit1_pos, res->bit2_pos); 6641 } 6642 6643 cmdline_parse_token_string_t cmd_read_reg_bit_field_read = 6644 TOKEN_STRING_INITIALIZER(struct cmd_read_reg_bit_field_result, read, 6645 "read"); 6646 cmdline_parse_token_string_t cmd_read_reg_bit_field_regfield = 6647 TOKEN_STRING_INITIALIZER(struct cmd_read_reg_bit_field_result, 6648 regfield, "regfield"); 6649 cmdline_parse_token_num_t cmd_read_reg_bit_field_port_id = 6650 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_field_result, port_id, 6651 UINT8); 6652 cmdline_parse_token_num_t cmd_read_reg_bit_field_reg_off = 6653 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_field_result, reg_off, 6654 UINT32); 6655 cmdline_parse_token_num_t cmd_read_reg_bit_field_bit1_pos = 6656 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_field_result, bit1_pos, 6657 UINT8); 6658 cmdline_parse_token_num_t cmd_read_reg_bit_field_bit2_pos = 6659 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_field_result, bit2_pos, 6660 UINT8); 6661 6662 cmdline_parse_inst_t cmd_read_reg_bit_field = { 6663 .f = cmd_read_reg_bit_field_parsed, 6664 .data = NULL, 6665 .help_str = "read regfield <port_id> <reg_off> <bit_x> <bit_y>: " 6666 "Read register bit field between bit_x and bit_y included", 6667 .tokens = { 6668 (void *)&cmd_read_reg_bit_field_read, 6669 (void *)&cmd_read_reg_bit_field_regfield, 6670 (void *)&cmd_read_reg_bit_field_port_id, 6671 (void *)&cmd_read_reg_bit_field_reg_off, 6672 (void *)&cmd_read_reg_bit_field_bit1_pos, 6673 (void *)&cmd_read_reg_bit_field_bit2_pos, 6674 NULL, 6675 }, 6676 }; 6677 6678 /* *** READ PORT REGISTER BIT *** */ 6679 struct cmd_read_reg_bit_result { 6680 cmdline_fixed_string_t read; 6681 cmdline_fixed_string_t regbit; 6682 uint8_t port_id; 6683 uint32_t reg_off; 6684 uint8_t bit_pos; 6685 }; 6686 6687 static void 6688 cmd_read_reg_bit_parsed(void *parsed_result, 6689 __attribute__((unused)) struct cmdline *cl, 6690 __attribute__((unused)) void *data) 6691 { 6692 struct cmd_read_reg_bit_result *res = parsed_result; 6693 port_reg_bit_display(res->port_id, res->reg_off, res->bit_pos); 6694 } 6695 6696 cmdline_parse_token_string_t cmd_read_reg_bit_read = 6697 TOKEN_STRING_INITIALIZER(struct cmd_read_reg_bit_result, read, "read"); 6698 cmdline_parse_token_string_t cmd_read_reg_bit_regbit = 6699 TOKEN_STRING_INITIALIZER(struct cmd_read_reg_bit_result, 6700 regbit, "regbit"); 6701 cmdline_parse_token_num_t cmd_read_reg_bit_port_id = 6702 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_result, port_id, UINT8); 6703 cmdline_parse_token_num_t cmd_read_reg_bit_reg_off = 6704 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_result, reg_off, UINT32); 6705 cmdline_parse_token_num_t cmd_read_reg_bit_bit_pos = 6706 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_result, bit_pos, UINT8); 6707 6708 cmdline_parse_inst_t cmd_read_reg_bit = { 6709 .f = cmd_read_reg_bit_parsed, 6710 .data = NULL, 6711 .help_str = "read regbit <port_id> <reg_off> <bit_x>: 0 <= bit_x <= 31", 6712 .tokens = { 6713 (void *)&cmd_read_reg_bit_read, 6714 (void *)&cmd_read_reg_bit_regbit, 6715 (void *)&cmd_read_reg_bit_port_id, 6716 (void *)&cmd_read_reg_bit_reg_off, 6717 (void *)&cmd_read_reg_bit_bit_pos, 6718 NULL, 6719 }, 6720 }; 6721 6722 /* *** WRITE PORT REGISTER *** */ 6723 struct cmd_write_reg_result { 6724 cmdline_fixed_string_t write; 6725 cmdline_fixed_string_t reg; 6726 uint8_t port_id; 6727 uint32_t reg_off; 6728 uint32_t value; 6729 }; 6730 6731 static void 6732 cmd_write_reg_parsed(void *parsed_result, 6733 __attribute__((unused)) struct cmdline *cl, 6734 __attribute__((unused)) void *data) 6735 { 6736 struct cmd_write_reg_result *res = parsed_result; 6737 port_reg_set(res->port_id, res->reg_off, res->value); 6738 } 6739 6740 cmdline_parse_token_string_t cmd_write_reg_write = 6741 TOKEN_STRING_INITIALIZER(struct cmd_write_reg_result, write, "write"); 6742 cmdline_parse_token_string_t cmd_write_reg_reg = 6743 TOKEN_STRING_INITIALIZER(struct cmd_write_reg_result, reg, "reg"); 6744 cmdline_parse_token_num_t cmd_write_reg_port_id = 6745 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_result, port_id, UINT8); 6746 cmdline_parse_token_num_t cmd_write_reg_reg_off = 6747 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_result, reg_off, UINT32); 6748 cmdline_parse_token_num_t cmd_write_reg_value = 6749 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_result, value, UINT32); 6750 6751 cmdline_parse_inst_t cmd_write_reg = { 6752 .f = cmd_write_reg_parsed, 6753 .data = NULL, 6754 .help_str = "write reg <port_id> <reg_off> <reg_value>", 6755 .tokens = { 6756 (void *)&cmd_write_reg_write, 6757 (void *)&cmd_write_reg_reg, 6758 (void *)&cmd_write_reg_port_id, 6759 (void *)&cmd_write_reg_reg_off, 6760 (void *)&cmd_write_reg_value, 6761 NULL, 6762 }, 6763 }; 6764 6765 /* *** WRITE PORT REGISTER BIT FIELD *** */ 6766 struct cmd_write_reg_bit_field_result { 6767 cmdline_fixed_string_t write; 6768 cmdline_fixed_string_t regfield; 6769 uint8_t port_id; 6770 uint32_t reg_off; 6771 uint8_t bit1_pos; 6772 uint8_t bit2_pos; 6773 uint32_t value; 6774 }; 6775 6776 static void 6777 cmd_write_reg_bit_field_parsed(void *parsed_result, 6778 __attribute__((unused)) struct cmdline *cl, 6779 __attribute__((unused)) void *data) 6780 { 6781 struct cmd_write_reg_bit_field_result *res = parsed_result; 6782 port_reg_bit_field_set(res->port_id, res->reg_off, 6783 res->bit1_pos, res->bit2_pos, res->value); 6784 } 6785 6786 cmdline_parse_token_string_t cmd_write_reg_bit_field_write = 6787 TOKEN_STRING_INITIALIZER(struct cmd_write_reg_bit_field_result, write, 6788 "write"); 6789 cmdline_parse_token_string_t cmd_write_reg_bit_field_regfield = 6790 TOKEN_STRING_INITIALIZER(struct cmd_write_reg_bit_field_result, 6791 regfield, "regfield"); 6792 cmdline_parse_token_num_t cmd_write_reg_bit_field_port_id = 6793 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, port_id, 6794 UINT8); 6795 cmdline_parse_token_num_t cmd_write_reg_bit_field_reg_off = 6796 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, reg_off, 6797 UINT32); 6798 cmdline_parse_token_num_t cmd_write_reg_bit_field_bit1_pos = 6799 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, bit1_pos, 6800 UINT8); 6801 cmdline_parse_token_num_t cmd_write_reg_bit_field_bit2_pos = 6802 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, bit2_pos, 6803 UINT8); 6804 cmdline_parse_token_num_t cmd_write_reg_bit_field_value = 6805 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, value, 6806 UINT32); 6807 6808 cmdline_parse_inst_t cmd_write_reg_bit_field = { 6809 .f = cmd_write_reg_bit_field_parsed, 6810 .data = NULL, 6811 .help_str = "write regfield <port_id> <reg_off> <bit_x> <bit_y> " 6812 "<reg_value>: " 6813 "Set register bit field between bit_x and bit_y included", 6814 .tokens = { 6815 (void *)&cmd_write_reg_bit_field_write, 6816 (void *)&cmd_write_reg_bit_field_regfield, 6817 (void *)&cmd_write_reg_bit_field_port_id, 6818 (void *)&cmd_write_reg_bit_field_reg_off, 6819 (void *)&cmd_write_reg_bit_field_bit1_pos, 6820 (void *)&cmd_write_reg_bit_field_bit2_pos, 6821 (void *)&cmd_write_reg_bit_field_value, 6822 NULL, 6823 }, 6824 }; 6825 6826 /* *** WRITE PORT REGISTER BIT *** */ 6827 struct cmd_write_reg_bit_result { 6828 cmdline_fixed_string_t write; 6829 cmdline_fixed_string_t regbit; 6830 uint8_t port_id; 6831 uint32_t reg_off; 6832 uint8_t bit_pos; 6833 uint8_t value; 6834 }; 6835 6836 static void 6837 cmd_write_reg_bit_parsed(void *parsed_result, 6838 __attribute__((unused)) struct cmdline *cl, 6839 __attribute__((unused)) void *data) 6840 { 6841 struct cmd_write_reg_bit_result *res = parsed_result; 6842 port_reg_bit_set(res->port_id, res->reg_off, res->bit_pos, res->value); 6843 } 6844 6845 cmdline_parse_token_string_t cmd_write_reg_bit_write = 6846 TOKEN_STRING_INITIALIZER(struct cmd_write_reg_bit_result, write, 6847 "write"); 6848 cmdline_parse_token_string_t cmd_write_reg_bit_regbit = 6849 TOKEN_STRING_INITIALIZER(struct cmd_write_reg_bit_result, 6850 regbit, "regbit"); 6851 cmdline_parse_token_num_t cmd_write_reg_bit_port_id = 6852 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_result, port_id, UINT8); 6853 cmdline_parse_token_num_t cmd_write_reg_bit_reg_off = 6854 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_result, reg_off, UINT32); 6855 cmdline_parse_token_num_t cmd_write_reg_bit_bit_pos = 6856 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_result, bit_pos, UINT8); 6857 cmdline_parse_token_num_t cmd_write_reg_bit_value = 6858 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_result, value, UINT8); 6859 6860 cmdline_parse_inst_t cmd_write_reg_bit = { 6861 .f = cmd_write_reg_bit_parsed, 6862 .data = NULL, 6863 .help_str = "write regbit <port_id> <reg_off> <bit_x> 0|1: " 6864 "0 <= bit_x <= 31", 6865 .tokens = { 6866 (void *)&cmd_write_reg_bit_write, 6867 (void *)&cmd_write_reg_bit_regbit, 6868 (void *)&cmd_write_reg_bit_port_id, 6869 (void *)&cmd_write_reg_bit_reg_off, 6870 (void *)&cmd_write_reg_bit_bit_pos, 6871 (void *)&cmd_write_reg_bit_value, 6872 NULL, 6873 }, 6874 }; 6875 6876 /* *** READ A RING DESCRIPTOR OF A PORT RX/TX QUEUE *** */ 6877 struct cmd_read_rxd_txd_result { 6878 cmdline_fixed_string_t read; 6879 cmdline_fixed_string_t rxd_txd; 6880 uint8_t port_id; 6881 uint16_t queue_id; 6882 uint16_t desc_id; 6883 }; 6884 6885 static void 6886 cmd_read_rxd_txd_parsed(void *parsed_result, 6887 __attribute__((unused)) struct cmdline *cl, 6888 __attribute__((unused)) void *data) 6889 { 6890 struct cmd_read_rxd_txd_result *res = parsed_result; 6891 6892 if (!strcmp(res->rxd_txd, "rxd")) 6893 rx_ring_desc_display(res->port_id, res->queue_id, res->desc_id); 6894 else if (!strcmp(res->rxd_txd, "txd")) 6895 tx_ring_desc_display(res->port_id, res->queue_id, res->desc_id); 6896 } 6897 6898 cmdline_parse_token_string_t cmd_read_rxd_txd_read = 6899 TOKEN_STRING_INITIALIZER(struct cmd_read_rxd_txd_result, read, "read"); 6900 cmdline_parse_token_string_t cmd_read_rxd_txd_rxd_txd = 6901 TOKEN_STRING_INITIALIZER(struct cmd_read_rxd_txd_result, rxd_txd, 6902 "rxd#txd"); 6903 cmdline_parse_token_num_t cmd_read_rxd_txd_port_id = 6904 TOKEN_NUM_INITIALIZER(struct cmd_read_rxd_txd_result, port_id, UINT8); 6905 cmdline_parse_token_num_t cmd_read_rxd_txd_queue_id = 6906 TOKEN_NUM_INITIALIZER(struct cmd_read_rxd_txd_result, queue_id, UINT16); 6907 cmdline_parse_token_num_t cmd_read_rxd_txd_desc_id = 6908 TOKEN_NUM_INITIALIZER(struct cmd_read_rxd_txd_result, desc_id, UINT16); 6909 6910 cmdline_parse_inst_t cmd_read_rxd_txd = { 6911 .f = cmd_read_rxd_txd_parsed, 6912 .data = NULL, 6913 .help_str = "read rxd|txd <port_id> <queue_id> <desc_id>", 6914 .tokens = { 6915 (void *)&cmd_read_rxd_txd_read, 6916 (void *)&cmd_read_rxd_txd_rxd_txd, 6917 (void *)&cmd_read_rxd_txd_port_id, 6918 (void *)&cmd_read_rxd_txd_queue_id, 6919 (void *)&cmd_read_rxd_txd_desc_id, 6920 NULL, 6921 }, 6922 }; 6923 6924 /* *** QUIT *** */ 6925 struct cmd_quit_result { 6926 cmdline_fixed_string_t quit; 6927 }; 6928 6929 static void cmd_quit_parsed(__attribute__((unused)) void *parsed_result, 6930 struct cmdline *cl, 6931 __attribute__((unused)) void *data) 6932 { 6933 pmd_test_exit(); 6934 cmdline_quit(cl); 6935 } 6936 6937 cmdline_parse_token_string_t cmd_quit_quit = 6938 TOKEN_STRING_INITIALIZER(struct cmd_quit_result, quit, "quit"); 6939 6940 cmdline_parse_inst_t cmd_quit = { 6941 .f = cmd_quit_parsed, 6942 .data = NULL, 6943 .help_str = "quit: Exit application", 6944 .tokens = { 6945 (void *)&cmd_quit_quit, 6946 NULL, 6947 }, 6948 }; 6949 6950 /* *** ADD/REMOVE MAC ADDRESS FROM A PORT *** */ 6951 struct cmd_mac_addr_result { 6952 cmdline_fixed_string_t mac_addr_cmd; 6953 cmdline_fixed_string_t what; 6954 uint8_t port_num; 6955 struct ether_addr address; 6956 }; 6957 6958 static void cmd_mac_addr_parsed(void *parsed_result, 6959 __attribute__((unused)) struct cmdline *cl, 6960 __attribute__((unused)) void *data) 6961 { 6962 struct cmd_mac_addr_result *res = parsed_result; 6963 int ret; 6964 6965 if (strcmp(res->what, "add") == 0) 6966 ret = rte_eth_dev_mac_addr_add(res->port_num, &res->address, 0); 6967 else if (strcmp(res->what, "set") == 0) 6968 ret = rte_eth_dev_default_mac_addr_set(res->port_num, 6969 &res->address); 6970 else 6971 ret = rte_eth_dev_mac_addr_remove(res->port_num, &res->address); 6972 6973 /* check the return value and print it if is < 0 */ 6974 if(ret < 0) 6975 printf("mac_addr_cmd error: (%s)\n", strerror(-ret)); 6976 6977 } 6978 6979 cmdline_parse_token_string_t cmd_mac_addr_cmd = 6980 TOKEN_STRING_INITIALIZER(struct cmd_mac_addr_result, mac_addr_cmd, 6981 "mac_addr"); 6982 cmdline_parse_token_string_t cmd_mac_addr_what = 6983 TOKEN_STRING_INITIALIZER(struct cmd_mac_addr_result, what, 6984 "add#remove#set"); 6985 cmdline_parse_token_num_t cmd_mac_addr_portnum = 6986 TOKEN_NUM_INITIALIZER(struct cmd_mac_addr_result, port_num, UINT8); 6987 cmdline_parse_token_etheraddr_t cmd_mac_addr_addr = 6988 TOKEN_ETHERADDR_INITIALIZER(struct cmd_mac_addr_result, address); 6989 6990 cmdline_parse_inst_t cmd_mac_addr = { 6991 .f = cmd_mac_addr_parsed, 6992 .data = (void *)0, 6993 .help_str = "mac_addr add|remove|set <port_id> <mac_addr>: " 6994 "Add/Remove/Set MAC address on port_id", 6995 .tokens = { 6996 (void *)&cmd_mac_addr_cmd, 6997 (void *)&cmd_mac_addr_what, 6998 (void *)&cmd_mac_addr_portnum, 6999 (void *)&cmd_mac_addr_addr, 7000 NULL, 7001 }, 7002 }; 7003 7004 7005 /* *** CONFIGURE QUEUE STATS COUNTER MAPPINGS *** */ 7006 struct cmd_set_qmap_result { 7007 cmdline_fixed_string_t set; 7008 cmdline_fixed_string_t qmap; 7009 cmdline_fixed_string_t what; 7010 uint8_t port_id; 7011 uint16_t queue_id; 7012 uint8_t map_value; 7013 }; 7014 7015 static void 7016 cmd_set_qmap_parsed(void *parsed_result, 7017 __attribute__((unused)) struct cmdline *cl, 7018 __attribute__((unused)) void *data) 7019 { 7020 struct cmd_set_qmap_result *res = parsed_result; 7021 int is_rx = (strcmp(res->what, "tx") == 0) ? 0 : 1; 7022 7023 set_qmap(res->port_id, (uint8_t)is_rx, res->queue_id, res->map_value); 7024 } 7025 7026 cmdline_parse_token_string_t cmd_setqmap_set = 7027 TOKEN_STRING_INITIALIZER(struct cmd_set_qmap_result, 7028 set, "set"); 7029 cmdline_parse_token_string_t cmd_setqmap_qmap = 7030 TOKEN_STRING_INITIALIZER(struct cmd_set_qmap_result, 7031 qmap, "stat_qmap"); 7032 cmdline_parse_token_string_t cmd_setqmap_what = 7033 TOKEN_STRING_INITIALIZER(struct cmd_set_qmap_result, 7034 what, "tx#rx"); 7035 cmdline_parse_token_num_t cmd_setqmap_portid = 7036 TOKEN_NUM_INITIALIZER(struct cmd_set_qmap_result, 7037 port_id, UINT8); 7038 cmdline_parse_token_num_t cmd_setqmap_queueid = 7039 TOKEN_NUM_INITIALIZER(struct cmd_set_qmap_result, 7040 queue_id, UINT16); 7041 cmdline_parse_token_num_t cmd_setqmap_mapvalue = 7042 TOKEN_NUM_INITIALIZER(struct cmd_set_qmap_result, 7043 map_value, UINT8); 7044 7045 cmdline_parse_inst_t cmd_set_qmap = { 7046 .f = cmd_set_qmap_parsed, 7047 .data = NULL, 7048 .help_str = "set stat_qmap rx|tx <port_id> <queue_id> <map_value>: " 7049 "Set statistics mapping value on tx|rx queue_id of port_id", 7050 .tokens = { 7051 (void *)&cmd_setqmap_set, 7052 (void *)&cmd_setqmap_qmap, 7053 (void *)&cmd_setqmap_what, 7054 (void *)&cmd_setqmap_portid, 7055 (void *)&cmd_setqmap_queueid, 7056 (void *)&cmd_setqmap_mapvalue, 7057 NULL, 7058 }, 7059 }; 7060 7061 /* *** CONFIGURE UNICAST HASH TABLE *** */ 7062 struct cmd_set_uc_hash_table { 7063 cmdline_fixed_string_t set; 7064 cmdline_fixed_string_t port; 7065 uint8_t port_id; 7066 cmdline_fixed_string_t what; 7067 struct ether_addr address; 7068 cmdline_fixed_string_t mode; 7069 }; 7070 7071 static void 7072 cmd_set_uc_hash_parsed(void *parsed_result, 7073 __attribute__((unused)) struct cmdline *cl, 7074 __attribute__((unused)) void *data) 7075 { 7076 int ret=0; 7077 struct cmd_set_uc_hash_table *res = parsed_result; 7078 7079 int is_on = (strcmp(res->mode, "on") == 0) ? 1 : 0; 7080 7081 if (strcmp(res->what, "uta") == 0) 7082 ret = rte_eth_dev_uc_hash_table_set(res->port_id, 7083 &res->address,(uint8_t)is_on); 7084 if (ret < 0) 7085 printf("bad unicast hash table parameter, return code = %d \n", ret); 7086 7087 } 7088 7089 cmdline_parse_token_string_t cmd_set_uc_hash_set = 7090 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_hash_table, 7091 set, "set"); 7092 cmdline_parse_token_string_t cmd_set_uc_hash_port = 7093 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_hash_table, 7094 port, "port"); 7095 cmdline_parse_token_num_t cmd_set_uc_hash_portid = 7096 TOKEN_NUM_INITIALIZER(struct cmd_set_uc_hash_table, 7097 port_id, UINT8); 7098 cmdline_parse_token_string_t cmd_set_uc_hash_what = 7099 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_hash_table, 7100 what, "uta"); 7101 cmdline_parse_token_etheraddr_t cmd_set_uc_hash_mac = 7102 TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_uc_hash_table, 7103 address); 7104 cmdline_parse_token_string_t cmd_set_uc_hash_mode = 7105 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_hash_table, 7106 mode, "on#off"); 7107 7108 cmdline_parse_inst_t cmd_set_uc_hash_filter = { 7109 .f = cmd_set_uc_hash_parsed, 7110 .data = NULL, 7111 .help_str = "set port <port_id> uta <mac_addr> on|off)", 7112 .tokens = { 7113 (void *)&cmd_set_uc_hash_set, 7114 (void *)&cmd_set_uc_hash_port, 7115 (void *)&cmd_set_uc_hash_portid, 7116 (void *)&cmd_set_uc_hash_what, 7117 (void *)&cmd_set_uc_hash_mac, 7118 (void *)&cmd_set_uc_hash_mode, 7119 NULL, 7120 }, 7121 }; 7122 7123 struct cmd_set_uc_all_hash_table { 7124 cmdline_fixed_string_t set; 7125 cmdline_fixed_string_t port; 7126 uint8_t port_id; 7127 cmdline_fixed_string_t what; 7128 cmdline_fixed_string_t value; 7129 cmdline_fixed_string_t mode; 7130 }; 7131 7132 static void 7133 cmd_set_uc_all_hash_parsed(void *parsed_result, 7134 __attribute__((unused)) struct cmdline *cl, 7135 __attribute__((unused)) void *data) 7136 { 7137 int ret=0; 7138 struct cmd_set_uc_all_hash_table *res = parsed_result; 7139 7140 int is_on = (strcmp(res->mode, "on") == 0) ? 1 : 0; 7141 7142 if ((strcmp(res->what, "uta") == 0) && 7143 (strcmp(res->value, "all") == 0)) 7144 ret = rte_eth_dev_uc_all_hash_table_set(res->port_id,(uint8_t) is_on); 7145 if (ret < 0) 7146 printf("bad unicast hash table parameter," 7147 "return code = %d \n", ret); 7148 } 7149 7150 cmdline_parse_token_string_t cmd_set_uc_all_hash_set = 7151 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table, 7152 set, "set"); 7153 cmdline_parse_token_string_t cmd_set_uc_all_hash_port = 7154 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table, 7155 port, "port"); 7156 cmdline_parse_token_num_t cmd_set_uc_all_hash_portid = 7157 TOKEN_NUM_INITIALIZER(struct cmd_set_uc_all_hash_table, 7158 port_id, UINT8); 7159 cmdline_parse_token_string_t cmd_set_uc_all_hash_what = 7160 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table, 7161 what, "uta"); 7162 cmdline_parse_token_string_t cmd_set_uc_all_hash_value = 7163 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table, 7164 value,"all"); 7165 cmdline_parse_token_string_t cmd_set_uc_all_hash_mode = 7166 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table, 7167 mode, "on#off"); 7168 7169 cmdline_parse_inst_t cmd_set_uc_all_hash_filter = { 7170 .f = cmd_set_uc_all_hash_parsed, 7171 .data = NULL, 7172 .help_str = "set port <port_id> uta all on|off", 7173 .tokens = { 7174 (void *)&cmd_set_uc_all_hash_set, 7175 (void *)&cmd_set_uc_all_hash_port, 7176 (void *)&cmd_set_uc_all_hash_portid, 7177 (void *)&cmd_set_uc_all_hash_what, 7178 (void *)&cmd_set_uc_all_hash_value, 7179 (void *)&cmd_set_uc_all_hash_mode, 7180 NULL, 7181 }, 7182 }; 7183 7184 /* *** CONFIGURE MACVLAN FILTER FOR VF(s) *** */ 7185 struct cmd_set_vf_macvlan_filter { 7186 cmdline_fixed_string_t set; 7187 cmdline_fixed_string_t port; 7188 uint8_t port_id; 7189 cmdline_fixed_string_t vf; 7190 uint8_t vf_id; 7191 struct ether_addr address; 7192 cmdline_fixed_string_t filter_type; 7193 cmdline_fixed_string_t mode; 7194 }; 7195 7196 static void 7197 cmd_set_vf_macvlan_parsed(void *parsed_result, 7198 __attribute__((unused)) struct cmdline *cl, 7199 __attribute__((unused)) void *data) 7200 { 7201 int is_on, ret = 0; 7202 struct cmd_set_vf_macvlan_filter *res = parsed_result; 7203 struct rte_eth_mac_filter filter; 7204 7205 memset(&filter, 0, sizeof(struct rte_eth_mac_filter)); 7206 7207 rte_memcpy(&filter.mac_addr, &res->address, ETHER_ADDR_LEN); 7208 7209 /* set VF MAC filter */ 7210 filter.is_vf = 1; 7211 7212 /* set VF ID */ 7213 filter.dst_id = res->vf_id; 7214 7215 if (!strcmp(res->filter_type, "exact-mac")) 7216 filter.filter_type = RTE_MAC_PERFECT_MATCH; 7217 else if (!strcmp(res->filter_type, "exact-mac-vlan")) 7218 filter.filter_type = RTE_MACVLAN_PERFECT_MATCH; 7219 else if (!strcmp(res->filter_type, "hashmac")) 7220 filter.filter_type = RTE_MAC_HASH_MATCH; 7221 else if (!strcmp(res->filter_type, "hashmac-vlan")) 7222 filter.filter_type = RTE_MACVLAN_HASH_MATCH; 7223 7224 is_on = (strcmp(res->mode, "on") == 0) ? 1 : 0; 7225 7226 if (is_on) 7227 ret = rte_eth_dev_filter_ctrl(res->port_id, 7228 RTE_ETH_FILTER_MACVLAN, 7229 RTE_ETH_FILTER_ADD, 7230 &filter); 7231 else 7232 ret = rte_eth_dev_filter_ctrl(res->port_id, 7233 RTE_ETH_FILTER_MACVLAN, 7234 RTE_ETH_FILTER_DELETE, 7235 &filter); 7236 7237 if (ret < 0) 7238 printf("bad set MAC hash parameter, return code = %d\n", ret); 7239 7240 } 7241 7242 cmdline_parse_token_string_t cmd_set_vf_macvlan_set = 7243 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_macvlan_filter, 7244 set, "set"); 7245 cmdline_parse_token_string_t cmd_set_vf_macvlan_port = 7246 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_macvlan_filter, 7247 port, "port"); 7248 cmdline_parse_token_num_t cmd_set_vf_macvlan_portid = 7249 TOKEN_NUM_INITIALIZER(struct cmd_set_vf_macvlan_filter, 7250 port_id, UINT8); 7251 cmdline_parse_token_string_t cmd_set_vf_macvlan_vf = 7252 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_macvlan_filter, 7253 vf, "vf"); 7254 cmdline_parse_token_num_t cmd_set_vf_macvlan_vf_id = 7255 TOKEN_NUM_INITIALIZER(struct cmd_set_vf_macvlan_filter, 7256 vf_id, UINT8); 7257 cmdline_parse_token_etheraddr_t cmd_set_vf_macvlan_mac = 7258 TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_vf_macvlan_filter, 7259 address); 7260 cmdline_parse_token_string_t cmd_set_vf_macvlan_filter_type = 7261 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_macvlan_filter, 7262 filter_type, "exact-mac#exact-mac-vlan" 7263 "#hashmac#hashmac-vlan"); 7264 cmdline_parse_token_string_t cmd_set_vf_macvlan_mode = 7265 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_macvlan_filter, 7266 mode, "on#off"); 7267 7268 cmdline_parse_inst_t cmd_set_vf_macvlan_filter = { 7269 .f = cmd_set_vf_macvlan_parsed, 7270 .data = NULL, 7271 .help_str = "set port <port_id> vf <vf_id> <mac_addr> " 7272 "exact-mac|exact-mac-vlan|hashmac|hashmac-vlan on|off: " 7273 "Exact match rule: exact match of MAC or MAC and VLAN; " 7274 "hash match rule: hash match of MAC and exact match of VLAN", 7275 .tokens = { 7276 (void *)&cmd_set_vf_macvlan_set, 7277 (void *)&cmd_set_vf_macvlan_port, 7278 (void *)&cmd_set_vf_macvlan_portid, 7279 (void *)&cmd_set_vf_macvlan_vf, 7280 (void *)&cmd_set_vf_macvlan_vf_id, 7281 (void *)&cmd_set_vf_macvlan_mac, 7282 (void *)&cmd_set_vf_macvlan_filter_type, 7283 (void *)&cmd_set_vf_macvlan_mode, 7284 NULL, 7285 }, 7286 }; 7287 7288 /* *** CONFIGURE VF TRAFFIC CONTROL *** */ 7289 struct cmd_set_vf_traffic { 7290 cmdline_fixed_string_t set; 7291 cmdline_fixed_string_t port; 7292 uint8_t port_id; 7293 cmdline_fixed_string_t vf; 7294 uint8_t vf_id; 7295 cmdline_fixed_string_t what; 7296 cmdline_fixed_string_t mode; 7297 }; 7298 7299 static void 7300 cmd_set_vf_traffic_parsed(void *parsed_result, 7301 __attribute__((unused)) struct cmdline *cl, 7302 __attribute__((unused)) void *data) 7303 { 7304 struct cmd_set_vf_traffic *res = parsed_result; 7305 int is_rx = (strcmp(res->what, "rx") == 0) ? 1 : 0; 7306 int is_on = (strcmp(res->mode, "on") == 0) ? 1 : 0; 7307 7308 set_vf_traffic(res->port_id, (uint8_t)is_rx, res->vf_id,(uint8_t) is_on); 7309 } 7310 7311 cmdline_parse_token_string_t cmd_setvf_traffic_set = 7312 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_traffic, 7313 set, "set"); 7314 cmdline_parse_token_string_t cmd_setvf_traffic_port = 7315 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_traffic, 7316 port, "port"); 7317 cmdline_parse_token_num_t cmd_setvf_traffic_portid = 7318 TOKEN_NUM_INITIALIZER(struct cmd_set_vf_traffic, 7319 port_id, UINT8); 7320 cmdline_parse_token_string_t cmd_setvf_traffic_vf = 7321 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_traffic, 7322 vf, "vf"); 7323 cmdline_parse_token_num_t cmd_setvf_traffic_vfid = 7324 TOKEN_NUM_INITIALIZER(struct cmd_set_vf_traffic, 7325 vf_id, UINT8); 7326 cmdline_parse_token_string_t cmd_setvf_traffic_what = 7327 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_traffic, 7328 what, "tx#rx"); 7329 cmdline_parse_token_string_t cmd_setvf_traffic_mode = 7330 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_traffic, 7331 mode, "on#off"); 7332 7333 cmdline_parse_inst_t cmd_set_vf_traffic = { 7334 .f = cmd_set_vf_traffic_parsed, 7335 .data = NULL, 7336 .help_str = "set port <port_id> vf <vf_id> rx|tx on|off", 7337 .tokens = { 7338 (void *)&cmd_setvf_traffic_set, 7339 (void *)&cmd_setvf_traffic_port, 7340 (void *)&cmd_setvf_traffic_portid, 7341 (void *)&cmd_setvf_traffic_vf, 7342 (void *)&cmd_setvf_traffic_vfid, 7343 (void *)&cmd_setvf_traffic_what, 7344 (void *)&cmd_setvf_traffic_mode, 7345 NULL, 7346 }, 7347 }; 7348 7349 /* *** CONFIGURE VF RECEIVE MODE *** */ 7350 struct cmd_set_vf_rxmode { 7351 cmdline_fixed_string_t set; 7352 cmdline_fixed_string_t port; 7353 uint8_t port_id; 7354 cmdline_fixed_string_t vf; 7355 uint8_t vf_id; 7356 cmdline_fixed_string_t what; 7357 cmdline_fixed_string_t mode; 7358 cmdline_fixed_string_t on; 7359 }; 7360 7361 static void 7362 cmd_set_vf_rxmode_parsed(void *parsed_result, 7363 __attribute__((unused)) struct cmdline *cl, 7364 __attribute__((unused)) void *data) 7365 { 7366 int ret = -ENOTSUP; 7367 uint16_t rx_mode = 0; 7368 struct cmd_set_vf_rxmode *res = parsed_result; 7369 7370 int is_on = (strcmp(res->on, "on") == 0) ? 1 : 0; 7371 if (!strcmp(res->what,"rxmode")) { 7372 if (!strcmp(res->mode, "AUPE")) 7373 rx_mode |= ETH_VMDQ_ACCEPT_UNTAG; 7374 else if (!strcmp(res->mode, "ROPE")) 7375 rx_mode |= ETH_VMDQ_ACCEPT_HASH_UC; 7376 else if (!strcmp(res->mode, "BAM")) 7377 rx_mode |= ETH_VMDQ_ACCEPT_BROADCAST; 7378 else if (!strncmp(res->mode, "MPE",3)) 7379 rx_mode |= ETH_VMDQ_ACCEPT_MULTICAST; 7380 } 7381 7382 #ifdef RTE_LIBRTE_IXGBE_PMD 7383 if (ret == -ENOTSUP) 7384 ret = rte_pmd_ixgbe_set_vf_rxmode(res->port_id, res->vf_id, 7385 rx_mode, (uint8_t)is_on); 7386 #endif 7387 #ifdef RTE_LIBRTE_BNXT_PMD 7388 if (ret == -ENOTSUP) 7389 ret = rte_pmd_bnxt_set_vf_rxmode(res->port_id, res->vf_id, 7390 rx_mode, (uint8_t)is_on); 7391 #endif 7392 if (ret < 0) 7393 printf("bad VF receive mode parameter, return code = %d \n", 7394 ret); 7395 } 7396 7397 cmdline_parse_token_string_t cmd_set_vf_rxmode_set = 7398 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode, 7399 set, "set"); 7400 cmdline_parse_token_string_t cmd_set_vf_rxmode_port = 7401 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode, 7402 port, "port"); 7403 cmdline_parse_token_num_t cmd_set_vf_rxmode_portid = 7404 TOKEN_NUM_INITIALIZER(struct cmd_set_vf_rxmode, 7405 port_id, UINT8); 7406 cmdline_parse_token_string_t cmd_set_vf_rxmode_vf = 7407 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode, 7408 vf, "vf"); 7409 cmdline_parse_token_num_t cmd_set_vf_rxmode_vfid = 7410 TOKEN_NUM_INITIALIZER(struct cmd_set_vf_rxmode, 7411 vf_id, UINT8); 7412 cmdline_parse_token_string_t cmd_set_vf_rxmode_what = 7413 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode, 7414 what, "rxmode"); 7415 cmdline_parse_token_string_t cmd_set_vf_rxmode_mode = 7416 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode, 7417 mode, "AUPE#ROPE#BAM#MPE"); 7418 cmdline_parse_token_string_t cmd_set_vf_rxmode_on = 7419 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode, 7420 on, "on#off"); 7421 7422 cmdline_parse_inst_t cmd_set_vf_rxmode = { 7423 .f = cmd_set_vf_rxmode_parsed, 7424 .data = NULL, 7425 .help_str = "set port <port_id> vf <vf_id> rxmode " 7426 "AUPE|ROPE|BAM|MPE on|off", 7427 .tokens = { 7428 (void *)&cmd_set_vf_rxmode_set, 7429 (void *)&cmd_set_vf_rxmode_port, 7430 (void *)&cmd_set_vf_rxmode_portid, 7431 (void *)&cmd_set_vf_rxmode_vf, 7432 (void *)&cmd_set_vf_rxmode_vfid, 7433 (void *)&cmd_set_vf_rxmode_what, 7434 (void *)&cmd_set_vf_rxmode_mode, 7435 (void *)&cmd_set_vf_rxmode_on, 7436 NULL, 7437 }, 7438 }; 7439 7440 /* *** ADD MAC ADDRESS FILTER FOR A VF OF A PORT *** */ 7441 struct cmd_vf_mac_addr_result { 7442 cmdline_fixed_string_t mac_addr_cmd; 7443 cmdline_fixed_string_t what; 7444 cmdline_fixed_string_t port; 7445 uint8_t port_num; 7446 cmdline_fixed_string_t vf; 7447 uint8_t vf_num; 7448 struct ether_addr address; 7449 }; 7450 7451 static void cmd_vf_mac_addr_parsed(void *parsed_result, 7452 __attribute__((unused)) struct cmdline *cl, 7453 __attribute__((unused)) void *data) 7454 { 7455 struct cmd_vf_mac_addr_result *res = parsed_result; 7456 int ret = -ENOTSUP; 7457 7458 if (strcmp(res->what, "add") != 0) 7459 return; 7460 7461 #ifdef RTE_LIBRTE_I40E_PMD 7462 if (ret == -ENOTSUP) 7463 ret = rte_pmd_i40e_add_vf_mac_addr(res->port_num, res->vf_num, 7464 &res->address); 7465 #endif 7466 #ifdef RTE_LIBRTE_BNXT_PMD 7467 if (ret == -ENOTSUP) 7468 ret = rte_pmd_bnxt_mac_addr_add(res->port_num, &res->address, 7469 res->vf_num); 7470 #endif 7471 7472 if(ret < 0) 7473 printf("vf_mac_addr_cmd error: (%s)\n", strerror(-ret)); 7474 7475 } 7476 7477 cmdline_parse_token_string_t cmd_vf_mac_addr_cmd = 7478 TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result, 7479 mac_addr_cmd,"mac_addr"); 7480 cmdline_parse_token_string_t cmd_vf_mac_addr_what = 7481 TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result, 7482 what,"add"); 7483 cmdline_parse_token_string_t cmd_vf_mac_addr_port = 7484 TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result, 7485 port,"port"); 7486 cmdline_parse_token_num_t cmd_vf_mac_addr_portnum = 7487 TOKEN_NUM_INITIALIZER(struct cmd_vf_mac_addr_result, 7488 port_num, UINT8); 7489 cmdline_parse_token_string_t cmd_vf_mac_addr_vf = 7490 TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result, 7491 vf,"vf"); 7492 cmdline_parse_token_num_t cmd_vf_mac_addr_vfnum = 7493 TOKEN_NUM_INITIALIZER(struct cmd_vf_mac_addr_result, 7494 vf_num, UINT8); 7495 cmdline_parse_token_etheraddr_t cmd_vf_mac_addr_addr = 7496 TOKEN_ETHERADDR_INITIALIZER(struct cmd_vf_mac_addr_result, 7497 address); 7498 7499 cmdline_parse_inst_t cmd_vf_mac_addr_filter = { 7500 .f = cmd_vf_mac_addr_parsed, 7501 .data = (void *)0, 7502 .help_str = "mac_addr add port <port_id> vf <vf_id> <mac_addr>: " 7503 "Add MAC address filtering for a VF on port_id", 7504 .tokens = { 7505 (void *)&cmd_vf_mac_addr_cmd, 7506 (void *)&cmd_vf_mac_addr_what, 7507 (void *)&cmd_vf_mac_addr_port, 7508 (void *)&cmd_vf_mac_addr_portnum, 7509 (void *)&cmd_vf_mac_addr_vf, 7510 (void *)&cmd_vf_mac_addr_vfnum, 7511 (void *)&cmd_vf_mac_addr_addr, 7512 NULL, 7513 }, 7514 }; 7515 7516 /* *** ADD/REMOVE A VLAN IDENTIFIER TO/FROM A PORT VLAN RX FILTER *** */ 7517 struct cmd_vf_rx_vlan_filter { 7518 cmdline_fixed_string_t rx_vlan; 7519 cmdline_fixed_string_t what; 7520 uint16_t vlan_id; 7521 cmdline_fixed_string_t port; 7522 uint8_t port_id; 7523 cmdline_fixed_string_t vf; 7524 uint64_t vf_mask; 7525 }; 7526 7527 static void 7528 cmd_vf_rx_vlan_filter_parsed(void *parsed_result, 7529 __attribute__((unused)) struct cmdline *cl, 7530 __attribute__((unused)) void *data) 7531 { 7532 struct cmd_vf_rx_vlan_filter *res = parsed_result; 7533 int ret = -ENOTSUP; 7534 7535 __rte_unused int is_add = (strcmp(res->what, "add") == 0) ? 1 : 0; 7536 7537 #ifdef RTE_LIBRTE_IXGBE_PMD 7538 if (ret == -ENOTSUP) 7539 ret = rte_pmd_ixgbe_set_vf_vlan_filter(res->port_id, 7540 res->vlan_id, res->vf_mask, is_add); 7541 #endif 7542 #ifdef RTE_LIBRTE_I40E_PMD 7543 if (ret == -ENOTSUP) 7544 ret = rte_pmd_i40e_set_vf_vlan_filter(res->port_id, 7545 res->vlan_id, res->vf_mask, is_add); 7546 #endif 7547 #ifdef RTE_LIBRTE_BNXT_PMD 7548 if (ret == -ENOTSUP) 7549 ret = rte_pmd_bnxt_set_vf_vlan_filter(res->port_id, 7550 res->vlan_id, res->vf_mask, is_add); 7551 #endif 7552 7553 switch (ret) { 7554 case 0: 7555 break; 7556 case -EINVAL: 7557 printf("invalid vlan_id %d or vf_mask %"PRIu64"\n", 7558 res->vlan_id, res->vf_mask); 7559 break; 7560 case -ENODEV: 7561 printf("invalid port_id %d\n", res->port_id); 7562 break; 7563 case -ENOTSUP: 7564 printf("function not implemented or supported\n"); 7565 break; 7566 default: 7567 printf("programming error: (%s)\n", strerror(-ret)); 7568 } 7569 } 7570 7571 cmdline_parse_token_string_t cmd_vf_rx_vlan_filter_rx_vlan = 7572 TOKEN_STRING_INITIALIZER(struct cmd_vf_rx_vlan_filter, 7573 rx_vlan, "rx_vlan"); 7574 cmdline_parse_token_string_t cmd_vf_rx_vlan_filter_what = 7575 TOKEN_STRING_INITIALIZER(struct cmd_vf_rx_vlan_filter, 7576 what, "add#rm"); 7577 cmdline_parse_token_num_t cmd_vf_rx_vlan_filter_vlanid = 7578 TOKEN_NUM_INITIALIZER(struct cmd_vf_rx_vlan_filter, 7579 vlan_id, UINT16); 7580 cmdline_parse_token_string_t cmd_vf_rx_vlan_filter_port = 7581 TOKEN_STRING_INITIALIZER(struct cmd_vf_rx_vlan_filter, 7582 port, "port"); 7583 cmdline_parse_token_num_t cmd_vf_rx_vlan_filter_portid = 7584 TOKEN_NUM_INITIALIZER(struct cmd_vf_rx_vlan_filter, 7585 port_id, UINT8); 7586 cmdline_parse_token_string_t cmd_vf_rx_vlan_filter_vf = 7587 TOKEN_STRING_INITIALIZER(struct cmd_vf_rx_vlan_filter, 7588 vf, "vf"); 7589 cmdline_parse_token_num_t cmd_vf_rx_vlan_filter_vf_mask = 7590 TOKEN_NUM_INITIALIZER(struct cmd_vf_rx_vlan_filter, 7591 vf_mask, UINT64); 7592 7593 cmdline_parse_inst_t cmd_vf_rxvlan_filter = { 7594 .f = cmd_vf_rx_vlan_filter_parsed, 7595 .data = NULL, 7596 .help_str = "rx_vlan add|rm <vlan_id> port <port_id> vf <vf_mask>: " 7597 "(vf_mask = hexadecimal VF mask)", 7598 .tokens = { 7599 (void *)&cmd_vf_rx_vlan_filter_rx_vlan, 7600 (void *)&cmd_vf_rx_vlan_filter_what, 7601 (void *)&cmd_vf_rx_vlan_filter_vlanid, 7602 (void *)&cmd_vf_rx_vlan_filter_port, 7603 (void *)&cmd_vf_rx_vlan_filter_portid, 7604 (void *)&cmd_vf_rx_vlan_filter_vf, 7605 (void *)&cmd_vf_rx_vlan_filter_vf_mask, 7606 NULL, 7607 }, 7608 }; 7609 7610 /* *** SET RATE LIMIT FOR A QUEUE OF A PORT *** */ 7611 struct cmd_queue_rate_limit_result { 7612 cmdline_fixed_string_t set; 7613 cmdline_fixed_string_t port; 7614 uint8_t port_num; 7615 cmdline_fixed_string_t queue; 7616 uint8_t queue_num; 7617 cmdline_fixed_string_t rate; 7618 uint16_t rate_num; 7619 }; 7620 7621 static void cmd_queue_rate_limit_parsed(void *parsed_result, 7622 __attribute__((unused)) struct cmdline *cl, 7623 __attribute__((unused)) void *data) 7624 { 7625 struct cmd_queue_rate_limit_result *res = parsed_result; 7626 int ret = 0; 7627 7628 if ((strcmp(res->set, "set") == 0) && (strcmp(res->port, "port") == 0) 7629 && (strcmp(res->queue, "queue") == 0) 7630 && (strcmp(res->rate, "rate") == 0)) 7631 ret = set_queue_rate_limit(res->port_num, res->queue_num, 7632 res->rate_num); 7633 if (ret < 0) 7634 printf("queue_rate_limit_cmd error: (%s)\n", strerror(-ret)); 7635 7636 } 7637 7638 cmdline_parse_token_string_t cmd_queue_rate_limit_set = 7639 TOKEN_STRING_INITIALIZER(struct cmd_queue_rate_limit_result, 7640 set, "set"); 7641 cmdline_parse_token_string_t cmd_queue_rate_limit_port = 7642 TOKEN_STRING_INITIALIZER(struct cmd_queue_rate_limit_result, 7643 port, "port"); 7644 cmdline_parse_token_num_t cmd_queue_rate_limit_portnum = 7645 TOKEN_NUM_INITIALIZER(struct cmd_queue_rate_limit_result, 7646 port_num, UINT8); 7647 cmdline_parse_token_string_t cmd_queue_rate_limit_queue = 7648 TOKEN_STRING_INITIALIZER(struct cmd_queue_rate_limit_result, 7649 queue, "queue"); 7650 cmdline_parse_token_num_t cmd_queue_rate_limit_queuenum = 7651 TOKEN_NUM_INITIALIZER(struct cmd_queue_rate_limit_result, 7652 queue_num, UINT8); 7653 cmdline_parse_token_string_t cmd_queue_rate_limit_rate = 7654 TOKEN_STRING_INITIALIZER(struct cmd_queue_rate_limit_result, 7655 rate, "rate"); 7656 cmdline_parse_token_num_t cmd_queue_rate_limit_ratenum = 7657 TOKEN_NUM_INITIALIZER(struct cmd_queue_rate_limit_result, 7658 rate_num, UINT16); 7659 7660 cmdline_parse_inst_t cmd_queue_rate_limit = { 7661 .f = cmd_queue_rate_limit_parsed, 7662 .data = (void *)0, 7663 .help_str = "set port <port_id> queue <queue_id> rate <rate_value>: " 7664 "Set rate limit for a queue on port_id", 7665 .tokens = { 7666 (void *)&cmd_queue_rate_limit_set, 7667 (void *)&cmd_queue_rate_limit_port, 7668 (void *)&cmd_queue_rate_limit_portnum, 7669 (void *)&cmd_queue_rate_limit_queue, 7670 (void *)&cmd_queue_rate_limit_queuenum, 7671 (void *)&cmd_queue_rate_limit_rate, 7672 (void *)&cmd_queue_rate_limit_ratenum, 7673 NULL, 7674 }, 7675 }; 7676 7677 /* *** SET RATE LIMIT FOR A VF OF A PORT *** */ 7678 struct cmd_vf_rate_limit_result { 7679 cmdline_fixed_string_t set; 7680 cmdline_fixed_string_t port; 7681 uint8_t port_num; 7682 cmdline_fixed_string_t vf; 7683 uint8_t vf_num; 7684 cmdline_fixed_string_t rate; 7685 uint16_t rate_num; 7686 cmdline_fixed_string_t q_msk; 7687 uint64_t q_msk_val; 7688 }; 7689 7690 static void cmd_vf_rate_limit_parsed(void *parsed_result, 7691 __attribute__((unused)) struct cmdline *cl, 7692 __attribute__((unused)) void *data) 7693 { 7694 struct cmd_vf_rate_limit_result *res = parsed_result; 7695 int ret = 0; 7696 7697 if ((strcmp(res->set, "set") == 0) && (strcmp(res->port, "port") == 0) 7698 && (strcmp(res->vf, "vf") == 0) 7699 && (strcmp(res->rate, "rate") == 0) 7700 && (strcmp(res->q_msk, "queue_mask") == 0)) 7701 ret = set_vf_rate_limit(res->port_num, res->vf_num, 7702 res->rate_num, res->q_msk_val); 7703 if (ret < 0) 7704 printf("vf_rate_limit_cmd error: (%s)\n", strerror(-ret)); 7705 7706 } 7707 7708 cmdline_parse_token_string_t cmd_vf_rate_limit_set = 7709 TOKEN_STRING_INITIALIZER(struct cmd_vf_rate_limit_result, 7710 set, "set"); 7711 cmdline_parse_token_string_t cmd_vf_rate_limit_port = 7712 TOKEN_STRING_INITIALIZER(struct cmd_vf_rate_limit_result, 7713 port, "port"); 7714 cmdline_parse_token_num_t cmd_vf_rate_limit_portnum = 7715 TOKEN_NUM_INITIALIZER(struct cmd_vf_rate_limit_result, 7716 port_num, UINT8); 7717 cmdline_parse_token_string_t cmd_vf_rate_limit_vf = 7718 TOKEN_STRING_INITIALIZER(struct cmd_vf_rate_limit_result, 7719 vf, "vf"); 7720 cmdline_parse_token_num_t cmd_vf_rate_limit_vfnum = 7721 TOKEN_NUM_INITIALIZER(struct cmd_vf_rate_limit_result, 7722 vf_num, UINT8); 7723 cmdline_parse_token_string_t cmd_vf_rate_limit_rate = 7724 TOKEN_STRING_INITIALIZER(struct cmd_vf_rate_limit_result, 7725 rate, "rate"); 7726 cmdline_parse_token_num_t cmd_vf_rate_limit_ratenum = 7727 TOKEN_NUM_INITIALIZER(struct cmd_vf_rate_limit_result, 7728 rate_num, UINT16); 7729 cmdline_parse_token_string_t cmd_vf_rate_limit_q_msk = 7730 TOKEN_STRING_INITIALIZER(struct cmd_vf_rate_limit_result, 7731 q_msk, "queue_mask"); 7732 cmdline_parse_token_num_t cmd_vf_rate_limit_q_msk_val = 7733 TOKEN_NUM_INITIALIZER(struct cmd_vf_rate_limit_result, 7734 q_msk_val, UINT64); 7735 7736 cmdline_parse_inst_t cmd_vf_rate_limit = { 7737 .f = cmd_vf_rate_limit_parsed, 7738 .data = (void *)0, 7739 .help_str = "set port <port_id> vf <vf_id> rate <rate_value> " 7740 "queue_mask <queue_mask_value>: " 7741 "Set rate limit for queues of VF on port_id", 7742 .tokens = { 7743 (void *)&cmd_vf_rate_limit_set, 7744 (void *)&cmd_vf_rate_limit_port, 7745 (void *)&cmd_vf_rate_limit_portnum, 7746 (void *)&cmd_vf_rate_limit_vf, 7747 (void *)&cmd_vf_rate_limit_vfnum, 7748 (void *)&cmd_vf_rate_limit_rate, 7749 (void *)&cmd_vf_rate_limit_ratenum, 7750 (void *)&cmd_vf_rate_limit_q_msk, 7751 (void *)&cmd_vf_rate_limit_q_msk_val, 7752 NULL, 7753 }, 7754 }; 7755 7756 /* *** ADD TUNNEL FILTER OF A PORT *** */ 7757 struct cmd_tunnel_filter_result { 7758 cmdline_fixed_string_t cmd; 7759 cmdline_fixed_string_t what; 7760 uint8_t port_id; 7761 struct ether_addr outer_mac; 7762 struct ether_addr inner_mac; 7763 cmdline_ipaddr_t ip_value; 7764 uint16_t inner_vlan; 7765 cmdline_fixed_string_t tunnel_type; 7766 cmdline_fixed_string_t filter_type; 7767 uint32_t tenant_id; 7768 uint16_t queue_num; 7769 }; 7770 7771 static void 7772 cmd_tunnel_filter_parsed(void *parsed_result, 7773 __attribute__((unused)) struct cmdline *cl, 7774 __attribute__((unused)) void *data) 7775 { 7776 struct cmd_tunnel_filter_result *res = parsed_result; 7777 struct rte_eth_tunnel_filter_conf tunnel_filter_conf; 7778 int ret = 0; 7779 7780 memset(&tunnel_filter_conf, 0, sizeof(tunnel_filter_conf)); 7781 7782 ether_addr_copy(&res->outer_mac, &tunnel_filter_conf.outer_mac); 7783 ether_addr_copy(&res->inner_mac, &tunnel_filter_conf.inner_mac); 7784 tunnel_filter_conf.inner_vlan = res->inner_vlan; 7785 7786 if (res->ip_value.family == AF_INET) { 7787 tunnel_filter_conf.ip_addr.ipv4_addr = 7788 res->ip_value.addr.ipv4.s_addr; 7789 tunnel_filter_conf.ip_type = RTE_TUNNEL_IPTYPE_IPV4; 7790 } else { 7791 memcpy(&(tunnel_filter_conf.ip_addr.ipv6_addr), 7792 &(res->ip_value.addr.ipv6), 7793 sizeof(struct in6_addr)); 7794 tunnel_filter_conf.ip_type = RTE_TUNNEL_IPTYPE_IPV6; 7795 } 7796 7797 if (!strcmp(res->filter_type, "imac-ivlan")) 7798 tunnel_filter_conf.filter_type = RTE_TUNNEL_FILTER_IMAC_IVLAN; 7799 else if (!strcmp(res->filter_type, "imac-ivlan-tenid")) 7800 tunnel_filter_conf.filter_type = 7801 RTE_TUNNEL_FILTER_IMAC_IVLAN_TENID; 7802 else if (!strcmp(res->filter_type, "imac-tenid")) 7803 tunnel_filter_conf.filter_type = RTE_TUNNEL_FILTER_IMAC_TENID; 7804 else if (!strcmp(res->filter_type, "imac")) 7805 tunnel_filter_conf.filter_type = ETH_TUNNEL_FILTER_IMAC; 7806 else if (!strcmp(res->filter_type, "omac-imac-tenid")) 7807 tunnel_filter_conf.filter_type = 7808 RTE_TUNNEL_FILTER_OMAC_TENID_IMAC; 7809 else if (!strcmp(res->filter_type, "oip")) 7810 tunnel_filter_conf.filter_type = ETH_TUNNEL_FILTER_OIP; 7811 else if (!strcmp(res->filter_type, "iip")) 7812 tunnel_filter_conf.filter_type = ETH_TUNNEL_FILTER_IIP; 7813 else { 7814 printf("The filter type is not supported"); 7815 return; 7816 } 7817 7818 if (!strcmp(res->tunnel_type, "vxlan")) 7819 tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_VXLAN; 7820 else if (!strcmp(res->tunnel_type, "nvgre")) 7821 tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_NVGRE; 7822 else if (!strcmp(res->tunnel_type, "ipingre")) 7823 tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_IP_IN_GRE; 7824 else { 7825 printf("The tunnel type %s not supported.\n", res->tunnel_type); 7826 return; 7827 } 7828 7829 tunnel_filter_conf.tenant_id = res->tenant_id; 7830 tunnel_filter_conf.queue_id = res->queue_num; 7831 if (!strcmp(res->what, "add")) 7832 ret = rte_eth_dev_filter_ctrl(res->port_id, 7833 RTE_ETH_FILTER_TUNNEL, 7834 RTE_ETH_FILTER_ADD, 7835 &tunnel_filter_conf); 7836 else 7837 ret = rte_eth_dev_filter_ctrl(res->port_id, 7838 RTE_ETH_FILTER_TUNNEL, 7839 RTE_ETH_FILTER_DELETE, 7840 &tunnel_filter_conf); 7841 if (ret < 0) 7842 printf("cmd_tunnel_filter_parsed error: (%s)\n", 7843 strerror(-ret)); 7844 7845 } 7846 cmdline_parse_token_string_t cmd_tunnel_filter_cmd = 7847 TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result, 7848 cmd, "tunnel_filter"); 7849 cmdline_parse_token_string_t cmd_tunnel_filter_what = 7850 TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result, 7851 what, "add#rm"); 7852 cmdline_parse_token_num_t cmd_tunnel_filter_port_id = 7853 TOKEN_NUM_INITIALIZER(struct cmd_tunnel_filter_result, 7854 port_id, UINT8); 7855 cmdline_parse_token_etheraddr_t cmd_tunnel_filter_outer_mac = 7856 TOKEN_ETHERADDR_INITIALIZER(struct cmd_tunnel_filter_result, 7857 outer_mac); 7858 cmdline_parse_token_etheraddr_t cmd_tunnel_filter_inner_mac = 7859 TOKEN_ETHERADDR_INITIALIZER(struct cmd_tunnel_filter_result, 7860 inner_mac); 7861 cmdline_parse_token_num_t cmd_tunnel_filter_innner_vlan = 7862 TOKEN_NUM_INITIALIZER(struct cmd_tunnel_filter_result, 7863 inner_vlan, UINT16); 7864 cmdline_parse_token_ipaddr_t cmd_tunnel_filter_ip_value = 7865 TOKEN_IPADDR_INITIALIZER(struct cmd_tunnel_filter_result, 7866 ip_value); 7867 cmdline_parse_token_string_t cmd_tunnel_filter_tunnel_type = 7868 TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result, 7869 tunnel_type, "vxlan#nvgre#ipingre"); 7870 7871 cmdline_parse_token_string_t cmd_tunnel_filter_filter_type = 7872 TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result, 7873 filter_type, "oip#iip#imac-ivlan#imac-ivlan-tenid#imac-tenid#" 7874 "imac#omac-imac-tenid"); 7875 cmdline_parse_token_num_t cmd_tunnel_filter_tenant_id = 7876 TOKEN_NUM_INITIALIZER(struct cmd_tunnel_filter_result, 7877 tenant_id, UINT32); 7878 cmdline_parse_token_num_t cmd_tunnel_filter_queue_num = 7879 TOKEN_NUM_INITIALIZER(struct cmd_tunnel_filter_result, 7880 queue_num, UINT16); 7881 7882 cmdline_parse_inst_t cmd_tunnel_filter = { 7883 .f = cmd_tunnel_filter_parsed, 7884 .data = (void *)0, 7885 .help_str = "tunnel_filter add|rm <port_id> <outer_mac> <inner_mac> " 7886 "<ip> <inner_vlan> vxlan|nvgre|ipingre oip|iip|imac-ivlan|" 7887 "imac-ivlan-tenid|imac-tenid|imac|omac-imac-tenid <tenant_id> " 7888 "<queue_id>: Add/Rm tunnel filter of a port", 7889 .tokens = { 7890 (void *)&cmd_tunnel_filter_cmd, 7891 (void *)&cmd_tunnel_filter_what, 7892 (void *)&cmd_tunnel_filter_port_id, 7893 (void *)&cmd_tunnel_filter_outer_mac, 7894 (void *)&cmd_tunnel_filter_inner_mac, 7895 (void *)&cmd_tunnel_filter_ip_value, 7896 (void *)&cmd_tunnel_filter_innner_vlan, 7897 (void *)&cmd_tunnel_filter_tunnel_type, 7898 (void *)&cmd_tunnel_filter_filter_type, 7899 (void *)&cmd_tunnel_filter_tenant_id, 7900 (void *)&cmd_tunnel_filter_queue_num, 7901 NULL, 7902 }, 7903 }; 7904 7905 /* *** CONFIGURE TUNNEL UDP PORT *** */ 7906 struct cmd_tunnel_udp_config { 7907 cmdline_fixed_string_t cmd; 7908 cmdline_fixed_string_t what; 7909 uint16_t udp_port; 7910 uint8_t port_id; 7911 }; 7912 7913 static void 7914 cmd_tunnel_udp_config_parsed(void *parsed_result, 7915 __attribute__((unused)) struct cmdline *cl, 7916 __attribute__((unused)) void *data) 7917 { 7918 struct cmd_tunnel_udp_config *res = parsed_result; 7919 struct rte_eth_udp_tunnel tunnel_udp; 7920 int ret; 7921 7922 tunnel_udp.udp_port = res->udp_port; 7923 7924 if (!strcmp(res->cmd, "rx_vxlan_port")) 7925 tunnel_udp.prot_type = RTE_TUNNEL_TYPE_VXLAN; 7926 7927 if (!strcmp(res->what, "add")) 7928 ret = rte_eth_dev_udp_tunnel_port_add(res->port_id, 7929 &tunnel_udp); 7930 else 7931 ret = rte_eth_dev_udp_tunnel_port_delete(res->port_id, 7932 &tunnel_udp); 7933 7934 if (ret < 0) 7935 printf("udp tunneling add error: (%s)\n", strerror(-ret)); 7936 } 7937 7938 cmdline_parse_token_string_t cmd_tunnel_udp_config_cmd = 7939 TOKEN_STRING_INITIALIZER(struct cmd_tunnel_udp_config, 7940 cmd, "rx_vxlan_port"); 7941 cmdline_parse_token_string_t cmd_tunnel_udp_config_what = 7942 TOKEN_STRING_INITIALIZER(struct cmd_tunnel_udp_config, 7943 what, "add#rm"); 7944 cmdline_parse_token_num_t cmd_tunnel_udp_config_udp_port = 7945 TOKEN_NUM_INITIALIZER(struct cmd_tunnel_udp_config, 7946 udp_port, UINT16); 7947 cmdline_parse_token_num_t cmd_tunnel_udp_config_port_id = 7948 TOKEN_NUM_INITIALIZER(struct cmd_tunnel_udp_config, 7949 port_id, UINT8); 7950 7951 cmdline_parse_inst_t cmd_tunnel_udp_config = { 7952 .f = cmd_tunnel_udp_config_parsed, 7953 .data = (void *)0, 7954 .help_str = "rx_vxlan_port add|rm <udp_port> <port_id>: " 7955 "Add/Remove a tunneling UDP port filter", 7956 .tokens = { 7957 (void *)&cmd_tunnel_udp_config_cmd, 7958 (void *)&cmd_tunnel_udp_config_what, 7959 (void *)&cmd_tunnel_udp_config_udp_port, 7960 (void *)&cmd_tunnel_udp_config_port_id, 7961 NULL, 7962 }, 7963 }; 7964 7965 /* *** GLOBAL CONFIG *** */ 7966 struct cmd_global_config_result { 7967 cmdline_fixed_string_t cmd; 7968 uint8_t port_id; 7969 cmdline_fixed_string_t cfg_type; 7970 uint8_t len; 7971 }; 7972 7973 static void 7974 cmd_global_config_parsed(void *parsed_result, 7975 __attribute__((unused)) struct cmdline *cl, 7976 __attribute__((unused)) void *data) 7977 { 7978 struct cmd_global_config_result *res = parsed_result; 7979 struct rte_eth_global_cfg conf; 7980 int ret; 7981 7982 memset(&conf, 0, sizeof(conf)); 7983 conf.cfg_type = RTE_ETH_GLOBAL_CFG_TYPE_GRE_KEY_LEN; 7984 conf.cfg.gre_key_len = res->len; 7985 ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE, 7986 RTE_ETH_FILTER_SET, &conf); 7987 if (ret != 0) 7988 printf("Global config error\n"); 7989 } 7990 7991 cmdline_parse_token_string_t cmd_global_config_cmd = 7992 TOKEN_STRING_INITIALIZER(struct cmd_global_config_result, cmd, 7993 "global_config"); 7994 cmdline_parse_token_num_t cmd_global_config_port_id = 7995 TOKEN_NUM_INITIALIZER(struct cmd_global_config_result, port_id, UINT8); 7996 cmdline_parse_token_string_t cmd_global_config_type = 7997 TOKEN_STRING_INITIALIZER(struct cmd_global_config_result, 7998 cfg_type, "gre-key-len"); 7999 cmdline_parse_token_num_t cmd_global_config_gre_key_len = 8000 TOKEN_NUM_INITIALIZER(struct cmd_global_config_result, 8001 len, UINT8); 8002 8003 cmdline_parse_inst_t cmd_global_config = { 8004 .f = cmd_global_config_parsed, 8005 .data = (void *)NULL, 8006 .help_str = "global_config <port_id> gre-key-len <key_len>", 8007 .tokens = { 8008 (void *)&cmd_global_config_cmd, 8009 (void *)&cmd_global_config_port_id, 8010 (void *)&cmd_global_config_type, 8011 (void *)&cmd_global_config_gre_key_len, 8012 NULL, 8013 }, 8014 }; 8015 8016 /* *** CONFIGURE VM MIRROR VLAN/POOL RULE *** */ 8017 struct cmd_set_mirror_mask_result { 8018 cmdline_fixed_string_t set; 8019 cmdline_fixed_string_t port; 8020 uint8_t port_id; 8021 cmdline_fixed_string_t mirror; 8022 uint8_t rule_id; 8023 cmdline_fixed_string_t what; 8024 cmdline_fixed_string_t value; 8025 cmdline_fixed_string_t dstpool; 8026 uint8_t dstpool_id; 8027 cmdline_fixed_string_t on; 8028 }; 8029 8030 cmdline_parse_token_string_t cmd_mirror_mask_set = 8031 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result, 8032 set, "set"); 8033 cmdline_parse_token_string_t cmd_mirror_mask_port = 8034 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result, 8035 port, "port"); 8036 cmdline_parse_token_num_t cmd_mirror_mask_portid = 8037 TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_mask_result, 8038 port_id, UINT8); 8039 cmdline_parse_token_string_t cmd_mirror_mask_mirror = 8040 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result, 8041 mirror, "mirror-rule"); 8042 cmdline_parse_token_num_t cmd_mirror_mask_ruleid = 8043 TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_mask_result, 8044 rule_id, UINT8); 8045 cmdline_parse_token_string_t cmd_mirror_mask_what = 8046 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result, 8047 what, "pool-mirror-up#pool-mirror-down" 8048 "#vlan-mirror"); 8049 cmdline_parse_token_string_t cmd_mirror_mask_value = 8050 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result, 8051 value, NULL); 8052 cmdline_parse_token_string_t cmd_mirror_mask_dstpool = 8053 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result, 8054 dstpool, "dst-pool"); 8055 cmdline_parse_token_num_t cmd_mirror_mask_poolid = 8056 TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_mask_result, 8057 dstpool_id, UINT8); 8058 cmdline_parse_token_string_t cmd_mirror_mask_on = 8059 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result, 8060 on, "on#off"); 8061 8062 static void 8063 cmd_set_mirror_mask_parsed(void *parsed_result, 8064 __attribute__((unused)) struct cmdline *cl, 8065 __attribute__((unused)) void *data) 8066 { 8067 int ret,nb_item,i; 8068 struct cmd_set_mirror_mask_result *res = parsed_result; 8069 struct rte_eth_mirror_conf mr_conf; 8070 8071 memset(&mr_conf, 0, sizeof(struct rte_eth_mirror_conf)); 8072 8073 unsigned int vlan_list[ETH_MIRROR_MAX_VLANS]; 8074 8075 mr_conf.dst_pool = res->dstpool_id; 8076 8077 if (!strcmp(res->what, "pool-mirror-up")) { 8078 mr_conf.pool_mask = strtoull(res->value, NULL, 16); 8079 mr_conf.rule_type = ETH_MIRROR_VIRTUAL_POOL_UP; 8080 } else if (!strcmp(res->what, "pool-mirror-down")) { 8081 mr_conf.pool_mask = strtoull(res->value, NULL, 16); 8082 mr_conf.rule_type = ETH_MIRROR_VIRTUAL_POOL_DOWN; 8083 } else if (!strcmp(res->what, "vlan-mirror")) { 8084 mr_conf.rule_type = ETH_MIRROR_VLAN; 8085 nb_item = parse_item_list(res->value, "vlan", 8086 ETH_MIRROR_MAX_VLANS, vlan_list, 1); 8087 if (nb_item <= 0) 8088 return; 8089 8090 for (i = 0; i < nb_item; i++) { 8091 if (vlan_list[i] > ETHER_MAX_VLAN_ID) { 8092 printf("Invalid vlan_id: must be < 4096\n"); 8093 return; 8094 } 8095 8096 mr_conf.vlan.vlan_id[i] = (uint16_t)vlan_list[i]; 8097 mr_conf.vlan.vlan_mask |= 1ULL << i; 8098 } 8099 } 8100 8101 if (!strcmp(res->on, "on")) 8102 ret = rte_eth_mirror_rule_set(res->port_id, &mr_conf, 8103 res->rule_id, 1); 8104 else 8105 ret = rte_eth_mirror_rule_set(res->port_id, &mr_conf, 8106 res->rule_id, 0); 8107 if (ret < 0) 8108 printf("mirror rule add error: (%s)\n", strerror(-ret)); 8109 } 8110 8111 cmdline_parse_inst_t cmd_set_mirror_mask = { 8112 .f = cmd_set_mirror_mask_parsed, 8113 .data = NULL, 8114 .help_str = "set port <port_id> mirror-rule <rule_id> " 8115 "pool-mirror-up|pool-mirror-down|vlan-mirror " 8116 "<pool_mask|vlan_id[,vlan_id]*> dst-pool <pool_id> on|off", 8117 .tokens = { 8118 (void *)&cmd_mirror_mask_set, 8119 (void *)&cmd_mirror_mask_port, 8120 (void *)&cmd_mirror_mask_portid, 8121 (void *)&cmd_mirror_mask_mirror, 8122 (void *)&cmd_mirror_mask_ruleid, 8123 (void *)&cmd_mirror_mask_what, 8124 (void *)&cmd_mirror_mask_value, 8125 (void *)&cmd_mirror_mask_dstpool, 8126 (void *)&cmd_mirror_mask_poolid, 8127 (void *)&cmd_mirror_mask_on, 8128 NULL, 8129 }, 8130 }; 8131 8132 /* *** CONFIGURE VM MIRROR UPLINK/DOWNLINK RULE *** */ 8133 struct cmd_set_mirror_link_result { 8134 cmdline_fixed_string_t set; 8135 cmdline_fixed_string_t port; 8136 uint8_t port_id; 8137 cmdline_fixed_string_t mirror; 8138 uint8_t rule_id; 8139 cmdline_fixed_string_t what; 8140 cmdline_fixed_string_t dstpool; 8141 uint8_t dstpool_id; 8142 cmdline_fixed_string_t on; 8143 }; 8144 8145 cmdline_parse_token_string_t cmd_mirror_link_set = 8146 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result, 8147 set, "set"); 8148 cmdline_parse_token_string_t cmd_mirror_link_port = 8149 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result, 8150 port, "port"); 8151 cmdline_parse_token_num_t cmd_mirror_link_portid = 8152 TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_link_result, 8153 port_id, UINT8); 8154 cmdline_parse_token_string_t cmd_mirror_link_mirror = 8155 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result, 8156 mirror, "mirror-rule"); 8157 cmdline_parse_token_num_t cmd_mirror_link_ruleid = 8158 TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_link_result, 8159 rule_id, UINT8); 8160 cmdline_parse_token_string_t cmd_mirror_link_what = 8161 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result, 8162 what, "uplink-mirror#downlink-mirror"); 8163 cmdline_parse_token_string_t cmd_mirror_link_dstpool = 8164 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result, 8165 dstpool, "dst-pool"); 8166 cmdline_parse_token_num_t cmd_mirror_link_poolid = 8167 TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_link_result, 8168 dstpool_id, UINT8); 8169 cmdline_parse_token_string_t cmd_mirror_link_on = 8170 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result, 8171 on, "on#off"); 8172 8173 static void 8174 cmd_set_mirror_link_parsed(void *parsed_result, 8175 __attribute__((unused)) struct cmdline *cl, 8176 __attribute__((unused)) void *data) 8177 { 8178 int ret; 8179 struct cmd_set_mirror_link_result *res = parsed_result; 8180 struct rte_eth_mirror_conf mr_conf; 8181 8182 memset(&mr_conf, 0, sizeof(struct rte_eth_mirror_conf)); 8183 if (!strcmp(res->what, "uplink-mirror")) 8184 mr_conf.rule_type = ETH_MIRROR_UPLINK_PORT; 8185 else 8186 mr_conf.rule_type = ETH_MIRROR_DOWNLINK_PORT; 8187 8188 mr_conf.dst_pool = res->dstpool_id; 8189 8190 if (!strcmp(res->on, "on")) 8191 ret = rte_eth_mirror_rule_set(res->port_id, &mr_conf, 8192 res->rule_id, 1); 8193 else 8194 ret = rte_eth_mirror_rule_set(res->port_id, &mr_conf, 8195 res->rule_id, 0); 8196 8197 /* check the return value and print it if is < 0 */ 8198 if (ret < 0) 8199 printf("mirror rule add error: (%s)\n", strerror(-ret)); 8200 8201 } 8202 8203 cmdline_parse_inst_t cmd_set_mirror_link = { 8204 .f = cmd_set_mirror_link_parsed, 8205 .data = NULL, 8206 .help_str = "set port <port_id> mirror-rule <rule_id> " 8207 "uplink-mirror|downlink-mirror dst-pool <pool_id> on|off", 8208 .tokens = { 8209 (void *)&cmd_mirror_link_set, 8210 (void *)&cmd_mirror_link_port, 8211 (void *)&cmd_mirror_link_portid, 8212 (void *)&cmd_mirror_link_mirror, 8213 (void *)&cmd_mirror_link_ruleid, 8214 (void *)&cmd_mirror_link_what, 8215 (void *)&cmd_mirror_link_dstpool, 8216 (void *)&cmd_mirror_link_poolid, 8217 (void *)&cmd_mirror_link_on, 8218 NULL, 8219 }, 8220 }; 8221 8222 /* *** RESET VM MIRROR RULE *** */ 8223 struct cmd_rm_mirror_rule_result { 8224 cmdline_fixed_string_t reset; 8225 cmdline_fixed_string_t port; 8226 uint8_t port_id; 8227 cmdline_fixed_string_t mirror; 8228 uint8_t rule_id; 8229 }; 8230 8231 cmdline_parse_token_string_t cmd_rm_mirror_rule_reset = 8232 TOKEN_STRING_INITIALIZER(struct cmd_rm_mirror_rule_result, 8233 reset, "reset"); 8234 cmdline_parse_token_string_t cmd_rm_mirror_rule_port = 8235 TOKEN_STRING_INITIALIZER(struct cmd_rm_mirror_rule_result, 8236 port, "port"); 8237 cmdline_parse_token_num_t cmd_rm_mirror_rule_portid = 8238 TOKEN_NUM_INITIALIZER(struct cmd_rm_mirror_rule_result, 8239 port_id, UINT8); 8240 cmdline_parse_token_string_t cmd_rm_mirror_rule_mirror = 8241 TOKEN_STRING_INITIALIZER(struct cmd_rm_mirror_rule_result, 8242 mirror, "mirror-rule"); 8243 cmdline_parse_token_num_t cmd_rm_mirror_rule_ruleid = 8244 TOKEN_NUM_INITIALIZER(struct cmd_rm_mirror_rule_result, 8245 rule_id, UINT8); 8246 8247 static void 8248 cmd_reset_mirror_rule_parsed(void *parsed_result, 8249 __attribute__((unused)) struct cmdline *cl, 8250 __attribute__((unused)) void *data) 8251 { 8252 int ret; 8253 struct cmd_set_mirror_link_result *res = parsed_result; 8254 /* check rule_id */ 8255 ret = rte_eth_mirror_rule_reset(res->port_id,res->rule_id); 8256 if(ret < 0) 8257 printf("mirror rule remove error: (%s)\n", strerror(-ret)); 8258 } 8259 8260 cmdline_parse_inst_t cmd_reset_mirror_rule = { 8261 .f = cmd_reset_mirror_rule_parsed, 8262 .data = NULL, 8263 .help_str = "reset port <port_id> mirror-rule <rule_id>", 8264 .tokens = { 8265 (void *)&cmd_rm_mirror_rule_reset, 8266 (void *)&cmd_rm_mirror_rule_port, 8267 (void *)&cmd_rm_mirror_rule_portid, 8268 (void *)&cmd_rm_mirror_rule_mirror, 8269 (void *)&cmd_rm_mirror_rule_ruleid, 8270 NULL, 8271 }, 8272 }; 8273 8274 /* ******************************************************************************** */ 8275 8276 struct cmd_dump_result { 8277 cmdline_fixed_string_t dump; 8278 }; 8279 8280 static void 8281 dump_struct_sizes(void) 8282 { 8283 #define DUMP_SIZE(t) printf("sizeof(" #t ") = %u\n", (unsigned)sizeof(t)); 8284 DUMP_SIZE(struct rte_mbuf); 8285 DUMP_SIZE(struct rte_mempool); 8286 DUMP_SIZE(struct rte_ring); 8287 #undef DUMP_SIZE 8288 } 8289 8290 static void cmd_dump_parsed(void *parsed_result, 8291 __attribute__((unused)) struct cmdline *cl, 8292 __attribute__((unused)) void *data) 8293 { 8294 struct cmd_dump_result *res = parsed_result; 8295 8296 if (!strcmp(res->dump, "dump_physmem")) 8297 rte_dump_physmem_layout(stdout); 8298 else if (!strcmp(res->dump, "dump_memzone")) 8299 rte_memzone_dump(stdout); 8300 else if (!strcmp(res->dump, "dump_struct_sizes")) 8301 dump_struct_sizes(); 8302 else if (!strcmp(res->dump, "dump_ring")) 8303 rte_ring_list_dump(stdout); 8304 else if (!strcmp(res->dump, "dump_mempool")) 8305 rte_mempool_list_dump(stdout); 8306 else if (!strcmp(res->dump, "dump_devargs")) 8307 rte_eal_devargs_dump(stdout); 8308 else if (!strcmp(res->dump, "dump_log_types")) 8309 rte_log_dump(stdout); 8310 } 8311 8312 cmdline_parse_token_string_t cmd_dump_dump = 8313 TOKEN_STRING_INITIALIZER(struct cmd_dump_result, dump, 8314 "dump_physmem#" 8315 "dump_memzone#" 8316 "dump_struct_sizes#" 8317 "dump_ring#" 8318 "dump_mempool#" 8319 "dump_devargs#" 8320 "dump_log_types"); 8321 8322 cmdline_parse_inst_t cmd_dump = { 8323 .f = cmd_dump_parsed, /* function to call */ 8324 .data = NULL, /* 2nd arg of func */ 8325 .help_str = "Dump status", 8326 .tokens = { /* token list, NULL terminated */ 8327 (void *)&cmd_dump_dump, 8328 NULL, 8329 }, 8330 }; 8331 8332 /* ******************************************************************************** */ 8333 8334 struct cmd_dump_one_result { 8335 cmdline_fixed_string_t dump; 8336 cmdline_fixed_string_t name; 8337 }; 8338 8339 static void cmd_dump_one_parsed(void *parsed_result, struct cmdline *cl, 8340 __attribute__((unused)) void *data) 8341 { 8342 struct cmd_dump_one_result *res = parsed_result; 8343 8344 if (!strcmp(res->dump, "dump_ring")) { 8345 struct rte_ring *r; 8346 r = rte_ring_lookup(res->name); 8347 if (r == NULL) { 8348 cmdline_printf(cl, "Cannot find ring\n"); 8349 return; 8350 } 8351 rte_ring_dump(stdout, r); 8352 } else if (!strcmp(res->dump, "dump_mempool")) { 8353 struct rte_mempool *mp; 8354 mp = rte_mempool_lookup(res->name); 8355 if (mp == NULL) { 8356 cmdline_printf(cl, "Cannot find mempool\n"); 8357 return; 8358 } 8359 rte_mempool_dump(stdout, mp); 8360 } 8361 } 8362 8363 cmdline_parse_token_string_t cmd_dump_one_dump = 8364 TOKEN_STRING_INITIALIZER(struct cmd_dump_one_result, dump, 8365 "dump_ring#dump_mempool"); 8366 8367 cmdline_parse_token_string_t cmd_dump_one_name = 8368 TOKEN_STRING_INITIALIZER(struct cmd_dump_one_result, name, NULL); 8369 8370 cmdline_parse_inst_t cmd_dump_one = { 8371 .f = cmd_dump_one_parsed, /* function to call */ 8372 .data = NULL, /* 2nd arg of func */ 8373 .help_str = "dump_ring|dump_mempool <name>: Dump one ring/mempool", 8374 .tokens = { /* token list, NULL terminated */ 8375 (void *)&cmd_dump_one_dump, 8376 (void *)&cmd_dump_one_name, 8377 NULL, 8378 }, 8379 }; 8380 8381 /* *** Add/Del syn filter *** */ 8382 struct cmd_syn_filter_result { 8383 cmdline_fixed_string_t filter; 8384 uint8_t port_id; 8385 cmdline_fixed_string_t ops; 8386 cmdline_fixed_string_t priority; 8387 cmdline_fixed_string_t high; 8388 cmdline_fixed_string_t queue; 8389 uint16_t queue_id; 8390 }; 8391 8392 static void 8393 cmd_syn_filter_parsed(void *parsed_result, 8394 __attribute__((unused)) struct cmdline *cl, 8395 __attribute__((unused)) void *data) 8396 { 8397 struct cmd_syn_filter_result *res = parsed_result; 8398 struct rte_eth_syn_filter syn_filter; 8399 int ret = 0; 8400 8401 ret = rte_eth_dev_filter_supported(res->port_id, 8402 RTE_ETH_FILTER_SYN); 8403 if (ret < 0) { 8404 printf("syn filter is not supported on port %u.\n", 8405 res->port_id); 8406 return; 8407 } 8408 8409 memset(&syn_filter, 0, sizeof(syn_filter)); 8410 8411 if (!strcmp(res->ops, "add")) { 8412 if (!strcmp(res->high, "high")) 8413 syn_filter.hig_pri = 1; 8414 else 8415 syn_filter.hig_pri = 0; 8416 8417 syn_filter.queue = res->queue_id; 8418 ret = rte_eth_dev_filter_ctrl(res->port_id, 8419 RTE_ETH_FILTER_SYN, 8420 RTE_ETH_FILTER_ADD, 8421 &syn_filter); 8422 } else 8423 ret = rte_eth_dev_filter_ctrl(res->port_id, 8424 RTE_ETH_FILTER_SYN, 8425 RTE_ETH_FILTER_DELETE, 8426 &syn_filter); 8427 8428 if (ret < 0) 8429 printf("syn filter programming error: (%s)\n", 8430 strerror(-ret)); 8431 } 8432 8433 cmdline_parse_token_string_t cmd_syn_filter_filter = 8434 TOKEN_STRING_INITIALIZER(struct cmd_syn_filter_result, 8435 filter, "syn_filter"); 8436 cmdline_parse_token_num_t cmd_syn_filter_port_id = 8437 TOKEN_NUM_INITIALIZER(struct cmd_syn_filter_result, 8438 port_id, UINT8); 8439 cmdline_parse_token_string_t cmd_syn_filter_ops = 8440 TOKEN_STRING_INITIALIZER(struct cmd_syn_filter_result, 8441 ops, "add#del"); 8442 cmdline_parse_token_string_t cmd_syn_filter_priority = 8443 TOKEN_STRING_INITIALIZER(struct cmd_syn_filter_result, 8444 priority, "priority"); 8445 cmdline_parse_token_string_t cmd_syn_filter_high = 8446 TOKEN_STRING_INITIALIZER(struct cmd_syn_filter_result, 8447 high, "high#low"); 8448 cmdline_parse_token_string_t cmd_syn_filter_queue = 8449 TOKEN_STRING_INITIALIZER(struct cmd_syn_filter_result, 8450 queue, "queue"); 8451 cmdline_parse_token_num_t cmd_syn_filter_queue_id = 8452 TOKEN_NUM_INITIALIZER(struct cmd_syn_filter_result, 8453 queue_id, UINT16); 8454 8455 cmdline_parse_inst_t cmd_syn_filter = { 8456 .f = cmd_syn_filter_parsed, 8457 .data = NULL, 8458 .help_str = "syn_filter <port_id> add|del priority high|low queue " 8459 "<queue_id>: Add/Delete syn filter", 8460 .tokens = { 8461 (void *)&cmd_syn_filter_filter, 8462 (void *)&cmd_syn_filter_port_id, 8463 (void *)&cmd_syn_filter_ops, 8464 (void *)&cmd_syn_filter_priority, 8465 (void *)&cmd_syn_filter_high, 8466 (void *)&cmd_syn_filter_queue, 8467 (void *)&cmd_syn_filter_queue_id, 8468 NULL, 8469 }, 8470 }; 8471 8472 /* *** ADD/REMOVE A 2tuple FILTER *** */ 8473 struct cmd_2tuple_filter_result { 8474 cmdline_fixed_string_t filter; 8475 uint8_t port_id; 8476 cmdline_fixed_string_t ops; 8477 cmdline_fixed_string_t dst_port; 8478 uint16_t dst_port_value; 8479 cmdline_fixed_string_t protocol; 8480 uint8_t protocol_value; 8481 cmdline_fixed_string_t mask; 8482 uint8_t mask_value; 8483 cmdline_fixed_string_t tcp_flags; 8484 uint8_t tcp_flags_value; 8485 cmdline_fixed_string_t priority; 8486 uint8_t priority_value; 8487 cmdline_fixed_string_t queue; 8488 uint16_t queue_id; 8489 }; 8490 8491 static void 8492 cmd_2tuple_filter_parsed(void *parsed_result, 8493 __attribute__((unused)) struct cmdline *cl, 8494 __attribute__((unused)) void *data) 8495 { 8496 struct rte_eth_ntuple_filter filter; 8497 struct cmd_2tuple_filter_result *res = parsed_result; 8498 int ret = 0; 8499 8500 ret = rte_eth_dev_filter_supported(res->port_id, RTE_ETH_FILTER_NTUPLE); 8501 if (ret < 0) { 8502 printf("ntuple filter is not supported on port %u.\n", 8503 res->port_id); 8504 return; 8505 } 8506 8507 memset(&filter, 0, sizeof(struct rte_eth_ntuple_filter)); 8508 8509 filter.flags = RTE_2TUPLE_FLAGS; 8510 filter.dst_port_mask = (res->mask_value & 0x02) ? UINT16_MAX : 0; 8511 filter.proto_mask = (res->mask_value & 0x01) ? UINT8_MAX : 0; 8512 filter.proto = res->protocol_value; 8513 filter.priority = res->priority_value; 8514 if (res->tcp_flags_value != 0 && filter.proto != IPPROTO_TCP) { 8515 printf("nonzero tcp_flags is only meaningful" 8516 " when protocol is TCP.\n"); 8517 return; 8518 } 8519 if (res->tcp_flags_value > TCP_FLAG_ALL) { 8520 printf("invalid TCP flags.\n"); 8521 return; 8522 } 8523 8524 if (res->tcp_flags_value != 0) { 8525 filter.flags |= RTE_NTUPLE_FLAGS_TCP_FLAG; 8526 filter.tcp_flags = res->tcp_flags_value; 8527 } 8528 8529 /* need convert to big endian. */ 8530 filter.dst_port = rte_cpu_to_be_16(res->dst_port_value); 8531 filter.queue = res->queue_id; 8532 8533 if (!strcmp(res->ops, "add")) 8534 ret = rte_eth_dev_filter_ctrl(res->port_id, 8535 RTE_ETH_FILTER_NTUPLE, 8536 RTE_ETH_FILTER_ADD, 8537 &filter); 8538 else 8539 ret = rte_eth_dev_filter_ctrl(res->port_id, 8540 RTE_ETH_FILTER_NTUPLE, 8541 RTE_ETH_FILTER_DELETE, 8542 &filter); 8543 if (ret < 0) 8544 printf("2tuple filter programming error: (%s)\n", 8545 strerror(-ret)); 8546 8547 } 8548 8549 cmdline_parse_token_string_t cmd_2tuple_filter_filter = 8550 TOKEN_STRING_INITIALIZER(struct cmd_2tuple_filter_result, 8551 filter, "2tuple_filter"); 8552 cmdline_parse_token_num_t cmd_2tuple_filter_port_id = 8553 TOKEN_NUM_INITIALIZER(struct cmd_2tuple_filter_result, 8554 port_id, UINT8); 8555 cmdline_parse_token_string_t cmd_2tuple_filter_ops = 8556 TOKEN_STRING_INITIALIZER(struct cmd_2tuple_filter_result, 8557 ops, "add#del"); 8558 cmdline_parse_token_string_t cmd_2tuple_filter_dst_port = 8559 TOKEN_STRING_INITIALIZER(struct cmd_2tuple_filter_result, 8560 dst_port, "dst_port"); 8561 cmdline_parse_token_num_t cmd_2tuple_filter_dst_port_value = 8562 TOKEN_NUM_INITIALIZER(struct cmd_2tuple_filter_result, 8563 dst_port_value, UINT16); 8564 cmdline_parse_token_string_t cmd_2tuple_filter_protocol = 8565 TOKEN_STRING_INITIALIZER(struct cmd_2tuple_filter_result, 8566 protocol, "protocol"); 8567 cmdline_parse_token_num_t cmd_2tuple_filter_protocol_value = 8568 TOKEN_NUM_INITIALIZER(struct cmd_2tuple_filter_result, 8569 protocol_value, UINT8); 8570 cmdline_parse_token_string_t cmd_2tuple_filter_mask = 8571 TOKEN_STRING_INITIALIZER(struct cmd_2tuple_filter_result, 8572 mask, "mask"); 8573 cmdline_parse_token_num_t cmd_2tuple_filter_mask_value = 8574 TOKEN_NUM_INITIALIZER(struct cmd_2tuple_filter_result, 8575 mask_value, INT8); 8576 cmdline_parse_token_string_t cmd_2tuple_filter_tcp_flags = 8577 TOKEN_STRING_INITIALIZER(struct cmd_2tuple_filter_result, 8578 tcp_flags, "tcp_flags"); 8579 cmdline_parse_token_num_t cmd_2tuple_filter_tcp_flags_value = 8580 TOKEN_NUM_INITIALIZER(struct cmd_2tuple_filter_result, 8581 tcp_flags_value, UINT8); 8582 cmdline_parse_token_string_t cmd_2tuple_filter_priority = 8583 TOKEN_STRING_INITIALIZER(struct cmd_2tuple_filter_result, 8584 priority, "priority"); 8585 cmdline_parse_token_num_t cmd_2tuple_filter_priority_value = 8586 TOKEN_NUM_INITIALIZER(struct cmd_2tuple_filter_result, 8587 priority_value, UINT8); 8588 cmdline_parse_token_string_t cmd_2tuple_filter_queue = 8589 TOKEN_STRING_INITIALIZER(struct cmd_2tuple_filter_result, 8590 queue, "queue"); 8591 cmdline_parse_token_num_t cmd_2tuple_filter_queue_id = 8592 TOKEN_NUM_INITIALIZER(struct cmd_2tuple_filter_result, 8593 queue_id, UINT16); 8594 8595 cmdline_parse_inst_t cmd_2tuple_filter = { 8596 .f = cmd_2tuple_filter_parsed, 8597 .data = NULL, 8598 .help_str = "2tuple_filter <port_id> add|del dst_port <value> protocol " 8599 "<value> mask <value> tcp_flags <value> priority <value> queue " 8600 "<queue_id>: Add a 2tuple filter", 8601 .tokens = { 8602 (void *)&cmd_2tuple_filter_filter, 8603 (void *)&cmd_2tuple_filter_port_id, 8604 (void *)&cmd_2tuple_filter_ops, 8605 (void *)&cmd_2tuple_filter_dst_port, 8606 (void *)&cmd_2tuple_filter_dst_port_value, 8607 (void *)&cmd_2tuple_filter_protocol, 8608 (void *)&cmd_2tuple_filter_protocol_value, 8609 (void *)&cmd_2tuple_filter_mask, 8610 (void *)&cmd_2tuple_filter_mask_value, 8611 (void *)&cmd_2tuple_filter_tcp_flags, 8612 (void *)&cmd_2tuple_filter_tcp_flags_value, 8613 (void *)&cmd_2tuple_filter_priority, 8614 (void *)&cmd_2tuple_filter_priority_value, 8615 (void *)&cmd_2tuple_filter_queue, 8616 (void *)&cmd_2tuple_filter_queue_id, 8617 NULL, 8618 }, 8619 }; 8620 8621 /* *** ADD/REMOVE A 5tuple FILTER *** */ 8622 struct cmd_5tuple_filter_result { 8623 cmdline_fixed_string_t filter; 8624 uint8_t port_id; 8625 cmdline_fixed_string_t ops; 8626 cmdline_fixed_string_t dst_ip; 8627 cmdline_ipaddr_t dst_ip_value; 8628 cmdline_fixed_string_t src_ip; 8629 cmdline_ipaddr_t src_ip_value; 8630 cmdline_fixed_string_t dst_port; 8631 uint16_t dst_port_value; 8632 cmdline_fixed_string_t src_port; 8633 uint16_t src_port_value; 8634 cmdline_fixed_string_t protocol; 8635 uint8_t protocol_value; 8636 cmdline_fixed_string_t mask; 8637 uint8_t mask_value; 8638 cmdline_fixed_string_t tcp_flags; 8639 uint8_t tcp_flags_value; 8640 cmdline_fixed_string_t priority; 8641 uint8_t priority_value; 8642 cmdline_fixed_string_t queue; 8643 uint16_t queue_id; 8644 }; 8645 8646 static void 8647 cmd_5tuple_filter_parsed(void *parsed_result, 8648 __attribute__((unused)) struct cmdline *cl, 8649 __attribute__((unused)) void *data) 8650 { 8651 struct rte_eth_ntuple_filter filter; 8652 struct cmd_5tuple_filter_result *res = parsed_result; 8653 int ret = 0; 8654 8655 ret = rte_eth_dev_filter_supported(res->port_id, RTE_ETH_FILTER_NTUPLE); 8656 if (ret < 0) { 8657 printf("ntuple filter is not supported on port %u.\n", 8658 res->port_id); 8659 return; 8660 } 8661 8662 memset(&filter, 0, sizeof(struct rte_eth_ntuple_filter)); 8663 8664 filter.flags = RTE_5TUPLE_FLAGS; 8665 filter.dst_ip_mask = (res->mask_value & 0x10) ? UINT32_MAX : 0; 8666 filter.src_ip_mask = (res->mask_value & 0x08) ? UINT32_MAX : 0; 8667 filter.dst_port_mask = (res->mask_value & 0x04) ? UINT16_MAX : 0; 8668 filter.src_port_mask = (res->mask_value & 0x02) ? UINT16_MAX : 0; 8669 filter.proto_mask = (res->mask_value & 0x01) ? UINT8_MAX : 0; 8670 filter.proto = res->protocol_value; 8671 filter.priority = res->priority_value; 8672 if (res->tcp_flags_value != 0 && filter.proto != IPPROTO_TCP) { 8673 printf("nonzero tcp_flags is only meaningful" 8674 " when protocol is TCP.\n"); 8675 return; 8676 } 8677 if (res->tcp_flags_value > TCP_FLAG_ALL) { 8678 printf("invalid TCP flags.\n"); 8679 return; 8680 } 8681 8682 if (res->tcp_flags_value != 0) { 8683 filter.flags |= RTE_NTUPLE_FLAGS_TCP_FLAG; 8684 filter.tcp_flags = res->tcp_flags_value; 8685 } 8686 8687 if (res->dst_ip_value.family == AF_INET) 8688 /* no need to convert, already big endian. */ 8689 filter.dst_ip = res->dst_ip_value.addr.ipv4.s_addr; 8690 else { 8691 if (filter.dst_ip_mask == 0) { 8692 printf("can not support ipv6 involved compare.\n"); 8693 return; 8694 } 8695 filter.dst_ip = 0; 8696 } 8697 8698 if (res->src_ip_value.family == AF_INET) 8699 /* no need to convert, already big endian. */ 8700 filter.src_ip = res->src_ip_value.addr.ipv4.s_addr; 8701 else { 8702 if (filter.src_ip_mask == 0) { 8703 printf("can not support ipv6 involved compare.\n"); 8704 return; 8705 } 8706 filter.src_ip = 0; 8707 } 8708 /* need convert to big endian. */ 8709 filter.dst_port = rte_cpu_to_be_16(res->dst_port_value); 8710 filter.src_port = rte_cpu_to_be_16(res->src_port_value); 8711 filter.queue = res->queue_id; 8712 8713 if (!strcmp(res->ops, "add")) 8714 ret = rte_eth_dev_filter_ctrl(res->port_id, 8715 RTE_ETH_FILTER_NTUPLE, 8716 RTE_ETH_FILTER_ADD, 8717 &filter); 8718 else 8719 ret = rte_eth_dev_filter_ctrl(res->port_id, 8720 RTE_ETH_FILTER_NTUPLE, 8721 RTE_ETH_FILTER_DELETE, 8722 &filter); 8723 if (ret < 0) 8724 printf("5tuple filter programming error: (%s)\n", 8725 strerror(-ret)); 8726 } 8727 8728 cmdline_parse_token_string_t cmd_5tuple_filter_filter = 8729 TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, 8730 filter, "5tuple_filter"); 8731 cmdline_parse_token_num_t cmd_5tuple_filter_port_id = 8732 TOKEN_NUM_INITIALIZER(struct cmd_5tuple_filter_result, 8733 port_id, UINT8); 8734 cmdline_parse_token_string_t cmd_5tuple_filter_ops = 8735 TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, 8736 ops, "add#del"); 8737 cmdline_parse_token_string_t cmd_5tuple_filter_dst_ip = 8738 TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, 8739 dst_ip, "dst_ip"); 8740 cmdline_parse_token_ipaddr_t cmd_5tuple_filter_dst_ip_value = 8741 TOKEN_IPADDR_INITIALIZER(struct cmd_5tuple_filter_result, 8742 dst_ip_value); 8743 cmdline_parse_token_string_t cmd_5tuple_filter_src_ip = 8744 TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, 8745 src_ip, "src_ip"); 8746 cmdline_parse_token_ipaddr_t cmd_5tuple_filter_src_ip_value = 8747 TOKEN_IPADDR_INITIALIZER(struct cmd_5tuple_filter_result, 8748 src_ip_value); 8749 cmdline_parse_token_string_t cmd_5tuple_filter_dst_port = 8750 TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, 8751 dst_port, "dst_port"); 8752 cmdline_parse_token_num_t cmd_5tuple_filter_dst_port_value = 8753 TOKEN_NUM_INITIALIZER(struct cmd_5tuple_filter_result, 8754 dst_port_value, UINT16); 8755 cmdline_parse_token_string_t cmd_5tuple_filter_src_port = 8756 TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, 8757 src_port, "src_port"); 8758 cmdline_parse_token_num_t cmd_5tuple_filter_src_port_value = 8759 TOKEN_NUM_INITIALIZER(struct cmd_5tuple_filter_result, 8760 src_port_value, UINT16); 8761 cmdline_parse_token_string_t cmd_5tuple_filter_protocol = 8762 TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, 8763 protocol, "protocol"); 8764 cmdline_parse_token_num_t cmd_5tuple_filter_protocol_value = 8765 TOKEN_NUM_INITIALIZER(struct cmd_5tuple_filter_result, 8766 protocol_value, UINT8); 8767 cmdline_parse_token_string_t cmd_5tuple_filter_mask = 8768 TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, 8769 mask, "mask"); 8770 cmdline_parse_token_num_t cmd_5tuple_filter_mask_value = 8771 TOKEN_NUM_INITIALIZER(struct cmd_5tuple_filter_result, 8772 mask_value, INT8); 8773 cmdline_parse_token_string_t cmd_5tuple_filter_tcp_flags = 8774 TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, 8775 tcp_flags, "tcp_flags"); 8776 cmdline_parse_token_num_t cmd_5tuple_filter_tcp_flags_value = 8777 TOKEN_NUM_INITIALIZER(struct cmd_5tuple_filter_result, 8778 tcp_flags_value, UINT8); 8779 cmdline_parse_token_string_t cmd_5tuple_filter_priority = 8780 TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, 8781 priority, "priority"); 8782 cmdline_parse_token_num_t cmd_5tuple_filter_priority_value = 8783 TOKEN_NUM_INITIALIZER(struct cmd_5tuple_filter_result, 8784 priority_value, UINT8); 8785 cmdline_parse_token_string_t cmd_5tuple_filter_queue = 8786 TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, 8787 queue, "queue"); 8788 cmdline_parse_token_num_t cmd_5tuple_filter_queue_id = 8789 TOKEN_NUM_INITIALIZER(struct cmd_5tuple_filter_result, 8790 queue_id, UINT16); 8791 8792 cmdline_parse_inst_t cmd_5tuple_filter = { 8793 .f = cmd_5tuple_filter_parsed, 8794 .data = NULL, 8795 .help_str = "5tuple_filter <port_id> add|del dst_ip <value> " 8796 "src_ip <value> dst_port <value> src_port <value> " 8797 "protocol <value> mask <value> tcp_flags <value> " 8798 "priority <value> queue <queue_id>: Add/Del a 5tuple filter", 8799 .tokens = { 8800 (void *)&cmd_5tuple_filter_filter, 8801 (void *)&cmd_5tuple_filter_port_id, 8802 (void *)&cmd_5tuple_filter_ops, 8803 (void *)&cmd_5tuple_filter_dst_ip, 8804 (void *)&cmd_5tuple_filter_dst_ip_value, 8805 (void *)&cmd_5tuple_filter_src_ip, 8806 (void *)&cmd_5tuple_filter_src_ip_value, 8807 (void *)&cmd_5tuple_filter_dst_port, 8808 (void *)&cmd_5tuple_filter_dst_port_value, 8809 (void *)&cmd_5tuple_filter_src_port, 8810 (void *)&cmd_5tuple_filter_src_port_value, 8811 (void *)&cmd_5tuple_filter_protocol, 8812 (void *)&cmd_5tuple_filter_protocol_value, 8813 (void *)&cmd_5tuple_filter_mask, 8814 (void *)&cmd_5tuple_filter_mask_value, 8815 (void *)&cmd_5tuple_filter_tcp_flags, 8816 (void *)&cmd_5tuple_filter_tcp_flags_value, 8817 (void *)&cmd_5tuple_filter_priority, 8818 (void *)&cmd_5tuple_filter_priority_value, 8819 (void *)&cmd_5tuple_filter_queue, 8820 (void *)&cmd_5tuple_filter_queue_id, 8821 NULL, 8822 }, 8823 }; 8824 8825 /* *** ADD/REMOVE A flex FILTER *** */ 8826 struct cmd_flex_filter_result { 8827 cmdline_fixed_string_t filter; 8828 cmdline_fixed_string_t ops; 8829 uint8_t port_id; 8830 cmdline_fixed_string_t len; 8831 uint8_t len_value; 8832 cmdline_fixed_string_t bytes; 8833 cmdline_fixed_string_t bytes_value; 8834 cmdline_fixed_string_t mask; 8835 cmdline_fixed_string_t mask_value; 8836 cmdline_fixed_string_t priority; 8837 uint8_t priority_value; 8838 cmdline_fixed_string_t queue; 8839 uint16_t queue_id; 8840 }; 8841 8842 static int xdigit2val(unsigned char c) 8843 { 8844 int val; 8845 if (isdigit(c)) 8846 val = c - '0'; 8847 else if (isupper(c)) 8848 val = c - 'A' + 10; 8849 else 8850 val = c - 'a' + 10; 8851 return val; 8852 } 8853 8854 static void 8855 cmd_flex_filter_parsed(void *parsed_result, 8856 __attribute__((unused)) struct cmdline *cl, 8857 __attribute__((unused)) void *data) 8858 { 8859 int ret = 0; 8860 struct rte_eth_flex_filter filter; 8861 struct cmd_flex_filter_result *res = parsed_result; 8862 char *bytes_ptr, *mask_ptr; 8863 uint16_t len, i, j = 0; 8864 char c; 8865 int val; 8866 uint8_t byte = 0; 8867 8868 if (res->len_value > RTE_FLEX_FILTER_MAXLEN) { 8869 printf("the len exceed the max length 128\n"); 8870 return; 8871 } 8872 memset(&filter, 0, sizeof(struct rte_eth_flex_filter)); 8873 filter.len = res->len_value; 8874 filter.priority = res->priority_value; 8875 filter.queue = res->queue_id; 8876 bytes_ptr = res->bytes_value; 8877 mask_ptr = res->mask_value; 8878 8879 /* translate bytes string to array. */ 8880 if (bytes_ptr[0] == '0' && ((bytes_ptr[1] == 'x') || 8881 (bytes_ptr[1] == 'X'))) 8882 bytes_ptr += 2; 8883 len = strnlen(bytes_ptr, res->len_value * 2); 8884 if (len == 0 || (len % 8 != 0)) { 8885 printf("please check len and bytes input\n"); 8886 return; 8887 } 8888 for (i = 0; i < len; i++) { 8889 c = bytes_ptr[i]; 8890 if (isxdigit(c) == 0) { 8891 /* invalid characters. */ 8892 printf("invalid input\n"); 8893 return; 8894 } 8895 val = xdigit2val(c); 8896 if (i % 2) { 8897 byte |= val; 8898 filter.bytes[j] = byte; 8899 printf("bytes[%d]:%02x ", j, filter.bytes[j]); 8900 j++; 8901 byte = 0; 8902 } else 8903 byte |= val << 4; 8904 } 8905 printf("\n"); 8906 /* translate mask string to uint8_t array. */ 8907 if (mask_ptr[0] == '0' && ((mask_ptr[1] == 'x') || 8908 (mask_ptr[1] == 'X'))) 8909 mask_ptr += 2; 8910 len = strnlen(mask_ptr, (res->len_value + 3) / 4); 8911 if (len == 0) { 8912 printf("invalid input\n"); 8913 return; 8914 } 8915 j = 0; 8916 byte = 0; 8917 for (i = 0; i < len; i++) { 8918 c = mask_ptr[i]; 8919 if (isxdigit(c) == 0) { 8920 /* invalid characters. */ 8921 printf("invalid input\n"); 8922 return; 8923 } 8924 val = xdigit2val(c); 8925 if (i % 2) { 8926 byte |= val; 8927 filter.mask[j] = byte; 8928 printf("mask[%d]:%02x ", j, filter.mask[j]); 8929 j++; 8930 byte = 0; 8931 } else 8932 byte |= val << 4; 8933 } 8934 printf("\n"); 8935 8936 if (!strcmp(res->ops, "add")) 8937 ret = rte_eth_dev_filter_ctrl(res->port_id, 8938 RTE_ETH_FILTER_FLEXIBLE, 8939 RTE_ETH_FILTER_ADD, 8940 &filter); 8941 else 8942 ret = rte_eth_dev_filter_ctrl(res->port_id, 8943 RTE_ETH_FILTER_FLEXIBLE, 8944 RTE_ETH_FILTER_DELETE, 8945 &filter); 8946 8947 if (ret < 0) 8948 printf("flex filter setting error: (%s)\n", strerror(-ret)); 8949 } 8950 8951 cmdline_parse_token_string_t cmd_flex_filter_filter = 8952 TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, 8953 filter, "flex_filter"); 8954 cmdline_parse_token_num_t cmd_flex_filter_port_id = 8955 TOKEN_NUM_INITIALIZER(struct cmd_flex_filter_result, 8956 port_id, UINT8); 8957 cmdline_parse_token_string_t cmd_flex_filter_ops = 8958 TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, 8959 ops, "add#del"); 8960 cmdline_parse_token_string_t cmd_flex_filter_len = 8961 TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, 8962 len, "len"); 8963 cmdline_parse_token_num_t cmd_flex_filter_len_value = 8964 TOKEN_NUM_INITIALIZER(struct cmd_flex_filter_result, 8965 len_value, UINT8); 8966 cmdline_parse_token_string_t cmd_flex_filter_bytes = 8967 TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, 8968 bytes, "bytes"); 8969 cmdline_parse_token_string_t cmd_flex_filter_bytes_value = 8970 TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, 8971 bytes_value, NULL); 8972 cmdline_parse_token_string_t cmd_flex_filter_mask = 8973 TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, 8974 mask, "mask"); 8975 cmdline_parse_token_string_t cmd_flex_filter_mask_value = 8976 TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, 8977 mask_value, NULL); 8978 cmdline_parse_token_string_t cmd_flex_filter_priority = 8979 TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, 8980 priority, "priority"); 8981 cmdline_parse_token_num_t cmd_flex_filter_priority_value = 8982 TOKEN_NUM_INITIALIZER(struct cmd_flex_filter_result, 8983 priority_value, UINT8); 8984 cmdline_parse_token_string_t cmd_flex_filter_queue = 8985 TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, 8986 queue, "queue"); 8987 cmdline_parse_token_num_t cmd_flex_filter_queue_id = 8988 TOKEN_NUM_INITIALIZER(struct cmd_flex_filter_result, 8989 queue_id, UINT16); 8990 cmdline_parse_inst_t cmd_flex_filter = { 8991 .f = cmd_flex_filter_parsed, 8992 .data = NULL, 8993 .help_str = "flex_filter <port_id> add|del len <value> bytes " 8994 "<value> mask <value> priority <value> queue <queue_id>: " 8995 "Add/Del a flex filter", 8996 .tokens = { 8997 (void *)&cmd_flex_filter_filter, 8998 (void *)&cmd_flex_filter_port_id, 8999 (void *)&cmd_flex_filter_ops, 9000 (void *)&cmd_flex_filter_len, 9001 (void *)&cmd_flex_filter_len_value, 9002 (void *)&cmd_flex_filter_bytes, 9003 (void *)&cmd_flex_filter_bytes_value, 9004 (void *)&cmd_flex_filter_mask, 9005 (void *)&cmd_flex_filter_mask_value, 9006 (void *)&cmd_flex_filter_priority, 9007 (void *)&cmd_flex_filter_priority_value, 9008 (void *)&cmd_flex_filter_queue, 9009 (void *)&cmd_flex_filter_queue_id, 9010 NULL, 9011 }, 9012 }; 9013 9014 /* *** Filters Control *** */ 9015 9016 /* *** deal with ethertype filter *** */ 9017 struct cmd_ethertype_filter_result { 9018 cmdline_fixed_string_t filter; 9019 uint8_t port_id; 9020 cmdline_fixed_string_t ops; 9021 cmdline_fixed_string_t mac; 9022 struct ether_addr mac_addr; 9023 cmdline_fixed_string_t ethertype; 9024 uint16_t ethertype_value; 9025 cmdline_fixed_string_t drop; 9026 cmdline_fixed_string_t queue; 9027 uint16_t queue_id; 9028 }; 9029 9030 cmdline_parse_token_string_t cmd_ethertype_filter_filter = 9031 TOKEN_STRING_INITIALIZER(struct cmd_ethertype_filter_result, 9032 filter, "ethertype_filter"); 9033 cmdline_parse_token_num_t cmd_ethertype_filter_port_id = 9034 TOKEN_NUM_INITIALIZER(struct cmd_ethertype_filter_result, 9035 port_id, UINT8); 9036 cmdline_parse_token_string_t cmd_ethertype_filter_ops = 9037 TOKEN_STRING_INITIALIZER(struct cmd_ethertype_filter_result, 9038 ops, "add#del"); 9039 cmdline_parse_token_string_t cmd_ethertype_filter_mac = 9040 TOKEN_STRING_INITIALIZER(struct cmd_ethertype_filter_result, 9041 mac, "mac_addr#mac_ignr"); 9042 cmdline_parse_token_etheraddr_t cmd_ethertype_filter_mac_addr = 9043 TOKEN_ETHERADDR_INITIALIZER(struct cmd_ethertype_filter_result, 9044 mac_addr); 9045 cmdline_parse_token_string_t cmd_ethertype_filter_ethertype = 9046 TOKEN_STRING_INITIALIZER(struct cmd_ethertype_filter_result, 9047 ethertype, "ethertype"); 9048 cmdline_parse_token_num_t cmd_ethertype_filter_ethertype_value = 9049 TOKEN_NUM_INITIALIZER(struct cmd_ethertype_filter_result, 9050 ethertype_value, UINT16); 9051 cmdline_parse_token_string_t cmd_ethertype_filter_drop = 9052 TOKEN_STRING_INITIALIZER(struct cmd_ethertype_filter_result, 9053 drop, "drop#fwd"); 9054 cmdline_parse_token_string_t cmd_ethertype_filter_queue = 9055 TOKEN_STRING_INITIALIZER(struct cmd_ethertype_filter_result, 9056 queue, "queue"); 9057 cmdline_parse_token_num_t cmd_ethertype_filter_queue_id = 9058 TOKEN_NUM_INITIALIZER(struct cmd_ethertype_filter_result, 9059 queue_id, UINT16); 9060 9061 static void 9062 cmd_ethertype_filter_parsed(void *parsed_result, 9063 __attribute__((unused)) struct cmdline *cl, 9064 __attribute__((unused)) void *data) 9065 { 9066 struct cmd_ethertype_filter_result *res = parsed_result; 9067 struct rte_eth_ethertype_filter filter; 9068 int ret = 0; 9069 9070 ret = rte_eth_dev_filter_supported(res->port_id, 9071 RTE_ETH_FILTER_ETHERTYPE); 9072 if (ret < 0) { 9073 printf("ethertype filter is not supported on port %u.\n", 9074 res->port_id); 9075 return; 9076 } 9077 9078 memset(&filter, 0, sizeof(filter)); 9079 if (!strcmp(res->mac, "mac_addr")) { 9080 filter.flags |= RTE_ETHTYPE_FLAGS_MAC; 9081 rte_memcpy(&filter.mac_addr, &res->mac_addr, 9082 sizeof(struct ether_addr)); 9083 } 9084 if (!strcmp(res->drop, "drop")) 9085 filter.flags |= RTE_ETHTYPE_FLAGS_DROP; 9086 filter.ether_type = res->ethertype_value; 9087 filter.queue = res->queue_id; 9088 9089 if (!strcmp(res->ops, "add")) 9090 ret = rte_eth_dev_filter_ctrl(res->port_id, 9091 RTE_ETH_FILTER_ETHERTYPE, 9092 RTE_ETH_FILTER_ADD, 9093 &filter); 9094 else 9095 ret = rte_eth_dev_filter_ctrl(res->port_id, 9096 RTE_ETH_FILTER_ETHERTYPE, 9097 RTE_ETH_FILTER_DELETE, 9098 &filter); 9099 if (ret < 0) 9100 printf("ethertype filter programming error: (%s)\n", 9101 strerror(-ret)); 9102 } 9103 9104 cmdline_parse_inst_t cmd_ethertype_filter = { 9105 .f = cmd_ethertype_filter_parsed, 9106 .data = NULL, 9107 .help_str = "ethertype_filter <port_id> add|del mac_addr|mac_ignr " 9108 "<mac_addr> ethertype <value> drop|fw queue <queue_id>: " 9109 "Add or delete an ethertype filter entry", 9110 .tokens = { 9111 (void *)&cmd_ethertype_filter_filter, 9112 (void *)&cmd_ethertype_filter_port_id, 9113 (void *)&cmd_ethertype_filter_ops, 9114 (void *)&cmd_ethertype_filter_mac, 9115 (void *)&cmd_ethertype_filter_mac_addr, 9116 (void *)&cmd_ethertype_filter_ethertype, 9117 (void *)&cmd_ethertype_filter_ethertype_value, 9118 (void *)&cmd_ethertype_filter_drop, 9119 (void *)&cmd_ethertype_filter_queue, 9120 (void *)&cmd_ethertype_filter_queue_id, 9121 NULL, 9122 }, 9123 }; 9124 9125 /* *** deal with flow director filter *** */ 9126 struct cmd_flow_director_result { 9127 cmdline_fixed_string_t flow_director_filter; 9128 uint8_t port_id; 9129 cmdline_fixed_string_t mode; 9130 cmdline_fixed_string_t mode_value; 9131 cmdline_fixed_string_t ops; 9132 cmdline_fixed_string_t flow; 9133 cmdline_fixed_string_t flow_type; 9134 cmdline_fixed_string_t ether; 9135 uint16_t ether_type; 9136 cmdline_fixed_string_t src; 9137 cmdline_ipaddr_t ip_src; 9138 uint16_t port_src; 9139 cmdline_fixed_string_t dst; 9140 cmdline_ipaddr_t ip_dst; 9141 uint16_t port_dst; 9142 cmdline_fixed_string_t verify_tag; 9143 uint32_t verify_tag_value; 9144 cmdline_ipaddr_t tos; 9145 uint8_t tos_value; 9146 cmdline_ipaddr_t proto; 9147 uint8_t proto_value; 9148 cmdline_ipaddr_t ttl; 9149 uint8_t ttl_value; 9150 cmdline_fixed_string_t vlan; 9151 uint16_t vlan_value; 9152 cmdline_fixed_string_t flexbytes; 9153 cmdline_fixed_string_t flexbytes_value; 9154 cmdline_fixed_string_t pf_vf; 9155 cmdline_fixed_string_t drop; 9156 cmdline_fixed_string_t queue; 9157 uint16_t queue_id; 9158 cmdline_fixed_string_t fd_id; 9159 uint32_t fd_id_value; 9160 cmdline_fixed_string_t mac; 9161 struct ether_addr mac_addr; 9162 cmdline_fixed_string_t tunnel; 9163 cmdline_fixed_string_t tunnel_type; 9164 cmdline_fixed_string_t tunnel_id; 9165 uint32_t tunnel_id_value; 9166 }; 9167 9168 static inline int 9169 parse_flexbytes(const char *q_arg, uint8_t *flexbytes, uint16_t max_num) 9170 { 9171 char s[256]; 9172 const char *p, *p0 = q_arg; 9173 char *end; 9174 unsigned long int_fld; 9175 char *str_fld[max_num]; 9176 int i; 9177 unsigned size; 9178 int ret = -1; 9179 9180 p = strchr(p0, '('); 9181 if (p == NULL) 9182 return -1; 9183 ++p; 9184 p0 = strchr(p, ')'); 9185 if (p0 == NULL) 9186 return -1; 9187 9188 size = p0 - p; 9189 if (size >= sizeof(s)) 9190 return -1; 9191 9192 snprintf(s, sizeof(s), "%.*s", size, p); 9193 ret = rte_strsplit(s, sizeof(s), str_fld, max_num, ','); 9194 if (ret < 0 || ret > max_num) 9195 return -1; 9196 for (i = 0; i < ret; i++) { 9197 errno = 0; 9198 int_fld = strtoul(str_fld[i], &end, 0); 9199 if (errno != 0 || *end != '\0' || int_fld > UINT8_MAX) 9200 return -1; 9201 flexbytes[i] = (uint8_t)int_fld; 9202 } 9203 return ret; 9204 } 9205 9206 static uint16_t 9207 str2flowtype(char *string) 9208 { 9209 uint8_t i = 0; 9210 static const struct { 9211 char str[32]; 9212 uint16_t type; 9213 } flowtype_str[] = { 9214 {"raw", RTE_ETH_FLOW_RAW}, 9215 {"ipv4", RTE_ETH_FLOW_IPV4}, 9216 {"ipv4-frag", RTE_ETH_FLOW_FRAG_IPV4}, 9217 {"ipv4-tcp", RTE_ETH_FLOW_NONFRAG_IPV4_TCP}, 9218 {"ipv4-udp", RTE_ETH_FLOW_NONFRAG_IPV4_UDP}, 9219 {"ipv4-sctp", RTE_ETH_FLOW_NONFRAG_IPV4_SCTP}, 9220 {"ipv4-other", RTE_ETH_FLOW_NONFRAG_IPV4_OTHER}, 9221 {"ipv6", RTE_ETH_FLOW_IPV6}, 9222 {"ipv6-frag", RTE_ETH_FLOW_FRAG_IPV6}, 9223 {"ipv6-tcp", RTE_ETH_FLOW_NONFRAG_IPV6_TCP}, 9224 {"ipv6-udp", RTE_ETH_FLOW_NONFRAG_IPV6_UDP}, 9225 {"ipv6-sctp", RTE_ETH_FLOW_NONFRAG_IPV6_SCTP}, 9226 {"ipv6-other", RTE_ETH_FLOW_NONFRAG_IPV6_OTHER}, 9227 {"l2_payload", RTE_ETH_FLOW_L2_PAYLOAD}, 9228 }; 9229 9230 for (i = 0; i < RTE_DIM(flowtype_str); i++) { 9231 if (!strcmp(flowtype_str[i].str, string)) 9232 return flowtype_str[i].type; 9233 } 9234 9235 if (isdigit(string[0]) && atoi(string) > 0 && atoi(string) < 64) 9236 return (uint16_t)atoi(string); 9237 9238 return RTE_ETH_FLOW_UNKNOWN; 9239 } 9240 9241 static enum rte_eth_fdir_tunnel_type 9242 str2fdir_tunneltype(char *string) 9243 { 9244 uint8_t i = 0; 9245 9246 static const struct { 9247 char str[32]; 9248 enum rte_eth_fdir_tunnel_type type; 9249 } tunneltype_str[] = { 9250 {"NVGRE", RTE_FDIR_TUNNEL_TYPE_NVGRE}, 9251 {"VxLAN", RTE_FDIR_TUNNEL_TYPE_VXLAN}, 9252 }; 9253 9254 for (i = 0; i < RTE_DIM(tunneltype_str); i++) { 9255 if (!strcmp(tunneltype_str[i].str, string)) 9256 return tunneltype_str[i].type; 9257 } 9258 return RTE_FDIR_TUNNEL_TYPE_UNKNOWN; 9259 } 9260 9261 #define IPV4_ADDR_TO_UINT(ip_addr, ip) \ 9262 do { \ 9263 if ((ip_addr).family == AF_INET) \ 9264 (ip) = (ip_addr).addr.ipv4.s_addr; \ 9265 else { \ 9266 printf("invalid parameter.\n"); \ 9267 return; \ 9268 } \ 9269 } while (0) 9270 9271 #define IPV6_ADDR_TO_ARRAY(ip_addr, ip) \ 9272 do { \ 9273 if ((ip_addr).family == AF_INET6) \ 9274 rte_memcpy(&(ip), \ 9275 &((ip_addr).addr.ipv6), \ 9276 sizeof(struct in6_addr)); \ 9277 else { \ 9278 printf("invalid parameter.\n"); \ 9279 return; \ 9280 } \ 9281 } while (0) 9282 9283 static void 9284 cmd_flow_director_filter_parsed(void *parsed_result, 9285 __attribute__((unused)) struct cmdline *cl, 9286 __attribute__((unused)) void *data) 9287 { 9288 struct cmd_flow_director_result *res = parsed_result; 9289 struct rte_eth_fdir_filter entry; 9290 uint8_t flexbytes[RTE_ETH_FDIR_MAX_FLEXLEN]; 9291 char *end; 9292 unsigned long vf_id; 9293 int ret = 0; 9294 9295 ret = rte_eth_dev_filter_supported(res->port_id, RTE_ETH_FILTER_FDIR); 9296 if (ret < 0) { 9297 printf("flow director is not supported on port %u.\n", 9298 res->port_id); 9299 return; 9300 } 9301 memset(flexbytes, 0, sizeof(flexbytes)); 9302 memset(&entry, 0, sizeof(struct rte_eth_fdir_filter)); 9303 9304 if (fdir_conf.mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN) { 9305 if (strcmp(res->mode_value, "MAC-VLAN")) { 9306 printf("Please set mode to MAC-VLAN.\n"); 9307 return; 9308 } 9309 } else if (fdir_conf.mode == RTE_FDIR_MODE_PERFECT_TUNNEL) { 9310 if (strcmp(res->mode_value, "Tunnel")) { 9311 printf("Please set mode to Tunnel.\n"); 9312 return; 9313 } 9314 } else { 9315 if (strcmp(res->mode_value, "IP")) { 9316 printf("Please set mode to IP.\n"); 9317 return; 9318 } 9319 entry.input.flow_type = str2flowtype(res->flow_type); 9320 } 9321 9322 ret = parse_flexbytes(res->flexbytes_value, 9323 flexbytes, 9324 RTE_ETH_FDIR_MAX_FLEXLEN); 9325 if (ret < 0) { 9326 printf("error: Cannot parse flexbytes input.\n"); 9327 return; 9328 } 9329 9330 switch (entry.input.flow_type) { 9331 case RTE_ETH_FLOW_FRAG_IPV4: 9332 case RTE_ETH_FLOW_NONFRAG_IPV4_OTHER: 9333 entry.input.flow.ip4_flow.proto = res->proto_value; 9334 /* fall-through */ 9335 case RTE_ETH_FLOW_NONFRAG_IPV4_UDP: 9336 case RTE_ETH_FLOW_NONFRAG_IPV4_TCP: 9337 IPV4_ADDR_TO_UINT(res->ip_dst, 9338 entry.input.flow.ip4_flow.dst_ip); 9339 IPV4_ADDR_TO_UINT(res->ip_src, 9340 entry.input.flow.ip4_flow.src_ip); 9341 entry.input.flow.ip4_flow.tos = res->tos_value; 9342 entry.input.flow.ip4_flow.ttl = res->ttl_value; 9343 /* need convert to big endian. */ 9344 entry.input.flow.udp4_flow.dst_port = 9345 rte_cpu_to_be_16(res->port_dst); 9346 entry.input.flow.udp4_flow.src_port = 9347 rte_cpu_to_be_16(res->port_src); 9348 break; 9349 case RTE_ETH_FLOW_NONFRAG_IPV4_SCTP: 9350 IPV4_ADDR_TO_UINT(res->ip_dst, 9351 entry.input.flow.sctp4_flow.ip.dst_ip); 9352 IPV4_ADDR_TO_UINT(res->ip_src, 9353 entry.input.flow.sctp4_flow.ip.src_ip); 9354 entry.input.flow.ip4_flow.tos = res->tos_value; 9355 entry.input.flow.ip4_flow.ttl = res->ttl_value; 9356 /* need convert to big endian. */ 9357 entry.input.flow.sctp4_flow.dst_port = 9358 rte_cpu_to_be_16(res->port_dst); 9359 entry.input.flow.sctp4_flow.src_port = 9360 rte_cpu_to_be_16(res->port_src); 9361 entry.input.flow.sctp4_flow.verify_tag = 9362 rte_cpu_to_be_32(res->verify_tag_value); 9363 break; 9364 case RTE_ETH_FLOW_FRAG_IPV6: 9365 case RTE_ETH_FLOW_NONFRAG_IPV6_OTHER: 9366 entry.input.flow.ipv6_flow.proto = res->proto_value; 9367 /* fall-through */ 9368 case RTE_ETH_FLOW_NONFRAG_IPV6_UDP: 9369 case RTE_ETH_FLOW_NONFRAG_IPV6_TCP: 9370 IPV6_ADDR_TO_ARRAY(res->ip_dst, 9371 entry.input.flow.ipv6_flow.dst_ip); 9372 IPV6_ADDR_TO_ARRAY(res->ip_src, 9373 entry.input.flow.ipv6_flow.src_ip); 9374 entry.input.flow.ipv6_flow.tc = res->tos_value; 9375 entry.input.flow.ipv6_flow.hop_limits = res->ttl_value; 9376 /* need convert to big endian. */ 9377 entry.input.flow.udp6_flow.dst_port = 9378 rte_cpu_to_be_16(res->port_dst); 9379 entry.input.flow.udp6_flow.src_port = 9380 rte_cpu_to_be_16(res->port_src); 9381 break; 9382 case RTE_ETH_FLOW_NONFRAG_IPV6_SCTP: 9383 IPV6_ADDR_TO_ARRAY(res->ip_dst, 9384 entry.input.flow.sctp6_flow.ip.dst_ip); 9385 IPV6_ADDR_TO_ARRAY(res->ip_src, 9386 entry.input.flow.sctp6_flow.ip.src_ip); 9387 entry.input.flow.ipv6_flow.tc = res->tos_value; 9388 entry.input.flow.ipv6_flow.hop_limits = res->ttl_value; 9389 /* need convert to big endian. */ 9390 entry.input.flow.sctp6_flow.dst_port = 9391 rte_cpu_to_be_16(res->port_dst); 9392 entry.input.flow.sctp6_flow.src_port = 9393 rte_cpu_to_be_16(res->port_src); 9394 entry.input.flow.sctp6_flow.verify_tag = 9395 rte_cpu_to_be_32(res->verify_tag_value); 9396 break; 9397 case RTE_ETH_FLOW_L2_PAYLOAD: 9398 entry.input.flow.l2_flow.ether_type = 9399 rte_cpu_to_be_16(res->ether_type); 9400 break; 9401 default: 9402 break; 9403 } 9404 9405 if (fdir_conf.mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN) 9406 rte_memcpy(&entry.input.flow.mac_vlan_flow.mac_addr, 9407 &res->mac_addr, 9408 sizeof(struct ether_addr)); 9409 9410 if (fdir_conf.mode == RTE_FDIR_MODE_PERFECT_TUNNEL) { 9411 rte_memcpy(&entry.input.flow.tunnel_flow.mac_addr, 9412 &res->mac_addr, 9413 sizeof(struct ether_addr)); 9414 entry.input.flow.tunnel_flow.tunnel_type = 9415 str2fdir_tunneltype(res->tunnel_type); 9416 entry.input.flow.tunnel_flow.tunnel_id = 9417 rte_cpu_to_be_32(res->tunnel_id_value); 9418 } 9419 9420 rte_memcpy(entry.input.flow_ext.flexbytes, 9421 flexbytes, 9422 RTE_ETH_FDIR_MAX_FLEXLEN); 9423 9424 entry.input.flow_ext.vlan_tci = rte_cpu_to_be_16(res->vlan_value); 9425 9426 entry.action.flex_off = 0; /*use 0 by default */ 9427 if (!strcmp(res->drop, "drop")) 9428 entry.action.behavior = RTE_ETH_FDIR_REJECT; 9429 else 9430 entry.action.behavior = RTE_ETH_FDIR_ACCEPT; 9431 9432 if (fdir_conf.mode != RTE_FDIR_MODE_PERFECT_MAC_VLAN && 9433 fdir_conf.mode != RTE_FDIR_MODE_PERFECT_TUNNEL) { 9434 if (!strcmp(res->pf_vf, "pf")) 9435 entry.input.flow_ext.is_vf = 0; 9436 else if (!strncmp(res->pf_vf, "vf", 2)) { 9437 struct rte_eth_dev_info dev_info; 9438 9439 memset(&dev_info, 0, sizeof(dev_info)); 9440 rte_eth_dev_info_get(res->port_id, &dev_info); 9441 errno = 0; 9442 vf_id = strtoul(res->pf_vf + 2, &end, 10); 9443 if (errno != 0 || *end != '\0' || 9444 vf_id >= dev_info.max_vfs) { 9445 printf("invalid parameter %s.\n", res->pf_vf); 9446 return; 9447 } 9448 entry.input.flow_ext.is_vf = 1; 9449 entry.input.flow_ext.dst_id = (uint16_t)vf_id; 9450 } else { 9451 printf("invalid parameter %s.\n", res->pf_vf); 9452 return; 9453 } 9454 } 9455 9456 /* set to report FD ID by default */ 9457 entry.action.report_status = RTE_ETH_FDIR_REPORT_ID; 9458 entry.action.rx_queue = res->queue_id; 9459 entry.soft_id = res->fd_id_value; 9460 if (!strcmp(res->ops, "add")) 9461 ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR, 9462 RTE_ETH_FILTER_ADD, &entry); 9463 else if (!strcmp(res->ops, "del")) 9464 ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR, 9465 RTE_ETH_FILTER_DELETE, &entry); 9466 else 9467 ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR, 9468 RTE_ETH_FILTER_UPDATE, &entry); 9469 if (ret < 0) 9470 printf("flow director programming error: (%s)\n", 9471 strerror(-ret)); 9472 } 9473 9474 cmdline_parse_token_string_t cmd_flow_director_filter = 9475 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9476 flow_director_filter, "flow_director_filter"); 9477 cmdline_parse_token_num_t cmd_flow_director_port_id = 9478 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, 9479 port_id, UINT8); 9480 cmdline_parse_token_string_t cmd_flow_director_ops = 9481 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9482 ops, "add#del#update"); 9483 cmdline_parse_token_string_t cmd_flow_director_flow = 9484 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9485 flow, "flow"); 9486 cmdline_parse_token_string_t cmd_flow_director_flow_type = 9487 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9488 flow_type, "ipv4-other#ipv4-frag#ipv4-tcp#ipv4-udp#ipv4-sctp#" 9489 "ipv6-other#ipv6-frag#ipv6-tcp#ipv6-udp#ipv6-sctp#l2_payload"); 9490 cmdline_parse_token_string_t cmd_flow_director_ether = 9491 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9492 ether, "ether"); 9493 cmdline_parse_token_num_t cmd_flow_director_ether_type = 9494 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, 9495 ether_type, UINT16); 9496 cmdline_parse_token_string_t cmd_flow_director_src = 9497 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9498 src, "src"); 9499 cmdline_parse_token_ipaddr_t cmd_flow_director_ip_src = 9500 TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_result, 9501 ip_src); 9502 cmdline_parse_token_num_t cmd_flow_director_port_src = 9503 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, 9504 port_src, UINT16); 9505 cmdline_parse_token_string_t cmd_flow_director_dst = 9506 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9507 dst, "dst"); 9508 cmdline_parse_token_ipaddr_t cmd_flow_director_ip_dst = 9509 TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_result, 9510 ip_dst); 9511 cmdline_parse_token_num_t cmd_flow_director_port_dst = 9512 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, 9513 port_dst, UINT16); 9514 cmdline_parse_token_string_t cmd_flow_director_verify_tag = 9515 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9516 verify_tag, "verify_tag"); 9517 cmdline_parse_token_num_t cmd_flow_director_verify_tag_value = 9518 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, 9519 verify_tag_value, UINT32); 9520 cmdline_parse_token_string_t cmd_flow_director_tos = 9521 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9522 tos, "tos"); 9523 cmdline_parse_token_num_t cmd_flow_director_tos_value = 9524 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, 9525 tos_value, UINT8); 9526 cmdline_parse_token_string_t cmd_flow_director_proto = 9527 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9528 proto, "proto"); 9529 cmdline_parse_token_num_t cmd_flow_director_proto_value = 9530 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, 9531 proto_value, UINT8); 9532 cmdline_parse_token_string_t cmd_flow_director_ttl = 9533 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9534 ttl, "ttl"); 9535 cmdline_parse_token_num_t cmd_flow_director_ttl_value = 9536 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, 9537 ttl_value, UINT8); 9538 cmdline_parse_token_string_t cmd_flow_director_vlan = 9539 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9540 vlan, "vlan"); 9541 cmdline_parse_token_num_t cmd_flow_director_vlan_value = 9542 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, 9543 vlan_value, UINT16); 9544 cmdline_parse_token_string_t cmd_flow_director_flexbytes = 9545 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9546 flexbytes, "flexbytes"); 9547 cmdline_parse_token_string_t cmd_flow_director_flexbytes_value = 9548 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9549 flexbytes_value, NULL); 9550 cmdline_parse_token_string_t cmd_flow_director_drop = 9551 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9552 drop, "drop#fwd"); 9553 cmdline_parse_token_string_t cmd_flow_director_pf_vf = 9554 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9555 pf_vf, NULL); 9556 cmdline_parse_token_string_t cmd_flow_director_queue = 9557 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9558 queue, "queue"); 9559 cmdline_parse_token_num_t cmd_flow_director_queue_id = 9560 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, 9561 queue_id, UINT16); 9562 cmdline_parse_token_string_t cmd_flow_director_fd_id = 9563 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9564 fd_id, "fd_id"); 9565 cmdline_parse_token_num_t cmd_flow_director_fd_id_value = 9566 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, 9567 fd_id_value, UINT32); 9568 9569 cmdline_parse_token_string_t cmd_flow_director_mode = 9570 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9571 mode, "mode"); 9572 cmdline_parse_token_string_t cmd_flow_director_mode_ip = 9573 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9574 mode_value, "IP"); 9575 cmdline_parse_token_string_t cmd_flow_director_mode_mac_vlan = 9576 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9577 mode_value, "MAC-VLAN"); 9578 cmdline_parse_token_string_t cmd_flow_director_mode_tunnel = 9579 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9580 mode_value, "Tunnel"); 9581 cmdline_parse_token_string_t cmd_flow_director_mac = 9582 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9583 mac, "mac"); 9584 cmdline_parse_token_etheraddr_t cmd_flow_director_mac_addr = 9585 TOKEN_ETHERADDR_INITIALIZER(struct cmd_flow_director_result, 9586 mac_addr); 9587 cmdline_parse_token_string_t cmd_flow_director_tunnel = 9588 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9589 tunnel, "tunnel"); 9590 cmdline_parse_token_string_t cmd_flow_director_tunnel_type = 9591 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9592 tunnel_type, "NVGRE#VxLAN"); 9593 cmdline_parse_token_string_t cmd_flow_director_tunnel_id = 9594 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 9595 tunnel_id, "tunnel-id"); 9596 cmdline_parse_token_num_t cmd_flow_director_tunnel_id_value = 9597 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, 9598 tunnel_id_value, UINT32); 9599 9600 cmdline_parse_inst_t cmd_add_del_ip_flow_director = { 9601 .f = cmd_flow_director_filter_parsed, 9602 .data = NULL, 9603 .help_str = "flow_director_filter <port_id> mode IP add|del|update flow" 9604 " ipv4-other|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|" 9605 "ipv6-other|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|" 9606 "l2_payload src <src_ip> dst <dst_ip> tos <tos_value> " 9607 "proto <proto_value> ttl <ttl_value> vlan <vlan_value> " 9608 "flexbytes <flexbyte_vaues> drop|fw <pf_vf> queue <queue_id> " 9609 "fd_id <fd_id_value>: " 9610 "Add or delete an ip flow director entry on NIC", 9611 .tokens = { 9612 (void *)&cmd_flow_director_filter, 9613 (void *)&cmd_flow_director_port_id, 9614 (void *)&cmd_flow_director_mode, 9615 (void *)&cmd_flow_director_mode_ip, 9616 (void *)&cmd_flow_director_ops, 9617 (void *)&cmd_flow_director_flow, 9618 (void *)&cmd_flow_director_flow_type, 9619 (void *)&cmd_flow_director_src, 9620 (void *)&cmd_flow_director_ip_src, 9621 (void *)&cmd_flow_director_dst, 9622 (void *)&cmd_flow_director_ip_dst, 9623 (void *)&cmd_flow_director_tos, 9624 (void *)&cmd_flow_director_tos_value, 9625 (void *)&cmd_flow_director_proto, 9626 (void *)&cmd_flow_director_proto_value, 9627 (void *)&cmd_flow_director_ttl, 9628 (void *)&cmd_flow_director_ttl_value, 9629 (void *)&cmd_flow_director_vlan, 9630 (void *)&cmd_flow_director_vlan_value, 9631 (void *)&cmd_flow_director_flexbytes, 9632 (void *)&cmd_flow_director_flexbytes_value, 9633 (void *)&cmd_flow_director_drop, 9634 (void *)&cmd_flow_director_pf_vf, 9635 (void *)&cmd_flow_director_queue, 9636 (void *)&cmd_flow_director_queue_id, 9637 (void *)&cmd_flow_director_fd_id, 9638 (void *)&cmd_flow_director_fd_id_value, 9639 NULL, 9640 }, 9641 }; 9642 9643 cmdline_parse_inst_t cmd_add_del_udp_flow_director = { 9644 .f = cmd_flow_director_filter_parsed, 9645 .data = NULL, 9646 .help_str = "flow_director_filter ... : Add or delete an udp/tcp flow " 9647 "director entry on NIC", 9648 .tokens = { 9649 (void *)&cmd_flow_director_filter, 9650 (void *)&cmd_flow_director_port_id, 9651 (void *)&cmd_flow_director_mode, 9652 (void *)&cmd_flow_director_mode_ip, 9653 (void *)&cmd_flow_director_ops, 9654 (void *)&cmd_flow_director_flow, 9655 (void *)&cmd_flow_director_flow_type, 9656 (void *)&cmd_flow_director_src, 9657 (void *)&cmd_flow_director_ip_src, 9658 (void *)&cmd_flow_director_port_src, 9659 (void *)&cmd_flow_director_dst, 9660 (void *)&cmd_flow_director_ip_dst, 9661 (void *)&cmd_flow_director_port_dst, 9662 (void *)&cmd_flow_director_tos, 9663 (void *)&cmd_flow_director_tos_value, 9664 (void *)&cmd_flow_director_ttl, 9665 (void *)&cmd_flow_director_ttl_value, 9666 (void *)&cmd_flow_director_vlan, 9667 (void *)&cmd_flow_director_vlan_value, 9668 (void *)&cmd_flow_director_flexbytes, 9669 (void *)&cmd_flow_director_flexbytes_value, 9670 (void *)&cmd_flow_director_drop, 9671 (void *)&cmd_flow_director_pf_vf, 9672 (void *)&cmd_flow_director_queue, 9673 (void *)&cmd_flow_director_queue_id, 9674 (void *)&cmd_flow_director_fd_id, 9675 (void *)&cmd_flow_director_fd_id_value, 9676 NULL, 9677 }, 9678 }; 9679 9680 cmdline_parse_inst_t cmd_add_del_sctp_flow_director = { 9681 .f = cmd_flow_director_filter_parsed, 9682 .data = NULL, 9683 .help_str = "flow_director_filter ... : Add or delete a sctp flow " 9684 "director entry on NIC", 9685 .tokens = { 9686 (void *)&cmd_flow_director_filter, 9687 (void *)&cmd_flow_director_port_id, 9688 (void *)&cmd_flow_director_mode, 9689 (void *)&cmd_flow_director_mode_ip, 9690 (void *)&cmd_flow_director_ops, 9691 (void *)&cmd_flow_director_flow, 9692 (void *)&cmd_flow_director_flow_type, 9693 (void *)&cmd_flow_director_src, 9694 (void *)&cmd_flow_director_ip_src, 9695 (void *)&cmd_flow_director_port_dst, 9696 (void *)&cmd_flow_director_dst, 9697 (void *)&cmd_flow_director_ip_dst, 9698 (void *)&cmd_flow_director_port_dst, 9699 (void *)&cmd_flow_director_verify_tag, 9700 (void *)&cmd_flow_director_verify_tag_value, 9701 (void *)&cmd_flow_director_tos, 9702 (void *)&cmd_flow_director_tos_value, 9703 (void *)&cmd_flow_director_ttl, 9704 (void *)&cmd_flow_director_ttl_value, 9705 (void *)&cmd_flow_director_vlan, 9706 (void *)&cmd_flow_director_vlan_value, 9707 (void *)&cmd_flow_director_flexbytes, 9708 (void *)&cmd_flow_director_flexbytes_value, 9709 (void *)&cmd_flow_director_drop, 9710 (void *)&cmd_flow_director_pf_vf, 9711 (void *)&cmd_flow_director_queue, 9712 (void *)&cmd_flow_director_queue_id, 9713 (void *)&cmd_flow_director_fd_id, 9714 (void *)&cmd_flow_director_fd_id_value, 9715 NULL, 9716 }, 9717 }; 9718 9719 cmdline_parse_inst_t cmd_add_del_l2_flow_director = { 9720 .f = cmd_flow_director_filter_parsed, 9721 .data = NULL, 9722 .help_str = "flow_director_filter ... : Add or delete a L2 flow " 9723 "director entry on NIC", 9724 .tokens = { 9725 (void *)&cmd_flow_director_filter, 9726 (void *)&cmd_flow_director_port_id, 9727 (void *)&cmd_flow_director_mode, 9728 (void *)&cmd_flow_director_mode_ip, 9729 (void *)&cmd_flow_director_ops, 9730 (void *)&cmd_flow_director_flow, 9731 (void *)&cmd_flow_director_flow_type, 9732 (void *)&cmd_flow_director_ether, 9733 (void *)&cmd_flow_director_ether_type, 9734 (void *)&cmd_flow_director_flexbytes, 9735 (void *)&cmd_flow_director_flexbytes_value, 9736 (void *)&cmd_flow_director_drop, 9737 (void *)&cmd_flow_director_pf_vf, 9738 (void *)&cmd_flow_director_queue, 9739 (void *)&cmd_flow_director_queue_id, 9740 (void *)&cmd_flow_director_fd_id, 9741 (void *)&cmd_flow_director_fd_id_value, 9742 NULL, 9743 }, 9744 }; 9745 9746 cmdline_parse_inst_t cmd_add_del_mac_vlan_flow_director = { 9747 .f = cmd_flow_director_filter_parsed, 9748 .data = NULL, 9749 .help_str = "flow_director_filter ... : Add or delete a MAC VLAN flow " 9750 "director entry on NIC", 9751 .tokens = { 9752 (void *)&cmd_flow_director_filter, 9753 (void *)&cmd_flow_director_port_id, 9754 (void *)&cmd_flow_director_mode, 9755 (void *)&cmd_flow_director_mode_mac_vlan, 9756 (void *)&cmd_flow_director_ops, 9757 (void *)&cmd_flow_director_mac, 9758 (void *)&cmd_flow_director_mac_addr, 9759 (void *)&cmd_flow_director_vlan, 9760 (void *)&cmd_flow_director_vlan_value, 9761 (void *)&cmd_flow_director_flexbytes, 9762 (void *)&cmd_flow_director_flexbytes_value, 9763 (void *)&cmd_flow_director_drop, 9764 (void *)&cmd_flow_director_queue, 9765 (void *)&cmd_flow_director_queue_id, 9766 (void *)&cmd_flow_director_fd_id, 9767 (void *)&cmd_flow_director_fd_id_value, 9768 NULL, 9769 }, 9770 }; 9771 9772 cmdline_parse_inst_t cmd_add_del_tunnel_flow_director = { 9773 .f = cmd_flow_director_filter_parsed, 9774 .data = NULL, 9775 .help_str = "flow_director_filter ... : Add or delete a tunnel flow " 9776 "director entry on NIC", 9777 .tokens = { 9778 (void *)&cmd_flow_director_filter, 9779 (void *)&cmd_flow_director_port_id, 9780 (void *)&cmd_flow_director_mode, 9781 (void *)&cmd_flow_director_mode_tunnel, 9782 (void *)&cmd_flow_director_ops, 9783 (void *)&cmd_flow_director_mac, 9784 (void *)&cmd_flow_director_mac_addr, 9785 (void *)&cmd_flow_director_vlan, 9786 (void *)&cmd_flow_director_vlan_value, 9787 (void *)&cmd_flow_director_tunnel, 9788 (void *)&cmd_flow_director_tunnel_type, 9789 (void *)&cmd_flow_director_tunnel_id, 9790 (void *)&cmd_flow_director_tunnel_id_value, 9791 (void *)&cmd_flow_director_flexbytes, 9792 (void *)&cmd_flow_director_flexbytes_value, 9793 (void *)&cmd_flow_director_drop, 9794 (void *)&cmd_flow_director_queue, 9795 (void *)&cmd_flow_director_queue_id, 9796 (void *)&cmd_flow_director_fd_id, 9797 (void *)&cmd_flow_director_fd_id_value, 9798 NULL, 9799 }, 9800 }; 9801 9802 struct cmd_flush_flow_director_result { 9803 cmdline_fixed_string_t flush_flow_director; 9804 uint8_t port_id; 9805 }; 9806 9807 cmdline_parse_token_string_t cmd_flush_flow_director_flush = 9808 TOKEN_STRING_INITIALIZER(struct cmd_flush_flow_director_result, 9809 flush_flow_director, "flush_flow_director"); 9810 cmdline_parse_token_num_t cmd_flush_flow_director_port_id = 9811 TOKEN_NUM_INITIALIZER(struct cmd_flush_flow_director_result, 9812 port_id, UINT8); 9813 9814 static void 9815 cmd_flush_flow_director_parsed(void *parsed_result, 9816 __attribute__((unused)) struct cmdline *cl, 9817 __attribute__((unused)) void *data) 9818 { 9819 struct cmd_flow_director_result *res = parsed_result; 9820 int ret = 0; 9821 9822 ret = rte_eth_dev_filter_supported(res->port_id, RTE_ETH_FILTER_FDIR); 9823 if (ret < 0) { 9824 printf("flow director is not supported on port %u.\n", 9825 res->port_id); 9826 return; 9827 } 9828 9829 ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR, 9830 RTE_ETH_FILTER_FLUSH, NULL); 9831 if (ret < 0) 9832 printf("flow director table flushing error: (%s)\n", 9833 strerror(-ret)); 9834 } 9835 9836 cmdline_parse_inst_t cmd_flush_flow_director = { 9837 .f = cmd_flush_flow_director_parsed, 9838 .data = NULL, 9839 .help_str = "flush_flow_director <port_id>: " 9840 "Flush all flow director entries of a device on NIC", 9841 .tokens = { 9842 (void *)&cmd_flush_flow_director_flush, 9843 (void *)&cmd_flush_flow_director_port_id, 9844 NULL, 9845 }, 9846 }; 9847 9848 /* *** deal with flow director mask *** */ 9849 struct cmd_flow_director_mask_result { 9850 cmdline_fixed_string_t flow_director_mask; 9851 uint8_t port_id; 9852 cmdline_fixed_string_t mode; 9853 cmdline_fixed_string_t mode_value; 9854 cmdline_fixed_string_t vlan; 9855 uint16_t vlan_mask; 9856 cmdline_fixed_string_t src_mask; 9857 cmdline_ipaddr_t ipv4_src; 9858 cmdline_ipaddr_t ipv6_src; 9859 uint16_t port_src; 9860 cmdline_fixed_string_t dst_mask; 9861 cmdline_ipaddr_t ipv4_dst; 9862 cmdline_ipaddr_t ipv6_dst; 9863 uint16_t port_dst; 9864 cmdline_fixed_string_t mac; 9865 uint8_t mac_addr_byte_mask; 9866 cmdline_fixed_string_t tunnel_id; 9867 uint32_t tunnel_id_mask; 9868 cmdline_fixed_string_t tunnel_type; 9869 uint8_t tunnel_type_mask; 9870 }; 9871 9872 static void 9873 cmd_flow_director_mask_parsed(void *parsed_result, 9874 __attribute__((unused)) struct cmdline *cl, 9875 __attribute__((unused)) void *data) 9876 { 9877 struct cmd_flow_director_mask_result *res = parsed_result; 9878 struct rte_eth_fdir_masks *mask; 9879 struct rte_port *port; 9880 9881 if (res->port_id > nb_ports) { 9882 printf("Invalid port, range is [0, %d]\n", nb_ports - 1); 9883 return; 9884 } 9885 9886 port = &ports[res->port_id]; 9887 /** Check if the port is not started **/ 9888 if (port->port_status != RTE_PORT_STOPPED) { 9889 printf("Please stop port %d first\n", res->port_id); 9890 return; 9891 } 9892 9893 mask = &port->dev_conf.fdir_conf.mask; 9894 9895 if (fdir_conf.mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN) { 9896 if (strcmp(res->mode_value, "MAC-VLAN")) { 9897 printf("Please set mode to MAC-VLAN.\n"); 9898 return; 9899 } 9900 9901 mask->vlan_tci_mask = rte_cpu_to_be_16(res->vlan_mask); 9902 } else if (fdir_conf.mode == RTE_FDIR_MODE_PERFECT_TUNNEL) { 9903 if (strcmp(res->mode_value, "Tunnel")) { 9904 printf("Please set mode to Tunnel.\n"); 9905 return; 9906 } 9907 9908 mask->vlan_tci_mask = rte_cpu_to_be_16(res->vlan_mask); 9909 mask->mac_addr_byte_mask = res->mac_addr_byte_mask; 9910 mask->tunnel_id_mask = rte_cpu_to_be_32(res->tunnel_id_mask); 9911 mask->tunnel_type_mask = res->tunnel_type_mask; 9912 } else { 9913 if (strcmp(res->mode_value, "IP")) { 9914 printf("Please set mode to IP.\n"); 9915 return; 9916 } 9917 9918 mask->vlan_tci_mask = rte_cpu_to_be_16(res->vlan_mask); 9919 IPV4_ADDR_TO_UINT(res->ipv4_src, mask->ipv4_mask.src_ip); 9920 IPV4_ADDR_TO_UINT(res->ipv4_dst, mask->ipv4_mask.dst_ip); 9921 IPV6_ADDR_TO_ARRAY(res->ipv6_src, mask->ipv6_mask.src_ip); 9922 IPV6_ADDR_TO_ARRAY(res->ipv6_dst, mask->ipv6_mask.dst_ip); 9923 mask->src_port_mask = rte_cpu_to_be_16(res->port_src); 9924 mask->dst_port_mask = rte_cpu_to_be_16(res->port_dst); 9925 } 9926 9927 cmd_reconfig_device_queue(res->port_id, 1, 1); 9928 } 9929 9930 cmdline_parse_token_string_t cmd_flow_director_mask = 9931 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 9932 flow_director_mask, "flow_director_mask"); 9933 cmdline_parse_token_num_t cmd_flow_director_mask_port_id = 9934 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result, 9935 port_id, UINT8); 9936 cmdline_parse_token_string_t cmd_flow_director_mask_vlan = 9937 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 9938 vlan, "vlan"); 9939 cmdline_parse_token_num_t cmd_flow_director_mask_vlan_value = 9940 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result, 9941 vlan_mask, UINT16); 9942 cmdline_parse_token_string_t cmd_flow_director_mask_src = 9943 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 9944 src_mask, "src_mask"); 9945 cmdline_parse_token_ipaddr_t cmd_flow_director_mask_ipv4_src = 9946 TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_mask_result, 9947 ipv4_src); 9948 cmdline_parse_token_ipaddr_t cmd_flow_director_mask_ipv6_src = 9949 TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_mask_result, 9950 ipv6_src); 9951 cmdline_parse_token_num_t cmd_flow_director_mask_port_src = 9952 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result, 9953 port_src, UINT16); 9954 cmdline_parse_token_string_t cmd_flow_director_mask_dst = 9955 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 9956 dst_mask, "dst_mask"); 9957 cmdline_parse_token_ipaddr_t cmd_flow_director_mask_ipv4_dst = 9958 TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_mask_result, 9959 ipv4_dst); 9960 cmdline_parse_token_ipaddr_t cmd_flow_director_mask_ipv6_dst = 9961 TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_mask_result, 9962 ipv6_dst); 9963 cmdline_parse_token_num_t cmd_flow_director_mask_port_dst = 9964 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result, 9965 port_dst, UINT16); 9966 9967 cmdline_parse_token_string_t cmd_flow_director_mask_mode = 9968 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 9969 mode, "mode"); 9970 cmdline_parse_token_string_t cmd_flow_director_mask_mode_ip = 9971 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 9972 mode_value, "IP"); 9973 cmdline_parse_token_string_t cmd_flow_director_mask_mode_mac_vlan = 9974 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 9975 mode_value, "MAC-VLAN"); 9976 cmdline_parse_token_string_t cmd_flow_director_mask_mode_tunnel = 9977 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 9978 mode_value, "Tunnel"); 9979 cmdline_parse_token_string_t cmd_flow_director_mask_mac = 9980 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 9981 mac, "mac"); 9982 cmdline_parse_token_num_t cmd_flow_director_mask_mac_value = 9983 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result, 9984 mac_addr_byte_mask, UINT8); 9985 cmdline_parse_token_string_t cmd_flow_director_mask_tunnel_type = 9986 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 9987 tunnel_type, "tunnel-type"); 9988 cmdline_parse_token_num_t cmd_flow_director_mask_tunnel_type_value = 9989 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result, 9990 tunnel_type_mask, UINT8); 9991 cmdline_parse_token_string_t cmd_flow_director_mask_tunnel_id = 9992 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 9993 tunnel_id, "tunnel-id"); 9994 cmdline_parse_token_num_t cmd_flow_director_mask_tunnel_id_value = 9995 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result, 9996 tunnel_id_mask, UINT32); 9997 9998 cmdline_parse_inst_t cmd_set_flow_director_ip_mask = { 9999 .f = cmd_flow_director_mask_parsed, 10000 .data = NULL, 10001 .help_str = "flow_director_mask ... : " 10002 "Set IP mode flow director's mask on NIC", 10003 .tokens = { 10004 (void *)&cmd_flow_director_mask, 10005 (void *)&cmd_flow_director_mask_port_id, 10006 (void *)&cmd_flow_director_mask_mode, 10007 (void *)&cmd_flow_director_mask_mode_ip, 10008 (void *)&cmd_flow_director_mask_vlan, 10009 (void *)&cmd_flow_director_mask_vlan_value, 10010 (void *)&cmd_flow_director_mask_src, 10011 (void *)&cmd_flow_director_mask_ipv4_src, 10012 (void *)&cmd_flow_director_mask_ipv6_src, 10013 (void *)&cmd_flow_director_mask_port_src, 10014 (void *)&cmd_flow_director_mask_dst, 10015 (void *)&cmd_flow_director_mask_ipv4_dst, 10016 (void *)&cmd_flow_director_mask_ipv6_dst, 10017 (void *)&cmd_flow_director_mask_port_dst, 10018 NULL, 10019 }, 10020 }; 10021 10022 cmdline_parse_inst_t cmd_set_flow_director_mac_vlan_mask = { 10023 .f = cmd_flow_director_mask_parsed, 10024 .data = NULL, 10025 .help_str = "flow_director_mask ... : Set MAC VLAN mode " 10026 "flow director's mask on NIC", 10027 .tokens = { 10028 (void *)&cmd_flow_director_mask, 10029 (void *)&cmd_flow_director_mask_port_id, 10030 (void *)&cmd_flow_director_mask_mode, 10031 (void *)&cmd_flow_director_mask_mode_mac_vlan, 10032 (void *)&cmd_flow_director_mask_vlan, 10033 (void *)&cmd_flow_director_mask_vlan_value, 10034 NULL, 10035 }, 10036 }; 10037 10038 cmdline_parse_inst_t cmd_set_flow_director_tunnel_mask = { 10039 .f = cmd_flow_director_mask_parsed, 10040 .data = NULL, 10041 .help_str = "flow_director_mask ... : Set tunnel mode " 10042 "flow director's mask on NIC", 10043 .tokens = { 10044 (void *)&cmd_flow_director_mask, 10045 (void *)&cmd_flow_director_mask_port_id, 10046 (void *)&cmd_flow_director_mask_mode, 10047 (void *)&cmd_flow_director_mask_mode_tunnel, 10048 (void *)&cmd_flow_director_mask_vlan, 10049 (void *)&cmd_flow_director_mask_vlan_value, 10050 (void *)&cmd_flow_director_mask_mac, 10051 (void *)&cmd_flow_director_mask_mac_value, 10052 (void *)&cmd_flow_director_mask_tunnel_type, 10053 (void *)&cmd_flow_director_mask_tunnel_type_value, 10054 (void *)&cmd_flow_director_mask_tunnel_id, 10055 (void *)&cmd_flow_director_mask_tunnel_id_value, 10056 NULL, 10057 }, 10058 }; 10059 10060 /* *** deal with flow director mask on flexible payload *** */ 10061 struct cmd_flow_director_flex_mask_result { 10062 cmdline_fixed_string_t flow_director_flexmask; 10063 uint8_t port_id; 10064 cmdline_fixed_string_t flow; 10065 cmdline_fixed_string_t flow_type; 10066 cmdline_fixed_string_t mask; 10067 }; 10068 10069 static void 10070 cmd_flow_director_flex_mask_parsed(void *parsed_result, 10071 __attribute__((unused)) struct cmdline *cl, 10072 __attribute__((unused)) void *data) 10073 { 10074 struct cmd_flow_director_flex_mask_result *res = parsed_result; 10075 struct rte_eth_fdir_info fdir_info; 10076 struct rte_eth_fdir_flex_mask flex_mask; 10077 struct rte_port *port; 10078 uint32_t flow_type_mask; 10079 uint16_t i; 10080 int ret; 10081 10082 if (res->port_id > nb_ports) { 10083 printf("Invalid port, range is [0, %d]\n", nb_ports - 1); 10084 return; 10085 } 10086 10087 port = &ports[res->port_id]; 10088 /** Check if the port is not started **/ 10089 if (port->port_status != RTE_PORT_STOPPED) { 10090 printf("Please stop port %d first\n", res->port_id); 10091 return; 10092 } 10093 10094 memset(&flex_mask, 0, sizeof(struct rte_eth_fdir_flex_mask)); 10095 ret = parse_flexbytes(res->mask, 10096 flex_mask.mask, 10097 RTE_ETH_FDIR_MAX_FLEXLEN); 10098 if (ret < 0) { 10099 printf("error: Cannot parse mask input.\n"); 10100 return; 10101 } 10102 10103 memset(&fdir_info, 0, sizeof(fdir_info)); 10104 ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR, 10105 RTE_ETH_FILTER_INFO, &fdir_info); 10106 if (ret < 0) { 10107 printf("Cannot get FDir filter info\n"); 10108 return; 10109 } 10110 10111 if (!strcmp(res->flow_type, "none")) { 10112 /* means don't specify the flow type */ 10113 flex_mask.flow_type = RTE_ETH_FLOW_UNKNOWN; 10114 for (i = 0; i < RTE_ETH_FLOW_MAX; i++) 10115 memset(&port->dev_conf.fdir_conf.flex_conf.flex_mask[i], 10116 0, sizeof(struct rte_eth_fdir_flex_mask)); 10117 port->dev_conf.fdir_conf.flex_conf.nb_flexmasks = 1; 10118 rte_memcpy(&port->dev_conf.fdir_conf.flex_conf.flex_mask[0], 10119 &flex_mask, 10120 sizeof(struct rte_eth_fdir_flex_mask)); 10121 cmd_reconfig_device_queue(res->port_id, 1, 1); 10122 return; 10123 } 10124 flow_type_mask = fdir_info.flow_types_mask[0]; 10125 if (!strcmp(res->flow_type, "all")) { 10126 if (!flow_type_mask) { 10127 printf("No flow type supported\n"); 10128 return; 10129 } 10130 for (i = RTE_ETH_FLOW_UNKNOWN; i < RTE_ETH_FLOW_MAX; i++) { 10131 if (flow_type_mask & (1 << i)) { 10132 flex_mask.flow_type = i; 10133 fdir_set_flex_mask(res->port_id, &flex_mask); 10134 } 10135 } 10136 cmd_reconfig_device_queue(res->port_id, 1, 1); 10137 return; 10138 } 10139 flex_mask.flow_type = str2flowtype(res->flow_type); 10140 if (!(flow_type_mask & (1 << flex_mask.flow_type))) { 10141 printf("Flow type %s not supported on port %d\n", 10142 res->flow_type, res->port_id); 10143 return; 10144 } 10145 fdir_set_flex_mask(res->port_id, &flex_mask); 10146 cmd_reconfig_device_queue(res->port_id, 1, 1); 10147 } 10148 10149 cmdline_parse_token_string_t cmd_flow_director_flexmask = 10150 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flex_mask_result, 10151 flow_director_flexmask, 10152 "flow_director_flex_mask"); 10153 cmdline_parse_token_num_t cmd_flow_director_flexmask_port_id = 10154 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_flex_mask_result, 10155 port_id, UINT8); 10156 cmdline_parse_token_string_t cmd_flow_director_flexmask_flow = 10157 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flex_mask_result, 10158 flow, "flow"); 10159 cmdline_parse_token_string_t cmd_flow_director_flexmask_flow_type = 10160 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flex_mask_result, 10161 flow_type, "none#ipv4-other#ipv4-frag#ipv4-tcp#ipv4-udp#ipv4-sctp#" 10162 "ipv6-other#ipv6-frag#ipv6-tcp#ipv6-udp#ipv6-sctp#l2_payload#all"); 10163 cmdline_parse_token_string_t cmd_flow_director_flexmask_mask = 10164 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flex_mask_result, 10165 mask, NULL); 10166 10167 cmdline_parse_inst_t cmd_set_flow_director_flex_mask = { 10168 .f = cmd_flow_director_flex_mask_parsed, 10169 .data = NULL, 10170 .help_str = "flow_director_flex_mask ... : " 10171 "Set flow director's flex mask on NIC", 10172 .tokens = { 10173 (void *)&cmd_flow_director_flexmask, 10174 (void *)&cmd_flow_director_flexmask_port_id, 10175 (void *)&cmd_flow_director_flexmask_flow, 10176 (void *)&cmd_flow_director_flexmask_flow_type, 10177 (void *)&cmd_flow_director_flexmask_mask, 10178 NULL, 10179 }, 10180 }; 10181 10182 /* *** deal with flow director flexible payload configuration *** */ 10183 struct cmd_flow_director_flexpayload_result { 10184 cmdline_fixed_string_t flow_director_flexpayload; 10185 uint8_t port_id; 10186 cmdline_fixed_string_t payload_layer; 10187 cmdline_fixed_string_t payload_cfg; 10188 }; 10189 10190 static inline int 10191 parse_offsets(const char *q_arg, uint16_t *offsets, uint16_t max_num) 10192 { 10193 char s[256]; 10194 const char *p, *p0 = q_arg; 10195 char *end; 10196 unsigned long int_fld; 10197 char *str_fld[max_num]; 10198 int i; 10199 unsigned size; 10200 int ret = -1; 10201 10202 p = strchr(p0, '('); 10203 if (p == NULL) 10204 return -1; 10205 ++p; 10206 p0 = strchr(p, ')'); 10207 if (p0 == NULL) 10208 return -1; 10209 10210 size = p0 - p; 10211 if (size >= sizeof(s)) 10212 return -1; 10213 10214 snprintf(s, sizeof(s), "%.*s", size, p); 10215 ret = rte_strsplit(s, sizeof(s), str_fld, max_num, ','); 10216 if (ret < 0 || ret > max_num) 10217 return -1; 10218 for (i = 0; i < ret; i++) { 10219 errno = 0; 10220 int_fld = strtoul(str_fld[i], &end, 0); 10221 if (errno != 0 || *end != '\0' || int_fld > UINT16_MAX) 10222 return -1; 10223 offsets[i] = (uint16_t)int_fld; 10224 } 10225 return ret; 10226 } 10227 10228 static void 10229 cmd_flow_director_flxpld_parsed(void *parsed_result, 10230 __attribute__((unused)) struct cmdline *cl, 10231 __attribute__((unused)) void *data) 10232 { 10233 struct cmd_flow_director_flexpayload_result *res = parsed_result; 10234 struct rte_eth_flex_payload_cfg flex_cfg; 10235 struct rte_port *port; 10236 int ret = 0; 10237 10238 if (res->port_id > nb_ports) { 10239 printf("Invalid port, range is [0, %d]\n", nb_ports - 1); 10240 return; 10241 } 10242 10243 port = &ports[res->port_id]; 10244 /** Check if the port is not started **/ 10245 if (port->port_status != RTE_PORT_STOPPED) { 10246 printf("Please stop port %d first\n", res->port_id); 10247 return; 10248 } 10249 10250 memset(&flex_cfg, 0, sizeof(struct rte_eth_flex_payload_cfg)); 10251 10252 if (!strcmp(res->payload_layer, "raw")) 10253 flex_cfg.type = RTE_ETH_RAW_PAYLOAD; 10254 else if (!strcmp(res->payload_layer, "l2")) 10255 flex_cfg.type = RTE_ETH_L2_PAYLOAD; 10256 else if (!strcmp(res->payload_layer, "l3")) 10257 flex_cfg.type = RTE_ETH_L3_PAYLOAD; 10258 else if (!strcmp(res->payload_layer, "l4")) 10259 flex_cfg.type = RTE_ETH_L4_PAYLOAD; 10260 10261 ret = parse_offsets(res->payload_cfg, flex_cfg.src_offset, 10262 RTE_ETH_FDIR_MAX_FLEXLEN); 10263 if (ret < 0) { 10264 printf("error: Cannot parse flex payload input.\n"); 10265 return; 10266 } 10267 10268 fdir_set_flex_payload(res->port_id, &flex_cfg); 10269 cmd_reconfig_device_queue(res->port_id, 1, 1); 10270 } 10271 10272 cmdline_parse_token_string_t cmd_flow_director_flexpayload = 10273 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flexpayload_result, 10274 flow_director_flexpayload, 10275 "flow_director_flex_payload"); 10276 cmdline_parse_token_num_t cmd_flow_director_flexpayload_port_id = 10277 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_flexpayload_result, 10278 port_id, UINT8); 10279 cmdline_parse_token_string_t cmd_flow_director_flexpayload_payload_layer = 10280 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flexpayload_result, 10281 payload_layer, "raw#l2#l3#l4"); 10282 cmdline_parse_token_string_t cmd_flow_director_flexpayload_payload_cfg = 10283 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flexpayload_result, 10284 payload_cfg, NULL); 10285 10286 cmdline_parse_inst_t cmd_set_flow_director_flex_payload = { 10287 .f = cmd_flow_director_flxpld_parsed, 10288 .data = NULL, 10289 .help_str = "flow_director_flexpayload ... : " 10290 "Set flow director's flex payload on NIC", 10291 .tokens = { 10292 (void *)&cmd_flow_director_flexpayload, 10293 (void *)&cmd_flow_director_flexpayload_port_id, 10294 (void *)&cmd_flow_director_flexpayload_payload_layer, 10295 (void *)&cmd_flow_director_flexpayload_payload_cfg, 10296 NULL, 10297 }, 10298 }; 10299 10300 /* Generic flow interface command. */ 10301 extern cmdline_parse_inst_t cmd_flow; 10302 10303 /* *** Classification Filters Control *** */ 10304 /* *** Get symmetric hash enable per port *** */ 10305 struct cmd_get_sym_hash_ena_per_port_result { 10306 cmdline_fixed_string_t get_sym_hash_ena_per_port; 10307 uint8_t port_id; 10308 }; 10309 10310 static void 10311 cmd_get_sym_hash_per_port_parsed(void *parsed_result, 10312 __rte_unused struct cmdline *cl, 10313 __rte_unused void *data) 10314 { 10315 struct cmd_get_sym_hash_ena_per_port_result *res = parsed_result; 10316 struct rte_eth_hash_filter_info info; 10317 int ret; 10318 10319 if (rte_eth_dev_filter_supported(res->port_id, 10320 RTE_ETH_FILTER_HASH) < 0) { 10321 printf("RTE_ETH_FILTER_HASH not supported on port: %d\n", 10322 res->port_id); 10323 return; 10324 } 10325 10326 memset(&info, 0, sizeof(info)); 10327 info.info_type = RTE_ETH_HASH_FILTER_SYM_HASH_ENA_PER_PORT; 10328 ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_HASH, 10329 RTE_ETH_FILTER_GET, &info); 10330 10331 if (ret < 0) { 10332 printf("Cannot get symmetric hash enable per port " 10333 "on port %u\n", res->port_id); 10334 return; 10335 } 10336 10337 printf("Symmetric hash is %s on port %u\n", info.info.enable ? 10338 "enabled" : "disabled", res->port_id); 10339 } 10340 10341 cmdline_parse_token_string_t cmd_get_sym_hash_ena_per_port_all = 10342 TOKEN_STRING_INITIALIZER(struct cmd_get_sym_hash_ena_per_port_result, 10343 get_sym_hash_ena_per_port, "get_sym_hash_ena_per_port"); 10344 cmdline_parse_token_num_t cmd_get_sym_hash_ena_per_port_port_id = 10345 TOKEN_NUM_INITIALIZER(struct cmd_get_sym_hash_ena_per_port_result, 10346 port_id, UINT8); 10347 10348 cmdline_parse_inst_t cmd_get_sym_hash_ena_per_port = { 10349 .f = cmd_get_sym_hash_per_port_parsed, 10350 .data = NULL, 10351 .help_str = "get_sym_hash_ena_per_port <port_id>", 10352 .tokens = { 10353 (void *)&cmd_get_sym_hash_ena_per_port_all, 10354 (void *)&cmd_get_sym_hash_ena_per_port_port_id, 10355 NULL, 10356 }, 10357 }; 10358 10359 /* *** Set symmetric hash enable per port *** */ 10360 struct cmd_set_sym_hash_ena_per_port_result { 10361 cmdline_fixed_string_t set_sym_hash_ena_per_port; 10362 cmdline_fixed_string_t enable; 10363 uint8_t port_id; 10364 }; 10365 10366 static void 10367 cmd_set_sym_hash_per_port_parsed(void *parsed_result, 10368 __rte_unused struct cmdline *cl, 10369 __rte_unused void *data) 10370 { 10371 struct cmd_set_sym_hash_ena_per_port_result *res = parsed_result; 10372 struct rte_eth_hash_filter_info info; 10373 int ret; 10374 10375 if (rte_eth_dev_filter_supported(res->port_id, 10376 RTE_ETH_FILTER_HASH) < 0) { 10377 printf("RTE_ETH_FILTER_HASH not supported on port: %d\n", 10378 res->port_id); 10379 return; 10380 } 10381 10382 memset(&info, 0, sizeof(info)); 10383 info.info_type = RTE_ETH_HASH_FILTER_SYM_HASH_ENA_PER_PORT; 10384 if (!strcmp(res->enable, "enable")) 10385 info.info.enable = 1; 10386 ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_HASH, 10387 RTE_ETH_FILTER_SET, &info); 10388 if (ret < 0) { 10389 printf("Cannot set symmetric hash enable per port on " 10390 "port %u\n", res->port_id); 10391 return; 10392 } 10393 printf("Symmetric hash has been set to %s on port %u\n", 10394 res->enable, res->port_id); 10395 } 10396 10397 cmdline_parse_token_string_t cmd_set_sym_hash_ena_per_port_all = 10398 TOKEN_STRING_INITIALIZER(struct cmd_set_sym_hash_ena_per_port_result, 10399 set_sym_hash_ena_per_port, "set_sym_hash_ena_per_port"); 10400 cmdline_parse_token_num_t cmd_set_sym_hash_ena_per_port_port_id = 10401 TOKEN_NUM_INITIALIZER(struct cmd_set_sym_hash_ena_per_port_result, 10402 port_id, UINT8); 10403 cmdline_parse_token_string_t cmd_set_sym_hash_ena_per_port_enable = 10404 TOKEN_STRING_INITIALIZER(struct cmd_set_sym_hash_ena_per_port_result, 10405 enable, "enable#disable"); 10406 10407 cmdline_parse_inst_t cmd_set_sym_hash_ena_per_port = { 10408 .f = cmd_set_sym_hash_per_port_parsed, 10409 .data = NULL, 10410 .help_str = "set_sym_hash_ena_per_port <port_id> enable|disable", 10411 .tokens = { 10412 (void *)&cmd_set_sym_hash_ena_per_port_all, 10413 (void *)&cmd_set_sym_hash_ena_per_port_port_id, 10414 (void *)&cmd_set_sym_hash_ena_per_port_enable, 10415 NULL, 10416 }, 10417 }; 10418 10419 /* Get global config of hash function */ 10420 struct cmd_get_hash_global_config_result { 10421 cmdline_fixed_string_t get_hash_global_config; 10422 uint8_t port_id; 10423 }; 10424 10425 static char * 10426 flowtype_to_str(uint16_t ftype) 10427 { 10428 uint16_t i; 10429 static struct { 10430 char str[16]; 10431 uint16_t ftype; 10432 } ftype_table[] = { 10433 {"ipv4", RTE_ETH_FLOW_IPV4}, 10434 {"ipv4-frag", RTE_ETH_FLOW_FRAG_IPV4}, 10435 {"ipv4-tcp", RTE_ETH_FLOW_NONFRAG_IPV4_TCP}, 10436 {"ipv4-udp", RTE_ETH_FLOW_NONFRAG_IPV4_UDP}, 10437 {"ipv4-sctp", RTE_ETH_FLOW_NONFRAG_IPV4_SCTP}, 10438 {"ipv4-other", RTE_ETH_FLOW_NONFRAG_IPV4_OTHER}, 10439 {"ipv6", RTE_ETH_FLOW_IPV6}, 10440 {"ipv6-frag", RTE_ETH_FLOW_FRAG_IPV6}, 10441 {"ipv6-tcp", RTE_ETH_FLOW_NONFRAG_IPV6_TCP}, 10442 {"ipv6-udp", RTE_ETH_FLOW_NONFRAG_IPV6_UDP}, 10443 {"ipv6-sctp", RTE_ETH_FLOW_NONFRAG_IPV6_SCTP}, 10444 {"ipv6-other", RTE_ETH_FLOW_NONFRAG_IPV6_OTHER}, 10445 {"l2_payload", RTE_ETH_FLOW_L2_PAYLOAD}, 10446 {"port", RTE_ETH_FLOW_PORT}, 10447 {"vxlan", RTE_ETH_FLOW_VXLAN}, 10448 {"geneve", RTE_ETH_FLOW_GENEVE}, 10449 {"nvgre", RTE_ETH_FLOW_NVGRE}, 10450 }; 10451 10452 for (i = 0; i < RTE_DIM(ftype_table); i++) { 10453 if (ftype_table[i].ftype == ftype) 10454 return ftype_table[i].str; 10455 } 10456 10457 return NULL; 10458 } 10459 10460 static void 10461 cmd_get_hash_global_config_parsed(void *parsed_result, 10462 __rte_unused struct cmdline *cl, 10463 __rte_unused void *data) 10464 { 10465 struct cmd_get_hash_global_config_result *res = parsed_result; 10466 struct rte_eth_hash_filter_info info; 10467 uint32_t idx, offset; 10468 uint16_t i; 10469 char *str; 10470 int ret; 10471 10472 if (rte_eth_dev_filter_supported(res->port_id, 10473 RTE_ETH_FILTER_HASH) < 0) { 10474 printf("RTE_ETH_FILTER_HASH not supported on port %d\n", 10475 res->port_id); 10476 return; 10477 } 10478 10479 memset(&info, 0, sizeof(info)); 10480 info.info_type = RTE_ETH_HASH_FILTER_GLOBAL_CONFIG; 10481 ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_HASH, 10482 RTE_ETH_FILTER_GET, &info); 10483 if (ret < 0) { 10484 printf("Cannot get hash global configurations by port %d\n", 10485 res->port_id); 10486 return; 10487 } 10488 10489 switch (info.info.global_conf.hash_func) { 10490 case RTE_ETH_HASH_FUNCTION_TOEPLITZ: 10491 printf("Hash function is Toeplitz\n"); 10492 break; 10493 case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR: 10494 printf("Hash function is Simple XOR\n"); 10495 break; 10496 default: 10497 printf("Unknown hash function\n"); 10498 break; 10499 } 10500 10501 for (i = 0; i < RTE_ETH_FLOW_MAX; i++) { 10502 idx = i / UINT32_BIT; 10503 offset = i % UINT32_BIT; 10504 if (!(info.info.global_conf.valid_bit_mask[idx] & 10505 (1UL << offset))) 10506 continue; 10507 str = flowtype_to_str(i); 10508 if (!str) 10509 continue; 10510 printf("Symmetric hash is %s globally for flow type %s " 10511 "by port %d\n", 10512 ((info.info.global_conf.sym_hash_enable_mask[idx] & 10513 (1UL << offset)) ? "enabled" : "disabled"), str, 10514 res->port_id); 10515 } 10516 } 10517 10518 cmdline_parse_token_string_t cmd_get_hash_global_config_all = 10519 TOKEN_STRING_INITIALIZER(struct cmd_get_hash_global_config_result, 10520 get_hash_global_config, "get_hash_global_config"); 10521 cmdline_parse_token_num_t cmd_get_hash_global_config_port_id = 10522 TOKEN_NUM_INITIALIZER(struct cmd_get_hash_global_config_result, 10523 port_id, UINT8); 10524 10525 cmdline_parse_inst_t cmd_get_hash_global_config = { 10526 .f = cmd_get_hash_global_config_parsed, 10527 .data = NULL, 10528 .help_str = "get_hash_global_config <port_id>", 10529 .tokens = { 10530 (void *)&cmd_get_hash_global_config_all, 10531 (void *)&cmd_get_hash_global_config_port_id, 10532 NULL, 10533 }, 10534 }; 10535 10536 /* Set global config of hash function */ 10537 struct cmd_set_hash_global_config_result { 10538 cmdline_fixed_string_t set_hash_global_config; 10539 uint8_t port_id; 10540 cmdline_fixed_string_t hash_func; 10541 cmdline_fixed_string_t flow_type; 10542 cmdline_fixed_string_t enable; 10543 }; 10544 10545 static void 10546 cmd_set_hash_global_config_parsed(void *parsed_result, 10547 __rte_unused struct cmdline *cl, 10548 __rte_unused void *data) 10549 { 10550 struct cmd_set_hash_global_config_result *res = parsed_result; 10551 struct rte_eth_hash_filter_info info; 10552 uint32_t ftype, idx, offset; 10553 int ret; 10554 10555 if (rte_eth_dev_filter_supported(res->port_id, 10556 RTE_ETH_FILTER_HASH) < 0) { 10557 printf("RTE_ETH_FILTER_HASH not supported on port %d\n", 10558 res->port_id); 10559 return; 10560 } 10561 memset(&info, 0, sizeof(info)); 10562 info.info_type = RTE_ETH_HASH_FILTER_GLOBAL_CONFIG; 10563 if (!strcmp(res->hash_func, "toeplitz")) 10564 info.info.global_conf.hash_func = 10565 RTE_ETH_HASH_FUNCTION_TOEPLITZ; 10566 else if (!strcmp(res->hash_func, "simple_xor")) 10567 info.info.global_conf.hash_func = 10568 RTE_ETH_HASH_FUNCTION_SIMPLE_XOR; 10569 else if (!strcmp(res->hash_func, "default")) 10570 info.info.global_conf.hash_func = 10571 RTE_ETH_HASH_FUNCTION_DEFAULT; 10572 10573 ftype = str2flowtype(res->flow_type); 10574 idx = ftype / (CHAR_BIT * sizeof(uint32_t)); 10575 offset = ftype % (CHAR_BIT * sizeof(uint32_t)); 10576 info.info.global_conf.valid_bit_mask[idx] |= (1UL << offset); 10577 if (!strcmp(res->enable, "enable")) 10578 info.info.global_conf.sym_hash_enable_mask[idx] |= 10579 (1UL << offset); 10580 ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_HASH, 10581 RTE_ETH_FILTER_SET, &info); 10582 if (ret < 0) 10583 printf("Cannot set global hash configurations by port %d\n", 10584 res->port_id); 10585 else 10586 printf("Global hash configurations have been set " 10587 "succcessfully by port %d\n", res->port_id); 10588 } 10589 10590 cmdline_parse_token_string_t cmd_set_hash_global_config_all = 10591 TOKEN_STRING_INITIALIZER(struct cmd_set_hash_global_config_result, 10592 set_hash_global_config, "set_hash_global_config"); 10593 cmdline_parse_token_num_t cmd_set_hash_global_config_port_id = 10594 TOKEN_NUM_INITIALIZER(struct cmd_set_hash_global_config_result, 10595 port_id, UINT8); 10596 cmdline_parse_token_string_t cmd_set_hash_global_config_hash_func = 10597 TOKEN_STRING_INITIALIZER(struct cmd_set_hash_global_config_result, 10598 hash_func, "toeplitz#simple_xor#default"); 10599 cmdline_parse_token_string_t cmd_set_hash_global_config_flow_type = 10600 TOKEN_STRING_INITIALIZER(struct cmd_set_hash_global_config_result, 10601 flow_type, 10602 "ipv4#ipv4-frag#ipv4-tcp#ipv4-udp#ipv4-sctp#ipv4-other#ipv6#" 10603 "ipv6-frag#ipv6-tcp#ipv6-udp#ipv6-sctp#ipv6-other#l2_payload"); 10604 cmdline_parse_token_string_t cmd_set_hash_global_config_enable = 10605 TOKEN_STRING_INITIALIZER(struct cmd_set_hash_global_config_result, 10606 enable, "enable#disable"); 10607 10608 cmdline_parse_inst_t cmd_set_hash_global_config = { 10609 .f = cmd_set_hash_global_config_parsed, 10610 .data = NULL, 10611 .help_str = "set_hash_global_config <port_id> " 10612 "toeplitz|simple_xor|default " 10613 "ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|" 10614 "ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|" 10615 "l2_payload enable|disable", 10616 .tokens = { 10617 (void *)&cmd_set_hash_global_config_all, 10618 (void *)&cmd_set_hash_global_config_port_id, 10619 (void *)&cmd_set_hash_global_config_hash_func, 10620 (void *)&cmd_set_hash_global_config_flow_type, 10621 (void *)&cmd_set_hash_global_config_enable, 10622 NULL, 10623 }, 10624 }; 10625 10626 /* Set hash input set */ 10627 struct cmd_set_hash_input_set_result { 10628 cmdline_fixed_string_t set_hash_input_set; 10629 uint8_t port_id; 10630 cmdline_fixed_string_t flow_type; 10631 cmdline_fixed_string_t inset_field; 10632 cmdline_fixed_string_t select; 10633 }; 10634 10635 static enum rte_eth_input_set_field 10636 str2inset(char *string) 10637 { 10638 uint16_t i; 10639 10640 static const struct { 10641 char str[32]; 10642 enum rte_eth_input_set_field inset; 10643 } inset_table[] = { 10644 {"ethertype", RTE_ETH_INPUT_SET_L2_ETHERTYPE}, 10645 {"ovlan", RTE_ETH_INPUT_SET_L2_OUTER_VLAN}, 10646 {"ivlan", RTE_ETH_INPUT_SET_L2_INNER_VLAN}, 10647 {"src-ipv4", RTE_ETH_INPUT_SET_L3_SRC_IP4}, 10648 {"dst-ipv4", RTE_ETH_INPUT_SET_L3_DST_IP4}, 10649 {"ipv4-tos", RTE_ETH_INPUT_SET_L3_IP4_TOS}, 10650 {"ipv4-proto", RTE_ETH_INPUT_SET_L3_IP4_PROTO}, 10651 {"ipv4-ttl", RTE_ETH_INPUT_SET_L3_IP4_TTL}, 10652 {"src-ipv6", RTE_ETH_INPUT_SET_L3_SRC_IP6}, 10653 {"dst-ipv6", RTE_ETH_INPUT_SET_L3_DST_IP6}, 10654 {"ipv6-tc", RTE_ETH_INPUT_SET_L3_IP6_TC}, 10655 {"ipv6-next-header", RTE_ETH_INPUT_SET_L3_IP6_NEXT_HEADER}, 10656 {"ipv6-hop-limits", RTE_ETH_INPUT_SET_L3_IP6_HOP_LIMITS}, 10657 {"udp-src-port", RTE_ETH_INPUT_SET_L4_UDP_SRC_PORT}, 10658 {"udp-dst-port", RTE_ETH_INPUT_SET_L4_UDP_DST_PORT}, 10659 {"tcp-src-port", RTE_ETH_INPUT_SET_L4_TCP_SRC_PORT}, 10660 {"tcp-dst-port", RTE_ETH_INPUT_SET_L4_TCP_DST_PORT}, 10661 {"sctp-src-port", RTE_ETH_INPUT_SET_L4_SCTP_SRC_PORT}, 10662 {"sctp-dst-port", RTE_ETH_INPUT_SET_L4_SCTP_DST_PORT}, 10663 {"sctp-veri-tag", RTE_ETH_INPUT_SET_L4_SCTP_VERIFICATION_TAG}, 10664 {"udp-key", RTE_ETH_INPUT_SET_TUNNEL_L4_UDP_KEY}, 10665 {"gre-key", RTE_ETH_INPUT_SET_TUNNEL_GRE_KEY}, 10666 {"fld-1st", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_1ST_WORD}, 10667 {"fld-2nd", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_2ND_WORD}, 10668 {"fld-3rd", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_3RD_WORD}, 10669 {"fld-4th", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_4TH_WORD}, 10670 {"fld-5th", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_5TH_WORD}, 10671 {"fld-6th", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_6TH_WORD}, 10672 {"fld-7th", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_7TH_WORD}, 10673 {"fld-8th", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_8TH_WORD}, 10674 {"none", RTE_ETH_INPUT_SET_NONE}, 10675 }; 10676 10677 for (i = 0; i < RTE_DIM(inset_table); i++) { 10678 if (!strcmp(string, inset_table[i].str)) 10679 return inset_table[i].inset; 10680 } 10681 10682 return RTE_ETH_INPUT_SET_UNKNOWN; 10683 } 10684 10685 static void 10686 cmd_set_hash_input_set_parsed(void *parsed_result, 10687 __rte_unused struct cmdline *cl, 10688 __rte_unused void *data) 10689 { 10690 struct cmd_set_hash_input_set_result *res = parsed_result; 10691 struct rte_eth_hash_filter_info info; 10692 10693 memset(&info, 0, sizeof(info)); 10694 info.info_type = RTE_ETH_HASH_FILTER_INPUT_SET_SELECT; 10695 info.info.input_set_conf.flow_type = str2flowtype(res->flow_type); 10696 info.info.input_set_conf.field[0] = str2inset(res->inset_field); 10697 info.info.input_set_conf.inset_size = 1; 10698 if (!strcmp(res->select, "select")) 10699 info.info.input_set_conf.op = RTE_ETH_INPUT_SET_SELECT; 10700 else if (!strcmp(res->select, "add")) 10701 info.info.input_set_conf.op = RTE_ETH_INPUT_SET_ADD; 10702 rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_HASH, 10703 RTE_ETH_FILTER_SET, &info); 10704 } 10705 10706 cmdline_parse_token_string_t cmd_set_hash_input_set_cmd = 10707 TOKEN_STRING_INITIALIZER(struct cmd_set_hash_input_set_result, 10708 set_hash_input_set, "set_hash_input_set"); 10709 cmdline_parse_token_num_t cmd_set_hash_input_set_port_id = 10710 TOKEN_NUM_INITIALIZER(struct cmd_set_hash_input_set_result, 10711 port_id, UINT8); 10712 cmdline_parse_token_string_t cmd_set_hash_input_set_flow_type = 10713 TOKEN_STRING_INITIALIZER(struct cmd_set_hash_input_set_result, 10714 flow_type, NULL); 10715 cmdline_parse_token_string_t cmd_set_hash_input_set_field = 10716 TOKEN_STRING_INITIALIZER(struct cmd_set_hash_input_set_result, 10717 inset_field, 10718 "ovlan#ivlan#src-ipv4#dst-ipv4#src-ipv6#dst-ipv6#" 10719 "ipv4-tos#ipv4-proto#ipv6-tc#ipv6-next-header#udp-src-port#" 10720 "udp-dst-port#tcp-src-port#tcp-dst-port#sctp-src-port#" 10721 "sctp-dst-port#sctp-veri-tag#udp-key#gre-key#fld-1st#" 10722 "fld-2nd#fld-3rd#fld-4th#fld-5th#fld-6th#fld-7th#" 10723 "fld-8th#none"); 10724 cmdline_parse_token_string_t cmd_set_hash_input_set_select = 10725 TOKEN_STRING_INITIALIZER(struct cmd_set_hash_input_set_result, 10726 select, "select#add"); 10727 10728 cmdline_parse_inst_t cmd_set_hash_input_set = { 10729 .f = cmd_set_hash_input_set_parsed, 10730 .data = NULL, 10731 .help_str = "set_hash_input_set <port_id> " 10732 "ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|" 10733 "ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|l2_payload|<flowtype_id> " 10734 "ovlan|ivlan|src-ipv4|dst-ipv4|src-ipv6|dst-ipv6|ipv4-tos|ipv4-proto|" 10735 "ipv6-tc|ipv6-next-header|udp-src-port|udp-dst-port|tcp-src-port|" 10736 "tcp-dst-port|sctp-src-port|sctp-dst-port|sctp-veri-tag|udp-key|" 10737 "gre-key|fld-1st|fld-2nd|fld-3rd|fld-4th|fld-5th|fld-6th|" 10738 "fld-7th|fld-8th|none select|add", 10739 .tokens = { 10740 (void *)&cmd_set_hash_input_set_cmd, 10741 (void *)&cmd_set_hash_input_set_port_id, 10742 (void *)&cmd_set_hash_input_set_flow_type, 10743 (void *)&cmd_set_hash_input_set_field, 10744 (void *)&cmd_set_hash_input_set_select, 10745 NULL, 10746 }, 10747 }; 10748 10749 /* Set flow director input set */ 10750 struct cmd_set_fdir_input_set_result { 10751 cmdline_fixed_string_t set_fdir_input_set; 10752 uint8_t port_id; 10753 cmdline_fixed_string_t flow_type; 10754 cmdline_fixed_string_t inset_field; 10755 cmdline_fixed_string_t select; 10756 }; 10757 10758 static void 10759 cmd_set_fdir_input_set_parsed(void *parsed_result, 10760 __rte_unused struct cmdline *cl, 10761 __rte_unused void *data) 10762 { 10763 struct cmd_set_fdir_input_set_result *res = parsed_result; 10764 struct rte_eth_fdir_filter_info info; 10765 10766 memset(&info, 0, sizeof(info)); 10767 info.info_type = RTE_ETH_FDIR_FILTER_INPUT_SET_SELECT; 10768 info.info.input_set_conf.flow_type = str2flowtype(res->flow_type); 10769 info.info.input_set_conf.field[0] = str2inset(res->inset_field); 10770 info.info.input_set_conf.inset_size = 1; 10771 if (!strcmp(res->select, "select")) 10772 info.info.input_set_conf.op = RTE_ETH_INPUT_SET_SELECT; 10773 else if (!strcmp(res->select, "add")) 10774 info.info.input_set_conf.op = RTE_ETH_INPUT_SET_ADD; 10775 rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR, 10776 RTE_ETH_FILTER_SET, &info); 10777 } 10778 10779 cmdline_parse_token_string_t cmd_set_fdir_input_set_cmd = 10780 TOKEN_STRING_INITIALIZER(struct cmd_set_fdir_input_set_result, 10781 set_fdir_input_set, "set_fdir_input_set"); 10782 cmdline_parse_token_num_t cmd_set_fdir_input_set_port_id = 10783 TOKEN_NUM_INITIALIZER(struct cmd_set_fdir_input_set_result, 10784 port_id, UINT8); 10785 cmdline_parse_token_string_t cmd_set_fdir_input_set_flow_type = 10786 TOKEN_STRING_INITIALIZER(struct cmd_set_fdir_input_set_result, 10787 flow_type, 10788 "ipv4-frag#ipv4-tcp#ipv4-udp#ipv4-sctp#ipv4-other#" 10789 "ipv6-frag#ipv6-tcp#ipv6-udp#ipv6-sctp#ipv6-other#l2_payload"); 10790 cmdline_parse_token_string_t cmd_set_fdir_input_set_field = 10791 TOKEN_STRING_INITIALIZER(struct cmd_set_fdir_input_set_result, 10792 inset_field, 10793 "ivlan#ethertype#src-ipv4#dst-ipv4#src-ipv6#dst-ipv6#" 10794 "ipv4-tos#ipv4-proto#ipv4-ttl#ipv6-tc#ipv6-next-header#" 10795 "ipv6-hop-limits#udp-src-port#udp-dst-port#" 10796 "tcp-src-port#tcp-dst-port#sctp-src-port#sctp-dst-port#" 10797 "sctp-veri-tag#none"); 10798 cmdline_parse_token_string_t cmd_set_fdir_input_set_select = 10799 TOKEN_STRING_INITIALIZER(struct cmd_set_fdir_input_set_result, 10800 select, "select#add"); 10801 10802 cmdline_parse_inst_t cmd_set_fdir_input_set = { 10803 .f = cmd_set_fdir_input_set_parsed, 10804 .data = NULL, 10805 .help_str = "set_fdir_input_set <port_id> " 10806 "ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|" 10807 "ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|l2_payload " 10808 "ivlan|ethertype|src-ipv4|dst-ipv4|src-ipv6|dst-ipv6|" 10809 "ipv4-tos|ipv4-proto|ipv4-ttl|ipv6-tc|ipv6-next-header|" 10810 "ipv6-hop-limits|udp-src-port|udp-dst-port|" 10811 "tcp-src-port|tcp-dst-port|sctp-src-port|sctp-dst-port|" 10812 "sctp-veri-tag|none select|add", 10813 .tokens = { 10814 (void *)&cmd_set_fdir_input_set_cmd, 10815 (void *)&cmd_set_fdir_input_set_port_id, 10816 (void *)&cmd_set_fdir_input_set_flow_type, 10817 (void *)&cmd_set_fdir_input_set_field, 10818 (void *)&cmd_set_fdir_input_set_select, 10819 NULL, 10820 }, 10821 }; 10822 10823 /* *** ADD/REMOVE A MULTICAST MAC ADDRESS TO/FROM A PORT *** */ 10824 struct cmd_mcast_addr_result { 10825 cmdline_fixed_string_t mcast_addr_cmd; 10826 cmdline_fixed_string_t what; 10827 uint8_t port_num; 10828 struct ether_addr mc_addr; 10829 }; 10830 10831 static void cmd_mcast_addr_parsed(void *parsed_result, 10832 __attribute__((unused)) struct cmdline *cl, 10833 __attribute__((unused)) void *data) 10834 { 10835 struct cmd_mcast_addr_result *res = parsed_result; 10836 10837 if (!is_multicast_ether_addr(&res->mc_addr)) { 10838 printf("Invalid multicast addr %02X:%02X:%02X:%02X:%02X:%02X\n", 10839 res->mc_addr.addr_bytes[0], res->mc_addr.addr_bytes[1], 10840 res->mc_addr.addr_bytes[2], res->mc_addr.addr_bytes[3], 10841 res->mc_addr.addr_bytes[4], res->mc_addr.addr_bytes[5]); 10842 return; 10843 } 10844 if (strcmp(res->what, "add") == 0) 10845 mcast_addr_add(res->port_num, &res->mc_addr); 10846 else 10847 mcast_addr_remove(res->port_num, &res->mc_addr); 10848 } 10849 10850 cmdline_parse_token_string_t cmd_mcast_addr_cmd = 10851 TOKEN_STRING_INITIALIZER(struct cmd_mcast_addr_result, 10852 mcast_addr_cmd, "mcast_addr"); 10853 cmdline_parse_token_string_t cmd_mcast_addr_what = 10854 TOKEN_STRING_INITIALIZER(struct cmd_mcast_addr_result, what, 10855 "add#remove"); 10856 cmdline_parse_token_num_t cmd_mcast_addr_portnum = 10857 TOKEN_NUM_INITIALIZER(struct cmd_mcast_addr_result, port_num, UINT8); 10858 cmdline_parse_token_etheraddr_t cmd_mcast_addr_addr = 10859 TOKEN_ETHERADDR_INITIALIZER(struct cmd_mac_addr_result, address); 10860 10861 cmdline_parse_inst_t cmd_mcast_addr = { 10862 .f = cmd_mcast_addr_parsed, 10863 .data = (void *)0, 10864 .help_str = "mcast_addr add|remove <port_id> <mcast_addr>: " 10865 "Add/Remove multicast MAC address on port_id", 10866 .tokens = { 10867 (void *)&cmd_mcast_addr_cmd, 10868 (void *)&cmd_mcast_addr_what, 10869 (void *)&cmd_mcast_addr_portnum, 10870 (void *)&cmd_mcast_addr_addr, 10871 NULL, 10872 }, 10873 }; 10874 10875 /* l2 tunnel config 10876 * only support E-tag now. 10877 */ 10878 10879 /* Ether type config */ 10880 struct cmd_config_l2_tunnel_eth_type_result { 10881 cmdline_fixed_string_t port; 10882 cmdline_fixed_string_t config; 10883 cmdline_fixed_string_t all; 10884 uint8_t id; 10885 cmdline_fixed_string_t l2_tunnel; 10886 cmdline_fixed_string_t l2_tunnel_type; 10887 cmdline_fixed_string_t eth_type; 10888 uint16_t eth_type_val; 10889 }; 10890 10891 cmdline_parse_token_string_t cmd_config_l2_tunnel_eth_type_port = 10892 TOKEN_STRING_INITIALIZER 10893 (struct cmd_config_l2_tunnel_eth_type_result, 10894 port, "port"); 10895 cmdline_parse_token_string_t cmd_config_l2_tunnel_eth_type_config = 10896 TOKEN_STRING_INITIALIZER 10897 (struct cmd_config_l2_tunnel_eth_type_result, 10898 config, "config"); 10899 cmdline_parse_token_string_t cmd_config_l2_tunnel_eth_type_all_str = 10900 TOKEN_STRING_INITIALIZER 10901 (struct cmd_config_l2_tunnel_eth_type_result, 10902 all, "all"); 10903 cmdline_parse_token_num_t cmd_config_l2_tunnel_eth_type_id = 10904 TOKEN_NUM_INITIALIZER 10905 (struct cmd_config_l2_tunnel_eth_type_result, 10906 id, UINT8); 10907 cmdline_parse_token_string_t cmd_config_l2_tunnel_eth_type_l2_tunnel = 10908 TOKEN_STRING_INITIALIZER 10909 (struct cmd_config_l2_tunnel_eth_type_result, 10910 l2_tunnel, "l2-tunnel"); 10911 cmdline_parse_token_string_t cmd_config_l2_tunnel_eth_type_l2_tunnel_type = 10912 TOKEN_STRING_INITIALIZER 10913 (struct cmd_config_l2_tunnel_eth_type_result, 10914 l2_tunnel_type, "E-tag"); 10915 cmdline_parse_token_string_t cmd_config_l2_tunnel_eth_type_eth_type = 10916 TOKEN_STRING_INITIALIZER 10917 (struct cmd_config_l2_tunnel_eth_type_result, 10918 eth_type, "ether-type"); 10919 cmdline_parse_token_num_t cmd_config_l2_tunnel_eth_type_eth_type_val = 10920 TOKEN_NUM_INITIALIZER 10921 (struct cmd_config_l2_tunnel_eth_type_result, 10922 eth_type_val, UINT16); 10923 10924 static enum rte_eth_tunnel_type 10925 str2fdir_l2_tunnel_type(char *string) 10926 { 10927 uint32_t i = 0; 10928 10929 static const struct { 10930 char str[32]; 10931 enum rte_eth_tunnel_type type; 10932 } l2_tunnel_type_str[] = { 10933 {"E-tag", RTE_L2_TUNNEL_TYPE_E_TAG}, 10934 }; 10935 10936 for (i = 0; i < RTE_DIM(l2_tunnel_type_str); i++) { 10937 if (!strcmp(l2_tunnel_type_str[i].str, string)) 10938 return l2_tunnel_type_str[i].type; 10939 } 10940 return RTE_TUNNEL_TYPE_NONE; 10941 } 10942 10943 /* ether type config for all ports */ 10944 static void 10945 cmd_config_l2_tunnel_eth_type_all_parsed 10946 (void *parsed_result, 10947 __attribute__((unused)) struct cmdline *cl, 10948 __attribute__((unused)) void *data) 10949 { 10950 struct cmd_config_l2_tunnel_eth_type_result *res = parsed_result; 10951 struct rte_eth_l2_tunnel_conf entry; 10952 portid_t pid; 10953 10954 entry.l2_tunnel_type = str2fdir_l2_tunnel_type(res->l2_tunnel_type); 10955 entry.ether_type = res->eth_type_val; 10956 10957 RTE_ETH_FOREACH_DEV(pid) { 10958 rte_eth_dev_l2_tunnel_eth_type_conf(pid, &entry); 10959 } 10960 } 10961 10962 cmdline_parse_inst_t cmd_config_l2_tunnel_eth_type_all = { 10963 .f = cmd_config_l2_tunnel_eth_type_all_parsed, 10964 .data = NULL, 10965 .help_str = "port config all l2-tunnel E-tag ether-type <value>", 10966 .tokens = { 10967 (void *)&cmd_config_l2_tunnel_eth_type_port, 10968 (void *)&cmd_config_l2_tunnel_eth_type_config, 10969 (void *)&cmd_config_l2_tunnel_eth_type_all_str, 10970 (void *)&cmd_config_l2_tunnel_eth_type_l2_tunnel, 10971 (void *)&cmd_config_l2_tunnel_eth_type_l2_tunnel_type, 10972 (void *)&cmd_config_l2_tunnel_eth_type_eth_type, 10973 (void *)&cmd_config_l2_tunnel_eth_type_eth_type_val, 10974 NULL, 10975 }, 10976 }; 10977 10978 /* ether type config for a specific port */ 10979 static void 10980 cmd_config_l2_tunnel_eth_type_specific_parsed( 10981 void *parsed_result, 10982 __attribute__((unused)) struct cmdline *cl, 10983 __attribute__((unused)) void *data) 10984 { 10985 struct cmd_config_l2_tunnel_eth_type_result *res = 10986 parsed_result; 10987 struct rte_eth_l2_tunnel_conf entry; 10988 10989 if (port_id_is_invalid(res->id, ENABLED_WARN)) 10990 return; 10991 10992 entry.l2_tunnel_type = str2fdir_l2_tunnel_type(res->l2_tunnel_type); 10993 entry.ether_type = res->eth_type_val; 10994 10995 rte_eth_dev_l2_tunnel_eth_type_conf(res->id, &entry); 10996 } 10997 10998 cmdline_parse_inst_t cmd_config_l2_tunnel_eth_type_specific = { 10999 .f = cmd_config_l2_tunnel_eth_type_specific_parsed, 11000 .data = NULL, 11001 .help_str = "port config <port_id> l2-tunnel E-tag ether-type <value>", 11002 .tokens = { 11003 (void *)&cmd_config_l2_tunnel_eth_type_port, 11004 (void *)&cmd_config_l2_tunnel_eth_type_config, 11005 (void *)&cmd_config_l2_tunnel_eth_type_id, 11006 (void *)&cmd_config_l2_tunnel_eth_type_l2_tunnel, 11007 (void *)&cmd_config_l2_tunnel_eth_type_l2_tunnel_type, 11008 (void *)&cmd_config_l2_tunnel_eth_type_eth_type, 11009 (void *)&cmd_config_l2_tunnel_eth_type_eth_type_val, 11010 NULL, 11011 }, 11012 }; 11013 11014 /* Enable/disable l2 tunnel */ 11015 struct cmd_config_l2_tunnel_en_dis_result { 11016 cmdline_fixed_string_t port; 11017 cmdline_fixed_string_t config; 11018 cmdline_fixed_string_t all; 11019 uint8_t id; 11020 cmdline_fixed_string_t l2_tunnel; 11021 cmdline_fixed_string_t l2_tunnel_type; 11022 cmdline_fixed_string_t en_dis; 11023 }; 11024 11025 cmdline_parse_token_string_t cmd_config_l2_tunnel_en_dis_port = 11026 TOKEN_STRING_INITIALIZER 11027 (struct cmd_config_l2_tunnel_en_dis_result, 11028 port, "port"); 11029 cmdline_parse_token_string_t cmd_config_l2_tunnel_en_dis_config = 11030 TOKEN_STRING_INITIALIZER 11031 (struct cmd_config_l2_tunnel_en_dis_result, 11032 config, "config"); 11033 cmdline_parse_token_string_t cmd_config_l2_tunnel_en_dis_all_str = 11034 TOKEN_STRING_INITIALIZER 11035 (struct cmd_config_l2_tunnel_en_dis_result, 11036 all, "all"); 11037 cmdline_parse_token_num_t cmd_config_l2_tunnel_en_dis_id = 11038 TOKEN_NUM_INITIALIZER 11039 (struct cmd_config_l2_tunnel_en_dis_result, 11040 id, UINT8); 11041 cmdline_parse_token_string_t cmd_config_l2_tunnel_en_dis_l2_tunnel = 11042 TOKEN_STRING_INITIALIZER 11043 (struct cmd_config_l2_tunnel_en_dis_result, 11044 l2_tunnel, "l2-tunnel"); 11045 cmdline_parse_token_string_t cmd_config_l2_tunnel_en_dis_l2_tunnel_type = 11046 TOKEN_STRING_INITIALIZER 11047 (struct cmd_config_l2_tunnel_en_dis_result, 11048 l2_tunnel_type, "E-tag"); 11049 cmdline_parse_token_string_t cmd_config_l2_tunnel_en_dis_en_dis = 11050 TOKEN_STRING_INITIALIZER 11051 (struct cmd_config_l2_tunnel_en_dis_result, 11052 en_dis, "enable#disable"); 11053 11054 /* enable/disable l2 tunnel for all ports */ 11055 static void 11056 cmd_config_l2_tunnel_en_dis_all_parsed( 11057 void *parsed_result, 11058 __attribute__((unused)) struct cmdline *cl, 11059 __attribute__((unused)) void *data) 11060 { 11061 struct cmd_config_l2_tunnel_en_dis_result *res = parsed_result; 11062 struct rte_eth_l2_tunnel_conf entry; 11063 portid_t pid; 11064 uint8_t en; 11065 11066 entry.l2_tunnel_type = str2fdir_l2_tunnel_type(res->l2_tunnel_type); 11067 11068 if (!strcmp("enable", res->en_dis)) 11069 en = 1; 11070 else 11071 en = 0; 11072 11073 RTE_ETH_FOREACH_DEV(pid) { 11074 rte_eth_dev_l2_tunnel_offload_set(pid, 11075 &entry, 11076 ETH_L2_TUNNEL_ENABLE_MASK, 11077 en); 11078 } 11079 } 11080 11081 cmdline_parse_inst_t cmd_config_l2_tunnel_en_dis_all = { 11082 .f = cmd_config_l2_tunnel_en_dis_all_parsed, 11083 .data = NULL, 11084 .help_str = "port config all l2-tunnel E-tag enable|disable", 11085 .tokens = { 11086 (void *)&cmd_config_l2_tunnel_en_dis_port, 11087 (void *)&cmd_config_l2_tunnel_en_dis_config, 11088 (void *)&cmd_config_l2_tunnel_en_dis_all_str, 11089 (void *)&cmd_config_l2_tunnel_en_dis_l2_tunnel, 11090 (void *)&cmd_config_l2_tunnel_en_dis_l2_tunnel_type, 11091 (void *)&cmd_config_l2_tunnel_en_dis_en_dis, 11092 NULL, 11093 }, 11094 }; 11095 11096 /* enable/disable l2 tunnel for a port */ 11097 static void 11098 cmd_config_l2_tunnel_en_dis_specific_parsed( 11099 void *parsed_result, 11100 __attribute__((unused)) struct cmdline *cl, 11101 __attribute__((unused)) void *data) 11102 { 11103 struct cmd_config_l2_tunnel_en_dis_result *res = 11104 parsed_result; 11105 struct rte_eth_l2_tunnel_conf entry; 11106 11107 if (port_id_is_invalid(res->id, ENABLED_WARN)) 11108 return; 11109 11110 entry.l2_tunnel_type = str2fdir_l2_tunnel_type(res->l2_tunnel_type); 11111 11112 if (!strcmp("enable", res->en_dis)) 11113 rte_eth_dev_l2_tunnel_offload_set(res->id, 11114 &entry, 11115 ETH_L2_TUNNEL_ENABLE_MASK, 11116 1); 11117 else 11118 rte_eth_dev_l2_tunnel_offload_set(res->id, 11119 &entry, 11120 ETH_L2_TUNNEL_ENABLE_MASK, 11121 0); 11122 } 11123 11124 cmdline_parse_inst_t cmd_config_l2_tunnel_en_dis_specific = { 11125 .f = cmd_config_l2_tunnel_en_dis_specific_parsed, 11126 .data = NULL, 11127 .help_str = "port config <port_id> l2-tunnel E-tag enable|disable", 11128 .tokens = { 11129 (void *)&cmd_config_l2_tunnel_en_dis_port, 11130 (void *)&cmd_config_l2_tunnel_en_dis_config, 11131 (void *)&cmd_config_l2_tunnel_en_dis_id, 11132 (void *)&cmd_config_l2_tunnel_en_dis_l2_tunnel, 11133 (void *)&cmd_config_l2_tunnel_en_dis_l2_tunnel_type, 11134 (void *)&cmd_config_l2_tunnel_en_dis_en_dis, 11135 NULL, 11136 }, 11137 }; 11138 11139 /* E-tag configuration */ 11140 11141 /* Common result structure for all E-tag configuration */ 11142 struct cmd_config_e_tag_result { 11143 cmdline_fixed_string_t e_tag; 11144 cmdline_fixed_string_t set; 11145 cmdline_fixed_string_t insertion; 11146 cmdline_fixed_string_t stripping; 11147 cmdline_fixed_string_t forwarding; 11148 cmdline_fixed_string_t filter; 11149 cmdline_fixed_string_t add; 11150 cmdline_fixed_string_t del; 11151 cmdline_fixed_string_t on; 11152 cmdline_fixed_string_t off; 11153 cmdline_fixed_string_t on_off; 11154 cmdline_fixed_string_t port_tag_id; 11155 uint32_t port_tag_id_val; 11156 cmdline_fixed_string_t e_tag_id; 11157 uint16_t e_tag_id_val; 11158 cmdline_fixed_string_t dst_pool; 11159 uint8_t dst_pool_val; 11160 cmdline_fixed_string_t port; 11161 uint8_t port_id; 11162 cmdline_fixed_string_t vf; 11163 uint8_t vf_id; 11164 }; 11165 11166 /* Common CLI fields for all E-tag configuration */ 11167 cmdline_parse_token_string_t cmd_config_e_tag_e_tag = 11168 TOKEN_STRING_INITIALIZER 11169 (struct cmd_config_e_tag_result, 11170 e_tag, "E-tag"); 11171 cmdline_parse_token_string_t cmd_config_e_tag_set = 11172 TOKEN_STRING_INITIALIZER 11173 (struct cmd_config_e_tag_result, 11174 set, "set"); 11175 cmdline_parse_token_string_t cmd_config_e_tag_insertion = 11176 TOKEN_STRING_INITIALIZER 11177 (struct cmd_config_e_tag_result, 11178 insertion, "insertion"); 11179 cmdline_parse_token_string_t cmd_config_e_tag_stripping = 11180 TOKEN_STRING_INITIALIZER 11181 (struct cmd_config_e_tag_result, 11182 stripping, "stripping"); 11183 cmdline_parse_token_string_t cmd_config_e_tag_forwarding = 11184 TOKEN_STRING_INITIALIZER 11185 (struct cmd_config_e_tag_result, 11186 forwarding, "forwarding"); 11187 cmdline_parse_token_string_t cmd_config_e_tag_filter = 11188 TOKEN_STRING_INITIALIZER 11189 (struct cmd_config_e_tag_result, 11190 filter, "filter"); 11191 cmdline_parse_token_string_t cmd_config_e_tag_add = 11192 TOKEN_STRING_INITIALIZER 11193 (struct cmd_config_e_tag_result, 11194 add, "add"); 11195 cmdline_parse_token_string_t cmd_config_e_tag_del = 11196 TOKEN_STRING_INITIALIZER 11197 (struct cmd_config_e_tag_result, 11198 del, "del"); 11199 cmdline_parse_token_string_t cmd_config_e_tag_on = 11200 TOKEN_STRING_INITIALIZER 11201 (struct cmd_config_e_tag_result, 11202 on, "on"); 11203 cmdline_parse_token_string_t cmd_config_e_tag_off = 11204 TOKEN_STRING_INITIALIZER 11205 (struct cmd_config_e_tag_result, 11206 off, "off"); 11207 cmdline_parse_token_string_t cmd_config_e_tag_on_off = 11208 TOKEN_STRING_INITIALIZER 11209 (struct cmd_config_e_tag_result, 11210 on_off, "on#off"); 11211 cmdline_parse_token_string_t cmd_config_e_tag_port_tag_id = 11212 TOKEN_STRING_INITIALIZER 11213 (struct cmd_config_e_tag_result, 11214 port_tag_id, "port-tag-id"); 11215 cmdline_parse_token_num_t cmd_config_e_tag_port_tag_id_val = 11216 TOKEN_NUM_INITIALIZER 11217 (struct cmd_config_e_tag_result, 11218 port_tag_id_val, UINT32); 11219 cmdline_parse_token_string_t cmd_config_e_tag_e_tag_id = 11220 TOKEN_STRING_INITIALIZER 11221 (struct cmd_config_e_tag_result, 11222 e_tag_id, "e-tag-id"); 11223 cmdline_parse_token_num_t cmd_config_e_tag_e_tag_id_val = 11224 TOKEN_NUM_INITIALIZER 11225 (struct cmd_config_e_tag_result, 11226 e_tag_id_val, UINT16); 11227 cmdline_parse_token_string_t cmd_config_e_tag_dst_pool = 11228 TOKEN_STRING_INITIALIZER 11229 (struct cmd_config_e_tag_result, 11230 dst_pool, "dst-pool"); 11231 cmdline_parse_token_num_t cmd_config_e_tag_dst_pool_val = 11232 TOKEN_NUM_INITIALIZER 11233 (struct cmd_config_e_tag_result, 11234 dst_pool_val, UINT8); 11235 cmdline_parse_token_string_t cmd_config_e_tag_port = 11236 TOKEN_STRING_INITIALIZER 11237 (struct cmd_config_e_tag_result, 11238 port, "port"); 11239 cmdline_parse_token_num_t cmd_config_e_tag_port_id = 11240 TOKEN_NUM_INITIALIZER 11241 (struct cmd_config_e_tag_result, 11242 port_id, UINT8); 11243 cmdline_parse_token_string_t cmd_config_e_tag_vf = 11244 TOKEN_STRING_INITIALIZER 11245 (struct cmd_config_e_tag_result, 11246 vf, "vf"); 11247 cmdline_parse_token_num_t cmd_config_e_tag_vf_id = 11248 TOKEN_NUM_INITIALIZER 11249 (struct cmd_config_e_tag_result, 11250 vf_id, UINT8); 11251 11252 /* E-tag insertion configuration */ 11253 static void 11254 cmd_config_e_tag_insertion_en_parsed( 11255 void *parsed_result, 11256 __attribute__((unused)) struct cmdline *cl, 11257 __attribute__((unused)) void *data) 11258 { 11259 struct cmd_config_e_tag_result *res = 11260 parsed_result; 11261 struct rte_eth_l2_tunnel_conf entry; 11262 11263 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 11264 return; 11265 11266 entry.l2_tunnel_type = RTE_L2_TUNNEL_TYPE_E_TAG; 11267 entry.tunnel_id = res->port_tag_id_val; 11268 entry.vf_id = res->vf_id; 11269 rte_eth_dev_l2_tunnel_offload_set(res->port_id, 11270 &entry, 11271 ETH_L2_TUNNEL_INSERTION_MASK, 11272 1); 11273 } 11274 11275 static void 11276 cmd_config_e_tag_insertion_dis_parsed( 11277 void *parsed_result, 11278 __attribute__((unused)) struct cmdline *cl, 11279 __attribute__((unused)) void *data) 11280 { 11281 struct cmd_config_e_tag_result *res = 11282 parsed_result; 11283 struct rte_eth_l2_tunnel_conf entry; 11284 11285 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 11286 return; 11287 11288 entry.l2_tunnel_type = RTE_L2_TUNNEL_TYPE_E_TAG; 11289 entry.vf_id = res->vf_id; 11290 11291 rte_eth_dev_l2_tunnel_offload_set(res->port_id, 11292 &entry, 11293 ETH_L2_TUNNEL_INSERTION_MASK, 11294 0); 11295 } 11296 11297 cmdline_parse_inst_t cmd_config_e_tag_insertion_en = { 11298 .f = cmd_config_e_tag_insertion_en_parsed, 11299 .data = NULL, 11300 .help_str = "E-tag ... : E-tag insertion enable", 11301 .tokens = { 11302 (void *)&cmd_config_e_tag_e_tag, 11303 (void *)&cmd_config_e_tag_set, 11304 (void *)&cmd_config_e_tag_insertion, 11305 (void *)&cmd_config_e_tag_on, 11306 (void *)&cmd_config_e_tag_port_tag_id, 11307 (void *)&cmd_config_e_tag_port_tag_id_val, 11308 (void *)&cmd_config_e_tag_port, 11309 (void *)&cmd_config_e_tag_port_id, 11310 (void *)&cmd_config_e_tag_vf, 11311 (void *)&cmd_config_e_tag_vf_id, 11312 NULL, 11313 }, 11314 }; 11315 11316 cmdline_parse_inst_t cmd_config_e_tag_insertion_dis = { 11317 .f = cmd_config_e_tag_insertion_dis_parsed, 11318 .data = NULL, 11319 .help_str = "E-tag ... : E-tag insertion disable", 11320 .tokens = { 11321 (void *)&cmd_config_e_tag_e_tag, 11322 (void *)&cmd_config_e_tag_set, 11323 (void *)&cmd_config_e_tag_insertion, 11324 (void *)&cmd_config_e_tag_off, 11325 (void *)&cmd_config_e_tag_port, 11326 (void *)&cmd_config_e_tag_port_id, 11327 (void *)&cmd_config_e_tag_vf, 11328 (void *)&cmd_config_e_tag_vf_id, 11329 NULL, 11330 }, 11331 }; 11332 11333 /* E-tag stripping configuration */ 11334 static void 11335 cmd_config_e_tag_stripping_parsed( 11336 void *parsed_result, 11337 __attribute__((unused)) struct cmdline *cl, 11338 __attribute__((unused)) void *data) 11339 { 11340 struct cmd_config_e_tag_result *res = 11341 parsed_result; 11342 struct rte_eth_l2_tunnel_conf entry; 11343 11344 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 11345 return; 11346 11347 entry.l2_tunnel_type = RTE_L2_TUNNEL_TYPE_E_TAG; 11348 11349 if (!strcmp(res->on_off, "on")) 11350 rte_eth_dev_l2_tunnel_offload_set 11351 (res->port_id, 11352 &entry, 11353 ETH_L2_TUNNEL_STRIPPING_MASK, 11354 1); 11355 else 11356 rte_eth_dev_l2_tunnel_offload_set 11357 (res->port_id, 11358 &entry, 11359 ETH_L2_TUNNEL_STRIPPING_MASK, 11360 0); 11361 } 11362 11363 cmdline_parse_inst_t cmd_config_e_tag_stripping_en_dis = { 11364 .f = cmd_config_e_tag_stripping_parsed, 11365 .data = NULL, 11366 .help_str = "E-tag ... : E-tag stripping enable/disable", 11367 .tokens = { 11368 (void *)&cmd_config_e_tag_e_tag, 11369 (void *)&cmd_config_e_tag_set, 11370 (void *)&cmd_config_e_tag_stripping, 11371 (void *)&cmd_config_e_tag_on_off, 11372 (void *)&cmd_config_e_tag_port, 11373 (void *)&cmd_config_e_tag_port_id, 11374 NULL, 11375 }, 11376 }; 11377 11378 /* E-tag forwarding configuration */ 11379 static void 11380 cmd_config_e_tag_forwarding_parsed( 11381 void *parsed_result, 11382 __attribute__((unused)) struct cmdline *cl, 11383 __attribute__((unused)) void *data) 11384 { 11385 struct cmd_config_e_tag_result *res = parsed_result; 11386 struct rte_eth_l2_tunnel_conf entry; 11387 11388 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 11389 return; 11390 11391 entry.l2_tunnel_type = RTE_L2_TUNNEL_TYPE_E_TAG; 11392 11393 if (!strcmp(res->on_off, "on")) 11394 rte_eth_dev_l2_tunnel_offload_set 11395 (res->port_id, 11396 &entry, 11397 ETH_L2_TUNNEL_FORWARDING_MASK, 11398 1); 11399 else 11400 rte_eth_dev_l2_tunnel_offload_set 11401 (res->port_id, 11402 &entry, 11403 ETH_L2_TUNNEL_FORWARDING_MASK, 11404 0); 11405 } 11406 11407 cmdline_parse_inst_t cmd_config_e_tag_forwarding_en_dis = { 11408 .f = cmd_config_e_tag_forwarding_parsed, 11409 .data = NULL, 11410 .help_str = "E-tag ... : E-tag forwarding enable/disable", 11411 .tokens = { 11412 (void *)&cmd_config_e_tag_e_tag, 11413 (void *)&cmd_config_e_tag_set, 11414 (void *)&cmd_config_e_tag_forwarding, 11415 (void *)&cmd_config_e_tag_on_off, 11416 (void *)&cmd_config_e_tag_port, 11417 (void *)&cmd_config_e_tag_port_id, 11418 NULL, 11419 }, 11420 }; 11421 11422 /* E-tag filter configuration */ 11423 static void 11424 cmd_config_e_tag_filter_add_parsed( 11425 void *parsed_result, 11426 __attribute__((unused)) struct cmdline *cl, 11427 __attribute__((unused)) void *data) 11428 { 11429 struct cmd_config_e_tag_result *res = parsed_result; 11430 struct rte_eth_l2_tunnel_conf entry; 11431 int ret = 0; 11432 11433 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 11434 return; 11435 11436 if (res->e_tag_id_val > 0x3fff) { 11437 printf("e-tag-id must be equal or less than 0x3fff.\n"); 11438 return; 11439 } 11440 11441 ret = rte_eth_dev_filter_supported(res->port_id, 11442 RTE_ETH_FILTER_L2_TUNNEL); 11443 if (ret < 0) { 11444 printf("E-tag filter is not supported on port %u.\n", 11445 res->port_id); 11446 return; 11447 } 11448 11449 entry.l2_tunnel_type = RTE_L2_TUNNEL_TYPE_E_TAG; 11450 entry.tunnel_id = res->e_tag_id_val; 11451 entry.pool = res->dst_pool_val; 11452 11453 ret = rte_eth_dev_filter_ctrl(res->port_id, 11454 RTE_ETH_FILTER_L2_TUNNEL, 11455 RTE_ETH_FILTER_ADD, 11456 &entry); 11457 if (ret < 0) 11458 printf("E-tag filter programming error: (%s)\n", 11459 strerror(-ret)); 11460 } 11461 11462 cmdline_parse_inst_t cmd_config_e_tag_filter_add = { 11463 .f = cmd_config_e_tag_filter_add_parsed, 11464 .data = NULL, 11465 .help_str = "E-tag ... : E-tag filter add", 11466 .tokens = { 11467 (void *)&cmd_config_e_tag_e_tag, 11468 (void *)&cmd_config_e_tag_set, 11469 (void *)&cmd_config_e_tag_filter, 11470 (void *)&cmd_config_e_tag_add, 11471 (void *)&cmd_config_e_tag_e_tag_id, 11472 (void *)&cmd_config_e_tag_e_tag_id_val, 11473 (void *)&cmd_config_e_tag_dst_pool, 11474 (void *)&cmd_config_e_tag_dst_pool_val, 11475 (void *)&cmd_config_e_tag_port, 11476 (void *)&cmd_config_e_tag_port_id, 11477 NULL, 11478 }, 11479 }; 11480 11481 static void 11482 cmd_config_e_tag_filter_del_parsed( 11483 void *parsed_result, 11484 __attribute__((unused)) struct cmdline *cl, 11485 __attribute__((unused)) void *data) 11486 { 11487 struct cmd_config_e_tag_result *res = parsed_result; 11488 struct rte_eth_l2_tunnel_conf entry; 11489 int ret = 0; 11490 11491 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 11492 return; 11493 11494 if (res->e_tag_id_val > 0x3fff) { 11495 printf("e-tag-id must be less than 0x3fff.\n"); 11496 return; 11497 } 11498 11499 ret = rte_eth_dev_filter_supported(res->port_id, 11500 RTE_ETH_FILTER_L2_TUNNEL); 11501 if (ret < 0) { 11502 printf("E-tag filter is not supported on port %u.\n", 11503 res->port_id); 11504 return; 11505 } 11506 11507 entry.l2_tunnel_type = RTE_L2_TUNNEL_TYPE_E_TAG; 11508 entry.tunnel_id = res->e_tag_id_val; 11509 11510 ret = rte_eth_dev_filter_ctrl(res->port_id, 11511 RTE_ETH_FILTER_L2_TUNNEL, 11512 RTE_ETH_FILTER_DELETE, 11513 &entry); 11514 if (ret < 0) 11515 printf("E-tag filter programming error: (%s)\n", 11516 strerror(-ret)); 11517 } 11518 11519 cmdline_parse_inst_t cmd_config_e_tag_filter_del = { 11520 .f = cmd_config_e_tag_filter_del_parsed, 11521 .data = NULL, 11522 .help_str = "E-tag ... : E-tag filter delete", 11523 .tokens = { 11524 (void *)&cmd_config_e_tag_e_tag, 11525 (void *)&cmd_config_e_tag_set, 11526 (void *)&cmd_config_e_tag_filter, 11527 (void *)&cmd_config_e_tag_del, 11528 (void *)&cmd_config_e_tag_e_tag_id, 11529 (void *)&cmd_config_e_tag_e_tag_id_val, 11530 (void *)&cmd_config_e_tag_port, 11531 (void *)&cmd_config_e_tag_port_id, 11532 NULL, 11533 }, 11534 }; 11535 11536 /* vf vlan anti spoof configuration */ 11537 11538 /* Common result structure for vf vlan anti spoof */ 11539 struct cmd_vf_vlan_anti_spoof_result { 11540 cmdline_fixed_string_t set; 11541 cmdline_fixed_string_t vf; 11542 cmdline_fixed_string_t vlan; 11543 cmdline_fixed_string_t antispoof; 11544 uint8_t port_id; 11545 uint32_t vf_id; 11546 cmdline_fixed_string_t on_off; 11547 }; 11548 11549 /* Common CLI fields for vf vlan anti spoof enable disable */ 11550 cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_set = 11551 TOKEN_STRING_INITIALIZER 11552 (struct cmd_vf_vlan_anti_spoof_result, 11553 set, "set"); 11554 cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_vf = 11555 TOKEN_STRING_INITIALIZER 11556 (struct cmd_vf_vlan_anti_spoof_result, 11557 vf, "vf"); 11558 cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_vlan = 11559 TOKEN_STRING_INITIALIZER 11560 (struct cmd_vf_vlan_anti_spoof_result, 11561 vlan, "vlan"); 11562 cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_antispoof = 11563 TOKEN_STRING_INITIALIZER 11564 (struct cmd_vf_vlan_anti_spoof_result, 11565 antispoof, "antispoof"); 11566 cmdline_parse_token_num_t cmd_vf_vlan_anti_spoof_port_id = 11567 TOKEN_NUM_INITIALIZER 11568 (struct cmd_vf_vlan_anti_spoof_result, 11569 port_id, UINT8); 11570 cmdline_parse_token_num_t cmd_vf_vlan_anti_spoof_vf_id = 11571 TOKEN_NUM_INITIALIZER 11572 (struct cmd_vf_vlan_anti_spoof_result, 11573 vf_id, UINT32); 11574 cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_on_off = 11575 TOKEN_STRING_INITIALIZER 11576 (struct cmd_vf_vlan_anti_spoof_result, 11577 on_off, "on#off"); 11578 11579 static void 11580 cmd_set_vf_vlan_anti_spoof_parsed( 11581 void *parsed_result, 11582 __attribute__((unused)) struct cmdline *cl, 11583 __attribute__((unused)) void *data) 11584 { 11585 struct cmd_vf_vlan_anti_spoof_result *res = parsed_result; 11586 int ret = -ENOTSUP; 11587 11588 __rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 11589 11590 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 11591 return; 11592 11593 #ifdef RTE_LIBRTE_IXGBE_PMD 11594 if (ret == -ENOTSUP) 11595 ret = rte_pmd_ixgbe_set_vf_vlan_anti_spoof(res->port_id, 11596 res->vf_id, is_on); 11597 #endif 11598 #ifdef RTE_LIBRTE_I40E_PMD 11599 if (ret == -ENOTSUP) 11600 ret = rte_pmd_i40e_set_vf_vlan_anti_spoof(res->port_id, 11601 res->vf_id, is_on); 11602 #endif 11603 #ifdef RTE_LIBRTE_BNXT_PMD 11604 if (ret == -ENOTSUP) 11605 ret = rte_pmd_bnxt_set_vf_vlan_anti_spoof(res->port_id, 11606 res->vf_id, is_on); 11607 #endif 11608 11609 switch (ret) { 11610 case 0: 11611 break; 11612 case -EINVAL: 11613 printf("invalid vf_id %d\n", res->vf_id); 11614 break; 11615 case -ENODEV: 11616 printf("invalid port_id %d\n", res->port_id); 11617 break; 11618 case -ENOTSUP: 11619 printf("function not implemented\n"); 11620 break; 11621 default: 11622 printf("programming error: (%s)\n", strerror(-ret)); 11623 } 11624 } 11625 11626 cmdline_parse_inst_t cmd_set_vf_vlan_anti_spoof = { 11627 .f = cmd_set_vf_vlan_anti_spoof_parsed, 11628 .data = NULL, 11629 .help_str = "set vf vlan antispoof <port_id> <vf_id> on|off", 11630 .tokens = { 11631 (void *)&cmd_vf_vlan_anti_spoof_set, 11632 (void *)&cmd_vf_vlan_anti_spoof_vf, 11633 (void *)&cmd_vf_vlan_anti_spoof_vlan, 11634 (void *)&cmd_vf_vlan_anti_spoof_antispoof, 11635 (void *)&cmd_vf_vlan_anti_spoof_port_id, 11636 (void *)&cmd_vf_vlan_anti_spoof_vf_id, 11637 (void *)&cmd_vf_vlan_anti_spoof_on_off, 11638 NULL, 11639 }, 11640 }; 11641 11642 /* vf mac anti spoof configuration */ 11643 11644 /* Common result structure for vf mac anti spoof */ 11645 struct cmd_vf_mac_anti_spoof_result { 11646 cmdline_fixed_string_t set; 11647 cmdline_fixed_string_t vf; 11648 cmdline_fixed_string_t mac; 11649 cmdline_fixed_string_t antispoof; 11650 uint8_t port_id; 11651 uint32_t vf_id; 11652 cmdline_fixed_string_t on_off; 11653 }; 11654 11655 /* Common CLI fields for vf mac anti spoof enable disable */ 11656 cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_set = 11657 TOKEN_STRING_INITIALIZER 11658 (struct cmd_vf_mac_anti_spoof_result, 11659 set, "set"); 11660 cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_vf = 11661 TOKEN_STRING_INITIALIZER 11662 (struct cmd_vf_mac_anti_spoof_result, 11663 vf, "vf"); 11664 cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_mac = 11665 TOKEN_STRING_INITIALIZER 11666 (struct cmd_vf_mac_anti_spoof_result, 11667 mac, "mac"); 11668 cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_antispoof = 11669 TOKEN_STRING_INITIALIZER 11670 (struct cmd_vf_mac_anti_spoof_result, 11671 antispoof, "antispoof"); 11672 cmdline_parse_token_num_t cmd_vf_mac_anti_spoof_port_id = 11673 TOKEN_NUM_INITIALIZER 11674 (struct cmd_vf_mac_anti_spoof_result, 11675 port_id, UINT8); 11676 cmdline_parse_token_num_t cmd_vf_mac_anti_spoof_vf_id = 11677 TOKEN_NUM_INITIALIZER 11678 (struct cmd_vf_mac_anti_spoof_result, 11679 vf_id, UINT32); 11680 cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_on_off = 11681 TOKEN_STRING_INITIALIZER 11682 (struct cmd_vf_mac_anti_spoof_result, 11683 on_off, "on#off"); 11684 11685 static void 11686 cmd_set_vf_mac_anti_spoof_parsed( 11687 void *parsed_result, 11688 __attribute__((unused)) struct cmdline *cl, 11689 __attribute__((unused)) void *data) 11690 { 11691 struct cmd_vf_mac_anti_spoof_result *res = parsed_result; 11692 int ret = -ENOTSUP; 11693 11694 __rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 11695 11696 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 11697 return; 11698 11699 #ifdef RTE_LIBRTE_IXGBE_PMD 11700 if (ret == -ENOTSUP) 11701 ret = rte_pmd_ixgbe_set_vf_mac_anti_spoof(res->port_id, 11702 res->vf_id, is_on); 11703 #endif 11704 #ifdef RTE_LIBRTE_I40E_PMD 11705 if (ret == -ENOTSUP) 11706 ret = rte_pmd_i40e_set_vf_mac_anti_spoof(res->port_id, 11707 res->vf_id, is_on); 11708 #endif 11709 #ifdef RTE_LIBRTE_BNXT_PMD 11710 if (ret == -ENOTSUP) 11711 ret = rte_pmd_bnxt_set_vf_mac_anti_spoof(res->port_id, 11712 res->vf_id, is_on); 11713 #endif 11714 11715 switch (ret) { 11716 case 0: 11717 break; 11718 case -EINVAL: 11719 printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on); 11720 break; 11721 case -ENODEV: 11722 printf("invalid port_id %d\n", res->port_id); 11723 break; 11724 case -ENOTSUP: 11725 printf("function not implemented\n"); 11726 break; 11727 default: 11728 printf("programming error: (%s)\n", strerror(-ret)); 11729 } 11730 } 11731 11732 cmdline_parse_inst_t cmd_set_vf_mac_anti_spoof = { 11733 .f = cmd_set_vf_mac_anti_spoof_parsed, 11734 .data = NULL, 11735 .help_str = "set vf mac antispoof <port_id> <vf_id> on|off", 11736 .tokens = { 11737 (void *)&cmd_vf_mac_anti_spoof_set, 11738 (void *)&cmd_vf_mac_anti_spoof_vf, 11739 (void *)&cmd_vf_mac_anti_spoof_mac, 11740 (void *)&cmd_vf_mac_anti_spoof_antispoof, 11741 (void *)&cmd_vf_mac_anti_spoof_port_id, 11742 (void *)&cmd_vf_mac_anti_spoof_vf_id, 11743 (void *)&cmd_vf_mac_anti_spoof_on_off, 11744 NULL, 11745 }, 11746 }; 11747 11748 /* vf vlan strip queue configuration */ 11749 11750 /* Common result structure for vf mac anti spoof */ 11751 struct cmd_vf_vlan_stripq_result { 11752 cmdline_fixed_string_t set; 11753 cmdline_fixed_string_t vf; 11754 cmdline_fixed_string_t vlan; 11755 cmdline_fixed_string_t stripq; 11756 portid_t port_id; 11757 uint16_t vf_id; 11758 cmdline_fixed_string_t on_off; 11759 }; 11760 11761 /* Common CLI fields for vf vlan strip enable disable */ 11762 cmdline_parse_token_string_t cmd_vf_vlan_stripq_set = 11763 TOKEN_STRING_INITIALIZER 11764 (struct cmd_vf_vlan_stripq_result, 11765 set, "set"); 11766 cmdline_parse_token_string_t cmd_vf_vlan_stripq_vf = 11767 TOKEN_STRING_INITIALIZER 11768 (struct cmd_vf_vlan_stripq_result, 11769 vf, "vf"); 11770 cmdline_parse_token_string_t cmd_vf_vlan_stripq_vlan = 11771 TOKEN_STRING_INITIALIZER 11772 (struct cmd_vf_vlan_stripq_result, 11773 vlan, "vlan"); 11774 cmdline_parse_token_string_t cmd_vf_vlan_stripq_stripq = 11775 TOKEN_STRING_INITIALIZER 11776 (struct cmd_vf_vlan_stripq_result, 11777 stripq, "stripq"); 11778 cmdline_parse_token_num_t cmd_vf_vlan_stripq_port_id = 11779 TOKEN_NUM_INITIALIZER 11780 (struct cmd_vf_vlan_stripq_result, 11781 port_id, UINT8); 11782 cmdline_parse_token_num_t cmd_vf_vlan_stripq_vf_id = 11783 TOKEN_NUM_INITIALIZER 11784 (struct cmd_vf_vlan_stripq_result, 11785 vf_id, UINT16); 11786 cmdline_parse_token_string_t cmd_vf_vlan_stripq_on_off = 11787 TOKEN_STRING_INITIALIZER 11788 (struct cmd_vf_vlan_stripq_result, 11789 on_off, "on#off"); 11790 11791 static void 11792 cmd_set_vf_vlan_stripq_parsed( 11793 void *parsed_result, 11794 __attribute__((unused)) struct cmdline *cl, 11795 __attribute__((unused)) void *data) 11796 { 11797 struct cmd_vf_vlan_stripq_result *res = parsed_result; 11798 int ret = -ENOTSUP; 11799 11800 __rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 11801 11802 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 11803 return; 11804 11805 #ifdef RTE_LIBRTE_IXGBE_PMD 11806 if (ret == -ENOTSUP) 11807 ret = rte_pmd_ixgbe_set_vf_vlan_stripq(res->port_id, 11808 res->vf_id, is_on); 11809 #endif 11810 #ifdef RTE_LIBRTE_I40E_PMD 11811 if (ret == -ENOTSUP) 11812 ret = rte_pmd_i40e_set_vf_vlan_stripq(res->port_id, 11813 res->vf_id, is_on); 11814 #endif 11815 #ifdef RTE_LIBRTE_BNXT_PMD 11816 if (ret == -ENOTSUP) 11817 ret = rte_pmd_bnxt_set_vf_vlan_stripq(res->port_id, 11818 res->vf_id, is_on); 11819 #endif 11820 11821 switch (ret) { 11822 case 0: 11823 break; 11824 case -EINVAL: 11825 printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on); 11826 break; 11827 case -ENODEV: 11828 printf("invalid port_id %d\n", res->port_id); 11829 break; 11830 case -ENOTSUP: 11831 printf("function not implemented\n"); 11832 break; 11833 default: 11834 printf("programming error: (%s)\n", strerror(-ret)); 11835 } 11836 } 11837 11838 cmdline_parse_inst_t cmd_set_vf_vlan_stripq = { 11839 .f = cmd_set_vf_vlan_stripq_parsed, 11840 .data = NULL, 11841 .help_str = "set vf vlan stripq <port_id> <vf_id> on|off", 11842 .tokens = { 11843 (void *)&cmd_vf_vlan_stripq_set, 11844 (void *)&cmd_vf_vlan_stripq_vf, 11845 (void *)&cmd_vf_vlan_stripq_vlan, 11846 (void *)&cmd_vf_vlan_stripq_stripq, 11847 (void *)&cmd_vf_vlan_stripq_port_id, 11848 (void *)&cmd_vf_vlan_stripq_vf_id, 11849 (void *)&cmd_vf_vlan_stripq_on_off, 11850 NULL, 11851 }, 11852 }; 11853 11854 /* vf vlan insert configuration */ 11855 11856 /* Common result structure for vf vlan insert */ 11857 struct cmd_vf_vlan_insert_result { 11858 cmdline_fixed_string_t set; 11859 cmdline_fixed_string_t vf; 11860 cmdline_fixed_string_t vlan; 11861 cmdline_fixed_string_t insert; 11862 uint8_t port_id; 11863 uint16_t vf_id; 11864 uint16_t vlan_id; 11865 }; 11866 11867 /* Common CLI fields for vf vlan insert enable disable */ 11868 cmdline_parse_token_string_t cmd_vf_vlan_insert_set = 11869 TOKEN_STRING_INITIALIZER 11870 (struct cmd_vf_vlan_insert_result, 11871 set, "set"); 11872 cmdline_parse_token_string_t cmd_vf_vlan_insert_vf = 11873 TOKEN_STRING_INITIALIZER 11874 (struct cmd_vf_vlan_insert_result, 11875 vf, "vf"); 11876 cmdline_parse_token_string_t cmd_vf_vlan_insert_vlan = 11877 TOKEN_STRING_INITIALIZER 11878 (struct cmd_vf_vlan_insert_result, 11879 vlan, "vlan"); 11880 cmdline_parse_token_string_t cmd_vf_vlan_insert_insert = 11881 TOKEN_STRING_INITIALIZER 11882 (struct cmd_vf_vlan_insert_result, 11883 insert, "insert"); 11884 cmdline_parse_token_num_t cmd_vf_vlan_insert_port_id = 11885 TOKEN_NUM_INITIALIZER 11886 (struct cmd_vf_vlan_insert_result, 11887 port_id, UINT8); 11888 cmdline_parse_token_num_t cmd_vf_vlan_insert_vf_id = 11889 TOKEN_NUM_INITIALIZER 11890 (struct cmd_vf_vlan_insert_result, 11891 vf_id, UINT16); 11892 cmdline_parse_token_num_t cmd_vf_vlan_insert_vlan_id = 11893 TOKEN_NUM_INITIALIZER 11894 (struct cmd_vf_vlan_insert_result, 11895 vlan_id, UINT16); 11896 11897 static void 11898 cmd_set_vf_vlan_insert_parsed( 11899 void *parsed_result, 11900 __attribute__((unused)) struct cmdline *cl, 11901 __attribute__((unused)) void *data) 11902 { 11903 struct cmd_vf_vlan_insert_result *res = parsed_result; 11904 int ret = -ENOTSUP; 11905 11906 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 11907 return; 11908 11909 #ifdef RTE_LIBRTE_IXGBE_PMD 11910 if (ret == -ENOTSUP) 11911 ret = rte_pmd_ixgbe_set_vf_vlan_insert(res->port_id, res->vf_id, 11912 res->vlan_id); 11913 #endif 11914 #ifdef RTE_LIBRTE_I40E_PMD 11915 if (ret == -ENOTSUP) 11916 ret = rte_pmd_i40e_set_vf_vlan_insert(res->port_id, res->vf_id, 11917 res->vlan_id); 11918 #endif 11919 #ifdef RTE_LIBRTE_BNXT_PMD 11920 if (ret == -ENOTSUP) 11921 ret = rte_pmd_bnxt_set_vf_vlan_insert(res->port_id, res->vf_id, 11922 res->vlan_id); 11923 #endif 11924 11925 switch (ret) { 11926 case 0: 11927 break; 11928 case -EINVAL: 11929 printf("invalid vf_id %d or vlan_id %d\n", res->vf_id, res->vlan_id); 11930 break; 11931 case -ENODEV: 11932 printf("invalid port_id %d\n", res->port_id); 11933 break; 11934 case -ENOTSUP: 11935 printf("function not implemented\n"); 11936 break; 11937 default: 11938 printf("programming error: (%s)\n", strerror(-ret)); 11939 } 11940 } 11941 11942 cmdline_parse_inst_t cmd_set_vf_vlan_insert = { 11943 .f = cmd_set_vf_vlan_insert_parsed, 11944 .data = NULL, 11945 .help_str = "set vf vlan insert <port_id> <vf_id> <vlan_id>", 11946 .tokens = { 11947 (void *)&cmd_vf_vlan_insert_set, 11948 (void *)&cmd_vf_vlan_insert_vf, 11949 (void *)&cmd_vf_vlan_insert_vlan, 11950 (void *)&cmd_vf_vlan_insert_insert, 11951 (void *)&cmd_vf_vlan_insert_port_id, 11952 (void *)&cmd_vf_vlan_insert_vf_id, 11953 (void *)&cmd_vf_vlan_insert_vlan_id, 11954 NULL, 11955 }, 11956 }; 11957 11958 /* tx loopback configuration */ 11959 11960 /* Common result structure for tx loopback */ 11961 struct cmd_tx_loopback_result { 11962 cmdline_fixed_string_t set; 11963 cmdline_fixed_string_t tx; 11964 cmdline_fixed_string_t loopback; 11965 uint8_t port_id; 11966 cmdline_fixed_string_t on_off; 11967 }; 11968 11969 /* Common CLI fields for tx loopback enable disable */ 11970 cmdline_parse_token_string_t cmd_tx_loopback_set = 11971 TOKEN_STRING_INITIALIZER 11972 (struct cmd_tx_loopback_result, 11973 set, "set"); 11974 cmdline_parse_token_string_t cmd_tx_loopback_tx = 11975 TOKEN_STRING_INITIALIZER 11976 (struct cmd_tx_loopback_result, 11977 tx, "tx"); 11978 cmdline_parse_token_string_t cmd_tx_loopback_loopback = 11979 TOKEN_STRING_INITIALIZER 11980 (struct cmd_tx_loopback_result, 11981 loopback, "loopback"); 11982 cmdline_parse_token_num_t cmd_tx_loopback_port_id = 11983 TOKEN_NUM_INITIALIZER 11984 (struct cmd_tx_loopback_result, 11985 port_id, UINT8); 11986 cmdline_parse_token_string_t cmd_tx_loopback_on_off = 11987 TOKEN_STRING_INITIALIZER 11988 (struct cmd_tx_loopback_result, 11989 on_off, "on#off"); 11990 11991 static void 11992 cmd_set_tx_loopback_parsed( 11993 void *parsed_result, 11994 __attribute__((unused)) struct cmdline *cl, 11995 __attribute__((unused)) void *data) 11996 { 11997 struct cmd_tx_loopback_result *res = parsed_result; 11998 int ret = -ENOTSUP; 11999 12000 __rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 12001 12002 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 12003 return; 12004 12005 #ifdef RTE_LIBRTE_IXGBE_PMD 12006 if (ret == -ENOTSUP) 12007 ret = rte_pmd_ixgbe_set_tx_loopback(res->port_id, is_on); 12008 #endif 12009 #ifdef RTE_LIBRTE_I40E_PMD 12010 if (ret == -ENOTSUP) 12011 ret = rte_pmd_i40e_set_tx_loopback(res->port_id, is_on); 12012 #endif 12013 #ifdef RTE_LIBRTE_BNXT_PMD 12014 if (ret == -ENOTSUP) 12015 ret = rte_pmd_bnxt_set_tx_loopback(res->port_id, is_on); 12016 #endif 12017 12018 switch (ret) { 12019 case 0: 12020 break; 12021 case -EINVAL: 12022 printf("invalid is_on %d\n", is_on); 12023 break; 12024 case -ENODEV: 12025 printf("invalid port_id %d\n", res->port_id); 12026 break; 12027 case -ENOTSUP: 12028 printf("function not implemented\n"); 12029 break; 12030 default: 12031 printf("programming error: (%s)\n", strerror(-ret)); 12032 } 12033 } 12034 12035 cmdline_parse_inst_t cmd_set_tx_loopback = { 12036 .f = cmd_set_tx_loopback_parsed, 12037 .data = NULL, 12038 .help_str = "set tx loopback <port_id> on|off", 12039 .tokens = { 12040 (void *)&cmd_tx_loopback_set, 12041 (void *)&cmd_tx_loopback_tx, 12042 (void *)&cmd_tx_loopback_loopback, 12043 (void *)&cmd_tx_loopback_port_id, 12044 (void *)&cmd_tx_loopback_on_off, 12045 NULL, 12046 }, 12047 }; 12048 12049 /* all queues drop enable configuration */ 12050 12051 /* Common result structure for all queues drop enable */ 12052 struct cmd_all_queues_drop_en_result { 12053 cmdline_fixed_string_t set; 12054 cmdline_fixed_string_t all; 12055 cmdline_fixed_string_t queues; 12056 cmdline_fixed_string_t drop; 12057 uint8_t port_id; 12058 cmdline_fixed_string_t on_off; 12059 }; 12060 12061 /* Common CLI fields for tx loopback enable disable */ 12062 cmdline_parse_token_string_t cmd_all_queues_drop_en_set = 12063 TOKEN_STRING_INITIALIZER 12064 (struct cmd_all_queues_drop_en_result, 12065 set, "set"); 12066 cmdline_parse_token_string_t cmd_all_queues_drop_en_all = 12067 TOKEN_STRING_INITIALIZER 12068 (struct cmd_all_queues_drop_en_result, 12069 all, "all"); 12070 cmdline_parse_token_string_t cmd_all_queues_drop_en_queues = 12071 TOKEN_STRING_INITIALIZER 12072 (struct cmd_all_queues_drop_en_result, 12073 queues, "queues"); 12074 cmdline_parse_token_string_t cmd_all_queues_drop_en_drop = 12075 TOKEN_STRING_INITIALIZER 12076 (struct cmd_all_queues_drop_en_result, 12077 drop, "drop"); 12078 cmdline_parse_token_num_t cmd_all_queues_drop_en_port_id = 12079 TOKEN_NUM_INITIALIZER 12080 (struct cmd_all_queues_drop_en_result, 12081 port_id, UINT8); 12082 cmdline_parse_token_string_t cmd_all_queues_drop_en_on_off = 12083 TOKEN_STRING_INITIALIZER 12084 (struct cmd_all_queues_drop_en_result, 12085 on_off, "on#off"); 12086 12087 static void 12088 cmd_set_all_queues_drop_en_parsed( 12089 void *parsed_result, 12090 __attribute__((unused)) struct cmdline *cl, 12091 __attribute__((unused)) void *data) 12092 { 12093 struct cmd_all_queues_drop_en_result *res = parsed_result; 12094 int ret = -ENOTSUP; 12095 int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 12096 12097 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 12098 return; 12099 12100 #ifdef RTE_LIBRTE_IXGBE_PMD 12101 if (ret == -ENOTSUP) 12102 ret = rte_pmd_ixgbe_set_all_queues_drop_en(res->port_id, is_on); 12103 #endif 12104 #ifdef RTE_LIBRTE_BNXT_PMD 12105 if (ret == -ENOTSUP) 12106 ret = rte_pmd_bnxt_set_all_queues_drop_en(res->port_id, is_on); 12107 #endif 12108 switch (ret) { 12109 case 0: 12110 break; 12111 case -EINVAL: 12112 printf("invalid is_on %d\n", is_on); 12113 break; 12114 case -ENODEV: 12115 printf("invalid port_id %d\n", res->port_id); 12116 break; 12117 case -ENOTSUP: 12118 printf("function not implemented\n"); 12119 break; 12120 default: 12121 printf("programming error: (%s)\n", strerror(-ret)); 12122 } 12123 } 12124 12125 cmdline_parse_inst_t cmd_set_all_queues_drop_en = { 12126 .f = cmd_set_all_queues_drop_en_parsed, 12127 .data = NULL, 12128 .help_str = "set all queues drop <port_id> on|off", 12129 .tokens = { 12130 (void *)&cmd_all_queues_drop_en_set, 12131 (void *)&cmd_all_queues_drop_en_all, 12132 (void *)&cmd_all_queues_drop_en_queues, 12133 (void *)&cmd_all_queues_drop_en_drop, 12134 (void *)&cmd_all_queues_drop_en_port_id, 12135 (void *)&cmd_all_queues_drop_en_on_off, 12136 NULL, 12137 }, 12138 }; 12139 12140 /* vf split drop enable configuration */ 12141 12142 /* Common result structure for vf split drop enable */ 12143 struct cmd_vf_split_drop_en_result { 12144 cmdline_fixed_string_t set; 12145 cmdline_fixed_string_t vf; 12146 cmdline_fixed_string_t split; 12147 cmdline_fixed_string_t drop; 12148 uint8_t port_id; 12149 uint16_t vf_id; 12150 cmdline_fixed_string_t on_off; 12151 }; 12152 12153 /* Common CLI fields for vf split drop enable disable */ 12154 cmdline_parse_token_string_t cmd_vf_split_drop_en_set = 12155 TOKEN_STRING_INITIALIZER 12156 (struct cmd_vf_split_drop_en_result, 12157 set, "set"); 12158 cmdline_parse_token_string_t cmd_vf_split_drop_en_vf = 12159 TOKEN_STRING_INITIALIZER 12160 (struct cmd_vf_split_drop_en_result, 12161 vf, "vf"); 12162 cmdline_parse_token_string_t cmd_vf_split_drop_en_split = 12163 TOKEN_STRING_INITIALIZER 12164 (struct cmd_vf_split_drop_en_result, 12165 split, "split"); 12166 cmdline_parse_token_string_t cmd_vf_split_drop_en_drop = 12167 TOKEN_STRING_INITIALIZER 12168 (struct cmd_vf_split_drop_en_result, 12169 drop, "drop"); 12170 cmdline_parse_token_num_t cmd_vf_split_drop_en_port_id = 12171 TOKEN_NUM_INITIALIZER 12172 (struct cmd_vf_split_drop_en_result, 12173 port_id, UINT8); 12174 cmdline_parse_token_num_t cmd_vf_split_drop_en_vf_id = 12175 TOKEN_NUM_INITIALIZER 12176 (struct cmd_vf_split_drop_en_result, 12177 vf_id, UINT16); 12178 cmdline_parse_token_string_t cmd_vf_split_drop_en_on_off = 12179 TOKEN_STRING_INITIALIZER 12180 (struct cmd_vf_split_drop_en_result, 12181 on_off, "on#off"); 12182 12183 static void 12184 cmd_set_vf_split_drop_en_parsed( 12185 void *parsed_result, 12186 __attribute__((unused)) struct cmdline *cl, 12187 __attribute__((unused)) void *data) 12188 { 12189 struct cmd_vf_split_drop_en_result *res = parsed_result; 12190 int ret = -ENOTSUP; 12191 int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 12192 12193 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 12194 return; 12195 12196 #ifdef RTE_LIBRTE_IXGBE_PMD 12197 ret = rte_pmd_ixgbe_set_vf_split_drop_en(res->port_id, res->vf_id, 12198 is_on); 12199 #endif 12200 switch (ret) { 12201 case 0: 12202 break; 12203 case -EINVAL: 12204 printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on); 12205 break; 12206 case -ENODEV: 12207 printf("invalid port_id %d\n", res->port_id); 12208 break; 12209 case -ENOTSUP: 12210 printf("not supported on port %d\n", res->port_id); 12211 break; 12212 default: 12213 printf("programming error: (%s)\n", strerror(-ret)); 12214 } 12215 } 12216 12217 cmdline_parse_inst_t cmd_set_vf_split_drop_en = { 12218 .f = cmd_set_vf_split_drop_en_parsed, 12219 .data = NULL, 12220 .help_str = "set vf split drop <port_id> <vf_id> on|off", 12221 .tokens = { 12222 (void *)&cmd_vf_split_drop_en_set, 12223 (void *)&cmd_vf_split_drop_en_vf, 12224 (void *)&cmd_vf_split_drop_en_split, 12225 (void *)&cmd_vf_split_drop_en_drop, 12226 (void *)&cmd_vf_split_drop_en_port_id, 12227 (void *)&cmd_vf_split_drop_en_vf_id, 12228 (void *)&cmd_vf_split_drop_en_on_off, 12229 NULL, 12230 }, 12231 }; 12232 12233 /* vf mac address configuration */ 12234 12235 /* Common result structure for vf mac address */ 12236 struct cmd_set_vf_mac_addr_result { 12237 cmdline_fixed_string_t set; 12238 cmdline_fixed_string_t vf; 12239 cmdline_fixed_string_t mac; 12240 cmdline_fixed_string_t addr; 12241 uint8_t port_id; 12242 uint16_t vf_id; 12243 struct ether_addr mac_addr; 12244 12245 }; 12246 12247 /* Common CLI fields for vf split drop enable disable */ 12248 cmdline_parse_token_string_t cmd_set_vf_mac_addr_set = 12249 TOKEN_STRING_INITIALIZER 12250 (struct cmd_set_vf_mac_addr_result, 12251 set, "set"); 12252 cmdline_parse_token_string_t cmd_set_vf_mac_addr_vf = 12253 TOKEN_STRING_INITIALIZER 12254 (struct cmd_set_vf_mac_addr_result, 12255 vf, "vf"); 12256 cmdline_parse_token_string_t cmd_set_vf_mac_addr_mac = 12257 TOKEN_STRING_INITIALIZER 12258 (struct cmd_set_vf_mac_addr_result, 12259 mac, "mac"); 12260 cmdline_parse_token_string_t cmd_set_vf_mac_addr_addr = 12261 TOKEN_STRING_INITIALIZER 12262 (struct cmd_set_vf_mac_addr_result, 12263 addr, "addr"); 12264 cmdline_parse_token_num_t cmd_set_vf_mac_addr_port_id = 12265 TOKEN_NUM_INITIALIZER 12266 (struct cmd_set_vf_mac_addr_result, 12267 port_id, UINT8); 12268 cmdline_parse_token_num_t cmd_set_vf_mac_addr_vf_id = 12269 TOKEN_NUM_INITIALIZER 12270 (struct cmd_set_vf_mac_addr_result, 12271 vf_id, UINT16); 12272 cmdline_parse_token_etheraddr_t cmd_set_vf_mac_addr_mac_addr = 12273 TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_vf_mac_addr_result, 12274 mac_addr); 12275 12276 static void 12277 cmd_set_vf_mac_addr_parsed( 12278 void *parsed_result, 12279 __attribute__((unused)) struct cmdline *cl, 12280 __attribute__((unused)) void *data) 12281 { 12282 struct cmd_set_vf_mac_addr_result *res = parsed_result; 12283 int ret = -ENOTSUP; 12284 12285 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 12286 return; 12287 12288 #ifdef RTE_LIBRTE_IXGBE_PMD 12289 if (ret == -ENOTSUP) 12290 ret = rte_pmd_ixgbe_set_vf_mac_addr(res->port_id, res->vf_id, 12291 &res->mac_addr); 12292 #endif 12293 #ifdef RTE_LIBRTE_I40E_PMD 12294 if (ret == -ENOTSUP) 12295 ret = rte_pmd_i40e_set_vf_mac_addr(res->port_id, res->vf_id, 12296 &res->mac_addr); 12297 #endif 12298 #ifdef RTE_LIBRTE_BNXT_PMD 12299 if (ret == -ENOTSUP) 12300 ret = rte_pmd_bnxt_set_vf_mac_addr(res->port_id, res->vf_id, 12301 &res->mac_addr); 12302 #endif 12303 12304 switch (ret) { 12305 case 0: 12306 break; 12307 case -EINVAL: 12308 printf("invalid vf_id %d or mac_addr\n", res->vf_id); 12309 break; 12310 case -ENODEV: 12311 printf("invalid port_id %d\n", res->port_id); 12312 break; 12313 case -ENOTSUP: 12314 printf("function not implemented\n"); 12315 break; 12316 default: 12317 printf("programming error: (%s)\n", strerror(-ret)); 12318 } 12319 } 12320 12321 cmdline_parse_inst_t cmd_set_vf_mac_addr = { 12322 .f = cmd_set_vf_mac_addr_parsed, 12323 .data = NULL, 12324 .help_str = "set vf mac addr <port_id> <vf_id> <mac_addr>", 12325 .tokens = { 12326 (void *)&cmd_set_vf_mac_addr_set, 12327 (void *)&cmd_set_vf_mac_addr_vf, 12328 (void *)&cmd_set_vf_mac_addr_mac, 12329 (void *)&cmd_set_vf_mac_addr_addr, 12330 (void *)&cmd_set_vf_mac_addr_port_id, 12331 (void *)&cmd_set_vf_mac_addr_vf_id, 12332 (void *)&cmd_set_vf_mac_addr_mac_addr, 12333 NULL, 12334 }, 12335 }; 12336 12337 /* MACsec configuration */ 12338 12339 /* Common result structure for MACsec offload enable */ 12340 struct cmd_macsec_offload_on_result { 12341 cmdline_fixed_string_t set; 12342 cmdline_fixed_string_t macsec; 12343 cmdline_fixed_string_t offload; 12344 uint8_t port_id; 12345 cmdline_fixed_string_t on; 12346 cmdline_fixed_string_t encrypt; 12347 cmdline_fixed_string_t en_on_off; 12348 cmdline_fixed_string_t replay_protect; 12349 cmdline_fixed_string_t rp_on_off; 12350 }; 12351 12352 /* Common CLI fields for MACsec offload disable */ 12353 cmdline_parse_token_string_t cmd_macsec_offload_on_set = 12354 TOKEN_STRING_INITIALIZER 12355 (struct cmd_macsec_offload_on_result, 12356 set, "set"); 12357 cmdline_parse_token_string_t cmd_macsec_offload_on_macsec = 12358 TOKEN_STRING_INITIALIZER 12359 (struct cmd_macsec_offload_on_result, 12360 macsec, "macsec"); 12361 cmdline_parse_token_string_t cmd_macsec_offload_on_offload = 12362 TOKEN_STRING_INITIALIZER 12363 (struct cmd_macsec_offload_on_result, 12364 offload, "offload"); 12365 cmdline_parse_token_num_t cmd_macsec_offload_on_port_id = 12366 TOKEN_NUM_INITIALIZER 12367 (struct cmd_macsec_offload_on_result, 12368 port_id, UINT8); 12369 cmdline_parse_token_string_t cmd_macsec_offload_on_on = 12370 TOKEN_STRING_INITIALIZER 12371 (struct cmd_macsec_offload_on_result, 12372 on, "on"); 12373 cmdline_parse_token_string_t cmd_macsec_offload_on_encrypt = 12374 TOKEN_STRING_INITIALIZER 12375 (struct cmd_macsec_offload_on_result, 12376 encrypt, "encrypt"); 12377 cmdline_parse_token_string_t cmd_macsec_offload_on_en_on_off = 12378 TOKEN_STRING_INITIALIZER 12379 (struct cmd_macsec_offload_on_result, 12380 en_on_off, "on#off"); 12381 cmdline_parse_token_string_t cmd_macsec_offload_on_replay_protect = 12382 TOKEN_STRING_INITIALIZER 12383 (struct cmd_macsec_offload_on_result, 12384 replay_protect, "replay-protect"); 12385 cmdline_parse_token_string_t cmd_macsec_offload_on_rp_on_off = 12386 TOKEN_STRING_INITIALIZER 12387 (struct cmd_macsec_offload_on_result, 12388 rp_on_off, "on#off"); 12389 12390 static void 12391 cmd_set_macsec_offload_on_parsed( 12392 void *parsed_result, 12393 __attribute__((unused)) struct cmdline *cl, 12394 __attribute__((unused)) void *data) 12395 { 12396 struct cmd_macsec_offload_on_result *res = parsed_result; 12397 int ret = -ENOTSUP; 12398 portid_t port_id = res->port_id; 12399 int en = (strcmp(res->en_on_off, "on") == 0) ? 1 : 0; 12400 int rp = (strcmp(res->rp_on_off, "on") == 0) ? 1 : 0; 12401 12402 if (port_id_is_invalid(port_id, ENABLED_WARN)) 12403 return; 12404 12405 ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_MACSEC; 12406 #ifdef RTE_LIBRTE_IXGBE_PMD 12407 ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp); 12408 #endif 12409 RTE_SET_USED(en); 12410 RTE_SET_USED(rp); 12411 12412 switch (ret) { 12413 case 0: 12414 break; 12415 case -ENODEV: 12416 printf("invalid port_id %d\n", port_id); 12417 break; 12418 case -ENOTSUP: 12419 printf("not supported on port %d\n", port_id); 12420 break; 12421 default: 12422 printf("programming error: (%s)\n", strerror(-ret)); 12423 } 12424 } 12425 12426 cmdline_parse_inst_t cmd_set_macsec_offload_on = { 12427 .f = cmd_set_macsec_offload_on_parsed, 12428 .data = NULL, 12429 .help_str = "set macsec offload <port_id> on " 12430 "encrypt on|off replay-protect on|off", 12431 .tokens = { 12432 (void *)&cmd_macsec_offload_on_set, 12433 (void *)&cmd_macsec_offload_on_macsec, 12434 (void *)&cmd_macsec_offload_on_offload, 12435 (void *)&cmd_macsec_offload_on_port_id, 12436 (void *)&cmd_macsec_offload_on_on, 12437 (void *)&cmd_macsec_offload_on_encrypt, 12438 (void *)&cmd_macsec_offload_on_en_on_off, 12439 (void *)&cmd_macsec_offload_on_replay_protect, 12440 (void *)&cmd_macsec_offload_on_rp_on_off, 12441 NULL, 12442 }, 12443 }; 12444 12445 /* Common result structure for MACsec offload disable */ 12446 struct cmd_macsec_offload_off_result { 12447 cmdline_fixed_string_t set; 12448 cmdline_fixed_string_t macsec; 12449 cmdline_fixed_string_t offload; 12450 uint8_t port_id; 12451 cmdline_fixed_string_t off; 12452 }; 12453 12454 /* Common CLI fields for MACsec offload disable */ 12455 cmdline_parse_token_string_t cmd_macsec_offload_off_set = 12456 TOKEN_STRING_INITIALIZER 12457 (struct cmd_macsec_offload_off_result, 12458 set, "set"); 12459 cmdline_parse_token_string_t cmd_macsec_offload_off_macsec = 12460 TOKEN_STRING_INITIALIZER 12461 (struct cmd_macsec_offload_off_result, 12462 macsec, "macsec"); 12463 cmdline_parse_token_string_t cmd_macsec_offload_off_offload = 12464 TOKEN_STRING_INITIALIZER 12465 (struct cmd_macsec_offload_off_result, 12466 offload, "offload"); 12467 cmdline_parse_token_num_t cmd_macsec_offload_off_port_id = 12468 TOKEN_NUM_INITIALIZER 12469 (struct cmd_macsec_offload_off_result, 12470 port_id, UINT8); 12471 cmdline_parse_token_string_t cmd_macsec_offload_off_off = 12472 TOKEN_STRING_INITIALIZER 12473 (struct cmd_macsec_offload_off_result, 12474 off, "off"); 12475 12476 static void 12477 cmd_set_macsec_offload_off_parsed( 12478 void *parsed_result, 12479 __attribute__((unused)) struct cmdline *cl, 12480 __attribute__((unused)) void *data) 12481 { 12482 struct cmd_macsec_offload_off_result *res = parsed_result; 12483 int ret = -ENOTSUP; 12484 portid_t port_id = res->port_id; 12485 12486 if (port_id_is_invalid(port_id, ENABLED_WARN)) 12487 return; 12488 12489 ports[port_id].tx_ol_flags &= ~TESTPMD_TX_OFFLOAD_MACSEC; 12490 #ifdef RTE_LIBRTE_IXGBE_PMD 12491 ret = rte_pmd_ixgbe_macsec_disable(port_id); 12492 #endif 12493 12494 switch (ret) { 12495 case 0: 12496 break; 12497 case -ENODEV: 12498 printf("invalid port_id %d\n", port_id); 12499 break; 12500 case -ENOTSUP: 12501 printf("not supported on port %d\n", port_id); 12502 break; 12503 default: 12504 printf("programming error: (%s)\n", strerror(-ret)); 12505 } 12506 } 12507 12508 cmdline_parse_inst_t cmd_set_macsec_offload_off = { 12509 .f = cmd_set_macsec_offload_off_parsed, 12510 .data = NULL, 12511 .help_str = "set macsec offload <port_id> off", 12512 .tokens = { 12513 (void *)&cmd_macsec_offload_off_set, 12514 (void *)&cmd_macsec_offload_off_macsec, 12515 (void *)&cmd_macsec_offload_off_offload, 12516 (void *)&cmd_macsec_offload_off_port_id, 12517 (void *)&cmd_macsec_offload_off_off, 12518 NULL, 12519 }, 12520 }; 12521 12522 /* Common result structure for MACsec secure connection configure */ 12523 struct cmd_macsec_sc_result { 12524 cmdline_fixed_string_t set; 12525 cmdline_fixed_string_t macsec; 12526 cmdline_fixed_string_t sc; 12527 cmdline_fixed_string_t tx_rx; 12528 uint8_t port_id; 12529 struct ether_addr mac; 12530 uint16_t pi; 12531 }; 12532 12533 /* Common CLI fields for MACsec secure connection configure */ 12534 cmdline_parse_token_string_t cmd_macsec_sc_set = 12535 TOKEN_STRING_INITIALIZER 12536 (struct cmd_macsec_sc_result, 12537 set, "set"); 12538 cmdline_parse_token_string_t cmd_macsec_sc_macsec = 12539 TOKEN_STRING_INITIALIZER 12540 (struct cmd_macsec_sc_result, 12541 macsec, "macsec"); 12542 cmdline_parse_token_string_t cmd_macsec_sc_sc = 12543 TOKEN_STRING_INITIALIZER 12544 (struct cmd_macsec_sc_result, 12545 sc, "sc"); 12546 cmdline_parse_token_string_t cmd_macsec_sc_tx_rx = 12547 TOKEN_STRING_INITIALIZER 12548 (struct cmd_macsec_sc_result, 12549 tx_rx, "tx#rx"); 12550 cmdline_parse_token_num_t cmd_macsec_sc_port_id = 12551 TOKEN_NUM_INITIALIZER 12552 (struct cmd_macsec_sc_result, 12553 port_id, UINT8); 12554 cmdline_parse_token_etheraddr_t cmd_macsec_sc_mac = 12555 TOKEN_ETHERADDR_INITIALIZER 12556 (struct cmd_macsec_sc_result, 12557 mac); 12558 cmdline_parse_token_num_t cmd_macsec_sc_pi = 12559 TOKEN_NUM_INITIALIZER 12560 (struct cmd_macsec_sc_result, 12561 pi, UINT16); 12562 12563 static void 12564 cmd_set_macsec_sc_parsed( 12565 void *parsed_result, 12566 __attribute__((unused)) struct cmdline *cl, 12567 __attribute__((unused)) void *data) 12568 { 12569 struct cmd_macsec_sc_result *res = parsed_result; 12570 int ret = -ENOTSUP; 12571 int is_tx = (strcmp(res->tx_rx, "tx") == 0) ? 1 : 0; 12572 12573 #ifdef RTE_LIBRTE_IXGBE_PMD 12574 ret = is_tx ? 12575 rte_pmd_ixgbe_macsec_config_txsc(res->port_id, 12576 res->mac.addr_bytes) : 12577 rte_pmd_ixgbe_macsec_config_rxsc(res->port_id, 12578 res->mac.addr_bytes, res->pi); 12579 #endif 12580 RTE_SET_USED(is_tx); 12581 12582 switch (ret) { 12583 case 0: 12584 break; 12585 case -ENODEV: 12586 printf("invalid port_id %d\n", res->port_id); 12587 break; 12588 case -ENOTSUP: 12589 printf("not supported on port %d\n", res->port_id); 12590 break; 12591 default: 12592 printf("programming error: (%s)\n", strerror(-ret)); 12593 } 12594 } 12595 12596 cmdline_parse_inst_t cmd_set_macsec_sc = { 12597 .f = cmd_set_macsec_sc_parsed, 12598 .data = NULL, 12599 .help_str = "set macsec sc tx|rx <port_id> <mac> <pi>", 12600 .tokens = { 12601 (void *)&cmd_macsec_sc_set, 12602 (void *)&cmd_macsec_sc_macsec, 12603 (void *)&cmd_macsec_sc_sc, 12604 (void *)&cmd_macsec_sc_tx_rx, 12605 (void *)&cmd_macsec_sc_port_id, 12606 (void *)&cmd_macsec_sc_mac, 12607 (void *)&cmd_macsec_sc_pi, 12608 NULL, 12609 }, 12610 }; 12611 12612 /* Common result structure for MACsec secure connection configure */ 12613 struct cmd_macsec_sa_result { 12614 cmdline_fixed_string_t set; 12615 cmdline_fixed_string_t macsec; 12616 cmdline_fixed_string_t sa; 12617 cmdline_fixed_string_t tx_rx; 12618 uint8_t port_id; 12619 uint8_t idx; 12620 uint8_t an; 12621 uint32_t pn; 12622 cmdline_fixed_string_t key; 12623 }; 12624 12625 /* Common CLI fields for MACsec secure connection configure */ 12626 cmdline_parse_token_string_t cmd_macsec_sa_set = 12627 TOKEN_STRING_INITIALIZER 12628 (struct cmd_macsec_sa_result, 12629 set, "set"); 12630 cmdline_parse_token_string_t cmd_macsec_sa_macsec = 12631 TOKEN_STRING_INITIALIZER 12632 (struct cmd_macsec_sa_result, 12633 macsec, "macsec"); 12634 cmdline_parse_token_string_t cmd_macsec_sa_sa = 12635 TOKEN_STRING_INITIALIZER 12636 (struct cmd_macsec_sa_result, 12637 sa, "sa"); 12638 cmdline_parse_token_string_t cmd_macsec_sa_tx_rx = 12639 TOKEN_STRING_INITIALIZER 12640 (struct cmd_macsec_sa_result, 12641 tx_rx, "tx#rx"); 12642 cmdline_parse_token_num_t cmd_macsec_sa_port_id = 12643 TOKEN_NUM_INITIALIZER 12644 (struct cmd_macsec_sa_result, 12645 port_id, UINT8); 12646 cmdline_parse_token_num_t cmd_macsec_sa_idx = 12647 TOKEN_NUM_INITIALIZER 12648 (struct cmd_macsec_sa_result, 12649 idx, UINT8); 12650 cmdline_parse_token_num_t cmd_macsec_sa_an = 12651 TOKEN_NUM_INITIALIZER 12652 (struct cmd_macsec_sa_result, 12653 an, UINT8); 12654 cmdline_parse_token_num_t cmd_macsec_sa_pn = 12655 TOKEN_NUM_INITIALIZER 12656 (struct cmd_macsec_sa_result, 12657 pn, UINT32); 12658 cmdline_parse_token_string_t cmd_macsec_sa_key = 12659 TOKEN_STRING_INITIALIZER 12660 (struct cmd_macsec_sa_result, 12661 key, NULL); 12662 12663 static void 12664 cmd_set_macsec_sa_parsed( 12665 void *parsed_result, 12666 __attribute__((unused)) struct cmdline *cl, 12667 __attribute__((unused)) void *data) 12668 { 12669 struct cmd_macsec_sa_result *res = parsed_result; 12670 int ret = -ENOTSUP; 12671 int is_tx = (strcmp(res->tx_rx, "tx") == 0) ? 1 : 0; 12672 uint8_t key[16] = { 0 }; 12673 uint8_t xdgt0; 12674 uint8_t xdgt1; 12675 int key_len; 12676 int i; 12677 12678 key_len = strlen(res->key) / 2; 12679 if (key_len > 16) 12680 key_len = 16; 12681 12682 for (i = 0; i < key_len; i++) { 12683 xdgt0 = parse_and_check_key_hexa_digit(res->key, (i * 2)); 12684 if (xdgt0 == 0xFF) 12685 return; 12686 xdgt1 = parse_and_check_key_hexa_digit(res->key, (i * 2) + 1); 12687 if (xdgt1 == 0xFF) 12688 return; 12689 key[i] = (uint8_t) ((xdgt0 * 16) + xdgt1); 12690 } 12691 12692 #ifdef RTE_LIBRTE_IXGBE_PMD 12693 ret = is_tx ? 12694 rte_pmd_ixgbe_macsec_select_txsa(res->port_id, 12695 res->idx, res->an, res->pn, key) : 12696 rte_pmd_ixgbe_macsec_select_rxsa(res->port_id, 12697 res->idx, res->an, res->pn, key); 12698 #endif 12699 RTE_SET_USED(is_tx); 12700 RTE_SET_USED(key); 12701 12702 switch (ret) { 12703 case 0: 12704 break; 12705 case -EINVAL: 12706 printf("invalid idx %d or an %d\n", res->idx, res->an); 12707 break; 12708 case -ENODEV: 12709 printf("invalid port_id %d\n", res->port_id); 12710 break; 12711 case -ENOTSUP: 12712 printf("not supported on port %d\n", res->port_id); 12713 break; 12714 default: 12715 printf("programming error: (%s)\n", strerror(-ret)); 12716 } 12717 } 12718 12719 cmdline_parse_inst_t cmd_set_macsec_sa = { 12720 .f = cmd_set_macsec_sa_parsed, 12721 .data = NULL, 12722 .help_str = "set macsec sa tx|rx <port_id> <idx> <an> <pn> <key>", 12723 .tokens = { 12724 (void *)&cmd_macsec_sa_set, 12725 (void *)&cmd_macsec_sa_macsec, 12726 (void *)&cmd_macsec_sa_sa, 12727 (void *)&cmd_macsec_sa_tx_rx, 12728 (void *)&cmd_macsec_sa_port_id, 12729 (void *)&cmd_macsec_sa_idx, 12730 (void *)&cmd_macsec_sa_an, 12731 (void *)&cmd_macsec_sa_pn, 12732 (void *)&cmd_macsec_sa_key, 12733 NULL, 12734 }, 12735 }; 12736 12737 /* VF unicast promiscuous mode configuration */ 12738 12739 /* Common result structure for VF unicast promiscuous mode */ 12740 struct cmd_vf_promisc_result { 12741 cmdline_fixed_string_t set; 12742 cmdline_fixed_string_t vf; 12743 cmdline_fixed_string_t promisc; 12744 uint8_t port_id; 12745 uint32_t vf_id; 12746 cmdline_fixed_string_t on_off; 12747 }; 12748 12749 /* Common CLI fields for VF unicast promiscuous mode enable disable */ 12750 cmdline_parse_token_string_t cmd_vf_promisc_set = 12751 TOKEN_STRING_INITIALIZER 12752 (struct cmd_vf_promisc_result, 12753 set, "set"); 12754 cmdline_parse_token_string_t cmd_vf_promisc_vf = 12755 TOKEN_STRING_INITIALIZER 12756 (struct cmd_vf_promisc_result, 12757 vf, "vf"); 12758 cmdline_parse_token_string_t cmd_vf_promisc_promisc = 12759 TOKEN_STRING_INITIALIZER 12760 (struct cmd_vf_promisc_result, 12761 promisc, "promisc"); 12762 cmdline_parse_token_num_t cmd_vf_promisc_port_id = 12763 TOKEN_NUM_INITIALIZER 12764 (struct cmd_vf_promisc_result, 12765 port_id, UINT8); 12766 cmdline_parse_token_num_t cmd_vf_promisc_vf_id = 12767 TOKEN_NUM_INITIALIZER 12768 (struct cmd_vf_promisc_result, 12769 vf_id, UINT32); 12770 cmdline_parse_token_string_t cmd_vf_promisc_on_off = 12771 TOKEN_STRING_INITIALIZER 12772 (struct cmd_vf_promisc_result, 12773 on_off, "on#off"); 12774 12775 static void 12776 cmd_set_vf_promisc_parsed( 12777 void *parsed_result, 12778 __attribute__((unused)) struct cmdline *cl, 12779 __attribute__((unused)) void *data) 12780 { 12781 struct cmd_vf_promisc_result *res = parsed_result; 12782 int ret = -ENOTSUP; 12783 12784 __rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 12785 12786 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 12787 return; 12788 12789 #ifdef RTE_LIBRTE_I40E_PMD 12790 ret = rte_pmd_i40e_set_vf_unicast_promisc(res->port_id, 12791 res->vf_id, is_on); 12792 #endif 12793 12794 switch (ret) { 12795 case 0: 12796 break; 12797 case -EINVAL: 12798 printf("invalid vf_id %d\n", res->vf_id); 12799 break; 12800 case -ENODEV: 12801 printf("invalid port_id %d\n", res->port_id); 12802 break; 12803 case -ENOTSUP: 12804 printf("function not implemented\n"); 12805 break; 12806 default: 12807 printf("programming error: (%s)\n", strerror(-ret)); 12808 } 12809 } 12810 12811 cmdline_parse_inst_t cmd_set_vf_promisc = { 12812 .f = cmd_set_vf_promisc_parsed, 12813 .data = NULL, 12814 .help_str = "set vf promisc <port_id> <vf_id> on|off: " 12815 "Set unicast promiscuous mode for a VF from the PF", 12816 .tokens = { 12817 (void *)&cmd_vf_promisc_set, 12818 (void *)&cmd_vf_promisc_vf, 12819 (void *)&cmd_vf_promisc_promisc, 12820 (void *)&cmd_vf_promisc_port_id, 12821 (void *)&cmd_vf_promisc_vf_id, 12822 (void *)&cmd_vf_promisc_on_off, 12823 NULL, 12824 }, 12825 }; 12826 12827 /* VF multicast promiscuous mode configuration */ 12828 12829 /* Common result structure for VF multicast promiscuous mode */ 12830 struct cmd_vf_allmulti_result { 12831 cmdline_fixed_string_t set; 12832 cmdline_fixed_string_t vf; 12833 cmdline_fixed_string_t allmulti; 12834 uint8_t port_id; 12835 uint32_t vf_id; 12836 cmdline_fixed_string_t on_off; 12837 }; 12838 12839 /* Common CLI fields for VF multicast promiscuous mode enable disable */ 12840 cmdline_parse_token_string_t cmd_vf_allmulti_set = 12841 TOKEN_STRING_INITIALIZER 12842 (struct cmd_vf_allmulti_result, 12843 set, "set"); 12844 cmdline_parse_token_string_t cmd_vf_allmulti_vf = 12845 TOKEN_STRING_INITIALIZER 12846 (struct cmd_vf_allmulti_result, 12847 vf, "vf"); 12848 cmdline_parse_token_string_t cmd_vf_allmulti_allmulti = 12849 TOKEN_STRING_INITIALIZER 12850 (struct cmd_vf_allmulti_result, 12851 allmulti, "allmulti"); 12852 cmdline_parse_token_num_t cmd_vf_allmulti_port_id = 12853 TOKEN_NUM_INITIALIZER 12854 (struct cmd_vf_allmulti_result, 12855 port_id, UINT8); 12856 cmdline_parse_token_num_t cmd_vf_allmulti_vf_id = 12857 TOKEN_NUM_INITIALIZER 12858 (struct cmd_vf_allmulti_result, 12859 vf_id, UINT32); 12860 cmdline_parse_token_string_t cmd_vf_allmulti_on_off = 12861 TOKEN_STRING_INITIALIZER 12862 (struct cmd_vf_allmulti_result, 12863 on_off, "on#off"); 12864 12865 static void 12866 cmd_set_vf_allmulti_parsed( 12867 void *parsed_result, 12868 __attribute__((unused)) struct cmdline *cl, 12869 __attribute__((unused)) void *data) 12870 { 12871 struct cmd_vf_allmulti_result *res = parsed_result; 12872 int ret = -ENOTSUP; 12873 12874 __rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 12875 12876 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 12877 return; 12878 12879 #ifdef RTE_LIBRTE_I40E_PMD 12880 ret = rte_pmd_i40e_set_vf_multicast_promisc(res->port_id, 12881 res->vf_id, is_on); 12882 #endif 12883 12884 switch (ret) { 12885 case 0: 12886 break; 12887 case -EINVAL: 12888 printf("invalid vf_id %d\n", res->vf_id); 12889 break; 12890 case -ENODEV: 12891 printf("invalid port_id %d\n", res->port_id); 12892 break; 12893 case -ENOTSUP: 12894 printf("function not implemented\n"); 12895 break; 12896 default: 12897 printf("programming error: (%s)\n", strerror(-ret)); 12898 } 12899 } 12900 12901 cmdline_parse_inst_t cmd_set_vf_allmulti = { 12902 .f = cmd_set_vf_allmulti_parsed, 12903 .data = NULL, 12904 .help_str = "set vf allmulti <port_id> <vf_id> on|off: " 12905 "Set multicast promiscuous mode for a VF from the PF", 12906 .tokens = { 12907 (void *)&cmd_vf_allmulti_set, 12908 (void *)&cmd_vf_allmulti_vf, 12909 (void *)&cmd_vf_allmulti_allmulti, 12910 (void *)&cmd_vf_allmulti_port_id, 12911 (void *)&cmd_vf_allmulti_vf_id, 12912 (void *)&cmd_vf_allmulti_on_off, 12913 NULL, 12914 }, 12915 }; 12916 12917 /* vf broadcast mode configuration */ 12918 12919 /* Common result structure for vf broadcast */ 12920 struct cmd_set_vf_broadcast_result { 12921 cmdline_fixed_string_t set; 12922 cmdline_fixed_string_t vf; 12923 cmdline_fixed_string_t broadcast; 12924 uint8_t port_id; 12925 uint16_t vf_id; 12926 cmdline_fixed_string_t on_off; 12927 }; 12928 12929 /* Common CLI fields for vf broadcast enable disable */ 12930 cmdline_parse_token_string_t cmd_set_vf_broadcast_set = 12931 TOKEN_STRING_INITIALIZER 12932 (struct cmd_set_vf_broadcast_result, 12933 set, "set"); 12934 cmdline_parse_token_string_t cmd_set_vf_broadcast_vf = 12935 TOKEN_STRING_INITIALIZER 12936 (struct cmd_set_vf_broadcast_result, 12937 vf, "vf"); 12938 cmdline_parse_token_string_t cmd_set_vf_broadcast_broadcast = 12939 TOKEN_STRING_INITIALIZER 12940 (struct cmd_set_vf_broadcast_result, 12941 broadcast, "broadcast"); 12942 cmdline_parse_token_num_t cmd_set_vf_broadcast_port_id = 12943 TOKEN_NUM_INITIALIZER 12944 (struct cmd_set_vf_broadcast_result, 12945 port_id, UINT8); 12946 cmdline_parse_token_num_t cmd_set_vf_broadcast_vf_id = 12947 TOKEN_NUM_INITIALIZER 12948 (struct cmd_set_vf_broadcast_result, 12949 vf_id, UINT16); 12950 cmdline_parse_token_string_t cmd_set_vf_broadcast_on_off = 12951 TOKEN_STRING_INITIALIZER 12952 (struct cmd_set_vf_broadcast_result, 12953 on_off, "on#off"); 12954 12955 static void 12956 cmd_set_vf_broadcast_parsed( 12957 void *parsed_result, 12958 __attribute__((unused)) struct cmdline *cl, 12959 __attribute__((unused)) void *data) 12960 { 12961 struct cmd_set_vf_broadcast_result *res = parsed_result; 12962 int ret = -ENOTSUP; 12963 12964 __rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 12965 12966 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 12967 return; 12968 12969 #ifdef RTE_LIBRTE_I40E_PMD 12970 ret = rte_pmd_i40e_set_vf_broadcast(res->port_id, 12971 res->vf_id, is_on); 12972 #endif 12973 12974 switch (ret) { 12975 case 0: 12976 break; 12977 case -EINVAL: 12978 printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on); 12979 break; 12980 case -ENODEV: 12981 printf("invalid port_id %d\n", res->port_id); 12982 break; 12983 case -ENOTSUP: 12984 printf("function not implemented\n"); 12985 break; 12986 default: 12987 printf("programming error: (%s)\n", strerror(-ret)); 12988 } 12989 } 12990 12991 cmdline_parse_inst_t cmd_set_vf_broadcast = { 12992 .f = cmd_set_vf_broadcast_parsed, 12993 .data = NULL, 12994 .help_str = "set vf broadcast <port_id> <vf_id> on|off", 12995 .tokens = { 12996 (void *)&cmd_set_vf_broadcast_set, 12997 (void *)&cmd_set_vf_broadcast_vf, 12998 (void *)&cmd_set_vf_broadcast_broadcast, 12999 (void *)&cmd_set_vf_broadcast_port_id, 13000 (void *)&cmd_set_vf_broadcast_vf_id, 13001 (void *)&cmd_set_vf_broadcast_on_off, 13002 NULL, 13003 }, 13004 }; 13005 13006 /* vf vlan tag configuration */ 13007 13008 /* Common result structure for vf vlan tag */ 13009 struct cmd_set_vf_vlan_tag_result { 13010 cmdline_fixed_string_t set; 13011 cmdline_fixed_string_t vf; 13012 cmdline_fixed_string_t vlan; 13013 cmdline_fixed_string_t tag; 13014 uint8_t port_id; 13015 uint16_t vf_id; 13016 cmdline_fixed_string_t on_off; 13017 }; 13018 13019 /* Common CLI fields for vf vlan tag enable disable */ 13020 cmdline_parse_token_string_t cmd_set_vf_vlan_tag_set = 13021 TOKEN_STRING_INITIALIZER 13022 (struct cmd_set_vf_vlan_tag_result, 13023 set, "set"); 13024 cmdline_parse_token_string_t cmd_set_vf_vlan_tag_vf = 13025 TOKEN_STRING_INITIALIZER 13026 (struct cmd_set_vf_vlan_tag_result, 13027 vf, "vf"); 13028 cmdline_parse_token_string_t cmd_set_vf_vlan_tag_vlan = 13029 TOKEN_STRING_INITIALIZER 13030 (struct cmd_set_vf_vlan_tag_result, 13031 vlan, "vlan"); 13032 cmdline_parse_token_string_t cmd_set_vf_vlan_tag_tag = 13033 TOKEN_STRING_INITIALIZER 13034 (struct cmd_set_vf_vlan_tag_result, 13035 tag, "tag"); 13036 cmdline_parse_token_num_t cmd_set_vf_vlan_tag_port_id = 13037 TOKEN_NUM_INITIALIZER 13038 (struct cmd_set_vf_vlan_tag_result, 13039 port_id, UINT8); 13040 cmdline_parse_token_num_t cmd_set_vf_vlan_tag_vf_id = 13041 TOKEN_NUM_INITIALIZER 13042 (struct cmd_set_vf_vlan_tag_result, 13043 vf_id, UINT16); 13044 cmdline_parse_token_string_t cmd_set_vf_vlan_tag_on_off = 13045 TOKEN_STRING_INITIALIZER 13046 (struct cmd_set_vf_vlan_tag_result, 13047 on_off, "on#off"); 13048 13049 static void 13050 cmd_set_vf_vlan_tag_parsed( 13051 void *parsed_result, 13052 __attribute__((unused)) struct cmdline *cl, 13053 __attribute__((unused)) void *data) 13054 { 13055 struct cmd_set_vf_vlan_tag_result *res = parsed_result; 13056 int ret = -ENOTSUP; 13057 13058 __rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 13059 13060 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 13061 return; 13062 13063 #ifdef RTE_LIBRTE_I40E_PMD 13064 ret = rte_pmd_i40e_set_vf_vlan_tag(res->port_id, 13065 res->vf_id, is_on); 13066 #endif 13067 13068 switch (ret) { 13069 case 0: 13070 break; 13071 case -EINVAL: 13072 printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on); 13073 break; 13074 case -ENODEV: 13075 printf("invalid port_id %d\n", res->port_id); 13076 break; 13077 case -ENOTSUP: 13078 printf("function not implemented\n"); 13079 break; 13080 default: 13081 printf("programming error: (%s)\n", strerror(-ret)); 13082 } 13083 } 13084 13085 cmdline_parse_inst_t cmd_set_vf_vlan_tag = { 13086 .f = cmd_set_vf_vlan_tag_parsed, 13087 .data = NULL, 13088 .help_str = "set vf vlan tag <port_id> <vf_id> on|off", 13089 .tokens = { 13090 (void *)&cmd_set_vf_vlan_tag_set, 13091 (void *)&cmd_set_vf_vlan_tag_vf, 13092 (void *)&cmd_set_vf_vlan_tag_vlan, 13093 (void *)&cmd_set_vf_vlan_tag_tag, 13094 (void *)&cmd_set_vf_vlan_tag_port_id, 13095 (void *)&cmd_set_vf_vlan_tag_vf_id, 13096 (void *)&cmd_set_vf_vlan_tag_on_off, 13097 NULL, 13098 }, 13099 }; 13100 13101 /* Common definition of VF and TC TX bandwidth configuration */ 13102 struct cmd_vf_tc_bw_result { 13103 cmdline_fixed_string_t set; 13104 cmdline_fixed_string_t vf; 13105 cmdline_fixed_string_t tc; 13106 cmdline_fixed_string_t tx; 13107 cmdline_fixed_string_t min_bw; 13108 cmdline_fixed_string_t max_bw; 13109 cmdline_fixed_string_t strict_link_prio; 13110 uint8_t port_id; 13111 uint16_t vf_id; 13112 uint8_t tc_no; 13113 uint32_t bw; 13114 cmdline_fixed_string_t bw_list; 13115 uint8_t tc_map; 13116 }; 13117 13118 cmdline_parse_token_string_t cmd_vf_tc_bw_set = 13119 TOKEN_STRING_INITIALIZER 13120 (struct cmd_vf_tc_bw_result, 13121 set, "set"); 13122 cmdline_parse_token_string_t cmd_vf_tc_bw_vf = 13123 TOKEN_STRING_INITIALIZER 13124 (struct cmd_vf_tc_bw_result, 13125 vf, "vf"); 13126 cmdline_parse_token_string_t cmd_vf_tc_bw_tc = 13127 TOKEN_STRING_INITIALIZER 13128 (struct cmd_vf_tc_bw_result, 13129 tc, "tc"); 13130 cmdline_parse_token_string_t cmd_vf_tc_bw_tx = 13131 TOKEN_STRING_INITIALIZER 13132 (struct cmd_vf_tc_bw_result, 13133 tx, "tx"); 13134 cmdline_parse_token_string_t cmd_vf_tc_bw_strict_link_prio = 13135 TOKEN_STRING_INITIALIZER 13136 (struct cmd_vf_tc_bw_result, 13137 strict_link_prio, "strict-link-priority"); 13138 cmdline_parse_token_string_t cmd_vf_tc_bw_min_bw = 13139 TOKEN_STRING_INITIALIZER 13140 (struct cmd_vf_tc_bw_result, 13141 min_bw, "min-bandwidth"); 13142 cmdline_parse_token_string_t cmd_vf_tc_bw_max_bw = 13143 TOKEN_STRING_INITIALIZER 13144 (struct cmd_vf_tc_bw_result, 13145 max_bw, "max-bandwidth"); 13146 cmdline_parse_token_num_t cmd_vf_tc_bw_port_id = 13147 TOKEN_NUM_INITIALIZER 13148 (struct cmd_vf_tc_bw_result, 13149 port_id, UINT8); 13150 cmdline_parse_token_num_t cmd_vf_tc_bw_vf_id = 13151 TOKEN_NUM_INITIALIZER 13152 (struct cmd_vf_tc_bw_result, 13153 vf_id, UINT16); 13154 cmdline_parse_token_num_t cmd_vf_tc_bw_tc_no = 13155 TOKEN_NUM_INITIALIZER 13156 (struct cmd_vf_tc_bw_result, 13157 tc_no, UINT8); 13158 cmdline_parse_token_num_t cmd_vf_tc_bw_bw = 13159 TOKEN_NUM_INITIALIZER 13160 (struct cmd_vf_tc_bw_result, 13161 bw, UINT32); 13162 cmdline_parse_token_string_t cmd_vf_tc_bw_bw_list = 13163 TOKEN_STRING_INITIALIZER 13164 (struct cmd_vf_tc_bw_result, 13165 bw_list, NULL); 13166 cmdline_parse_token_num_t cmd_vf_tc_bw_tc_map = 13167 TOKEN_NUM_INITIALIZER 13168 (struct cmd_vf_tc_bw_result, 13169 tc_map, UINT8); 13170 13171 /* VF max bandwidth setting */ 13172 static void 13173 cmd_vf_max_bw_parsed( 13174 void *parsed_result, 13175 __attribute__((unused)) struct cmdline *cl, 13176 __attribute__((unused)) void *data) 13177 { 13178 struct cmd_vf_tc_bw_result *res = parsed_result; 13179 int ret = -ENOTSUP; 13180 13181 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 13182 return; 13183 13184 #ifdef RTE_LIBRTE_I40E_PMD 13185 ret = rte_pmd_i40e_set_vf_max_bw(res->port_id, 13186 res->vf_id, res->bw); 13187 #endif 13188 13189 switch (ret) { 13190 case 0: 13191 break; 13192 case -EINVAL: 13193 printf("invalid vf_id %d or bandwidth %d\n", 13194 res->vf_id, res->bw); 13195 break; 13196 case -ENODEV: 13197 printf("invalid port_id %d\n", res->port_id); 13198 break; 13199 case -ENOTSUP: 13200 printf("function not implemented\n"); 13201 break; 13202 default: 13203 printf("programming error: (%s)\n", strerror(-ret)); 13204 } 13205 } 13206 13207 cmdline_parse_inst_t cmd_vf_max_bw = { 13208 .f = cmd_vf_max_bw_parsed, 13209 .data = NULL, 13210 .help_str = "set vf tx max-bandwidth <port_id> <vf_id> <bandwidth>", 13211 .tokens = { 13212 (void *)&cmd_vf_tc_bw_set, 13213 (void *)&cmd_vf_tc_bw_vf, 13214 (void *)&cmd_vf_tc_bw_tx, 13215 (void *)&cmd_vf_tc_bw_max_bw, 13216 (void *)&cmd_vf_tc_bw_port_id, 13217 (void *)&cmd_vf_tc_bw_vf_id, 13218 (void *)&cmd_vf_tc_bw_bw, 13219 NULL, 13220 }, 13221 }; 13222 13223 static int 13224 vf_tc_min_bw_parse_bw_list(uint8_t *bw_list, 13225 uint8_t *tc_num, 13226 char *str) 13227 { 13228 uint32_t size; 13229 const char *p, *p0 = str; 13230 char s[256]; 13231 char *end; 13232 char *str_fld[16]; 13233 uint16_t i; 13234 int ret; 13235 13236 p = strchr(p0, '('); 13237 if (p == NULL) { 13238 printf("The bandwidth-list should be '(bw1, bw2, ...)'\n"); 13239 return -1; 13240 } 13241 p++; 13242 p0 = strchr(p, ')'); 13243 if (p0 == NULL) { 13244 printf("The bandwidth-list should be '(bw1, bw2, ...)'\n"); 13245 return -1; 13246 } 13247 size = p0 - p; 13248 if (size >= sizeof(s)) { 13249 printf("The string size exceeds the internal buffer size\n"); 13250 return -1; 13251 } 13252 snprintf(s, sizeof(s), "%.*s", size, p); 13253 ret = rte_strsplit(s, sizeof(s), str_fld, 16, ','); 13254 if (ret <= 0) { 13255 printf("Failed to get the bandwidth list. "); 13256 return -1; 13257 } 13258 *tc_num = ret; 13259 for (i = 0; i < ret; i++) 13260 bw_list[i] = (uint8_t)strtoul(str_fld[i], &end, 0); 13261 13262 return 0; 13263 } 13264 13265 /* TC min bandwidth setting */ 13266 static void 13267 cmd_vf_tc_min_bw_parsed( 13268 void *parsed_result, 13269 __attribute__((unused)) struct cmdline *cl, 13270 __attribute__((unused)) void *data) 13271 { 13272 struct cmd_vf_tc_bw_result *res = parsed_result; 13273 uint8_t tc_num; 13274 uint8_t bw[16]; 13275 int ret = -ENOTSUP; 13276 13277 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 13278 return; 13279 13280 ret = vf_tc_min_bw_parse_bw_list(bw, &tc_num, res->bw_list); 13281 if (ret) 13282 return; 13283 13284 #ifdef RTE_LIBRTE_I40E_PMD 13285 ret = rte_pmd_i40e_set_vf_tc_bw_alloc(res->port_id, res->vf_id, 13286 tc_num, bw); 13287 #endif 13288 13289 switch (ret) { 13290 case 0: 13291 break; 13292 case -EINVAL: 13293 printf("invalid vf_id %d or bandwidth\n", res->vf_id); 13294 break; 13295 case -ENODEV: 13296 printf("invalid port_id %d\n", res->port_id); 13297 break; 13298 case -ENOTSUP: 13299 printf("function not implemented\n"); 13300 break; 13301 default: 13302 printf("programming error: (%s)\n", strerror(-ret)); 13303 } 13304 } 13305 13306 cmdline_parse_inst_t cmd_vf_tc_min_bw = { 13307 .f = cmd_vf_tc_min_bw_parsed, 13308 .data = NULL, 13309 .help_str = "set vf tc tx min-bandwidth <port_id> <vf_id>" 13310 " <bw1, bw2, ...>", 13311 .tokens = { 13312 (void *)&cmd_vf_tc_bw_set, 13313 (void *)&cmd_vf_tc_bw_vf, 13314 (void *)&cmd_vf_tc_bw_tc, 13315 (void *)&cmd_vf_tc_bw_tx, 13316 (void *)&cmd_vf_tc_bw_min_bw, 13317 (void *)&cmd_vf_tc_bw_port_id, 13318 (void *)&cmd_vf_tc_bw_vf_id, 13319 (void *)&cmd_vf_tc_bw_bw_list, 13320 NULL, 13321 }, 13322 }; 13323 13324 static void 13325 cmd_tc_min_bw_parsed( 13326 void *parsed_result, 13327 __attribute__((unused)) struct cmdline *cl, 13328 __attribute__((unused)) void *data) 13329 { 13330 struct cmd_vf_tc_bw_result *res = parsed_result; 13331 struct rte_port *port; 13332 uint8_t tc_num; 13333 uint8_t bw[16]; 13334 int ret = -ENOTSUP; 13335 13336 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 13337 return; 13338 13339 port = &ports[res->port_id]; 13340 /** Check if the port is not started **/ 13341 if (port->port_status != RTE_PORT_STOPPED) { 13342 printf("Please stop port %d first\n", res->port_id); 13343 return; 13344 } 13345 13346 ret = vf_tc_min_bw_parse_bw_list(bw, &tc_num, res->bw_list); 13347 if (ret) 13348 return; 13349 13350 #ifdef RTE_LIBRTE_IXGBE_PMD 13351 ret = rte_pmd_ixgbe_set_tc_bw_alloc(res->port_id, tc_num, bw); 13352 #endif 13353 13354 switch (ret) { 13355 case 0: 13356 break; 13357 case -EINVAL: 13358 printf("invalid bandwidth\n"); 13359 break; 13360 case -ENODEV: 13361 printf("invalid port_id %d\n", res->port_id); 13362 break; 13363 case -ENOTSUP: 13364 printf("function not implemented\n"); 13365 break; 13366 default: 13367 printf("programming error: (%s)\n", strerror(-ret)); 13368 } 13369 } 13370 13371 cmdline_parse_inst_t cmd_tc_min_bw = { 13372 .f = cmd_tc_min_bw_parsed, 13373 .data = NULL, 13374 .help_str = "set tc tx min-bandwidth <port_id> <bw1, bw2, ...>", 13375 .tokens = { 13376 (void *)&cmd_vf_tc_bw_set, 13377 (void *)&cmd_vf_tc_bw_tc, 13378 (void *)&cmd_vf_tc_bw_tx, 13379 (void *)&cmd_vf_tc_bw_min_bw, 13380 (void *)&cmd_vf_tc_bw_port_id, 13381 (void *)&cmd_vf_tc_bw_bw_list, 13382 NULL, 13383 }, 13384 }; 13385 13386 /* TC max bandwidth setting */ 13387 static void 13388 cmd_vf_tc_max_bw_parsed( 13389 void *parsed_result, 13390 __attribute__((unused)) struct cmdline *cl, 13391 __attribute__((unused)) void *data) 13392 { 13393 struct cmd_vf_tc_bw_result *res = parsed_result; 13394 int ret = -ENOTSUP; 13395 13396 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 13397 return; 13398 13399 #ifdef RTE_LIBRTE_I40E_PMD 13400 ret = rte_pmd_i40e_set_vf_tc_max_bw(res->port_id, res->vf_id, 13401 res->tc_no, res->bw); 13402 #endif 13403 13404 switch (ret) { 13405 case 0: 13406 break; 13407 case -EINVAL: 13408 printf("invalid vf_id %d, tc_no %d or bandwidth %d\n", 13409 res->vf_id, res->tc_no, res->bw); 13410 break; 13411 case -ENODEV: 13412 printf("invalid port_id %d\n", res->port_id); 13413 break; 13414 case -ENOTSUP: 13415 printf("function not implemented\n"); 13416 break; 13417 default: 13418 printf("programming error: (%s)\n", strerror(-ret)); 13419 } 13420 } 13421 13422 cmdline_parse_inst_t cmd_vf_tc_max_bw = { 13423 .f = cmd_vf_tc_max_bw_parsed, 13424 .data = NULL, 13425 .help_str = "set vf tc tx max-bandwidth <port_id> <vf_id> <tc_no>" 13426 " <bandwidth>", 13427 .tokens = { 13428 (void *)&cmd_vf_tc_bw_set, 13429 (void *)&cmd_vf_tc_bw_vf, 13430 (void *)&cmd_vf_tc_bw_tc, 13431 (void *)&cmd_vf_tc_bw_tx, 13432 (void *)&cmd_vf_tc_bw_max_bw, 13433 (void *)&cmd_vf_tc_bw_port_id, 13434 (void *)&cmd_vf_tc_bw_vf_id, 13435 (void *)&cmd_vf_tc_bw_tc_no, 13436 (void *)&cmd_vf_tc_bw_bw, 13437 NULL, 13438 }, 13439 }; 13440 13441 13442 #if defined RTE_LIBRTE_PMD_SOFTNIC && defined RTE_LIBRTE_SCHED 13443 13444 /* *** Set Port default Traffic Management Hierarchy *** */ 13445 struct cmd_set_port_tm_hierarchy_default_result { 13446 cmdline_fixed_string_t set; 13447 cmdline_fixed_string_t port; 13448 cmdline_fixed_string_t tm; 13449 cmdline_fixed_string_t hierarchy; 13450 cmdline_fixed_string_t def; 13451 uint16_t port_id; 13452 }; 13453 13454 cmdline_parse_token_string_t cmd_set_port_tm_hierarchy_default_set = 13455 TOKEN_STRING_INITIALIZER( 13456 struct cmd_set_port_tm_hierarchy_default_result, set, "set"); 13457 cmdline_parse_token_string_t cmd_set_port_tm_hierarchy_default_port = 13458 TOKEN_STRING_INITIALIZER( 13459 struct cmd_set_port_tm_hierarchy_default_result, port, "port"); 13460 cmdline_parse_token_string_t cmd_set_port_tm_hierarchy_default_tm = 13461 TOKEN_STRING_INITIALIZER( 13462 struct cmd_set_port_tm_hierarchy_default_result, tm, "tm"); 13463 cmdline_parse_token_string_t cmd_set_port_tm_hierarchy_default_hierarchy = 13464 TOKEN_STRING_INITIALIZER( 13465 struct cmd_set_port_tm_hierarchy_default_result, 13466 hierarchy, "hierarchy"); 13467 cmdline_parse_token_string_t cmd_set_port_tm_hierarchy_default_default = 13468 TOKEN_STRING_INITIALIZER( 13469 struct cmd_set_port_tm_hierarchy_default_result, 13470 def, "default"); 13471 cmdline_parse_token_num_t cmd_set_port_tm_hierarchy_default_port_id = 13472 TOKEN_NUM_INITIALIZER( 13473 struct cmd_set_port_tm_hierarchy_default_result, 13474 port_id, UINT8); 13475 13476 static void cmd_set_port_tm_hierarchy_default_parsed(void *parsed_result, 13477 __attribute__((unused)) struct cmdline *cl, 13478 __attribute__((unused)) void *data) 13479 { 13480 struct cmd_set_port_tm_hierarchy_default_result *res = parsed_result; 13481 struct rte_port *p; 13482 uint16_t port_id = res->port_id; 13483 13484 if (port_id_is_invalid(port_id, ENABLED_WARN)) 13485 return; 13486 13487 p = &ports[port_id]; 13488 13489 /* Port tm flag */ 13490 if (p->softport.tm_flag == 0) { 13491 printf(" tm not enabled on port %u (error)\n", port_id); 13492 return; 13493 } 13494 13495 /* Forward mode: tm */ 13496 if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) { 13497 printf(" tm mode not enabled(error)\n"); 13498 return; 13499 } 13500 13501 /* Set the default tm hierarchy */ 13502 p->softport.tm.default_hierarchy_enable = 1; 13503 } 13504 13505 cmdline_parse_inst_t cmd_set_port_tm_hierarchy_default = { 13506 .f = cmd_set_port_tm_hierarchy_default_parsed, 13507 .data = NULL, 13508 .help_str = "set port tm hierarchy default <port_id>", 13509 .tokens = { 13510 (void *)&cmd_set_port_tm_hierarchy_default_set, 13511 (void *)&cmd_set_port_tm_hierarchy_default_port, 13512 (void *)&cmd_set_port_tm_hierarchy_default_tm, 13513 (void *)&cmd_set_port_tm_hierarchy_default_hierarchy, 13514 (void *)&cmd_set_port_tm_hierarchy_default_default, 13515 (void *)&cmd_set_port_tm_hierarchy_default_port_id, 13516 NULL, 13517 }, 13518 }; 13519 #endif 13520 13521 /* Strict link priority scheduling mode setting */ 13522 static void 13523 cmd_strict_link_prio_parsed( 13524 void *parsed_result, 13525 __attribute__((unused)) struct cmdline *cl, 13526 __attribute__((unused)) void *data) 13527 { 13528 struct cmd_vf_tc_bw_result *res = parsed_result; 13529 int ret = -ENOTSUP; 13530 13531 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 13532 return; 13533 13534 #ifdef RTE_LIBRTE_I40E_PMD 13535 ret = rte_pmd_i40e_set_tc_strict_prio(res->port_id, res->tc_map); 13536 #endif 13537 13538 switch (ret) { 13539 case 0: 13540 break; 13541 case -EINVAL: 13542 printf("invalid tc_bitmap 0x%x\n", res->tc_map); 13543 break; 13544 case -ENODEV: 13545 printf("invalid port_id %d\n", res->port_id); 13546 break; 13547 case -ENOTSUP: 13548 printf("function not implemented\n"); 13549 break; 13550 default: 13551 printf("programming error: (%s)\n", strerror(-ret)); 13552 } 13553 } 13554 13555 cmdline_parse_inst_t cmd_strict_link_prio = { 13556 .f = cmd_strict_link_prio_parsed, 13557 .data = NULL, 13558 .help_str = "set tx strict-link-priority <port_id> <tc_bitmap>", 13559 .tokens = { 13560 (void *)&cmd_vf_tc_bw_set, 13561 (void *)&cmd_vf_tc_bw_tx, 13562 (void *)&cmd_vf_tc_bw_strict_link_prio, 13563 (void *)&cmd_vf_tc_bw_port_id, 13564 (void *)&cmd_vf_tc_bw_tc_map, 13565 NULL, 13566 }, 13567 }; 13568 13569 /* Load dynamic device personalization*/ 13570 struct cmd_ddp_add_result { 13571 cmdline_fixed_string_t ddp; 13572 cmdline_fixed_string_t add; 13573 uint8_t port_id; 13574 char filepath[]; 13575 }; 13576 13577 cmdline_parse_token_string_t cmd_ddp_add_ddp = 13578 TOKEN_STRING_INITIALIZER(struct cmd_ddp_add_result, ddp, "ddp"); 13579 cmdline_parse_token_string_t cmd_ddp_add_add = 13580 TOKEN_STRING_INITIALIZER(struct cmd_ddp_add_result, add, "add"); 13581 cmdline_parse_token_num_t cmd_ddp_add_port_id = 13582 TOKEN_NUM_INITIALIZER(struct cmd_ddp_add_result, port_id, UINT8); 13583 cmdline_parse_token_string_t cmd_ddp_add_filepath = 13584 TOKEN_STRING_INITIALIZER(struct cmd_ddp_add_result, filepath, NULL); 13585 13586 static void 13587 cmd_ddp_add_parsed( 13588 void *parsed_result, 13589 __attribute__((unused)) struct cmdline *cl, 13590 __attribute__((unused)) void *data) 13591 { 13592 struct cmd_ddp_add_result *res = parsed_result; 13593 uint8_t *buff; 13594 uint32_t size; 13595 char *filepath; 13596 char *file_fld[2]; 13597 int file_num; 13598 int ret = -ENOTSUP; 13599 13600 if (res->port_id > nb_ports) { 13601 printf("Invalid port, range is [0, %d]\n", nb_ports - 1); 13602 return; 13603 } 13604 13605 if (!all_ports_stopped()) { 13606 printf("Please stop all ports first\n"); 13607 return; 13608 } 13609 13610 filepath = strdup(res->filepath); 13611 if (filepath == NULL) { 13612 printf("Failed to allocate memory\n"); 13613 return; 13614 } 13615 file_num = rte_strsplit(filepath, strlen(filepath), file_fld, 2, ','); 13616 13617 buff = open_ddp_package_file(file_fld[0], &size); 13618 if (!buff) { 13619 free((void *)filepath); 13620 return; 13621 } 13622 13623 #ifdef RTE_LIBRTE_I40E_PMD 13624 if (ret == -ENOTSUP) 13625 ret = rte_pmd_i40e_process_ddp_package(res->port_id, 13626 buff, size, 13627 RTE_PMD_I40E_PKG_OP_WR_ADD); 13628 #endif 13629 13630 if (ret == -EEXIST) 13631 printf("Profile has already existed.\n"); 13632 else if (ret < 0) 13633 printf("Failed to load profile.\n"); 13634 else if (file_num == 2) 13635 save_ddp_package_file(file_fld[1], buff, size); 13636 13637 close_ddp_package_file(buff); 13638 free((void *)filepath); 13639 } 13640 13641 cmdline_parse_inst_t cmd_ddp_add = { 13642 .f = cmd_ddp_add_parsed, 13643 .data = NULL, 13644 .help_str = "ddp add <port_id> <profile_path[,output_path]>", 13645 .tokens = { 13646 (void *)&cmd_ddp_add_ddp, 13647 (void *)&cmd_ddp_add_add, 13648 (void *)&cmd_ddp_add_port_id, 13649 (void *)&cmd_ddp_add_filepath, 13650 NULL, 13651 }, 13652 }; 13653 13654 /* Delete dynamic device personalization*/ 13655 struct cmd_ddp_del_result { 13656 cmdline_fixed_string_t ddp; 13657 cmdline_fixed_string_t del; 13658 uint8_t port_id; 13659 char filepath[]; 13660 }; 13661 13662 cmdline_parse_token_string_t cmd_ddp_del_ddp = 13663 TOKEN_STRING_INITIALIZER(struct cmd_ddp_del_result, ddp, "ddp"); 13664 cmdline_parse_token_string_t cmd_ddp_del_del = 13665 TOKEN_STRING_INITIALIZER(struct cmd_ddp_del_result, del, "del"); 13666 cmdline_parse_token_num_t cmd_ddp_del_port_id = 13667 TOKEN_NUM_INITIALIZER(struct cmd_ddp_del_result, port_id, UINT8); 13668 cmdline_parse_token_string_t cmd_ddp_del_filepath = 13669 TOKEN_STRING_INITIALIZER(struct cmd_ddp_del_result, filepath, NULL); 13670 13671 static void 13672 cmd_ddp_del_parsed( 13673 void *parsed_result, 13674 __attribute__((unused)) struct cmdline *cl, 13675 __attribute__((unused)) void *data) 13676 { 13677 struct cmd_ddp_del_result *res = parsed_result; 13678 uint8_t *buff; 13679 uint32_t size; 13680 int ret = -ENOTSUP; 13681 13682 if (res->port_id > nb_ports) { 13683 printf("Invalid port, range is [0, %d]\n", nb_ports - 1); 13684 return; 13685 } 13686 13687 if (!all_ports_stopped()) { 13688 printf("Please stop all ports first\n"); 13689 return; 13690 } 13691 13692 buff = open_ddp_package_file(res->filepath, &size); 13693 if (!buff) 13694 return; 13695 13696 #ifdef RTE_LIBRTE_I40E_PMD 13697 if (ret == -ENOTSUP) 13698 ret = rte_pmd_i40e_process_ddp_package(res->port_id, 13699 buff, size, 13700 RTE_PMD_I40E_PKG_OP_WR_DEL); 13701 #endif 13702 13703 if (ret == -EACCES) 13704 printf("Profile does not exist.\n"); 13705 else if (ret < 0) 13706 printf("Failed to delete profile.\n"); 13707 13708 close_ddp_package_file(buff); 13709 } 13710 13711 cmdline_parse_inst_t cmd_ddp_del = { 13712 .f = cmd_ddp_del_parsed, 13713 .data = NULL, 13714 .help_str = "ddp del <port_id> <profile_path>", 13715 .tokens = { 13716 (void *)&cmd_ddp_del_ddp, 13717 (void *)&cmd_ddp_del_del, 13718 (void *)&cmd_ddp_del_port_id, 13719 (void *)&cmd_ddp_del_filepath, 13720 NULL, 13721 }, 13722 }; 13723 13724 /* Get dynamic device personalization profile info */ 13725 struct cmd_ddp_info_result { 13726 cmdline_fixed_string_t ddp; 13727 cmdline_fixed_string_t get; 13728 cmdline_fixed_string_t info; 13729 char filepath[]; 13730 }; 13731 13732 cmdline_parse_token_string_t cmd_ddp_info_ddp = 13733 TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, ddp, "ddp"); 13734 cmdline_parse_token_string_t cmd_ddp_info_get = 13735 TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, get, "get"); 13736 cmdline_parse_token_string_t cmd_ddp_info_info = 13737 TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, info, "info"); 13738 cmdline_parse_token_string_t cmd_ddp_info_filepath = 13739 TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, filepath, NULL); 13740 13741 static void 13742 cmd_ddp_info_parsed( 13743 void *parsed_result, 13744 __attribute__((unused)) struct cmdline *cl, 13745 __attribute__((unused)) void *data) 13746 { 13747 struct cmd_ddp_info_result *res = parsed_result; 13748 uint8_t *pkg; 13749 uint32_t pkg_size; 13750 int ret = -ENOTSUP; 13751 #ifdef RTE_LIBRTE_I40E_PMD 13752 uint32_t i, j, n; 13753 uint8_t *buff; 13754 uint32_t buff_size = 0; 13755 struct rte_pmd_i40e_profile_info info; 13756 uint32_t dev_num = 0; 13757 struct rte_pmd_i40e_ddp_device_id *devs; 13758 uint32_t proto_num = 0; 13759 struct rte_pmd_i40e_proto_info *proto; 13760 uint32_t pctype_num = 0; 13761 struct rte_pmd_i40e_ptype_info *pctype; 13762 uint32_t ptype_num = 0; 13763 struct rte_pmd_i40e_ptype_info *ptype; 13764 uint8_t proto_id; 13765 13766 #endif 13767 13768 pkg = open_ddp_package_file(res->filepath, &pkg_size); 13769 if (!pkg) 13770 return; 13771 13772 #ifdef RTE_LIBRTE_I40E_PMD 13773 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, 13774 (uint8_t *)&info, sizeof(info), 13775 RTE_PMD_I40E_PKG_INFO_GLOBAL_HEADER); 13776 if (!ret) { 13777 printf("Global Track id: 0x%x\n", info.track_id); 13778 printf("Global Version: %d.%d.%d.%d\n", 13779 info.version.major, 13780 info.version.minor, 13781 info.version.update, 13782 info.version.draft); 13783 printf("Global Package name: %s\n\n", info.name); 13784 } 13785 13786 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, 13787 (uint8_t *)&info, sizeof(info), 13788 RTE_PMD_I40E_PKG_INFO_HEADER); 13789 if (!ret) { 13790 printf("i40e Profile Track id: 0x%x\n", info.track_id); 13791 printf("i40e Profile Version: %d.%d.%d.%d\n", 13792 info.version.major, 13793 info.version.minor, 13794 info.version.update, 13795 info.version.draft); 13796 printf("i40e Profile name: %s\n\n", info.name); 13797 } 13798 13799 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, 13800 (uint8_t *)&buff_size, sizeof(buff_size), 13801 RTE_PMD_I40E_PKG_INFO_GLOBAL_NOTES_SIZE); 13802 if (!ret && buff_size) { 13803 buff = (uint8_t *)malloc(buff_size); 13804 if (buff) { 13805 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, 13806 buff, buff_size, 13807 RTE_PMD_I40E_PKG_INFO_GLOBAL_NOTES); 13808 if (!ret) 13809 printf("Package Notes:\n%s\n\n", buff); 13810 free(buff); 13811 } 13812 } 13813 13814 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, 13815 (uint8_t *)&dev_num, sizeof(dev_num), 13816 RTE_PMD_I40E_PKG_INFO_DEVID_NUM); 13817 if (!ret && dev_num) { 13818 buff_size = dev_num * sizeof(struct rte_pmd_i40e_ddp_device_id); 13819 devs = (struct rte_pmd_i40e_ddp_device_id *)malloc(buff_size); 13820 if (devs) { 13821 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, 13822 (uint8_t *)devs, buff_size, 13823 RTE_PMD_I40E_PKG_INFO_DEVID_LIST); 13824 if (!ret) { 13825 printf("List of supported devices:\n"); 13826 for (i = 0; i < dev_num; i++) { 13827 printf(" %04X:%04X %04X:%04X\n", 13828 devs[i].vendor_dev_id >> 16, 13829 devs[i].vendor_dev_id & 0xFFFF, 13830 devs[i].sub_vendor_dev_id >> 16, 13831 devs[i].sub_vendor_dev_id & 0xFFFF); 13832 } 13833 printf("\n"); 13834 } 13835 free(devs); 13836 } 13837 } 13838 13839 /* get information about protocols and packet types */ 13840 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, 13841 (uint8_t *)&proto_num, sizeof(proto_num), 13842 RTE_PMD_I40E_PKG_INFO_PROTOCOL_NUM); 13843 if (ret || !proto_num) 13844 goto no_print_return; 13845 13846 buff_size = proto_num * sizeof(struct rte_pmd_i40e_proto_info); 13847 proto = (struct rte_pmd_i40e_proto_info *)malloc(buff_size); 13848 if (!proto) 13849 goto no_print_return; 13850 13851 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, (uint8_t *)proto, 13852 buff_size, 13853 RTE_PMD_I40E_PKG_INFO_PROTOCOL_LIST); 13854 if (!ret) { 13855 printf("List of used protocols:\n"); 13856 for (i = 0; i < proto_num; i++) 13857 printf(" %2u: %s\n", proto[i].proto_id, 13858 proto[i].name); 13859 printf("\n"); 13860 } 13861 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, 13862 (uint8_t *)&pctype_num, sizeof(pctype_num), 13863 RTE_PMD_I40E_PKG_INFO_PCTYPE_NUM); 13864 if (ret || !pctype_num) 13865 goto no_print_pctypes; 13866 13867 buff_size = pctype_num * sizeof(struct rte_pmd_i40e_ptype_info); 13868 pctype = (struct rte_pmd_i40e_ptype_info *)malloc(buff_size); 13869 if (!pctype) 13870 goto no_print_pctypes; 13871 13872 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, (uint8_t *)pctype, 13873 buff_size, 13874 RTE_PMD_I40E_PKG_INFO_PCTYPE_LIST); 13875 if (ret) { 13876 free(pctype); 13877 goto no_print_pctypes; 13878 } 13879 13880 printf("List of defined packet classification types:\n"); 13881 for (i = 0; i < pctype_num; i++) { 13882 printf(" %2u:", pctype[i].ptype_id); 13883 for (j = 0; j < RTE_PMD_I40E_PROTO_NUM; j++) { 13884 proto_id = pctype[i].protocols[j]; 13885 if (proto_id != RTE_PMD_I40E_PROTO_UNUSED) { 13886 for (n = 0; n < proto_num; n++) { 13887 if (proto[n].proto_id == proto_id) { 13888 printf(" %s", proto[n].name); 13889 break; 13890 } 13891 } 13892 } 13893 } 13894 printf("\n"); 13895 } 13896 printf("\n"); 13897 free(pctype); 13898 13899 no_print_pctypes: 13900 13901 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, (uint8_t *)&ptype_num, 13902 sizeof(ptype_num), 13903 RTE_PMD_I40E_PKG_INFO_PTYPE_NUM); 13904 if (ret || !ptype_num) 13905 goto no_print_return; 13906 13907 buff_size = ptype_num * sizeof(struct rte_pmd_i40e_ptype_info); 13908 ptype = (struct rte_pmd_i40e_ptype_info *)malloc(buff_size); 13909 if (!ptype) 13910 goto no_print_return; 13911 13912 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, (uint8_t *)ptype, 13913 buff_size, 13914 RTE_PMD_I40E_PKG_INFO_PTYPE_LIST); 13915 if (ret) { 13916 free(ptype); 13917 goto no_print_return; 13918 } 13919 printf("List of defined packet types:\n"); 13920 for (i = 0; i < ptype_num; i++) { 13921 printf(" %2u:", ptype[i].ptype_id); 13922 for (j = 0; j < RTE_PMD_I40E_PROTO_NUM; j++) { 13923 proto_id = ptype[i].protocols[j]; 13924 if (proto_id != RTE_PMD_I40E_PROTO_UNUSED) { 13925 for (n = 0; n < proto_num; n++) { 13926 if (proto[n].proto_id == proto_id) { 13927 printf(" %s", proto[n].name); 13928 break; 13929 } 13930 } 13931 } 13932 } 13933 printf("\n"); 13934 } 13935 free(ptype); 13936 printf("\n"); 13937 13938 free(proto); 13939 ret = 0; 13940 no_print_return: 13941 #endif 13942 if (ret == -ENOTSUP) 13943 printf("Function not supported in PMD driver\n"); 13944 close_ddp_package_file(pkg); 13945 } 13946 13947 cmdline_parse_inst_t cmd_ddp_get_info = { 13948 .f = cmd_ddp_info_parsed, 13949 .data = NULL, 13950 .help_str = "ddp get info <profile_path>", 13951 .tokens = { 13952 (void *)&cmd_ddp_info_ddp, 13953 (void *)&cmd_ddp_info_get, 13954 (void *)&cmd_ddp_info_info, 13955 (void *)&cmd_ddp_info_filepath, 13956 NULL, 13957 }, 13958 }; 13959 13960 /* Get dynamic device personalization profile info list*/ 13961 #define PROFILE_INFO_SIZE 48 13962 #define MAX_PROFILE_NUM 16 13963 13964 struct cmd_ddp_get_list_result { 13965 cmdline_fixed_string_t ddp; 13966 cmdline_fixed_string_t get; 13967 cmdline_fixed_string_t list; 13968 uint8_t port_id; 13969 }; 13970 13971 cmdline_parse_token_string_t cmd_ddp_get_list_ddp = 13972 TOKEN_STRING_INITIALIZER(struct cmd_ddp_get_list_result, ddp, "ddp"); 13973 cmdline_parse_token_string_t cmd_ddp_get_list_get = 13974 TOKEN_STRING_INITIALIZER(struct cmd_ddp_get_list_result, get, "get"); 13975 cmdline_parse_token_string_t cmd_ddp_get_list_list = 13976 TOKEN_STRING_INITIALIZER(struct cmd_ddp_get_list_result, list, "list"); 13977 cmdline_parse_token_num_t cmd_ddp_get_list_port_id = 13978 TOKEN_NUM_INITIALIZER(struct cmd_ddp_get_list_result, port_id, UINT8); 13979 13980 static void 13981 cmd_ddp_get_list_parsed( 13982 void *parsed_result, 13983 __attribute__((unused)) struct cmdline *cl, 13984 __attribute__((unused)) void *data) 13985 { 13986 struct cmd_ddp_get_list_result *res = parsed_result; 13987 #ifdef RTE_LIBRTE_I40E_PMD 13988 struct rte_pmd_i40e_profile_list *p_list; 13989 struct rte_pmd_i40e_profile_info *p_info; 13990 uint32_t p_num; 13991 uint32_t size; 13992 uint32_t i; 13993 #endif 13994 int ret = -ENOTSUP; 13995 13996 if (res->port_id > nb_ports) { 13997 printf("Invalid port, range is [0, %d]\n", nb_ports - 1); 13998 return; 13999 } 14000 14001 #ifdef RTE_LIBRTE_I40E_PMD 14002 size = PROFILE_INFO_SIZE * MAX_PROFILE_NUM + 4; 14003 p_list = (struct rte_pmd_i40e_profile_list *)malloc(size); 14004 if (!p_list) 14005 printf("%s: Failed to malloc buffer\n", __func__); 14006 14007 if (ret == -ENOTSUP) 14008 ret = rte_pmd_i40e_get_ddp_list(res->port_id, 14009 (uint8_t *)p_list, size); 14010 14011 if (!ret) { 14012 p_num = p_list->p_count; 14013 printf("Profile number is: %d\n\n", p_num); 14014 14015 for (i = 0; i < p_num; i++) { 14016 p_info = &p_list->p_info[i]; 14017 printf("Profile %d:\n", i); 14018 printf("Track id: 0x%x\n", p_info->track_id); 14019 printf("Version: %d.%d.%d.%d\n", 14020 p_info->version.major, 14021 p_info->version.minor, 14022 p_info->version.update, 14023 p_info->version.draft); 14024 printf("Profile name: %s\n\n", p_info->name); 14025 } 14026 } 14027 14028 free(p_list); 14029 #endif 14030 14031 if (ret < 0) 14032 printf("Failed to get ddp list\n"); 14033 } 14034 14035 cmdline_parse_inst_t cmd_ddp_get_list = { 14036 .f = cmd_ddp_get_list_parsed, 14037 .data = NULL, 14038 .help_str = "ddp get list <port_id>", 14039 .tokens = { 14040 (void *)&cmd_ddp_get_list_ddp, 14041 (void *)&cmd_ddp_get_list_get, 14042 (void *)&cmd_ddp_get_list_list, 14043 (void *)&cmd_ddp_get_list_port_id, 14044 NULL, 14045 }, 14046 }; 14047 14048 /* show vf stats */ 14049 14050 /* Common result structure for show vf stats */ 14051 struct cmd_show_vf_stats_result { 14052 cmdline_fixed_string_t show; 14053 cmdline_fixed_string_t vf; 14054 cmdline_fixed_string_t stats; 14055 uint8_t port_id; 14056 uint16_t vf_id; 14057 }; 14058 14059 /* Common CLI fields show vf stats*/ 14060 cmdline_parse_token_string_t cmd_show_vf_stats_show = 14061 TOKEN_STRING_INITIALIZER 14062 (struct cmd_show_vf_stats_result, 14063 show, "show"); 14064 cmdline_parse_token_string_t cmd_show_vf_stats_vf = 14065 TOKEN_STRING_INITIALIZER 14066 (struct cmd_show_vf_stats_result, 14067 vf, "vf"); 14068 cmdline_parse_token_string_t cmd_show_vf_stats_stats = 14069 TOKEN_STRING_INITIALIZER 14070 (struct cmd_show_vf_stats_result, 14071 stats, "stats"); 14072 cmdline_parse_token_num_t cmd_show_vf_stats_port_id = 14073 TOKEN_NUM_INITIALIZER 14074 (struct cmd_show_vf_stats_result, 14075 port_id, UINT8); 14076 cmdline_parse_token_num_t cmd_show_vf_stats_vf_id = 14077 TOKEN_NUM_INITIALIZER 14078 (struct cmd_show_vf_stats_result, 14079 vf_id, UINT16); 14080 14081 static void 14082 cmd_show_vf_stats_parsed( 14083 void *parsed_result, 14084 __attribute__((unused)) struct cmdline *cl, 14085 __attribute__((unused)) void *data) 14086 { 14087 struct cmd_show_vf_stats_result *res = parsed_result; 14088 struct rte_eth_stats stats; 14089 int ret = -ENOTSUP; 14090 static const char *nic_stats_border = "########################"; 14091 14092 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 14093 return; 14094 14095 memset(&stats, 0, sizeof(stats)); 14096 14097 #ifdef RTE_LIBRTE_I40E_PMD 14098 if (ret == -ENOTSUP) 14099 ret = rte_pmd_i40e_get_vf_stats(res->port_id, 14100 res->vf_id, 14101 &stats); 14102 #endif 14103 #ifdef RTE_LIBRTE_BNXT_PMD 14104 if (ret == -ENOTSUP) 14105 ret = rte_pmd_bnxt_get_vf_stats(res->port_id, 14106 res->vf_id, 14107 &stats); 14108 #endif 14109 14110 switch (ret) { 14111 case 0: 14112 break; 14113 case -EINVAL: 14114 printf("invalid vf_id %d\n", res->vf_id); 14115 break; 14116 case -ENODEV: 14117 printf("invalid port_id %d\n", res->port_id); 14118 break; 14119 case -ENOTSUP: 14120 printf("function not implemented\n"); 14121 break; 14122 default: 14123 printf("programming error: (%s)\n", strerror(-ret)); 14124 } 14125 14126 printf("\n %s NIC statistics for port %-2d vf %-2d %s\n", 14127 nic_stats_border, res->port_id, res->vf_id, nic_stats_border); 14128 14129 printf(" RX-packets: %-10"PRIu64" RX-missed: %-10"PRIu64" RX-bytes: " 14130 "%-"PRIu64"\n", 14131 stats.ipackets, stats.imissed, stats.ibytes); 14132 printf(" RX-errors: %-"PRIu64"\n", stats.ierrors); 14133 printf(" RX-nombuf: %-10"PRIu64"\n", 14134 stats.rx_nombuf); 14135 printf(" TX-packets: %-10"PRIu64" TX-errors: %-10"PRIu64" TX-bytes: " 14136 "%-"PRIu64"\n", 14137 stats.opackets, stats.oerrors, stats.obytes); 14138 14139 printf(" %s############################%s\n", 14140 nic_stats_border, nic_stats_border); 14141 } 14142 14143 cmdline_parse_inst_t cmd_show_vf_stats = { 14144 .f = cmd_show_vf_stats_parsed, 14145 .data = NULL, 14146 .help_str = "show vf stats <port_id> <vf_id>", 14147 .tokens = { 14148 (void *)&cmd_show_vf_stats_show, 14149 (void *)&cmd_show_vf_stats_vf, 14150 (void *)&cmd_show_vf_stats_stats, 14151 (void *)&cmd_show_vf_stats_port_id, 14152 (void *)&cmd_show_vf_stats_vf_id, 14153 NULL, 14154 }, 14155 }; 14156 14157 /* clear vf stats */ 14158 14159 /* Common result structure for clear vf stats */ 14160 struct cmd_clear_vf_stats_result { 14161 cmdline_fixed_string_t clear; 14162 cmdline_fixed_string_t vf; 14163 cmdline_fixed_string_t stats; 14164 uint8_t port_id; 14165 uint16_t vf_id; 14166 }; 14167 14168 /* Common CLI fields clear vf stats*/ 14169 cmdline_parse_token_string_t cmd_clear_vf_stats_clear = 14170 TOKEN_STRING_INITIALIZER 14171 (struct cmd_clear_vf_stats_result, 14172 clear, "clear"); 14173 cmdline_parse_token_string_t cmd_clear_vf_stats_vf = 14174 TOKEN_STRING_INITIALIZER 14175 (struct cmd_clear_vf_stats_result, 14176 vf, "vf"); 14177 cmdline_parse_token_string_t cmd_clear_vf_stats_stats = 14178 TOKEN_STRING_INITIALIZER 14179 (struct cmd_clear_vf_stats_result, 14180 stats, "stats"); 14181 cmdline_parse_token_num_t cmd_clear_vf_stats_port_id = 14182 TOKEN_NUM_INITIALIZER 14183 (struct cmd_clear_vf_stats_result, 14184 port_id, UINT8); 14185 cmdline_parse_token_num_t cmd_clear_vf_stats_vf_id = 14186 TOKEN_NUM_INITIALIZER 14187 (struct cmd_clear_vf_stats_result, 14188 vf_id, UINT16); 14189 14190 static void 14191 cmd_clear_vf_stats_parsed( 14192 void *parsed_result, 14193 __attribute__((unused)) struct cmdline *cl, 14194 __attribute__((unused)) void *data) 14195 { 14196 struct cmd_clear_vf_stats_result *res = parsed_result; 14197 int ret = -ENOTSUP; 14198 14199 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 14200 return; 14201 14202 #ifdef RTE_LIBRTE_I40E_PMD 14203 if (ret == -ENOTSUP) 14204 ret = rte_pmd_i40e_reset_vf_stats(res->port_id, 14205 res->vf_id); 14206 #endif 14207 #ifdef RTE_LIBRTE_BNXT_PMD 14208 if (ret == -ENOTSUP) 14209 ret = rte_pmd_bnxt_reset_vf_stats(res->port_id, 14210 res->vf_id); 14211 #endif 14212 14213 switch (ret) { 14214 case 0: 14215 break; 14216 case -EINVAL: 14217 printf("invalid vf_id %d\n", res->vf_id); 14218 break; 14219 case -ENODEV: 14220 printf("invalid port_id %d\n", res->port_id); 14221 break; 14222 case -ENOTSUP: 14223 printf("function not implemented\n"); 14224 break; 14225 default: 14226 printf("programming error: (%s)\n", strerror(-ret)); 14227 } 14228 } 14229 14230 cmdline_parse_inst_t cmd_clear_vf_stats = { 14231 .f = cmd_clear_vf_stats_parsed, 14232 .data = NULL, 14233 .help_str = "clear vf stats <port_id> <vf_id>", 14234 .tokens = { 14235 (void *)&cmd_clear_vf_stats_clear, 14236 (void *)&cmd_clear_vf_stats_vf, 14237 (void *)&cmd_clear_vf_stats_stats, 14238 (void *)&cmd_clear_vf_stats_port_id, 14239 (void *)&cmd_clear_vf_stats_vf_id, 14240 NULL, 14241 }, 14242 }; 14243 14244 /* port config pctype mapping reset */ 14245 14246 /* Common result structure for port config pctype mapping reset */ 14247 struct cmd_pctype_mapping_reset_result { 14248 cmdline_fixed_string_t port; 14249 cmdline_fixed_string_t config; 14250 uint8_t port_id; 14251 cmdline_fixed_string_t pctype; 14252 cmdline_fixed_string_t mapping; 14253 cmdline_fixed_string_t reset; 14254 }; 14255 14256 /* Common CLI fields for port config pctype mapping reset*/ 14257 cmdline_parse_token_string_t cmd_pctype_mapping_reset_port = 14258 TOKEN_STRING_INITIALIZER 14259 (struct cmd_pctype_mapping_reset_result, 14260 port, "port"); 14261 cmdline_parse_token_string_t cmd_pctype_mapping_reset_config = 14262 TOKEN_STRING_INITIALIZER 14263 (struct cmd_pctype_mapping_reset_result, 14264 config, "config"); 14265 cmdline_parse_token_num_t cmd_pctype_mapping_reset_port_id = 14266 TOKEN_NUM_INITIALIZER 14267 (struct cmd_pctype_mapping_reset_result, 14268 port_id, UINT8); 14269 cmdline_parse_token_string_t cmd_pctype_mapping_reset_pctype = 14270 TOKEN_STRING_INITIALIZER 14271 (struct cmd_pctype_mapping_reset_result, 14272 pctype, "pctype"); 14273 cmdline_parse_token_string_t cmd_pctype_mapping_reset_mapping = 14274 TOKEN_STRING_INITIALIZER 14275 (struct cmd_pctype_mapping_reset_result, 14276 mapping, "mapping"); 14277 cmdline_parse_token_string_t cmd_pctype_mapping_reset_reset = 14278 TOKEN_STRING_INITIALIZER 14279 (struct cmd_pctype_mapping_reset_result, 14280 reset, "reset"); 14281 14282 static void 14283 cmd_pctype_mapping_reset_parsed( 14284 void *parsed_result, 14285 __attribute__((unused)) struct cmdline *cl, 14286 __attribute__((unused)) void *data) 14287 { 14288 struct cmd_pctype_mapping_reset_result *res = parsed_result; 14289 int ret = -ENOTSUP; 14290 14291 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 14292 return; 14293 14294 #ifdef RTE_LIBRTE_I40E_PMD 14295 ret = rte_pmd_i40e_flow_type_mapping_reset(res->port_id); 14296 #endif 14297 14298 switch (ret) { 14299 case 0: 14300 break; 14301 case -ENODEV: 14302 printf("invalid port_id %d\n", res->port_id); 14303 break; 14304 case -ENOTSUP: 14305 printf("function not implemented\n"); 14306 break; 14307 default: 14308 printf("programming error: (%s)\n", strerror(-ret)); 14309 } 14310 } 14311 14312 cmdline_parse_inst_t cmd_pctype_mapping_reset = { 14313 .f = cmd_pctype_mapping_reset_parsed, 14314 .data = NULL, 14315 .help_str = "port config <port_id> pctype mapping reset", 14316 .tokens = { 14317 (void *)&cmd_pctype_mapping_reset_port, 14318 (void *)&cmd_pctype_mapping_reset_config, 14319 (void *)&cmd_pctype_mapping_reset_port_id, 14320 (void *)&cmd_pctype_mapping_reset_pctype, 14321 (void *)&cmd_pctype_mapping_reset_mapping, 14322 (void *)&cmd_pctype_mapping_reset_reset, 14323 NULL, 14324 }, 14325 }; 14326 14327 /* show port pctype mapping */ 14328 14329 /* Common result structure for show port pctype mapping */ 14330 struct cmd_pctype_mapping_get_result { 14331 cmdline_fixed_string_t show; 14332 cmdline_fixed_string_t port; 14333 uint8_t port_id; 14334 cmdline_fixed_string_t pctype; 14335 cmdline_fixed_string_t mapping; 14336 }; 14337 14338 /* Common CLI fields for pctype mapping get */ 14339 cmdline_parse_token_string_t cmd_pctype_mapping_get_show = 14340 TOKEN_STRING_INITIALIZER 14341 (struct cmd_pctype_mapping_get_result, 14342 show, "show"); 14343 cmdline_parse_token_string_t cmd_pctype_mapping_get_port = 14344 TOKEN_STRING_INITIALIZER 14345 (struct cmd_pctype_mapping_get_result, 14346 port, "port"); 14347 cmdline_parse_token_num_t cmd_pctype_mapping_get_port_id = 14348 TOKEN_NUM_INITIALIZER 14349 (struct cmd_pctype_mapping_get_result, 14350 port_id, UINT8); 14351 cmdline_parse_token_string_t cmd_pctype_mapping_get_pctype = 14352 TOKEN_STRING_INITIALIZER 14353 (struct cmd_pctype_mapping_get_result, 14354 pctype, "pctype"); 14355 cmdline_parse_token_string_t cmd_pctype_mapping_get_mapping = 14356 TOKEN_STRING_INITIALIZER 14357 (struct cmd_pctype_mapping_get_result, 14358 mapping, "mapping"); 14359 14360 static void 14361 cmd_pctype_mapping_get_parsed( 14362 void *parsed_result, 14363 __attribute__((unused)) struct cmdline *cl, 14364 __attribute__((unused)) void *data) 14365 { 14366 struct cmd_pctype_mapping_get_result *res = parsed_result; 14367 int ret = -ENOTSUP; 14368 #ifdef RTE_LIBRTE_I40E_PMD 14369 struct rte_pmd_i40e_flow_type_mapping 14370 mapping[RTE_PMD_I40E_FLOW_TYPE_MAX]; 14371 int i, j, first_pctype; 14372 #endif 14373 14374 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 14375 return; 14376 14377 #ifdef RTE_LIBRTE_I40E_PMD 14378 ret = rte_pmd_i40e_flow_type_mapping_get(res->port_id, mapping); 14379 #endif 14380 14381 switch (ret) { 14382 case 0: 14383 break; 14384 case -ENODEV: 14385 printf("invalid port_id %d\n", res->port_id); 14386 return; 14387 case -ENOTSUP: 14388 printf("function not implemented\n"); 14389 return; 14390 default: 14391 printf("programming error: (%s)\n", strerror(-ret)); 14392 return; 14393 } 14394 14395 #ifdef RTE_LIBRTE_I40E_PMD 14396 for (i = 0; i < RTE_PMD_I40E_FLOW_TYPE_MAX; i++) { 14397 if (mapping[i].pctype != 0ULL) { 14398 first_pctype = 1; 14399 14400 printf("pctype: "); 14401 for (j = 0; j < RTE_PMD_I40E_PCTYPE_MAX; j++) { 14402 if (mapping[i].pctype & (1ULL << j)) { 14403 printf(first_pctype ? 14404 "%02d" : ",%02d", j); 14405 first_pctype = 0; 14406 } 14407 } 14408 printf(" -> flowtype: %02d\n", mapping[i].flow_type); 14409 } 14410 } 14411 #endif 14412 } 14413 14414 cmdline_parse_inst_t cmd_pctype_mapping_get = { 14415 .f = cmd_pctype_mapping_get_parsed, 14416 .data = NULL, 14417 .help_str = "show port <port_id> pctype mapping", 14418 .tokens = { 14419 (void *)&cmd_pctype_mapping_get_show, 14420 (void *)&cmd_pctype_mapping_get_port, 14421 (void *)&cmd_pctype_mapping_get_port_id, 14422 (void *)&cmd_pctype_mapping_get_pctype, 14423 (void *)&cmd_pctype_mapping_get_mapping, 14424 NULL, 14425 }, 14426 }; 14427 14428 /* port config pctype mapping update */ 14429 14430 /* Common result structure for port config pctype mapping update */ 14431 struct cmd_pctype_mapping_update_result { 14432 cmdline_fixed_string_t port; 14433 cmdline_fixed_string_t config; 14434 uint8_t port_id; 14435 cmdline_fixed_string_t pctype; 14436 cmdline_fixed_string_t mapping; 14437 cmdline_fixed_string_t update; 14438 cmdline_fixed_string_t pctype_list; 14439 uint16_t flow_type; 14440 }; 14441 14442 /* Common CLI fields for pctype mapping update*/ 14443 cmdline_parse_token_string_t cmd_pctype_mapping_update_port = 14444 TOKEN_STRING_INITIALIZER 14445 (struct cmd_pctype_mapping_update_result, 14446 port, "port"); 14447 cmdline_parse_token_string_t cmd_pctype_mapping_update_config = 14448 TOKEN_STRING_INITIALIZER 14449 (struct cmd_pctype_mapping_update_result, 14450 config, "config"); 14451 cmdline_parse_token_num_t cmd_pctype_mapping_update_port_id = 14452 TOKEN_NUM_INITIALIZER 14453 (struct cmd_pctype_mapping_update_result, 14454 port_id, UINT8); 14455 cmdline_parse_token_string_t cmd_pctype_mapping_update_pctype = 14456 TOKEN_STRING_INITIALIZER 14457 (struct cmd_pctype_mapping_update_result, 14458 pctype, "pctype"); 14459 cmdline_parse_token_string_t cmd_pctype_mapping_update_mapping = 14460 TOKEN_STRING_INITIALIZER 14461 (struct cmd_pctype_mapping_update_result, 14462 mapping, "mapping"); 14463 cmdline_parse_token_string_t cmd_pctype_mapping_update_update = 14464 TOKEN_STRING_INITIALIZER 14465 (struct cmd_pctype_mapping_update_result, 14466 update, "update"); 14467 cmdline_parse_token_string_t cmd_pctype_mapping_update_pc_type = 14468 TOKEN_STRING_INITIALIZER 14469 (struct cmd_pctype_mapping_update_result, 14470 pctype_list, NULL); 14471 cmdline_parse_token_num_t cmd_pctype_mapping_update_flow_type = 14472 TOKEN_NUM_INITIALIZER 14473 (struct cmd_pctype_mapping_update_result, 14474 flow_type, UINT16); 14475 14476 static void 14477 cmd_pctype_mapping_update_parsed( 14478 void *parsed_result, 14479 __attribute__((unused)) struct cmdline *cl, 14480 __attribute__((unused)) void *data) 14481 { 14482 struct cmd_pctype_mapping_update_result *res = parsed_result; 14483 int ret = -ENOTSUP; 14484 #ifdef RTE_LIBRTE_I40E_PMD 14485 struct rte_pmd_i40e_flow_type_mapping mapping; 14486 unsigned int i; 14487 unsigned int nb_item; 14488 unsigned int pctype_list[RTE_PMD_I40E_PCTYPE_MAX]; 14489 #endif 14490 14491 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 14492 return; 14493 14494 #ifdef RTE_LIBRTE_I40E_PMD 14495 nb_item = parse_item_list(res->pctype_list, "pctypes", 14496 RTE_PMD_I40E_PCTYPE_MAX, pctype_list, 1); 14497 mapping.flow_type = res->flow_type; 14498 for (i = 0, mapping.pctype = 0ULL; i < nb_item; i++) 14499 mapping.pctype |= (1ULL << pctype_list[i]); 14500 ret = rte_pmd_i40e_flow_type_mapping_update(res->port_id, 14501 &mapping, 14502 1, 14503 0); 14504 #endif 14505 14506 switch (ret) { 14507 case 0: 14508 break; 14509 case -EINVAL: 14510 printf("invalid pctype or flow type\n"); 14511 break; 14512 case -ENODEV: 14513 printf("invalid port_id %d\n", res->port_id); 14514 break; 14515 case -ENOTSUP: 14516 printf("function not implemented\n"); 14517 break; 14518 default: 14519 printf("programming error: (%s)\n", strerror(-ret)); 14520 } 14521 } 14522 14523 cmdline_parse_inst_t cmd_pctype_mapping_update = { 14524 .f = cmd_pctype_mapping_update_parsed, 14525 .data = NULL, 14526 .help_str = "port config <port_id> pctype mapping update" 14527 " <pctype_id_0,[pctype_id_1]*> <flowtype_id>", 14528 .tokens = { 14529 (void *)&cmd_pctype_mapping_update_port, 14530 (void *)&cmd_pctype_mapping_update_config, 14531 (void *)&cmd_pctype_mapping_update_port_id, 14532 (void *)&cmd_pctype_mapping_update_pctype, 14533 (void *)&cmd_pctype_mapping_update_mapping, 14534 (void *)&cmd_pctype_mapping_update_update, 14535 (void *)&cmd_pctype_mapping_update_pc_type, 14536 (void *)&cmd_pctype_mapping_update_flow_type, 14537 NULL, 14538 }, 14539 }; 14540 14541 /* ptype mapping get */ 14542 14543 /* Common result structure for ptype mapping get */ 14544 struct cmd_ptype_mapping_get_result { 14545 cmdline_fixed_string_t ptype; 14546 cmdline_fixed_string_t mapping; 14547 cmdline_fixed_string_t get; 14548 uint8_t port_id; 14549 uint8_t valid_only; 14550 }; 14551 14552 /* Common CLI fields for ptype mapping get */ 14553 cmdline_parse_token_string_t cmd_ptype_mapping_get_ptype = 14554 TOKEN_STRING_INITIALIZER 14555 (struct cmd_ptype_mapping_get_result, 14556 ptype, "ptype"); 14557 cmdline_parse_token_string_t cmd_ptype_mapping_get_mapping = 14558 TOKEN_STRING_INITIALIZER 14559 (struct cmd_ptype_mapping_get_result, 14560 mapping, "mapping"); 14561 cmdline_parse_token_string_t cmd_ptype_mapping_get_get = 14562 TOKEN_STRING_INITIALIZER 14563 (struct cmd_ptype_mapping_get_result, 14564 get, "get"); 14565 cmdline_parse_token_num_t cmd_ptype_mapping_get_port_id = 14566 TOKEN_NUM_INITIALIZER 14567 (struct cmd_ptype_mapping_get_result, 14568 port_id, UINT8); 14569 cmdline_parse_token_num_t cmd_ptype_mapping_get_valid_only = 14570 TOKEN_NUM_INITIALIZER 14571 (struct cmd_ptype_mapping_get_result, 14572 valid_only, UINT8); 14573 14574 static void 14575 cmd_ptype_mapping_get_parsed( 14576 void *parsed_result, 14577 __attribute__((unused)) struct cmdline *cl, 14578 __attribute__((unused)) void *data) 14579 { 14580 struct cmd_ptype_mapping_get_result *res = parsed_result; 14581 int ret = -ENOTSUP; 14582 #ifdef RTE_LIBRTE_I40E_PMD 14583 int max_ptype_num = 256; 14584 struct rte_pmd_i40e_ptype_mapping mapping[max_ptype_num]; 14585 uint16_t count; 14586 int i; 14587 #endif 14588 14589 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 14590 return; 14591 14592 #ifdef RTE_LIBRTE_I40E_PMD 14593 ret = rte_pmd_i40e_ptype_mapping_get(res->port_id, 14594 mapping, 14595 max_ptype_num, 14596 &count, 14597 res->valid_only); 14598 #endif 14599 14600 switch (ret) { 14601 case 0: 14602 break; 14603 case -ENODEV: 14604 printf("invalid port_id %d\n", res->port_id); 14605 break; 14606 case -ENOTSUP: 14607 printf("function not implemented\n"); 14608 break; 14609 default: 14610 printf("programming error: (%s)\n", strerror(-ret)); 14611 } 14612 14613 #ifdef RTE_LIBRTE_I40E_PMD 14614 if (!ret) { 14615 for (i = 0; i < count; i++) 14616 printf("%3d\t0x%08x\n", 14617 mapping[i].hw_ptype, mapping[i].sw_ptype); 14618 } 14619 #endif 14620 } 14621 14622 cmdline_parse_inst_t cmd_ptype_mapping_get = { 14623 .f = cmd_ptype_mapping_get_parsed, 14624 .data = NULL, 14625 .help_str = "ptype mapping get <port_id> <valid_only>", 14626 .tokens = { 14627 (void *)&cmd_ptype_mapping_get_ptype, 14628 (void *)&cmd_ptype_mapping_get_mapping, 14629 (void *)&cmd_ptype_mapping_get_get, 14630 (void *)&cmd_ptype_mapping_get_port_id, 14631 (void *)&cmd_ptype_mapping_get_valid_only, 14632 NULL, 14633 }, 14634 }; 14635 14636 /* ptype mapping replace */ 14637 14638 /* Common result structure for ptype mapping replace */ 14639 struct cmd_ptype_mapping_replace_result { 14640 cmdline_fixed_string_t ptype; 14641 cmdline_fixed_string_t mapping; 14642 cmdline_fixed_string_t replace; 14643 uint8_t port_id; 14644 uint32_t target; 14645 uint8_t mask; 14646 uint32_t pkt_type; 14647 }; 14648 14649 /* Common CLI fields for ptype mapping replace */ 14650 cmdline_parse_token_string_t cmd_ptype_mapping_replace_ptype = 14651 TOKEN_STRING_INITIALIZER 14652 (struct cmd_ptype_mapping_replace_result, 14653 ptype, "ptype"); 14654 cmdline_parse_token_string_t cmd_ptype_mapping_replace_mapping = 14655 TOKEN_STRING_INITIALIZER 14656 (struct cmd_ptype_mapping_replace_result, 14657 mapping, "mapping"); 14658 cmdline_parse_token_string_t cmd_ptype_mapping_replace_replace = 14659 TOKEN_STRING_INITIALIZER 14660 (struct cmd_ptype_mapping_replace_result, 14661 replace, "replace"); 14662 cmdline_parse_token_num_t cmd_ptype_mapping_replace_port_id = 14663 TOKEN_NUM_INITIALIZER 14664 (struct cmd_ptype_mapping_replace_result, 14665 port_id, UINT8); 14666 cmdline_parse_token_num_t cmd_ptype_mapping_replace_target = 14667 TOKEN_NUM_INITIALIZER 14668 (struct cmd_ptype_mapping_replace_result, 14669 target, UINT32); 14670 cmdline_parse_token_num_t cmd_ptype_mapping_replace_mask = 14671 TOKEN_NUM_INITIALIZER 14672 (struct cmd_ptype_mapping_replace_result, 14673 mask, UINT8); 14674 cmdline_parse_token_num_t cmd_ptype_mapping_replace_pkt_type = 14675 TOKEN_NUM_INITIALIZER 14676 (struct cmd_ptype_mapping_replace_result, 14677 pkt_type, UINT32); 14678 14679 static void 14680 cmd_ptype_mapping_replace_parsed( 14681 void *parsed_result, 14682 __attribute__((unused)) struct cmdline *cl, 14683 __attribute__((unused)) void *data) 14684 { 14685 struct cmd_ptype_mapping_replace_result *res = parsed_result; 14686 int ret = -ENOTSUP; 14687 14688 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 14689 return; 14690 14691 #ifdef RTE_LIBRTE_I40E_PMD 14692 ret = rte_pmd_i40e_ptype_mapping_replace(res->port_id, 14693 res->target, 14694 res->mask, 14695 res->pkt_type); 14696 #endif 14697 14698 switch (ret) { 14699 case 0: 14700 break; 14701 case -EINVAL: 14702 printf("invalid ptype 0x%8x or 0x%8x\n", 14703 res->target, res->pkt_type); 14704 break; 14705 case -ENODEV: 14706 printf("invalid port_id %d\n", res->port_id); 14707 break; 14708 case -ENOTSUP: 14709 printf("function not implemented\n"); 14710 break; 14711 default: 14712 printf("programming error: (%s)\n", strerror(-ret)); 14713 } 14714 } 14715 14716 cmdline_parse_inst_t cmd_ptype_mapping_replace = { 14717 .f = cmd_ptype_mapping_replace_parsed, 14718 .data = NULL, 14719 .help_str = 14720 "ptype mapping replace <port_id> <target> <mask> <pkt_type>", 14721 .tokens = { 14722 (void *)&cmd_ptype_mapping_replace_ptype, 14723 (void *)&cmd_ptype_mapping_replace_mapping, 14724 (void *)&cmd_ptype_mapping_replace_replace, 14725 (void *)&cmd_ptype_mapping_replace_port_id, 14726 (void *)&cmd_ptype_mapping_replace_target, 14727 (void *)&cmd_ptype_mapping_replace_mask, 14728 (void *)&cmd_ptype_mapping_replace_pkt_type, 14729 NULL, 14730 }, 14731 }; 14732 14733 /* ptype mapping reset */ 14734 14735 /* Common result structure for ptype mapping reset */ 14736 struct cmd_ptype_mapping_reset_result { 14737 cmdline_fixed_string_t ptype; 14738 cmdline_fixed_string_t mapping; 14739 cmdline_fixed_string_t reset; 14740 uint8_t port_id; 14741 }; 14742 14743 /* Common CLI fields for ptype mapping reset*/ 14744 cmdline_parse_token_string_t cmd_ptype_mapping_reset_ptype = 14745 TOKEN_STRING_INITIALIZER 14746 (struct cmd_ptype_mapping_reset_result, 14747 ptype, "ptype"); 14748 cmdline_parse_token_string_t cmd_ptype_mapping_reset_mapping = 14749 TOKEN_STRING_INITIALIZER 14750 (struct cmd_ptype_mapping_reset_result, 14751 mapping, "mapping"); 14752 cmdline_parse_token_string_t cmd_ptype_mapping_reset_reset = 14753 TOKEN_STRING_INITIALIZER 14754 (struct cmd_ptype_mapping_reset_result, 14755 reset, "reset"); 14756 cmdline_parse_token_num_t cmd_ptype_mapping_reset_port_id = 14757 TOKEN_NUM_INITIALIZER 14758 (struct cmd_ptype_mapping_reset_result, 14759 port_id, UINT8); 14760 14761 static void 14762 cmd_ptype_mapping_reset_parsed( 14763 void *parsed_result, 14764 __attribute__((unused)) struct cmdline *cl, 14765 __attribute__((unused)) void *data) 14766 { 14767 struct cmd_ptype_mapping_reset_result *res = parsed_result; 14768 int ret = -ENOTSUP; 14769 14770 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 14771 return; 14772 14773 #ifdef RTE_LIBRTE_I40E_PMD 14774 ret = rte_pmd_i40e_ptype_mapping_reset(res->port_id); 14775 #endif 14776 14777 switch (ret) { 14778 case 0: 14779 break; 14780 case -ENODEV: 14781 printf("invalid port_id %d\n", res->port_id); 14782 break; 14783 case -ENOTSUP: 14784 printf("function not implemented\n"); 14785 break; 14786 default: 14787 printf("programming error: (%s)\n", strerror(-ret)); 14788 } 14789 } 14790 14791 cmdline_parse_inst_t cmd_ptype_mapping_reset = { 14792 .f = cmd_ptype_mapping_reset_parsed, 14793 .data = NULL, 14794 .help_str = "ptype mapping reset <port_id>", 14795 .tokens = { 14796 (void *)&cmd_ptype_mapping_reset_ptype, 14797 (void *)&cmd_ptype_mapping_reset_mapping, 14798 (void *)&cmd_ptype_mapping_reset_reset, 14799 (void *)&cmd_ptype_mapping_reset_port_id, 14800 NULL, 14801 }, 14802 }; 14803 14804 /* ptype mapping update */ 14805 14806 /* Common result structure for ptype mapping update */ 14807 struct cmd_ptype_mapping_update_result { 14808 cmdline_fixed_string_t ptype; 14809 cmdline_fixed_string_t mapping; 14810 cmdline_fixed_string_t reset; 14811 uint8_t port_id; 14812 uint8_t hw_ptype; 14813 uint32_t sw_ptype; 14814 }; 14815 14816 /* Common CLI fields for ptype mapping update*/ 14817 cmdline_parse_token_string_t cmd_ptype_mapping_update_ptype = 14818 TOKEN_STRING_INITIALIZER 14819 (struct cmd_ptype_mapping_update_result, 14820 ptype, "ptype"); 14821 cmdline_parse_token_string_t cmd_ptype_mapping_update_mapping = 14822 TOKEN_STRING_INITIALIZER 14823 (struct cmd_ptype_mapping_update_result, 14824 mapping, "mapping"); 14825 cmdline_parse_token_string_t cmd_ptype_mapping_update_update = 14826 TOKEN_STRING_INITIALIZER 14827 (struct cmd_ptype_mapping_update_result, 14828 reset, "update"); 14829 cmdline_parse_token_num_t cmd_ptype_mapping_update_port_id = 14830 TOKEN_NUM_INITIALIZER 14831 (struct cmd_ptype_mapping_update_result, 14832 port_id, UINT8); 14833 cmdline_parse_token_num_t cmd_ptype_mapping_update_hw_ptype = 14834 TOKEN_NUM_INITIALIZER 14835 (struct cmd_ptype_mapping_update_result, 14836 hw_ptype, UINT8); 14837 cmdline_parse_token_num_t cmd_ptype_mapping_update_sw_ptype = 14838 TOKEN_NUM_INITIALIZER 14839 (struct cmd_ptype_mapping_update_result, 14840 sw_ptype, UINT32); 14841 14842 static void 14843 cmd_ptype_mapping_update_parsed( 14844 void *parsed_result, 14845 __attribute__((unused)) struct cmdline *cl, 14846 __attribute__((unused)) void *data) 14847 { 14848 struct cmd_ptype_mapping_update_result *res = parsed_result; 14849 int ret = -ENOTSUP; 14850 #ifdef RTE_LIBRTE_I40E_PMD 14851 struct rte_pmd_i40e_ptype_mapping mapping; 14852 #endif 14853 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 14854 return; 14855 14856 #ifdef RTE_LIBRTE_I40E_PMD 14857 mapping.hw_ptype = res->hw_ptype; 14858 mapping.sw_ptype = res->sw_ptype; 14859 ret = rte_pmd_i40e_ptype_mapping_update(res->port_id, 14860 &mapping, 14861 1, 14862 0); 14863 #endif 14864 14865 switch (ret) { 14866 case 0: 14867 break; 14868 case -EINVAL: 14869 printf("invalid ptype 0x%8x\n", res->sw_ptype); 14870 break; 14871 case -ENODEV: 14872 printf("invalid port_id %d\n", res->port_id); 14873 break; 14874 case -ENOTSUP: 14875 printf("function not implemented\n"); 14876 break; 14877 default: 14878 printf("programming error: (%s)\n", strerror(-ret)); 14879 } 14880 } 14881 14882 cmdline_parse_inst_t cmd_ptype_mapping_update = { 14883 .f = cmd_ptype_mapping_update_parsed, 14884 .data = NULL, 14885 .help_str = "ptype mapping update <port_id> <hw_ptype> <sw_ptype>", 14886 .tokens = { 14887 (void *)&cmd_ptype_mapping_update_ptype, 14888 (void *)&cmd_ptype_mapping_update_mapping, 14889 (void *)&cmd_ptype_mapping_update_update, 14890 (void *)&cmd_ptype_mapping_update_port_id, 14891 (void *)&cmd_ptype_mapping_update_hw_ptype, 14892 (void *)&cmd_ptype_mapping_update_sw_ptype, 14893 NULL, 14894 }, 14895 }; 14896 14897 /* Common result structure for file commands */ 14898 struct cmd_cmdfile_result { 14899 cmdline_fixed_string_t load; 14900 cmdline_fixed_string_t filename; 14901 }; 14902 14903 /* Common CLI fields for file commands */ 14904 cmdline_parse_token_string_t cmd_load_cmdfile = 14905 TOKEN_STRING_INITIALIZER(struct cmd_cmdfile_result, load, "load"); 14906 cmdline_parse_token_string_t cmd_load_cmdfile_filename = 14907 TOKEN_STRING_INITIALIZER(struct cmd_cmdfile_result, filename, NULL); 14908 14909 static void 14910 cmd_load_from_file_parsed( 14911 void *parsed_result, 14912 __attribute__((unused)) struct cmdline *cl, 14913 __attribute__((unused)) void *data) 14914 { 14915 struct cmd_cmdfile_result *res = parsed_result; 14916 14917 cmdline_read_from_file(res->filename); 14918 } 14919 14920 cmdline_parse_inst_t cmd_load_from_file = { 14921 .f = cmd_load_from_file_parsed, 14922 .data = NULL, 14923 .help_str = "load <filename>", 14924 .tokens = { 14925 (void *)&cmd_load_cmdfile, 14926 (void *)&cmd_load_cmdfile_filename, 14927 NULL, 14928 }, 14929 }; 14930 14931 /* ******************************************************************************** */ 14932 14933 /* list of instructions */ 14934 cmdline_parse_ctx_t main_ctx[] = { 14935 (cmdline_parse_inst_t *)&cmd_help_brief, 14936 (cmdline_parse_inst_t *)&cmd_help_long, 14937 (cmdline_parse_inst_t *)&cmd_quit, 14938 (cmdline_parse_inst_t *)&cmd_load_from_file, 14939 (cmdline_parse_inst_t *)&cmd_showport, 14940 (cmdline_parse_inst_t *)&cmd_showqueue, 14941 (cmdline_parse_inst_t *)&cmd_showportall, 14942 (cmdline_parse_inst_t *)&cmd_showcfg, 14943 (cmdline_parse_inst_t *)&cmd_start, 14944 (cmdline_parse_inst_t *)&cmd_start_tx_first, 14945 (cmdline_parse_inst_t *)&cmd_start_tx_first_n, 14946 (cmdline_parse_inst_t *)&cmd_set_link_up, 14947 (cmdline_parse_inst_t *)&cmd_set_link_down, 14948 (cmdline_parse_inst_t *)&cmd_reset, 14949 (cmdline_parse_inst_t *)&cmd_set_numbers, 14950 (cmdline_parse_inst_t *)&cmd_set_txpkts, 14951 (cmdline_parse_inst_t *)&cmd_set_txsplit, 14952 (cmdline_parse_inst_t *)&cmd_set_fwd_list, 14953 (cmdline_parse_inst_t *)&cmd_set_fwd_mask, 14954 (cmdline_parse_inst_t *)&cmd_set_fwd_mode, 14955 (cmdline_parse_inst_t *)&cmd_set_fwd_retry_mode, 14956 (cmdline_parse_inst_t *)&cmd_set_burst_tx_retry, 14957 (cmdline_parse_inst_t *)&cmd_set_promisc_mode_one, 14958 (cmdline_parse_inst_t *)&cmd_set_promisc_mode_all, 14959 (cmdline_parse_inst_t *)&cmd_set_allmulti_mode_one, 14960 (cmdline_parse_inst_t *)&cmd_set_allmulti_mode_all, 14961 (cmdline_parse_inst_t *)&cmd_set_flush_rx, 14962 (cmdline_parse_inst_t *)&cmd_set_link_check, 14963 (cmdline_parse_inst_t *)&cmd_set_bypass_mode, 14964 (cmdline_parse_inst_t *)&cmd_set_bypass_event, 14965 (cmdline_parse_inst_t *)&cmd_set_bypass_timeout, 14966 (cmdline_parse_inst_t *)&cmd_show_bypass_config, 14967 #ifdef RTE_LIBRTE_PMD_BOND 14968 (cmdline_parse_inst_t *) &cmd_set_bonding_mode, 14969 (cmdline_parse_inst_t *) &cmd_show_bonding_config, 14970 (cmdline_parse_inst_t *) &cmd_set_bonding_primary, 14971 (cmdline_parse_inst_t *) &cmd_add_bonding_slave, 14972 (cmdline_parse_inst_t *) &cmd_remove_bonding_slave, 14973 (cmdline_parse_inst_t *) &cmd_create_bonded_device, 14974 (cmdline_parse_inst_t *) &cmd_set_bond_mac_addr, 14975 (cmdline_parse_inst_t *) &cmd_set_balance_xmit_policy, 14976 (cmdline_parse_inst_t *) &cmd_set_bond_mon_period, 14977 (cmdline_parse_inst_t *) &cmd_set_lacp_dedicated_queues, 14978 (cmdline_parse_inst_t *) &cmd_set_bonding_agg_mode_policy, 14979 #endif 14980 (cmdline_parse_inst_t *)&cmd_vlan_offload, 14981 (cmdline_parse_inst_t *)&cmd_vlan_tpid, 14982 (cmdline_parse_inst_t *)&cmd_rx_vlan_filter_all, 14983 (cmdline_parse_inst_t *)&cmd_rx_vlan_filter, 14984 (cmdline_parse_inst_t *)&cmd_tx_vlan_set, 14985 (cmdline_parse_inst_t *)&cmd_tx_vlan_set_qinq, 14986 (cmdline_parse_inst_t *)&cmd_tx_vlan_reset, 14987 (cmdline_parse_inst_t *)&cmd_tx_vlan_set_pvid, 14988 (cmdline_parse_inst_t *)&cmd_csum_set, 14989 (cmdline_parse_inst_t *)&cmd_csum_show, 14990 (cmdline_parse_inst_t *)&cmd_csum_tunnel, 14991 (cmdline_parse_inst_t *)&cmd_tso_set, 14992 (cmdline_parse_inst_t *)&cmd_tso_show, 14993 (cmdline_parse_inst_t *)&cmd_tunnel_tso_set, 14994 (cmdline_parse_inst_t *)&cmd_tunnel_tso_show, 14995 (cmdline_parse_inst_t *)&cmd_gro_enable, 14996 (cmdline_parse_inst_t *)&cmd_gro_flush, 14997 (cmdline_parse_inst_t *)&cmd_gro_show, 14998 (cmdline_parse_inst_t *)&cmd_gso_enable, 14999 (cmdline_parse_inst_t *)&cmd_gso_size, 15000 (cmdline_parse_inst_t *)&cmd_gso_show, 15001 (cmdline_parse_inst_t *)&cmd_link_flow_control_set, 15002 (cmdline_parse_inst_t *)&cmd_link_flow_control_set_rx, 15003 (cmdline_parse_inst_t *)&cmd_link_flow_control_set_tx, 15004 (cmdline_parse_inst_t *)&cmd_link_flow_control_set_hw, 15005 (cmdline_parse_inst_t *)&cmd_link_flow_control_set_lw, 15006 (cmdline_parse_inst_t *)&cmd_link_flow_control_set_pt, 15007 (cmdline_parse_inst_t *)&cmd_link_flow_control_set_xon, 15008 (cmdline_parse_inst_t *)&cmd_link_flow_control_set_macfwd, 15009 (cmdline_parse_inst_t *)&cmd_link_flow_control_set_autoneg, 15010 (cmdline_parse_inst_t *)&cmd_priority_flow_control_set, 15011 (cmdline_parse_inst_t *)&cmd_config_dcb, 15012 (cmdline_parse_inst_t *)&cmd_read_reg, 15013 (cmdline_parse_inst_t *)&cmd_read_reg_bit_field, 15014 (cmdline_parse_inst_t *)&cmd_read_reg_bit, 15015 (cmdline_parse_inst_t *)&cmd_write_reg, 15016 (cmdline_parse_inst_t *)&cmd_write_reg_bit_field, 15017 (cmdline_parse_inst_t *)&cmd_write_reg_bit, 15018 (cmdline_parse_inst_t *)&cmd_read_rxd_txd, 15019 (cmdline_parse_inst_t *)&cmd_stop, 15020 (cmdline_parse_inst_t *)&cmd_mac_addr, 15021 (cmdline_parse_inst_t *)&cmd_set_qmap, 15022 (cmdline_parse_inst_t *)&cmd_operate_port, 15023 (cmdline_parse_inst_t *)&cmd_operate_specific_port, 15024 (cmdline_parse_inst_t *)&cmd_operate_attach_port, 15025 (cmdline_parse_inst_t *)&cmd_operate_detach_port, 15026 (cmdline_parse_inst_t *)&cmd_config_speed_all, 15027 (cmdline_parse_inst_t *)&cmd_config_speed_specific, 15028 (cmdline_parse_inst_t *)&cmd_config_rx_tx, 15029 (cmdline_parse_inst_t *)&cmd_config_mtu, 15030 (cmdline_parse_inst_t *)&cmd_config_max_pkt_len, 15031 (cmdline_parse_inst_t *)&cmd_config_rx_mode_flag, 15032 (cmdline_parse_inst_t *)&cmd_config_rss, 15033 (cmdline_parse_inst_t *)&cmd_config_rxtx_queue, 15034 (cmdline_parse_inst_t *)&cmd_config_txqflags, 15035 (cmdline_parse_inst_t *)&cmd_config_rss_reta, 15036 (cmdline_parse_inst_t *)&cmd_showport_reta, 15037 (cmdline_parse_inst_t *)&cmd_config_burst, 15038 (cmdline_parse_inst_t *)&cmd_config_thresh, 15039 (cmdline_parse_inst_t *)&cmd_config_threshold, 15040 (cmdline_parse_inst_t *)&cmd_set_uc_hash_filter, 15041 (cmdline_parse_inst_t *)&cmd_set_uc_all_hash_filter, 15042 (cmdline_parse_inst_t *)&cmd_vf_mac_addr_filter, 15043 (cmdline_parse_inst_t *)&cmd_set_vf_macvlan_filter, 15044 (cmdline_parse_inst_t *)&cmd_queue_rate_limit, 15045 (cmdline_parse_inst_t *)&cmd_tunnel_filter, 15046 (cmdline_parse_inst_t *)&cmd_tunnel_udp_config, 15047 (cmdline_parse_inst_t *)&cmd_global_config, 15048 (cmdline_parse_inst_t *)&cmd_set_mirror_mask, 15049 (cmdline_parse_inst_t *)&cmd_set_mirror_link, 15050 (cmdline_parse_inst_t *)&cmd_reset_mirror_rule, 15051 (cmdline_parse_inst_t *)&cmd_showport_rss_hash, 15052 (cmdline_parse_inst_t *)&cmd_showport_rss_hash_key, 15053 (cmdline_parse_inst_t *)&cmd_config_rss_hash_key, 15054 (cmdline_parse_inst_t *)&cmd_dump, 15055 (cmdline_parse_inst_t *)&cmd_dump_one, 15056 (cmdline_parse_inst_t *)&cmd_ethertype_filter, 15057 (cmdline_parse_inst_t *)&cmd_syn_filter, 15058 (cmdline_parse_inst_t *)&cmd_2tuple_filter, 15059 (cmdline_parse_inst_t *)&cmd_5tuple_filter, 15060 (cmdline_parse_inst_t *)&cmd_flex_filter, 15061 (cmdline_parse_inst_t *)&cmd_add_del_ip_flow_director, 15062 (cmdline_parse_inst_t *)&cmd_add_del_udp_flow_director, 15063 (cmdline_parse_inst_t *)&cmd_add_del_sctp_flow_director, 15064 (cmdline_parse_inst_t *)&cmd_add_del_l2_flow_director, 15065 (cmdline_parse_inst_t *)&cmd_add_del_mac_vlan_flow_director, 15066 (cmdline_parse_inst_t *)&cmd_add_del_tunnel_flow_director, 15067 (cmdline_parse_inst_t *)&cmd_flush_flow_director, 15068 (cmdline_parse_inst_t *)&cmd_set_flow_director_ip_mask, 15069 (cmdline_parse_inst_t *)&cmd_set_flow_director_mac_vlan_mask, 15070 (cmdline_parse_inst_t *)&cmd_set_flow_director_tunnel_mask, 15071 (cmdline_parse_inst_t *)&cmd_set_flow_director_flex_mask, 15072 (cmdline_parse_inst_t *)&cmd_set_flow_director_flex_payload, 15073 (cmdline_parse_inst_t *)&cmd_get_sym_hash_ena_per_port, 15074 (cmdline_parse_inst_t *)&cmd_set_sym_hash_ena_per_port, 15075 (cmdline_parse_inst_t *)&cmd_get_hash_global_config, 15076 (cmdline_parse_inst_t *)&cmd_set_hash_global_config, 15077 (cmdline_parse_inst_t *)&cmd_set_hash_input_set, 15078 (cmdline_parse_inst_t *)&cmd_set_fdir_input_set, 15079 (cmdline_parse_inst_t *)&cmd_flow, 15080 (cmdline_parse_inst_t *)&cmd_mcast_addr, 15081 (cmdline_parse_inst_t *)&cmd_config_l2_tunnel_eth_type_all, 15082 (cmdline_parse_inst_t *)&cmd_config_l2_tunnel_eth_type_specific, 15083 (cmdline_parse_inst_t *)&cmd_config_l2_tunnel_en_dis_all, 15084 (cmdline_parse_inst_t *)&cmd_config_l2_tunnel_en_dis_specific, 15085 (cmdline_parse_inst_t *)&cmd_config_e_tag_insertion_en, 15086 (cmdline_parse_inst_t *)&cmd_config_e_tag_insertion_dis, 15087 (cmdline_parse_inst_t *)&cmd_config_e_tag_stripping_en_dis, 15088 (cmdline_parse_inst_t *)&cmd_config_e_tag_forwarding_en_dis, 15089 (cmdline_parse_inst_t *)&cmd_config_e_tag_filter_add, 15090 (cmdline_parse_inst_t *)&cmd_config_e_tag_filter_del, 15091 (cmdline_parse_inst_t *)&cmd_set_vf_vlan_anti_spoof, 15092 (cmdline_parse_inst_t *)&cmd_set_vf_mac_anti_spoof, 15093 (cmdline_parse_inst_t *)&cmd_set_vf_vlan_stripq, 15094 (cmdline_parse_inst_t *)&cmd_set_vf_vlan_insert, 15095 (cmdline_parse_inst_t *)&cmd_set_tx_loopback, 15096 (cmdline_parse_inst_t *)&cmd_set_all_queues_drop_en, 15097 (cmdline_parse_inst_t *)&cmd_set_vf_split_drop_en, 15098 (cmdline_parse_inst_t *)&cmd_set_macsec_offload_on, 15099 (cmdline_parse_inst_t *)&cmd_set_macsec_offload_off, 15100 (cmdline_parse_inst_t *)&cmd_set_macsec_sc, 15101 (cmdline_parse_inst_t *)&cmd_set_macsec_sa, 15102 (cmdline_parse_inst_t *)&cmd_set_vf_traffic, 15103 (cmdline_parse_inst_t *)&cmd_set_vf_rxmode, 15104 (cmdline_parse_inst_t *)&cmd_vf_rate_limit, 15105 (cmdline_parse_inst_t *)&cmd_vf_rxvlan_filter, 15106 (cmdline_parse_inst_t *)&cmd_set_vf_mac_addr, 15107 (cmdline_parse_inst_t *)&cmd_set_vf_promisc, 15108 (cmdline_parse_inst_t *)&cmd_set_vf_allmulti, 15109 (cmdline_parse_inst_t *)&cmd_set_vf_broadcast, 15110 (cmdline_parse_inst_t *)&cmd_set_vf_vlan_tag, 15111 (cmdline_parse_inst_t *)&cmd_vf_max_bw, 15112 (cmdline_parse_inst_t *)&cmd_vf_tc_min_bw, 15113 (cmdline_parse_inst_t *)&cmd_vf_tc_max_bw, 15114 (cmdline_parse_inst_t *)&cmd_strict_link_prio, 15115 (cmdline_parse_inst_t *)&cmd_tc_min_bw, 15116 #if defined RTE_LIBRTE_PMD_SOFTNIC && defined RTE_LIBRTE_SCHED 15117 (cmdline_parse_inst_t *)&cmd_set_port_tm_hierarchy_default, 15118 #endif 15119 (cmdline_parse_inst_t *)&cmd_ddp_add, 15120 (cmdline_parse_inst_t *)&cmd_ddp_del, 15121 (cmdline_parse_inst_t *)&cmd_ddp_get_list, 15122 (cmdline_parse_inst_t *)&cmd_ddp_get_info, 15123 (cmdline_parse_inst_t *)&cmd_show_vf_stats, 15124 (cmdline_parse_inst_t *)&cmd_clear_vf_stats, 15125 (cmdline_parse_inst_t *)&cmd_ptype_mapping_get, 15126 (cmdline_parse_inst_t *)&cmd_ptype_mapping_replace, 15127 (cmdline_parse_inst_t *)&cmd_ptype_mapping_reset, 15128 (cmdline_parse_inst_t *)&cmd_ptype_mapping_update, 15129 15130 (cmdline_parse_inst_t *)&cmd_pctype_mapping_get, 15131 (cmdline_parse_inst_t *)&cmd_pctype_mapping_reset, 15132 (cmdline_parse_inst_t *)&cmd_pctype_mapping_update, 15133 NULL, 15134 }; 15135 15136 /* read cmdline commands from file */ 15137 void 15138 cmdline_read_from_file(const char *filename) 15139 { 15140 struct cmdline *cl; 15141 15142 cl = cmdline_file_new(main_ctx, "testpmd> ", filename); 15143 if (cl == NULL) { 15144 printf("Failed to create file based cmdline context: %s\n", 15145 filename); 15146 return; 15147 } 15148 15149 cmdline_interact(cl); 15150 cmdline_quit(cl); 15151 15152 cmdline_free(cl); 15153 15154 printf("Read CLI commands from %s\n", filename); 15155 } 15156 15157 /* prompt function, called from main on MASTER lcore */ 15158 void 15159 prompt(void) 15160 { 15161 /* initialize non-constant commands */ 15162 cmd_set_fwd_mode_init(); 15163 cmd_set_fwd_retry_mode_init(); 15164 15165 testpmd_cl = cmdline_stdin_new(main_ctx, "testpmd> "); 15166 if (testpmd_cl == NULL) 15167 return; 15168 cmdline_interact(testpmd_cl); 15169 cmdline_stdin_exit(testpmd_cl); 15170 } 15171 15172 void 15173 prompt_exit(void) 15174 { 15175 if (testpmd_cl != NULL) 15176 cmdline_quit(testpmd_cl); 15177 } 15178 15179 static void 15180 cmd_reconfig_device_queue(portid_t id, uint8_t dev, uint8_t queue) 15181 { 15182 if (id == (portid_t)RTE_PORT_ALL) { 15183 portid_t pid; 15184 15185 RTE_ETH_FOREACH_DEV(pid) { 15186 /* check if need_reconfig has been set to 1 */ 15187 if (ports[pid].need_reconfig == 0) 15188 ports[pid].need_reconfig = dev; 15189 /* check if need_reconfig_queues has been set to 1 */ 15190 if (ports[pid].need_reconfig_queues == 0) 15191 ports[pid].need_reconfig_queues = queue; 15192 } 15193 } else if (!port_id_is_invalid(id, DISABLED_WARN)) { 15194 /* check if need_reconfig has been set to 1 */ 15195 if (ports[id].need_reconfig == 0) 15196 ports[id].need_reconfig = dev; 15197 /* check if need_reconfig_queues has been set to 1 */ 15198 if (ports[id].need_reconfig_queues == 0) 15199 ports[id].need_reconfig_queues = queue; 15200 } 15201 } 15202