1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2010-2016 Intel Corporation. 3 * Copyright(c) 2014 6WIND S.A. 4 */ 5 6 #include <stdarg.h> 7 #include <errno.h> 8 #include <stdio.h> 9 #include <stdint.h> 10 #include <string.h> 11 #include <unistd.h> 12 #include <inttypes.h> 13 #include <sys/queue.h> 14 15 #include <rte_common.h> 16 #include <rte_byteorder.h> 17 #include <rte_log.h> 18 #include <rte_debug.h> 19 #include <rte_cycles.h> 20 #include <rte_memory.h> 21 #include <rte_memzone.h> 22 #include <rte_malloc.h> 23 #include <rte_launch.h> 24 #include <rte_eal.h> 25 #include <rte_per_lcore.h> 26 #include <rte_lcore.h> 27 #include <rte_atomic.h> 28 #include <rte_branch_prediction.h> 29 #include <rte_ring.h> 30 #include <rte_mempool.h> 31 #include <rte_interrupts.h> 32 #include <rte_pci.h> 33 #include <rte_ether.h> 34 #include <rte_ethdev.h> 35 #include <rte_string_fns.h> 36 #include <rte_devargs.h> 37 #include <rte_flow.h> 38 #include <rte_gro.h> 39 #include <rte_mbuf_dyn.h> 40 41 #include <cmdline_rdline.h> 42 #include <cmdline_parse.h> 43 #include <cmdline_parse_num.h> 44 #include <cmdline_parse_string.h> 45 #include <cmdline_parse_ipaddr.h> 46 #include <cmdline_parse_etheraddr.h> 47 #include <cmdline_socket.h> 48 #include <cmdline.h> 49 #ifdef RTE_NET_BOND 50 #include <rte_eth_bond.h> 51 #include <rte_eth_bond_8023ad.h> 52 #endif 53 #if defined RTE_BUS_DPAA && defined RTE_NET_DPAA 54 #include <rte_pmd_dpaa.h> 55 #endif 56 #ifdef RTE_NET_IXGBE 57 #include <rte_pmd_ixgbe.h> 58 #endif 59 #ifdef RTE_NET_I40E 60 #include <rte_pmd_i40e.h> 61 #endif 62 #ifdef RTE_NET_BNXT 63 #include <rte_pmd_bnxt.h> 64 #endif 65 #include "testpmd.h" 66 #include "cmdline_mtr.h" 67 #include "cmdline_tm.h" 68 #include "bpf_cmd.h" 69 70 static struct cmdline *testpmd_cl; 71 72 static void cmd_reconfig_device_queue(portid_t id, uint8_t dev, uint8_t queue); 73 74 /* *** Help command with introduction. *** */ 75 struct cmd_help_brief_result { 76 cmdline_fixed_string_t help; 77 }; 78 79 static void cmd_help_brief_parsed(__rte_unused void *parsed_result, 80 struct cmdline *cl, 81 __rte_unused void *data) 82 { 83 cmdline_printf( 84 cl, 85 "\n" 86 "Help is available for the following sections:\n\n" 87 " help control : Start and stop forwarding.\n" 88 " help display : Displaying port, stats and config " 89 "information.\n" 90 " help config : Configuration information.\n" 91 " help ports : Configuring ports.\n" 92 " help registers : Reading and setting port registers.\n" 93 " help filters : Filters configuration help.\n" 94 " help traffic_management : Traffic Management commands.\n" 95 " help devices : Device related cmds.\n" 96 " help all : All of the above sections.\n\n" 97 ); 98 99 } 100 101 cmdline_parse_token_string_t cmd_help_brief_help = 102 TOKEN_STRING_INITIALIZER(struct cmd_help_brief_result, help, "help"); 103 104 cmdline_parse_inst_t cmd_help_brief = { 105 .f = cmd_help_brief_parsed, 106 .data = NULL, 107 .help_str = "help: Show help", 108 .tokens = { 109 (void *)&cmd_help_brief_help, 110 NULL, 111 }, 112 }; 113 114 /* *** Help command with help sections. *** */ 115 struct cmd_help_long_result { 116 cmdline_fixed_string_t help; 117 cmdline_fixed_string_t section; 118 }; 119 120 static void cmd_help_long_parsed(void *parsed_result, 121 struct cmdline *cl, 122 __rte_unused void *data) 123 { 124 int show_all = 0; 125 struct cmd_help_long_result *res = parsed_result; 126 127 if (!strcmp(res->section, "all")) 128 show_all = 1; 129 130 if (show_all || !strcmp(res->section, "control")) { 131 132 cmdline_printf( 133 cl, 134 "\n" 135 "Control forwarding:\n" 136 "-------------------\n\n" 137 138 "start\n" 139 " Start packet forwarding with current configuration.\n\n" 140 141 "start tx_first\n" 142 " Start packet forwarding with current config" 143 " after sending one burst of packets.\n\n" 144 145 "stop\n" 146 " Stop packet forwarding, and display accumulated" 147 " statistics.\n\n" 148 149 "quit\n" 150 " Quit to prompt.\n\n" 151 ); 152 } 153 154 if (show_all || !strcmp(res->section, "display")) { 155 156 cmdline_printf( 157 cl, 158 "\n" 159 "Display:\n" 160 "--------\n\n" 161 162 "show port (info|stats|summary|xstats|fdir|dcb_tc) (port_id|all)\n" 163 " Display information for port_id, or all.\n\n" 164 165 "show port port_id (module_eeprom|eeprom)\n" 166 " Display the module EEPROM or EEPROM information for port_id.\n\n" 167 168 "show port X rss reta (size) (mask0,mask1,...)\n" 169 " Display the rss redirection table entry indicated" 170 " by masks on port X. size is used to indicate the" 171 " hardware supported reta size\n\n" 172 173 "show port (port_id) rss-hash [key]\n" 174 " Display the RSS hash functions and RSS hash key of port\n\n" 175 176 "clear port (info|stats|xstats|fdir) (port_id|all)\n" 177 " Clear information for port_id, or all.\n\n" 178 179 "show (rxq|txq) info (port_id) (queue_id)\n" 180 " Display information for configured RX/TX queue.\n\n" 181 182 "show config (rxtx|cores|fwd|rxoffs|rxpkts|txpkts)\n" 183 " Display the given configuration.\n\n" 184 185 "read rxd (port_id) (queue_id) (rxd_id)\n" 186 " Display an RX descriptor of a port RX queue.\n\n" 187 188 "read txd (port_id) (queue_id) (txd_id)\n" 189 " Display a TX descriptor of a port TX queue.\n\n" 190 191 "ddp get list (port_id)\n" 192 " Get ddp profile info list\n\n" 193 194 "ddp get info (profile_path)\n" 195 " Get ddp profile information.\n\n" 196 197 "show vf stats (port_id) (vf_id)\n" 198 " Display a VF's statistics.\n\n" 199 200 "clear vf stats (port_id) (vf_id)\n" 201 " Reset a VF's statistics.\n\n" 202 203 "show port (port_id) pctype mapping\n" 204 " Get flow ptype to pctype mapping on a port\n\n" 205 206 "show port meter stats (port_id) (meter_id) (clear)\n" 207 " Get meter stats on a port\n\n" 208 209 "show fwd stats all\n" 210 " Display statistics for all fwd engines.\n\n" 211 212 "clear fwd stats all\n" 213 " Clear statistics for all fwd engines.\n\n" 214 215 "show port (port_id) rx_offload capabilities\n" 216 " List all per queue and per port Rx offloading" 217 " capabilities of a port\n\n" 218 219 "show port (port_id) rx_offload configuration\n" 220 " List port level and all queue level" 221 " Rx offloading configuration\n\n" 222 223 "show port (port_id) tx_offload capabilities\n" 224 " List all per queue and per port" 225 " Tx offloading capabilities of a port\n\n" 226 227 "show port (port_id) tx_offload configuration\n" 228 " List port level and all queue level" 229 " Tx offloading configuration\n\n" 230 231 "show port (port_id) tx_metadata\n" 232 " Show Tx metadata value set" 233 " for a specific port\n\n" 234 235 "show port (port_id) ptypes\n" 236 " Show port supported ptypes" 237 " for a specific port\n\n" 238 239 "show device info (<identifier>|all)" 240 " Show general information about devices probed.\n\n" 241 242 "show port (port_id) rxq|txq (queue_id) desc (desc_id) status" 243 " Show status of rx|tx descriptor.\n\n" 244 245 "show port (port_id) rxq (queue_id) desc used count\n" 246 " Show current number of filled receive" 247 " packet descriptors.\n\n" 248 249 "show port (port_id) macs|mcast_macs" 250 " Display list of mac addresses added to port.\n\n" 251 252 "show port (port_id) fec capabilities" 253 " Show fec capabilities of a port.\n\n" 254 255 "show port (port_id) fec_mode" 256 " Show fec mode of a port.\n\n" 257 258 "show port (port_id) flow_ctrl" 259 " Show flow control info of a port.\n\n" 260 ); 261 } 262 263 if (show_all || !strcmp(res->section, "config")) { 264 cmdline_printf( 265 cl, 266 "\n" 267 "Configuration:\n" 268 "--------------\n" 269 "Configuration changes only become active when" 270 " forwarding is started/restarted.\n\n" 271 272 "set default\n" 273 " Reset forwarding to the default configuration.\n\n" 274 275 "set verbose (level)\n" 276 " Set the debug verbosity level X.\n\n" 277 278 "set log global|(type) (level)\n" 279 " Set the log level.\n\n" 280 281 "set nbport (num)\n" 282 " Set number of ports.\n\n" 283 284 "set nbcore (num)\n" 285 " Set number of cores.\n\n" 286 287 "set coremask (mask)\n" 288 " Set the forwarding cores hexadecimal mask.\n\n" 289 290 "set portmask (mask)\n" 291 " Set the forwarding ports hexadecimal mask.\n\n" 292 293 "set burst (num)\n" 294 " Set number of packets per burst.\n\n" 295 296 "set burst tx delay (microseconds) retry (num)\n" 297 " Set the transmit delay time and number of retries," 298 " effective when retry is enabled.\n\n" 299 300 "set rxoffs (x[,y]*)\n" 301 " Set the offset of each packet segment on" 302 " receiving if split feature is engaged." 303 " Affects only the queues configured with split" 304 " offloads.\n\n" 305 306 "set rxpkts (x[,y]*)\n" 307 " Set the length of each segment to scatter" 308 " packets on receiving if split feature is engaged." 309 " Affects only the queues configured with split" 310 " offloads.\n\n" 311 312 "set txpkts (x[,y]*)\n" 313 " Set the length of each segment of TXONLY" 314 " and optionally CSUM packets.\n\n" 315 316 "set txsplit (off|on|rand)\n" 317 " Set the split policy for the TX packets." 318 " Right now only applicable for CSUM and TXONLY" 319 " modes\n\n" 320 321 "set txtimes (x, y)\n" 322 " Set the scheduling on timestamps" 323 " timings for the TXONLY mode\n\n" 324 325 "set corelist (x[,y]*)\n" 326 " Set the list of forwarding cores.\n\n" 327 328 "set portlist (x[,y]*)\n" 329 " Set the list of forwarding ports.\n\n" 330 331 "set port setup on (iterator|event)\n" 332 " Select how attached port is retrieved for setup.\n\n" 333 334 "set tx loopback (port_id) (on|off)\n" 335 " Enable or disable tx loopback.\n\n" 336 337 "set all queues drop (port_id) (on|off)\n" 338 " Set drop enable bit for all queues.\n\n" 339 340 "set vf split drop (port_id) (vf_id) (on|off)\n" 341 " Set split drop enable bit for a VF from the PF.\n\n" 342 343 "set vf mac antispoof (port_id) (vf_id) (on|off).\n" 344 " Set MAC antispoof for a VF from the PF.\n\n" 345 346 "set macsec offload (port_id) on encrypt (on|off) replay-protect (on|off)\n" 347 " Enable MACsec offload.\n\n" 348 349 "set macsec offload (port_id) off\n" 350 " Disable MACsec offload.\n\n" 351 352 "set macsec sc (tx|rx) (port_id) (mac) (pi)\n" 353 " Configure MACsec secure connection (SC).\n\n" 354 355 "set macsec sa (tx|rx) (port_id) (idx) (an) (pn) (key)\n" 356 " Configure MACsec secure association (SA).\n\n" 357 358 "set vf broadcast (port_id) (vf_id) (on|off)\n" 359 " Set VF broadcast for a VF from the PF.\n\n" 360 361 "vlan set stripq (on|off) (port_id,queue_id)\n" 362 " Set the VLAN strip for a queue on a port.\n\n" 363 364 "set vf vlan stripq (port_id) (vf_id) (on|off)\n" 365 " Set the VLAN strip for all queues in a pool for a VF from the PF.\n\n" 366 367 "set vf vlan insert (port_id) (vf_id) (vlan_id)\n" 368 " Set VLAN insert for a VF from the PF.\n\n" 369 370 "set vf vlan antispoof (port_id) (vf_id) (on|off)\n" 371 " Set VLAN antispoof for a VF from the PF.\n\n" 372 373 "set vf vlan tag (port_id) (vf_id) (on|off)\n" 374 " Set VLAN tag for a VF from the PF.\n\n" 375 376 "set vf tx max-bandwidth (port_id) (vf_id) (bandwidth)\n" 377 " Set a VF's max bandwidth(Mbps).\n\n" 378 379 "set vf tc tx min-bandwidth (port_id) (vf_id) (bw1, bw2, ...)\n" 380 " Set all TCs' min bandwidth(%%) on a VF.\n\n" 381 382 "set vf tc tx max-bandwidth (port_id) (vf_id) (tc_no) (bandwidth)\n" 383 " Set a TC's max bandwidth(Mbps) on a VF.\n\n" 384 385 "set tx strict-link-priority (port_id) (tc_bitmap)\n" 386 " Set some TCs' strict link priority mode on a physical port.\n\n" 387 388 "set tc tx min-bandwidth (port_id) (bw1, bw2, ...)\n" 389 " Set all TCs' min bandwidth(%%) for all PF and VFs.\n\n" 390 391 "vlan set (strip|filter|qinq_strip|extend) (on|off) (port_id)\n" 392 " Set the VLAN strip or filter or qinq strip or extend\n\n" 393 394 "vlan set (inner|outer) tpid (value) (port_id)\n" 395 " Set the VLAN TPID for Packet Filtering on" 396 " a port\n\n" 397 398 "rx_vlan add (vlan_id|all) (port_id)\n" 399 " Add a vlan_id, or all identifiers, to the set" 400 " of VLAN identifiers filtered by port_id.\n\n" 401 402 "rx_vlan rm (vlan_id|all) (port_id)\n" 403 " Remove a vlan_id, or all identifiers, from the set" 404 " of VLAN identifiers filtered by port_id.\n\n" 405 406 "rx_vlan add (vlan_id) port (port_id) vf (vf_mask)\n" 407 " Add a vlan_id, to the set of VLAN identifiers" 408 "filtered for VF(s) from port_id.\n\n" 409 410 "rx_vlan rm (vlan_id) port (port_id) vf (vf_mask)\n" 411 " Remove a vlan_id, to the set of VLAN identifiers" 412 "filtered for VF(s) from port_id.\n\n" 413 414 "rx_vxlan_port add (udp_port) (port_id)\n" 415 " Add an UDP port for VXLAN packet filter on a port\n\n" 416 417 "rx_vxlan_port rm (udp_port) (port_id)\n" 418 " Remove an UDP port for VXLAN packet filter on a port\n\n" 419 420 "tx_vlan set (port_id) vlan_id[, vlan_id_outer]\n" 421 " Set hardware insertion of VLAN IDs (single or double VLAN " 422 "depends on the number of VLAN IDs) in packets sent on a port.\n\n" 423 424 "tx_vlan set pvid port_id vlan_id (on|off)\n" 425 " Set port based TX VLAN insertion.\n\n" 426 427 "tx_vlan reset (port_id)\n" 428 " Disable hardware insertion of a VLAN header in" 429 " packets sent on a port.\n\n" 430 431 "csum set (ip|udp|tcp|sctp|outer-ip|outer-udp) (hw|sw) (port_id)\n" 432 " Select hardware or software calculation of the" 433 " checksum when transmitting a packet using the" 434 " csum forward engine.\n" 435 " ip|udp|tcp|sctp always concern the inner layer.\n" 436 " outer-ip concerns the outer IP layer in" 437 " outer-udp concerns the outer UDP layer in" 438 " case the packet is recognized as a tunnel packet by" 439 " the forward engine (vxlan, gre and ipip are supported)\n" 440 " Please check the NIC datasheet for HW limits.\n\n" 441 442 "csum parse-tunnel (on|off) (tx_port_id)\n" 443 " If disabled, treat tunnel packets as non-tunneled" 444 " packets (treat inner headers as payload). The port\n" 445 " argument is the port used for TX in csum forward" 446 " engine.\n\n" 447 448 "csum show (port_id)\n" 449 " Display tx checksum offload configuration\n\n" 450 451 "tso set (segsize) (portid)\n" 452 " Enable TCP Segmentation Offload in csum forward" 453 " engine.\n" 454 " Please check the NIC datasheet for HW limits.\n\n" 455 456 "tso show (portid)" 457 " Display the status of TCP Segmentation Offload.\n\n" 458 459 "set port (port_id) gro on|off\n" 460 " Enable or disable Generic Receive Offload in" 461 " csum forwarding engine.\n\n" 462 463 "show port (port_id) gro\n" 464 " Display GRO configuration.\n\n" 465 466 "set gro flush (cycles)\n" 467 " Set the cycle to flush GROed packets from" 468 " reassembly tables.\n\n" 469 470 "set port (port_id) gso (on|off)" 471 " Enable or disable Generic Segmentation Offload in" 472 " csum forwarding engine.\n\n" 473 474 "set gso segsz (length)\n" 475 " Set max packet length for output GSO segments," 476 " including packet header and payload.\n\n" 477 478 "show port (port_id) gso\n" 479 " Show GSO configuration.\n\n" 480 481 "set fwd (%s)\n" 482 " Set packet forwarding mode.\n\n" 483 484 "mac_addr add (port_id) (XX:XX:XX:XX:XX:XX)\n" 485 " Add a MAC address on port_id.\n\n" 486 487 "mac_addr remove (port_id) (XX:XX:XX:XX:XX:XX)\n" 488 " Remove a MAC address from port_id.\n\n" 489 490 "mac_addr set (port_id) (XX:XX:XX:XX:XX:XX)\n" 491 " Set the default MAC address for port_id.\n\n" 492 493 "mac_addr add port (port_id) vf (vf_id) (mac_address)\n" 494 " Add a MAC address for a VF on the port.\n\n" 495 496 "set vf mac addr (port_id) (vf_id) (XX:XX:XX:XX:XX:XX)\n" 497 " Set the MAC address for a VF from the PF.\n\n" 498 499 "set eth-peer (port_id) (peer_addr)\n" 500 " set the peer address for certain port.\n\n" 501 502 "set port (port_id) uta (mac_address|all) (on|off)\n" 503 " Add/Remove a or all unicast hash filter(s)" 504 "from port X.\n\n" 505 506 "set promisc (port_id|all) (on|off)\n" 507 " Set the promiscuous mode on port_id, or all.\n\n" 508 509 "set allmulti (port_id|all) (on|off)\n" 510 " Set the allmulti mode on port_id, or all.\n\n" 511 512 "set vf promisc (port_id) (vf_id) (on|off)\n" 513 " Set unicast promiscuous mode for a VF from the PF.\n\n" 514 515 "set vf allmulti (port_id) (vf_id) (on|off)\n" 516 " Set multicast promiscuous mode for a VF from the PF.\n\n" 517 518 "set flow_ctrl rx (on|off) tx (on|off) (high_water)" 519 " (low_water) (pause_time) (send_xon) mac_ctrl_frame_fwd" 520 " (on|off) autoneg (on|off) (port_id)\n" 521 "set flow_ctrl rx (on|off) (portid)\n" 522 "set flow_ctrl tx (on|off) (portid)\n" 523 "set flow_ctrl high_water (high_water) (portid)\n" 524 "set flow_ctrl low_water (low_water) (portid)\n" 525 "set flow_ctrl pause_time (pause_time) (portid)\n" 526 "set flow_ctrl send_xon (send_xon) (portid)\n" 527 "set flow_ctrl mac_ctrl_frame_fwd (on|off) (portid)\n" 528 "set flow_ctrl autoneg (on|off) (port_id)\n" 529 " Set the link flow control parameter on a port.\n\n" 530 531 "set pfc_ctrl rx (on|off) tx (on|off) (high_water)" 532 " (low_water) (pause_time) (priority) (port_id)\n" 533 " Set the priority flow control parameter on a" 534 " port.\n\n" 535 536 "set stat_qmap (tx|rx) (port_id) (queue_id) (qmapping)\n" 537 " Set statistics mapping (qmapping 0..15) for RX/TX" 538 " queue on port.\n" 539 " e.g., 'set stat_qmap rx 0 2 5' sets rx queue 2" 540 " on port 0 to mapping 5.\n\n" 541 542 "set xstats-hide-zero on|off\n" 543 " Set the option to hide the zero values" 544 " for xstats display.\n" 545 546 "set record-core-cycles on|off\n" 547 " Set the option to enable measurement of CPU cycles.\n" 548 549 "set record-burst-stats on|off\n" 550 " Set the option to enable display of RX and TX bursts.\n" 551 552 "set port (port_id) vf (vf_id) rx|tx on|off\n" 553 " Enable/Disable a VF receive/tranmit from a port\n\n" 554 555 "set port (port_id) vf (vf_id) rxmode (AUPE|ROPE|BAM" 556 "|MPE) (on|off)\n" 557 " AUPE:accepts untagged VLAN;" 558 "ROPE:accept unicast hash\n\n" 559 " BAM:accepts broadcast packets;" 560 "MPE:accepts all multicast packets\n\n" 561 " Enable/Disable a VF receive mode of a port\n\n" 562 563 "set port (port_id) queue (queue_id) rate (rate_num)\n" 564 " Set rate limit for a queue of a port\n\n" 565 566 "set port (port_id) vf (vf_id) rate (rate_num) " 567 "queue_mask (queue_mask_value)\n" 568 " Set rate limit for queues in VF of a port\n\n" 569 570 "set port (port_id) mirror-rule (rule_id)" 571 " (pool-mirror-up|pool-mirror-down|vlan-mirror)" 572 " (poolmask|vlanid[,vlanid]*) dst-pool (pool_id) (on|off)\n" 573 " Set pool or vlan type mirror rule on a port.\n" 574 " e.g., 'set port 0 mirror-rule 0 vlan-mirror 0,1" 575 " dst-pool 0 on' enable mirror traffic with vlan 0,1" 576 " to pool 0.\n\n" 577 578 "set port (port_id) mirror-rule (rule_id)" 579 " (uplink-mirror|downlink-mirror) dst-pool" 580 " (pool_id) (on|off)\n" 581 " Set uplink or downlink type mirror rule on a port.\n" 582 " e.g., 'set port 0 mirror-rule 0 uplink-mirror dst-pool" 583 " 0 on' enable mirror income traffic to pool 0.\n\n" 584 585 "reset port (port_id) mirror-rule (rule_id)\n" 586 " Reset a mirror rule.\n\n" 587 588 "set flush_rx (on|off)\n" 589 " Flush (default) or don't flush RX streams before" 590 " forwarding. Mainly used with PCAP drivers.\n\n" 591 592 "set bypass mode (normal|bypass|isolate) (port_id)\n" 593 " Set the bypass mode for the lowest port on bypass enabled" 594 " NIC.\n\n" 595 596 "set bypass event (timeout|os_on|os_off|power_on|power_off) " 597 "mode (normal|bypass|isolate) (port_id)\n" 598 " Set the event required to initiate specified bypass mode for" 599 " the lowest port on a bypass enabled NIC where:\n" 600 " timeout = enable bypass after watchdog timeout.\n" 601 " os_on = enable bypass when OS/board is powered on.\n" 602 " os_off = enable bypass when OS/board is powered off.\n" 603 " power_on = enable bypass when power supply is turned on.\n" 604 " power_off = enable bypass when power supply is turned off." 605 "\n\n" 606 607 "set bypass timeout (0|1.5|2|3|4|8|16|32)\n" 608 " Set the bypass watchdog timeout to 'n' seconds" 609 " where 0 = instant.\n\n" 610 611 "show bypass config (port_id)\n" 612 " Show the bypass configuration for a bypass enabled NIC" 613 " using the lowest port on the NIC.\n\n" 614 615 #ifdef RTE_NET_BOND 616 "create bonded device (mode) (socket)\n" 617 " Create a new bonded device with specific bonding mode and socket.\n\n" 618 619 "add bonding slave (slave_id) (port_id)\n" 620 " Add a slave device to a bonded device.\n\n" 621 622 "remove bonding slave (slave_id) (port_id)\n" 623 " Remove a slave device from a bonded device.\n\n" 624 625 "set bonding mode (value) (port_id)\n" 626 " Set the bonding mode on a bonded device.\n\n" 627 628 "set bonding primary (slave_id) (port_id)\n" 629 " Set the primary slave for a bonded device.\n\n" 630 631 "show bonding config (port_id)\n" 632 " Show the bonding config for port_id.\n\n" 633 634 "set bonding mac_addr (port_id) (address)\n" 635 " Set the MAC address of a bonded device.\n\n" 636 637 "set bonding mode IEEE802.3AD aggregator policy (port_id) (agg_name)" 638 " Set Aggregation mode for IEEE802.3AD (mode 4)" 639 640 "set bonding balance_xmit_policy (port_id) (l2|l23|l34)\n" 641 " Set the transmit balance policy for bonded device running in balance mode.\n\n" 642 643 "set bonding mon_period (port_id) (value)\n" 644 " Set the bonding link status monitoring polling period in ms.\n\n" 645 646 "set bonding lacp dedicated_queues <port_id> (enable|disable)\n" 647 " Enable/disable dedicated queues for LACP control traffic.\n\n" 648 649 #endif 650 "set link-up port (port_id)\n" 651 " Set link up for a port.\n\n" 652 653 "set link-down port (port_id)\n" 654 " Set link down for a port.\n\n" 655 656 "ddp add (port_id) (profile_path[,backup_profile_path])\n" 657 " Load a profile package on a port\n\n" 658 659 "ddp del (port_id) (backup_profile_path)\n" 660 " Delete a profile package from a port\n\n" 661 662 "ptype mapping get (port_id) (valid_only)\n" 663 " Get ptype mapping on a port\n\n" 664 665 "ptype mapping replace (port_id) (target) (mask) (pky_type)\n" 666 " Replace target with the pkt_type in ptype mapping\n\n" 667 668 "ptype mapping reset (port_id)\n" 669 " Reset ptype mapping on a port\n\n" 670 671 "ptype mapping update (port_id) (hw_ptype) (sw_ptype)\n" 672 " Update a ptype mapping item on a port\n\n" 673 674 "set port (port_id) ptype_mask (ptype_mask)\n" 675 " set packet types classification for a specific port\n\n" 676 677 "set port (port_id) queue-region region_id (value) " 678 "queue_start_index (value) queue_num (value)\n" 679 " Set a queue region on a port\n\n" 680 681 "set port (port_id) queue-region region_id (value) " 682 "flowtype (value)\n" 683 " Set a flowtype region index on a port\n\n" 684 685 "set port (port_id) queue-region UP (value) region_id (value)\n" 686 " Set the mapping of User Priority to " 687 "queue region on a port\n\n" 688 689 "set port (port_id) queue-region flush (on|off)\n" 690 " flush all queue region related configuration\n\n" 691 692 "show port meter cap (port_id)\n" 693 " Show port meter capability information\n\n" 694 695 "add port meter profile srtcm_rfc2697 (port_id) (profile_id) (cir) (cbs) (ebs) (packet_mode)\n" 696 " meter profile add - srtcm rfc 2697\n\n" 697 698 "add port meter profile trtcm_rfc2698 (port_id) (profile_id) (cir) (pir) (cbs) (pbs) (packet_mode)\n" 699 " meter profile add - trtcm rfc 2698\n\n" 700 701 "add port meter profile trtcm_rfc4115 (port_id) (profile_id) (cir) (eir) (cbs) (ebs) (packet_mode)\n" 702 " meter profile add - trtcm rfc 4115\n\n" 703 704 "del port meter profile (port_id) (profile_id)\n" 705 " meter profile delete\n\n" 706 707 "create port meter (port_id) (mtr_id) (profile_id) (policy_id) (meter_enable)\n" 708 "(stats_mask) (shared) (use_pre_meter_color) [(dscp_tbl_entry0) (dscp_tbl_entry1)...\n" 709 "(dscp_tbl_entry63)]\n" 710 " meter create\n\n" 711 712 "enable port meter (port_id) (mtr_id)\n" 713 " meter enable\n\n" 714 715 "disable port meter (port_id) (mtr_id)\n" 716 " meter disable\n\n" 717 718 "del port meter (port_id) (mtr_id)\n" 719 " meter delete\n\n" 720 721 "add port meter policy (port_id) (policy_id) g_actions (actions)\n" 722 "y_actions (actions) r_actions (actions)\n" 723 " meter policy add\n\n" 724 725 "del port meter policy (port_id) (policy_id)\n" 726 " meter policy delete\n\n" 727 728 "set port meter profile (port_id) (mtr_id) (profile_id)\n" 729 " meter update meter profile\n\n" 730 731 "set port meter dscp table (port_id) (mtr_id) [(dscp_tbl_entry0)\n" 732 "(dscp_tbl_entry1)...(dscp_tbl_entry63)]\n" 733 " update meter dscp table entries\n\n" 734 735 "set port meter policer action (port_id) (mtr_id) (action_mask)\n" 736 "(action0) [(action1) (action2)]\n" 737 " meter update policer action\n\n" 738 739 "set port meter stats mask (port_id) (mtr_id) (stats_mask)\n" 740 " meter update stats\n\n" 741 742 "show port (port_id) queue-region\n" 743 " show all queue region related configuration info\n\n" 744 745 "set port (port_id) fec_mode auto|off|rs|baser\n" 746 " set fec mode for a specific port\n\n" 747 748 , list_pkt_forwarding_modes() 749 ); 750 } 751 752 if (show_all || !strcmp(res->section, "ports")) { 753 754 cmdline_printf( 755 cl, 756 "\n" 757 "Port Operations:\n" 758 "----------------\n\n" 759 760 "port start (port_id|all)\n" 761 " Start all ports or port_id.\n\n" 762 763 "port stop (port_id|all)\n" 764 " Stop all ports or port_id.\n\n" 765 766 "port close (port_id|all)\n" 767 " Close all ports or port_id.\n\n" 768 769 "port reset (port_id|all)\n" 770 " Reset all ports or port_id.\n\n" 771 772 "port attach (ident)\n" 773 " Attach physical or virtual dev by pci address or virtual device name\n\n" 774 775 "port detach (port_id)\n" 776 " Detach physical or virtual dev by port_id\n\n" 777 778 "port config (port_id|all)" 779 " speed (10|100|1000|10000|25000|40000|50000|100000|200000|auto)" 780 " duplex (half|full|auto)\n" 781 " Set speed and duplex for all ports or port_id\n\n" 782 783 "port config (port_id|all) loopback (mode)\n" 784 " Set loopback mode for all ports or port_id\n\n" 785 786 "port config all (rxq|txq|rxd|txd) (value)\n" 787 " Set number for rxq/txq/rxd/txd.\n\n" 788 789 "port config all max-pkt-len (value)\n" 790 " Set the max packet length.\n\n" 791 792 "port config all max-lro-pkt-size (value)\n" 793 " Set the max LRO aggregated packet size.\n\n" 794 795 "port config all drop-en (on|off)\n" 796 " Enable or disable packet drop on all RX queues of all ports when no " 797 "receive buffers available.\n\n" 798 799 "port config all rss (all|default|ip|tcp|udp|sctp|" 800 "ether|port|vxlan|geneve|nvgre|vxlan-gpe|ecpri|mpls|none|level-default|" 801 "level-outer|level-inner|<flowtype_id>)\n" 802 " Set the RSS mode.\n\n" 803 804 "port config port-id rss reta (hash,queue)[,(hash,queue)]\n" 805 " Set the RSS redirection table.\n\n" 806 807 "port config (port_id) dcb vt (on|off) (traffic_class)" 808 " pfc (on|off)\n" 809 " Set the DCB mode.\n\n" 810 811 "port config all burst (value)\n" 812 " Set the number of packets per burst.\n\n" 813 814 "port config all (txpt|txht|txwt|rxpt|rxht|rxwt)" 815 " (value)\n" 816 " Set the ring prefetch/host/writeback threshold" 817 " for tx/rx queue.\n\n" 818 819 "port config all (txfreet|txrst|rxfreet) (value)\n" 820 " Set free threshold for rx/tx, or set" 821 " tx rs bit threshold.\n\n" 822 "port config mtu X value\n" 823 " Set the MTU of port X to a given value\n\n" 824 825 "port config (port_id) (rxq|txq) (queue_id) ring_size (value)\n" 826 " Set a rx/tx queue's ring size configuration, the new" 827 " value will take effect after command that (re-)start the port" 828 " or command that setup the specific queue\n\n" 829 830 "port (port_id) (rxq|txq) (queue_id) (start|stop)\n" 831 " Start/stop a rx/tx queue of port X. Only take effect" 832 " when port X is started\n\n" 833 834 "port (port_id) (rxq|txq) (queue_id) deferred_start (on|off)\n" 835 " Switch on/off a deferred start of port X rx/tx queue. Only" 836 " take effect when port X is stopped.\n\n" 837 838 "port (port_id) (rxq|txq) (queue_id) setup\n" 839 " Setup a rx/tx queue of port X.\n\n" 840 841 "port config (port_id) pctype mapping reset\n" 842 " Reset flow type to pctype mapping on a port\n\n" 843 844 "port config (port_id) pctype mapping update" 845 " (pctype_id_0[,pctype_id_1]*) (flow_type_id)\n" 846 " Update a flow type to pctype mapping item on a port\n\n" 847 848 "port config (port_id) pctype (pctype_id) hash_inset|" 849 "fdir_inset|fdir_flx_inset get|set|clear field\n" 850 " (field_idx)\n" 851 " Configure RSS|FDIR|FDIR_FLX input set for some pctype\n\n" 852 853 "port config (port_id) pctype (pctype_id) hash_inset|" 854 "fdir_inset|fdir_flx_inset clear all" 855 " Clear RSS|FDIR|FDIR_FLX input set completely for some pctype\n\n" 856 857 "port config (port_id) udp_tunnel_port add|rm vxlan|geneve|ecpri (udp_port)\n\n" 858 " Add/remove UDP tunnel port for tunneling offload\n\n" 859 860 "port config <port_id> rx_offload vlan_strip|" 861 "ipv4_cksum|udp_cksum|tcp_cksum|tcp_lro|qinq_strip|" 862 "outer_ipv4_cksum|macsec_strip|header_split|" 863 "vlan_filter|vlan_extend|jumbo_frame|scatter|" 864 "buffer_split|timestamp|security|keep_crc on|off\n" 865 " Enable or disable a per port Rx offloading" 866 " on all Rx queues of a port\n\n" 867 868 "port (port_id) rxq (queue_id) rx_offload vlan_strip|" 869 "ipv4_cksum|udp_cksum|tcp_cksum|tcp_lro|qinq_strip|" 870 "outer_ipv4_cksum|macsec_strip|header_split|" 871 "vlan_filter|vlan_extend|jumbo_frame|scatter|" 872 "buffer_split|timestamp|security|keep_crc on|off\n" 873 " Enable or disable a per queue Rx offloading" 874 " only on a specific Rx queue\n\n" 875 876 "port config (port_id) tx_offload vlan_insert|" 877 "ipv4_cksum|udp_cksum|tcp_cksum|sctp_cksum|tcp_tso|" 878 "udp_tso|outer_ipv4_cksum|qinq_insert|vxlan_tnl_tso|" 879 "gre_tnl_tso|ipip_tnl_tso|geneve_tnl_tso|" 880 "macsec_insert|mt_lockfree|multi_segs|mbuf_fast_free|" 881 "security on|off\n" 882 " Enable or disable a per port Tx offloading" 883 " on all Tx queues of a port\n\n" 884 885 "port (port_id) txq (queue_id) tx_offload vlan_insert|" 886 "ipv4_cksum|udp_cksum|tcp_cksum|sctp_cksum|tcp_tso|" 887 "udp_tso|outer_ipv4_cksum|qinq_insert|vxlan_tnl_tso|" 888 "gre_tnl_tso|ipip_tnl_tso|geneve_tnl_tso|macsec_insert" 889 "|mt_lockfree|multi_segs|mbuf_fast_free|security" 890 " on|off\n" 891 " Enable or disable a per queue Tx offloading" 892 " only on a specific Tx queue\n\n" 893 894 "bpf-load rx|tx (port) (queue) (J|M|B) (file_name)\n" 895 " Load an eBPF program as a callback" 896 " for particular RX/TX queue\n\n" 897 898 "bpf-unload rx|tx (port) (queue)\n" 899 " Unload previously loaded eBPF program" 900 " for particular RX/TX queue\n\n" 901 902 "port config (port_id) tx_metadata (value)\n" 903 " Set Tx metadata value per port. Testpmd will add this value" 904 " to any Tx packet sent from this port\n\n" 905 906 "port config (port_id) dynf (name) set|clear\n" 907 " Register a dynf and Set/clear this flag on Tx. " 908 "Testpmd will set this value to any Tx packet " 909 "sent from this port\n\n" 910 911 "port cleanup (port_id) txq (queue_id) (free_cnt)\n" 912 " Cleanup txq mbufs for a specific Tx queue\n\n" 913 ); 914 } 915 916 if (show_all || !strcmp(res->section, "registers")) { 917 918 cmdline_printf( 919 cl, 920 "\n" 921 "Registers:\n" 922 "----------\n\n" 923 924 "read reg (port_id) (address)\n" 925 " Display value of a port register.\n\n" 926 927 "read regfield (port_id) (address) (bit_x) (bit_y)\n" 928 " Display a port register bit field.\n\n" 929 930 "read regbit (port_id) (address) (bit_x)\n" 931 " Display a single port register bit.\n\n" 932 933 "write reg (port_id) (address) (value)\n" 934 " Set value of a port register.\n\n" 935 936 "write regfield (port_id) (address) (bit_x) (bit_y)" 937 " (value)\n" 938 " Set bit field of a port register.\n\n" 939 940 "write regbit (port_id) (address) (bit_x) (value)\n" 941 " Set single bit value of a port register.\n\n" 942 ); 943 } 944 if (show_all || !strcmp(res->section, "filters")) { 945 946 cmdline_printf( 947 cl, 948 "\n" 949 "filters:\n" 950 "--------\n\n" 951 952 #ifdef RTE_NET_I40E 953 "flow_director_filter (port_id) mode raw (add|del|update)" 954 " flow (flow_id) (drop|fwd) queue (queue_id)" 955 " fd_id (fd_id_value) packet (packet file name)\n" 956 " Add/Del a raw type flow director filter.\n\n" 957 #endif 958 959 "flow_director_mask (port_id) mode IP vlan (vlan_value)" 960 " src_mask (ipv4_src) (ipv6_src) (src_port)" 961 " dst_mask (ipv4_dst) (ipv6_dst) (dst_port)\n" 962 " Set flow director IP mask.\n\n" 963 964 "flow_director_mask (port_id) mode MAC-VLAN" 965 " vlan (vlan_value)\n" 966 " Set flow director MAC-VLAN mask.\n\n" 967 968 "flow_director_mask (port_id) mode Tunnel" 969 " vlan (vlan_value) mac (mac_value)" 970 " tunnel-type (tunnel_type_value)" 971 " tunnel-id (tunnel_id_value)\n" 972 " Set flow director Tunnel mask.\n\n" 973 974 "flow_director_flex_payload (port_id)" 975 " (raw|l2|l3|l4) (config)\n" 976 " Configure flex payload selection.\n\n" 977 978 "flow validate {port_id}" 979 " [group {group_id}] [priority {level}]" 980 " [ingress] [egress]" 981 " pattern {item} [/ {item} [...]] / end" 982 " actions {action} [/ {action} [...]] / end\n" 983 " Check whether a flow rule can be created.\n\n" 984 985 "flow create {port_id}" 986 " [group {group_id}] [priority {level}]" 987 " [ingress] [egress]" 988 " pattern {item} [/ {item} [...]] / end" 989 " actions {action} [/ {action} [...]] / end\n" 990 " Create a flow rule.\n\n" 991 992 "flow destroy {port_id} rule {rule_id} [...]\n" 993 " Destroy specific flow rules.\n\n" 994 995 "flow flush {port_id}\n" 996 " Destroy all flow rules.\n\n" 997 998 "flow query {port_id} {rule_id} {action}\n" 999 " Query an existing flow rule.\n\n" 1000 1001 "flow list {port_id} [group {group_id}] [...]\n" 1002 " List existing flow rules sorted by priority," 1003 " filtered by group identifiers.\n\n" 1004 1005 "flow isolate {port_id} {boolean}\n" 1006 " Restrict ingress traffic to the defined" 1007 " flow rules\n\n" 1008 1009 "flow aged {port_id} [destroy]\n" 1010 " List and destroy aged flows" 1011 " flow rules\n\n" 1012 1013 "flow indirect_action {port_id} create" 1014 " [action_id {indirect_action_id}]" 1015 " [ingress] [egress]" 1016 " action {action} / end\n" 1017 " Create indirect action.\n\n" 1018 1019 "flow indirect_action {port_id} update" 1020 " {indirect_action_id} action {action} / end\n" 1021 " Update indirect action.\n\n" 1022 1023 "flow indirect_action {port_id} destroy" 1024 " action_id {indirect_action_id} [...]\n" 1025 " Destroy specific indirect actions.\n\n" 1026 1027 "flow indirect_action {port_id} query" 1028 " {indirect_action_id}\n" 1029 " Query an existing indirect action.\n\n" 1030 1031 "set vxlan ip-version (ipv4|ipv6) vni (vni) udp-src" 1032 " (udp-src) udp-dst (udp-dst) ip-src (ip-src) ip-dst" 1033 " (ip-dst) eth-src (eth-src) eth-dst (eth-dst)\n" 1034 " Configure the VXLAN encapsulation for flows.\n\n" 1035 1036 "set vxlan-with-vlan ip-version (ipv4|ipv6) vni (vni)" 1037 " udp-src (udp-src) udp-dst (udp-dst) ip-src (ip-src)" 1038 " ip-dst (ip-dst) vlan-tci (vlan-tci) eth-src (eth-src)" 1039 " eth-dst (eth-dst)\n" 1040 " Configure the VXLAN encapsulation for flows.\n\n" 1041 1042 "set vxlan-tos-ttl ip-version (ipv4|ipv6) vni (vni) udp-src" 1043 " (udp-src) udp-dst (udp-dst) ip-tos (ip-tos) ip-ttl (ip-ttl)" 1044 " ip-src (ip-src) ip-dst (ip-dst) eth-src (eth-src)" 1045 " eth-dst (eth-dst)\n" 1046 " Configure the VXLAN encapsulation for flows.\n\n" 1047 1048 "set nvgre ip-version (ipv4|ipv6) tni (tni) ip-src" 1049 " (ip-src) ip-dst (ip-dst) eth-src (eth-src) eth-dst" 1050 " (eth-dst)\n" 1051 " Configure the NVGRE encapsulation for flows.\n\n" 1052 1053 "set nvgre-with-vlan ip-version (ipv4|ipv6) tni (tni)" 1054 " ip-src (ip-src) ip-dst (ip-dst) vlan-tci (vlan-tci)" 1055 " eth-src (eth-src) eth-dst (eth-dst)\n" 1056 " Configure the NVGRE encapsulation for flows.\n\n" 1057 1058 "set raw_encap {flow items}\n" 1059 " Configure the encapsulation with raw data.\n\n" 1060 1061 "set raw_decap {flow items}\n" 1062 " Configure the decapsulation with raw data.\n\n" 1063 1064 ); 1065 } 1066 1067 if (show_all || !strcmp(res->section, "traffic_management")) { 1068 cmdline_printf( 1069 cl, 1070 "\n" 1071 "Traffic Management:\n" 1072 "--------------\n" 1073 "show port tm cap (port_id)\n" 1074 " Display the port TM capability.\n\n" 1075 1076 "show port tm level cap (port_id) (level_id)\n" 1077 " Display the port TM hierarchical level capability.\n\n" 1078 1079 "show port tm node cap (port_id) (node_id)\n" 1080 " Display the port TM node capability.\n\n" 1081 1082 "show port tm node type (port_id) (node_id)\n" 1083 " Display the port TM node type.\n\n" 1084 1085 "show port tm node stats (port_id) (node_id) (clear)\n" 1086 " Display the port TM node stats.\n\n" 1087 1088 "add port tm node shaper profile (port_id) (shaper_profile_id)" 1089 " (cmit_tb_rate) (cmit_tb_size) (peak_tb_rate) (peak_tb_size)" 1090 " (packet_length_adjust) (packet_mode)\n" 1091 " Add port tm node private shaper profile.\n\n" 1092 1093 "del port tm node shaper profile (port_id) (shaper_profile_id)\n" 1094 " Delete port tm node private shaper profile.\n\n" 1095 1096 "add port tm node shared shaper (port_id) (shared_shaper_id)" 1097 " (shaper_profile_id)\n" 1098 " Add/update port tm node shared shaper.\n\n" 1099 1100 "del port tm node shared shaper (port_id) (shared_shaper_id)\n" 1101 " Delete port tm node shared shaper.\n\n" 1102 1103 "set port tm node shaper profile (port_id) (node_id)" 1104 " (shaper_profile_id)\n" 1105 " Set port tm node shaper profile.\n\n" 1106 1107 "add port tm node wred profile (port_id) (wred_profile_id)" 1108 " (color_g) (min_th_g) (max_th_g) (maxp_inv_g) (wq_log2_g)" 1109 " (color_y) (min_th_y) (max_th_y) (maxp_inv_y) (wq_log2_y)" 1110 " (color_r) (min_th_r) (max_th_r) (maxp_inv_r) (wq_log2_r)\n" 1111 " Add port tm node wred profile.\n\n" 1112 1113 "del port tm node wred profile (port_id) (wred_profile_id)\n" 1114 " Delete port tm node wred profile.\n\n" 1115 1116 "add port tm nonleaf node (port_id) (node_id) (parent_node_id)" 1117 " (priority) (weight) (level_id) (shaper_profile_id)" 1118 " (n_sp_priorities) (stats_mask) (n_shared_shapers)" 1119 " [(shared_shaper_id_0) (shared_shaper_id_1)...]\n" 1120 " Add port tm nonleaf node.\n\n" 1121 1122 "add port tm nonleaf node pktmode (port_id) (node_id) (parent_node_id)" 1123 " (priority) (weight) (level_id) (shaper_profile_id)" 1124 " (n_sp_priorities) (stats_mask) (n_shared_shapers)" 1125 " [(shared_shaper_id_0) (shared_shaper_id_1)...]\n" 1126 " Add port tm nonleaf node with pkt mode enabled.\n\n" 1127 1128 "add port tm leaf node (port_id) (node_id) (parent_node_id)" 1129 " (priority) (weight) (level_id) (shaper_profile_id)" 1130 " (cman_mode) (wred_profile_id) (stats_mask) (n_shared_shapers)" 1131 " [(shared_shaper_id_0) (shared_shaper_id_1)...]\n" 1132 " Add port tm leaf node.\n\n" 1133 1134 "del port tm node (port_id) (node_id)\n" 1135 " Delete port tm node.\n\n" 1136 1137 "set port tm node parent (port_id) (node_id) (parent_node_id)" 1138 " (priority) (weight)\n" 1139 " Set port tm node parent.\n\n" 1140 1141 "suspend port tm node (port_id) (node_id)" 1142 " Suspend tm node.\n\n" 1143 1144 "resume port tm node (port_id) (node_id)" 1145 " Resume tm node.\n\n" 1146 1147 "port tm hierarchy commit (port_id) (clean_on_fail)\n" 1148 " Commit tm hierarchy.\n\n" 1149 1150 "set port tm mark ip_ecn (port) (green) (yellow)" 1151 " (red)\n" 1152 " Enables/Disables the traffic management marking" 1153 " for IP ECN (Explicit Congestion Notification)" 1154 " packets on a given port\n\n" 1155 1156 "set port tm mark ip_dscp (port) (green) (yellow)" 1157 " (red)\n" 1158 " Enables/Disables the traffic management marking" 1159 " on the port for IP dscp packets\n\n" 1160 1161 "set port tm mark vlan_dei (port) (green) (yellow)" 1162 " (red)\n" 1163 " Enables/Disables the traffic management marking" 1164 " on the port for VLAN packets with DEI enabled\n\n" 1165 ); 1166 } 1167 1168 if (show_all || !strcmp(res->section, "devices")) { 1169 cmdline_printf( 1170 cl, 1171 "\n" 1172 "Device Operations:\n" 1173 "--------------\n" 1174 "device detach (identifier)\n" 1175 " Detach device by identifier.\n\n" 1176 ); 1177 } 1178 1179 } 1180 1181 cmdline_parse_token_string_t cmd_help_long_help = 1182 TOKEN_STRING_INITIALIZER(struct cmd_help_long_result, help, "help"); 1183 1184 cmdline_parse_token_string_t cmd_help_long_section = 1185 TOKEN_STRING_INITIALIZER(struct cmd_help_long_result, section, 1186 "all#control#display#config#" 1187 "ports#registers#filters#traffic_management#devices"); 1188 1189 cmdline_parse_inst_t cmd_help_long = { 1190 .f = cmd_help_long_parsed, 1191 .data = NULL, 1192 .help_str = "help all|control|display|config|ports|register|" 1193 "filters|traffic_management|devices: " 1194 "Show help", 1195 .tokens = { 1196 (void *)&cmd_help_long_help, 1197 (void *)&cmd_help_long_section, 1198 NULL, 1199 }, 1200 }; 1201 1202 1203 /* *** start/stop/close all ports *** */ 1204 struct cmd_operate_port_result { 1205 cmdline_fixed_string_t keyword; 1206 cmdline_fixed_string_t name; 1207 cmdline_fixed_string_t value; 1208 }; 1209 1210 static void cmd_operate_port_parsed(void *parsed_result, 1211 __rte_unused struct cmdline *cl, 1212 __rte_unused void *data) 1213 { 1214 struct cmd_operate_port_result *res = parsed_result; 1215 1216 if (!strcmp(res->name, "start")) 1217 start_port(RTE_PORT_ALL); 1218 else if (!strcmp(res->name, "stop")) 1219 stop_port(RTE_PORT_ALL); 1220 else if (!strcmp(res->name, "close")) 1221 close_port(RTE_PORT_ALL); 1222 else if (!strcmp(res->name, "reset")) 1223 reset_port(RTE_PORT_ALL); 1224 else 1225 printf("Unknown parameter\n"); 1226 } 1227 1228 cmdline_parse_token_string_t cmd_operate_port_all_cmd = 1229 TOKEN_STRING_INITIALIZER(struct cmd_operate_port_result, keyword, 1230 "port"); 1231 cmdline_parse_token_string_t cmd_operate_port_all_port = 1232 TOKEN_STRING_INITIALIZER(struct cmd_operate_port_result, name, 1233 "start#stop#close#reset"); 1234 cmdline_parse_token_string_t cmd_operate_port_all_all = 1235 TOKEN_STRING_INITIALIZER(struct cmd_operate_port_result, value, "all"); 1236 1237 cmdline_parse_inst_t cmd_operate_port = { 1238 .f = cmd_operate_port_parsed, 1239 .data = NULL, 1240 .help_str = "port start|stop|close all: Start/Stop/Close/Reset all ports", 1241 .tokens = { 1242 (void *)&cmd_operate_port_all_cmd, 1243 (void *)&cmd_operate_port_all_port, 1244 (void *)&cmd_operate_port_all_all, 1245 NULL, 1246 }, 1247 }; 1248 1249 /* *** start/stop/close specific port *** */ 1250 struct cmd_operate_specific_port_result { 1251 cmdline_fixed_string_t keyword; 1252 cmdline_fixed_string_t name; 1253 uint8_t value; 1254 }; 1255 1256 static void cmd_operate_specific_port_parsed(void *parsed_result, 1257 __rte_unused struct cmdline *cl, 1258 __rte_unused void *data) 1259 { 1260 struct cmd_operate_specific_port_result *res = parsed_result; 1261 1262 if (!strcmp(res->name, "start")) 1263 start_port(res->value); 1264 else if (!strcmp(res->name, "stop")) 1265 stop_port(res->value); 1266 else if (!strcmp(res->name, "close")) 1267 close_port(res->value); 1268 else if (!strcmp(res->name, "reset")) 1269 reset_port(res->value); 1270 else 1271 printf("Unknown parameter\n"); 1272 } 1273 1274 cmdline_parse_token_string_t cmd_operate_specific_port_cmd = 1275 TOKEN_STRING_INITIALIZER(struct cmd_operate_specific_port_result, 1276 keyword, "port"); 1277 cmdline_parse_token_string_t cmd_operate_specific_port_port = 1278 TOKEN_STRING_INITIALIZER(struct cmd_operate_specific_port_result, 1279 name, "start#stop#close#reset"); 1280 cmdline_parse_token_num_t cmd_operate_specific_port_id = 1281 TOKEN_NUM_INITIALIZER(struct cmd_operate_specific_port_result, 1282 value, RTE_UINT8); 1283 1284 cmdline_parse_inst_t cmd_operate_specific_port = { 1285 .f = cmd_operate_specific_port_parsed, 1286 .data = NULL, 1287 .help_str = "port start|stop|close <port_id>: Start/Stop/Close/Reset port_id", 1288 .tokens = { 1289 (void *)&cmd_operate_specific_port_cmd, 1290 (void *)&cmd_operate_specific_port_port, 1291 (void *)&cmd_operate_specific_port_id, 1292 NULL, 1293 }, 1294 }; 1295 1296 /* *** enable port setup (after attach) via iterator or event *** */ 1297 struct cmd_set_port_setup_on_result { 1298 cmdline_fixed_string_t set; 1299 cmdline_fixed_string_t port; 1300 cmdline_fixed_string_t setup; 1301 cmdline_fixed_string_t on; 1302 cmdline_fixed_string_t mode; 1303 }; 1304 1305 static void cmd_set_port_setup_on_parsed(void *parsed_result, 1306 __rte_unused struct cmdline *cl, 1307 __rte_unused void *data) 1308 { 1309 struct cmd_set_port_setup_on_result *res = parsed_result; 1310 1311 if (strcmp(res->mode, "event") == 0) 1312 setup_on_probe_event = true; 1313 else if (strcmp(res->mode, "iterator") == 0) 1314 setup_on_probe_event = false; 1315 else 1316 printf("Unknown mode\n"); 1317 } 1318 1319 cmdline_parse_token_string_t cmd_set_port_setup_on_set = 1320 TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result, 1321 set, "set"); 1322 cmdline_parse_token_string_t cmd_set_port_setup_on_port = 1323 TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result, 1324 port, "port"); 1325 cmdline_parse_token_string_t cmd_set_port_setup_on_setup = 1326 TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result, 1327 setup, "setup"); 1328 cmdline_parse_token_string_t cmd_set_port_setup_on_on = 1329 TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result, 1330 on, "on"); 1331 cmdline_parse_token_string_t cmd_set_port_setup_on_mode = 1332 TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result, 1333 mode, "iterator#event"); 1334 1335 cmdline_parse_inst_t cmd_set_port_setup_on = { 1336 .f = cmd_set_port_setup_on_parsed, 1337 .data = NULL, 1338 .help_str = "set port setup on iterator|event", 1339 .tokens = { 1340 (void *)&cmd_set_port_setup_on_set, 1341 (void *)&cmd_set_port_setup_on_port, 1342 (void *)&cmd_set_port_setup_on_setup, 1343 (void *)&cmd_set_port_setup_on_on, 1344 (void *)&cmd_set_port_setup_on_mode, 1345 NULL, 1346 }, 1347 }; 1348 1349 /* *** attach a specified port *** */ 1350 struct cmd_operate_attach_port_result { 1351 cmdline_fixed_string_t port; 1352 cmdline_fixed_string_t keyword; 1353 cmdline_multi_string_t identifier; 1354 }; 1355 1356 static void cmd_operate_attach_port_parsed(void *parsed_result, 1357 __rte_unused struct cmdline *cl, 1358 __rte_unused void *data) 1359 { 1360 struct cmd_operate_attach_port_result *res = parsed_result; 1361 1362 if (!strcmp(res->keyword, "attach")) 1363 attach_port(res->identifier); 1364 else 1365 printf("Unknown parameter\n"); 1366 } 1367 1368 cmdline_parse_token_string_t cmd_operate_attach_port_port = 1369 TOKEN_STRING_INITIALIZER(struct cmd_operate_attach_port_result, 1370 port, "port"); 1371 cmdline_parse_token_string_t cmd_operate_attach_port_keyword = 1372 TOKEN_STRING_INITIALIZER(struct cmd_operate_attach_port_result, 1373 keyword, "attach"); 1374 cmdline_parse_token_string_t cmd_operate_attach_port_identifier = 1375 TOKEN_STRING_INITIALIZER(struct cmd_operate_attach_port_result, 1376 identifier, TOKEN_STRING_MULTI); 1377 1378 cmdline_parse_inst_t cmd_operate_attach_port = { 1379 .f = cmd_operate_attach_port_parsed, 1380 .data = NULL, 1381 .help_str = "port attach <identifier>: " 1382 "(identifier: pci address or virtual dev name)", 1383 .tokens = { 1384 (void *)&cmd_operate_attach_port_port, 1385 (void *)&cmd_operate_attach_port_keyword, 1386 (void *)&cmd_operate_attach_port_identifier, 1387 NULL, 1388 }, 1389 }; 1390 1391 /* *** detach a specified port *** */ 1392 struct cmd_operate_detach_port_result { 1393 cmdline_fixed_string_t port; 1394 cmdline_fixed_string_t keyword; 1395 portid_t port_id; 1396 }; 1397 1398 static void cmd_operate_detach_port_parsed(void *parsed_result, 1399 __rte_unused struct cmdline *cl, 1400 __rte_unused void *data) 1401 { 1402 struct cmd_operate_detach_port_result *res = parsed_result; 1403 1404 if (!strcmp(res->keyword, "detach")) { 1405 RTE_ETH_VALID_PORTID_OR_RET(res->port_id); 1406 detach_port_device(res->port_id); 1407 } else { 1408 printf("Unknown parameter\n"); 1409 } 1410 } 1411 1412 cmdline_parse_token_string_t cmd_operate_detach_port_port = 1413 TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_port_result, 1414 port, "port"); 1415 cmdline_parse_token_string_t cmd_operate_detach_port_keyword = 1416 TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_port_result, 1417 keyword, "detach"); 1418 cmdline_parse_token_num_t cmd_operate_detach_port_port_id = 1419 TOKEN_NUM_INITIALIZER(struct cmd_operate_detach_port_result, 1420 port_id, RTE_UINT16); 1421 1422 cmdline_parse_inst_t cmd_operate_detach_port = { 1423 .f = cmd_operate_detach_port_parsed, 1424 .data = NULL, 1425 .help_str = "port detach <port_id>", 1426 .tokens = { 1427 (void *)&cmd_operate_detach_port_port, 1428 (void *)&cmd_operate_detach_port_keyword, 1429 (void *)&cmd_operate_detach_port_port_id, 1430 NULL, 1431 }, 1432 }; 1433 1434 /* *** detach device by identifier *** */ 1435 struct cmd_operate_detach_device_result { 1436 cmdline_fixed_string_t device; 1437 cmdline_fixed_string_t keyword; 1438 cmdline_fixed_string_t identifier; 1439 }; 1440 1441 static void cmd_operate_detach_device_parsed(void *parsed_result, 1442 __rte_unused struct cmdline *cl, 1443 __rte_unused void *data) 1444 { 1445 struct cmd_operate_detach_device_result *res = parsed_result; 1446 1447 if (!strcmp(res->keyword, "detach")) 1448 detach_devargs(res->identifier); 1449 else 1450 printf("Unknown parameter\n"); 1451 } 1452 1453 cmdline_parse_token_string_t cmd_operate_detach_device_device = 1454 TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_device_result, 1455 device, "device"); 1456 cmdline_parse_token_string_t cmd_operate_detach_device_keyword = 1457 TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_device_result, 1458 keyword, "detach"); 1459 cmdline_parse_token_string_t cmd_operate_detach_device_identifier = 1460 TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_device_result, 1461 identifier, NULL); 1462 1463 cmdline_parse_inst_t cmd_operate_detach_device = { 1464 .f = cmd_operate_detach_device_parsed, 1465 .data = NULL, 1466 .help_str = "device detach <identifier>:" 1467 "(identifier: pci address or virtual dev name)", 1468 .tokens = { 1469 (void *)&cmd_operate_detach_device_device, 1470 (void *)&cmd_operate_detach_device_keyword, 1471 (void *)&cmd_operate_detach_device_identifier, 1472 NULL, 1473 }, 1474 }; 1475 /* *** configure speed for all ports *** */ 1476 struct cmd_config_speed_all { 1477 cmdline_fixed_string_t port; 1478 cmdline_fixed_string_t keyword; 1479 cmdline_fixed_string_t all; 1480 cmdline_fixed_string_t item1; 1481 cmdline_fixed_string_t item2; 1482 cmdline_fixed_string_t value1; 1483 cmdline_fixed_string_t value2; 1484 }; 1485 1486 static int 1487 parse_and_check_speed_duplex(char *speedstr, char *duplexstr, uint32_t *speed) 1488 { 1489 1490 int duplex; 1491 1492 if (!strcmp(duplexstr, "half")) { 1493 duplex = ETH_LINK_HALF_DUPLEX; 1494 } else if (!strcmp(duplexstr, "full")) { 1495 duplex = ETH_LINK_FULL_DUPLEX; 1496 } else if (!strcmp(duplexstr, "auto")) { 1497 duplex = ETH_LINK_FULL_DUPLEX; 1498 } else { 1499 printf("Unknown duplex parameter\n"); 1500 return -1; 1501 } 1502 1503 if (!strcmp(speedstr, "10")) { 1504 *speed = (duplex == ETH_LINK_HALF_DUPLEX) ? 1505 ETH_LINK_SPEED_10M_HD : ETH_LINK_SPEED_10M; 1506 } else if (!strcmp(speedstr, "100")) { 1507 *speed = (duplex == ETH_LINK_HALF_DUPLEX) ? 1508 ETH_LINK_SPEED_100M_HD : ETH_LINK_SPEED_100M; 1509 } else { 1510 if (duplex != ETH_LINK_FULL_DUPLEX) { 1511 printf("Invalid speed/duplex parameters\n"); 1512 return -1; 1513 } 1514 if (!strcmp(speedstr, "1000")) { 1515 *speed = ETH_LINK_SPEED_1G; 1516 } else if (!strcmp(speedstr, "10000")) { 1517 *speed = ETH_LINK_SPEED_10G; 1518 } else if (!strcmp(speedstr, "25000")) { 1519 *speed = ETH_LINK_SPEED_25G; 1520 } else if (!strcmp(speedstr, "40000")) { 1521 *speed = ETH_LINK_SPEED_40G; 1522 } else if (!strcmp(speedstr, "50000")) { 1523 *speed = ETH_LINK_SPEED_50G; 1524 } else if (!strcmp(speedstr, "100000")) { 1525 *speed = ETH_LINK_SPEED_100G; 1526 } else if (!strcmp(speedstr, "200000")) { 1527 *speed = ETH_LINK_SPEED_200G; 1528 } else if (!strcmp(speedstr, "auto")) { 1529 *speed = ETH_LINK_SPEED_AUTONEG; 1530 } else { 1531 printf("Unknown speed parameter\n"); 1532 return -1; 1533 } 1534 } 1535 1536 if (*speed != ETH_LINK_SPEED_AUTONEG) 1537 *speed |= ETH_LINK_SPEED_FIXED; 1538 1539 return 0; 1540 } 1541 1542 static void 1543 cmd_config_speed_all_parsed(void *parsed_result, 1544 __rte_unused struct cmdline *cl, 1545 __rte_unused void *data) 1546 { 1547 struct cmd_config_speed_all *res = parsed_result; 1548 uint32_t link_speed; 1549 portid_t pid; 1550 1551 if (!all_ports_stopped()) { 1552 printf("Please stop all ports first\n"); 1553 return; 1554 } 1555 1556 if (parse_and_check_speed_duplex(res->value1, res->value2, 1557 &link_speed) < 0) 1558 return; 1559 1560 RTE_ETH_FOREACH_DEV(pid) { 1561 ports[pid].dev_conf.link_speeds = link_speed; 1562 } 1563 1564 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 1565 } 1566 1567 cmdline_parse_token_string_t cmd_config_speed_all_port = 1568 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, port, "port"); 1569 cmdline_parse_token_string_t cmd_config_speed_all_keyword = 1570 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, keyword, 1571 "config"); 1572 cmdline_parse_token_string_t cmd_config_speed_all_all = 1573 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, all, "all"); 1574 cmdline_parse_token_string_t cmd_config_speed_all_item1 = 1575 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, item1, "speed"); 1576 cmdline_parse_token_string_t cmd_config_speed_all_value1 = 1577 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, value1, 1578 "10#100#1000#10000#25000#40000#50000#100000#200000#auto"); 1579 cmdline_parse_token_string_t cmd_config_speed_all_item2 = 1580 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, item2, "duplex"); 1581 cmdline_parse_token_string_t cmd_config_speed_all_value2 = 1582 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, value2, 1583 "half#full#auto"); 1584 1585 cmdline_parse_inst_t cmd_config_speed_all = { 1586 .f = cmd_config_speed_all_parsed, 1587 .data = NULL, 1588 .help_str = "port config all speed " 1589 "10|100|1000|10000|25000|40000|50000|100000|200000|auto duplex " 1590 "half|full|auto", 1591 .tokens = { 1592 (void *)&cmd_config_speed_all_port, 1593 (void *)&cmd_config_speed_all_keyword, 1594 (void *)&cmd_config_speed_all_all, 1595 (void *)&cmd_config_speed_all_item1, 1596 (void *)&cmd_config_speed_all_value1, 1597 (void *)&cmd_config_speed_all_item2, 1598 (void *)&cmd_config_speed_all_value2, 1599 NULL, 1600 }, 1601 }; 1602 1603 /* *** configure speed for specific port *** */ 1604 struct cmd_config_speed_specific { 1605 cmdline_fixed_string_t port; 1606 cmdline_fixed_string_t keyword; 1607 portid_t id; 1608 cmdline_fixed_string_t item1; 1609 cmdline_fixed_string_t item2; 1610 cmdline_fixed_string_t value1; 1611 cmdline_fixed_string_t value2; 1612 }; 1613 1614 static void 1615 cmd_config_speed_specific_parsed(void *parsed_result, 1616 __rte_unused struct cmdline *cl, 1617 __rte_unused void *data) 1618 { 1619 struct cmd_config_speed_specific *res = parsed_result; 1620 uint32_t link_speed; 1621 1622 if (port_id_is_invalid(res->id, ENABLED_WARN)) 1623 return; 1624 1625 if (!port_is_stopped(res->id)) { 1626 printf("Please stop port %d first\n", res->id); 1627 return; 1628 } 1629 1630 if (parse_and_check_speed_duplex(res->value1, res->value2, 1631 &link_speed) < 0) 1632 return; 1633 1634 ports[res->id].dev_conf.link_speeds = link_speed; 1635 1636 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 1637 } 1638 1639 1640 cmdline_parse_token_string_t cmd_config_speed_specific_port = 1641 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, port, 1642 "port"); 1643 cmdline_parse_token_string_t cmd_config_speed_specific_keyword = 1644 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, keyword, 1645 "config"); 1646 cmdline_parse_token_num_t cmd_config_speed_specific_id = 1647 TOKEN_NUM_INITIALIZER(struct cmd_config_speed_specific, id, RTE_UINT16); 1648 cmdline_parse_token_string_t cmd_config_speed_specific_item1 = 1649 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, item1, 1650 "speed"); 1651 cmdline_parse_token_string_t cmd_config_speed_specific_value1 = 1652 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, value1, 1653 "10#100#1000#10000#25000#40000#50000#100000#200000#auto"); 1654 cmdline_parse_token_string_t cmd_config_speed_specific_item2 = 1655 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, item2, 1656 "duplex"); 1657 cmdline_parse_token_string_t cmd_config_speed_specific_value2 = 1658 TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, value2, 1659 "half#full#auto"); 1660 1661 cmdline_parse_inst_t cmd_config_speed_specific = { 1662 .f = cmd_config_speed_specific_parsed, 1663 .data = NULL, 1664 .help_str = "port config <port_id> speed " 1665 "10|100|1000|10000|25000|40000|50000|100000|200000|auto duplex " 1666 "half|full|auto", 1667 .tokens = { 1668 (void *)&cmd_config_speed_specific_port, 1669 (void *)&cmd_config_speed_specific_keyword, 1670 (void *)&cmd_config_speed_specific_id, 1671 (void *)&cmd_config_speed_specific_item1, 1672 (void *)&cmd_config_speed_specific_value1, 1673 (void *)&cmd_config_speed_specific_item2, 1674 (void *)&cmd_config_speed_specific_value2, 1675 NULL, 1676 }, 1677 }; 1678 1679 /* *** configure loopback for all ports *** */ 1680 struct cmd_config_loopback_all { 1681 cmdline_fixed_string_t port; 1682 cmdline_fixed_string_t keyword; 1683 cmdline_fixed_string_t all; 1684 cmdline_fixed_string_t item; 1685 uint32_t mode; 1686 }; 1687 1688 static void 1689 cmd_config_loopback_all_parsed(void *parsed_result, 1690 __rte_unused struct cmdline *cl, 1691 __rte_unused void *data) 1692 { 1693 struct cmd_config_loopback_all *res = parsed_result; 1694 portid_t pid; 1695 1696 if (!all_ports_stopped()) { 1697 printf("Please stop all ports first\n"); 1698 return; 1699 } 1700 1701 RTE_ETH_FOREACH_DEV(pid) { 1702 ports[pid].dev_conf.lpbk_mode = res->mode; 1703 } 1704 1705 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 1706 } 1707 1708 cmdline_parse_token_string_t cmd_config_loopback_all_port = 1709 TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_all, port, "port"); 1710 cmdline_parse_token_string_t cmd_config_loopback_all_keyword = 1711 TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_all, keyword, 1712 "config"); 1713 cmdline_parse_token_string_t cmd_config_loopback_all_all = 1714 TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_all, all, "all"); 1715 cmdline_parse_token_string_t cmd_config_loopback_all_item = 1716 TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_all, item, 1717 "loopback"); 1718 cmdline_parse_token_num_t cmd_config_loopback_all_mode = 1719 TOKEN_NUM_INITIALIZER(struct cmd_config_loopback_all, mode, RTE_UINT32); 1720 1721 cmdline_parse_inst_t cmd_config_loopback_all = { 1722 .f = cmd_config_loopback_all_parsed, 1723 .data = NULL, 1724 .help_str = "port config all loopback <mode>", 1725 .tokens = { 1726 (void *)&cmd_config_loopback_all_port, 1727 (void *)&cmd_config_loopback_all_keyword, 1728 (void *)&cmd_config_loopback_all_all, 1729 (void *)&cmd_config_loopback_all_item, 1730 (void *)&cmd_config_loopback_all_mode, 1731 NULL, 1732 }, 1733 }; 1734 1735 /* *** configure loopback for specific port *** */ 1736 struct cmd_config_loopback_specific { 1737 cmdline_fixed_string_t port; 1738 cmdline_fixed_string_t keyword; 1739 uint16_t port_id; 1740 cmdline_fixed_string_t item; 1741 uint32_t mode; 1742 }; 1743 1744 static void 1745 cmd_config_loopback_specific_parsed(void *parsed_result, 1746 __rte_unused struct cmdline *cl, 1747 __rte_unused void *data) 1748 { 1749 struct cmd_config_loopback_specific *res = parsed_result; 1750 1751 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 1752 return; 1753 1754 if (!port_is_stopped(res->port_id)) { 1755 printf("Please stop port %u first\n", res->port_id); 1756 return; 1757 } 1758 1759 ports[res->port_id].dev_conf.lpbk_mode = res->mode; 1760 1761 cmd_reconfig_device_queue(res->port_id, 1, 1); 1762 } 1763 1764 1765 cmdline_parse_token_string_t cmd_config_loopback_specific_port = 1766 TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_specific, port, 1767 "port"); 1768 cmdline_parse_token_string_t cmd_config_loopback_specific_keyword = 1769 TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_specific, keyword, 1770 "config"); 1771 cmdline_parse_token_num_t cmd_config_loopback_specific_id = 1772 TOKEN_NUM_INITIALIZER(struct cmd_config_loopback_specific, port_id, 1773 RTE_UINT16); 1774 cmdline_parse_token_string_t cmd_config_loopback_specific_item = 1775 TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_specific, item, 1776 "loopback"); 1777 cmdline_parse_token_num_t cmd_config_loopback_specific_mode = 1778 TOKEN_NUM_INITIALIZER(struct cmd_config_loopback_specific, mode, 1779 RTE_UINT32); 1780 1781 cmdline_parse_inst_t cmd_config_loopback_specific = { 1782 .f = cmd_config_loopback_specific_parsed, 1783 .data = NULL, 1784 .help_str = "port config <port_id> loopback <mode>", 1785 .tokens = { 1786 (void *)&cmd_config_loopback_specific_port, 1787 (void *)&cmd_config_loopback_specific_keyword, 1788 (void *)&cmd_config_loopback_specific_id, 1789 (void *)&cmd_config_loopback_specific_item, 1790 (void *)&cmd_config_loopback_specific_mode, 1791 NULL, 1792 }, 1793 }; 1794 1795 /* *** configure txq/rxq, txd/rxd *** */ 1796 struct cmd_config_rx_tx { 1797 cmdline_fixed_string_t port; 1798 cmdline_fixed_string_t keyword; 1799 cmdline_fixed_string_t all; 1800 cmdline_fixed_string_t name; 1801 uint16_t value; 1802 }; 1803 1804 static void 1805 cmd_config_rx_tx_parsed(void *parsed_result, 1806 __rte_unused struct cmdline *cl, 1807 __rte_unused void *data) 1808 { 1809 struct cmd_config_rx_tx *res = parsed_result; 1810 1811 if (!all_ports_stopped()) { 1812 printf("Please stop all ports first\n"); 1813 return; 1814 } 1815 if (!strcmp(res->name, "rxq")) { 1816 if (!res->value && !nb_txq) { 1817 printf("Warning: Either rx or tx queues should be non zero\n"); 1818 return; 1819 } 1820 if (check_nb_rxq(res->value) != 0) 1821 return; 1822 nb_rxq = res->value; 1823 } 1824 else if (!strcmp(res->name, "txq")) { 1825 if (!res->value && !nb_rxq) { 1826 printf("Warning: Either rx or tx queues should be non zero\n"); 1827 return; 1828 } 1829 if (check_nb_txq(res->value) != 0) 1830 return; 1831 nb_txq = res->value; 1832 } 1833 else if (!strcmp(res->name, "rxd")) { 1834 if (check_nb_rxd(res->value) != 0) 1835 return; 1836 nb_rxd = res->value; 1837 } else if (!strcmp(res->name, "txd")) { 1838 if (check_nb_txd(res->value) != 0) 1839 return; 1840 1841 nb_txd = res->value; 1842 } else { 1843 printf("Unknown parameter\n"); 1844 return; 1845 } 1846 1847 fwd_config_setup(); 1848 1849 init_port_config(); 1850 1851 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 1852 } 1853 1854 cmdline_parse_token_string_t cmd_config_rx_tx_port = 1855 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_tx, port, "port"); 1856 cmdline_parse_token_string_t cmd_config_rx_tx_keyword = 1857 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_tx, keyword, "config"); 1858 cmdline_parse_token_string_t cmd_config_rx_tx_all = 1859 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_tx, all, "all"); 1860 cmdline_parse_token_string_t cmd_config_rx_tx_name = 1861 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_tx, name, 1862 "rxq#txq#rxd#txd"); 1863 cmdline_parse_token_num_t cmd_config_rx_tx_value = 1864 TOKEN_NUM_INITIALIZER(struct cmd_config_rx_tx, value, RTE_UINT16); 1865 1866 cmdline_parse_inst_t cmd_config_rx_tx = { 1867 .f = cmd_config_rx_tx_parsed, 1868 .data = NULL, 1869 .help_str = "port config all rxq|txq|rxd|txd <value>", 1870 .tokens = { 1871 (void *)&cmd_config_rx_tx_port, 1872 (void *)&cmd_config_rx_tx_keyword, 1873 (void *)&cmd_config_rx_tx_all, 1874 (void *)&cmd_config_rx_tx_name, 1875 (void *)&cmd_config_rx_tx_value, 1876 NULL, 1877 }, 1878 }; 1879 1880 /* *** config max packet length *** */ 1881 struct cmd_config_max_pkt_len_result { 1882 cmdline_fixed_string_t port; 1883 cmdline_fixed_string_t keyword; 1884 cmdline_fixed_string_t all; 1885 cmdline_fixed_string_t name; 1886 uint32_t value; 1887 }; 1888 1889 static void 1890 cmd_config_max_pkt_len_parsed(void *parsed_result, 1891 __rte_unused struct cmdline *cl, 1892 __rte_unused void *data) 1893 { 1894 struct cmd_config_max_pkt_len_result *res = parsed_result; 1895 uint32_t max_rx_pkt_len_backup = 0; 1896 portid_t pid; 1897 int ret; 1898 1899 if (!all_ports_stopped()) { 1900 printf("Please stop all ports first\n"); 1901 return; 1902 } 1903 1904 RTE_ETH_FOREACH_DEV(pid) { 1905 struct rte_port *port = &ports[pid]; 1906 1907 if (!strcmp(res->name, "max-pkt-len")) { 1908 if (res->value < RTE_ETHER_MIN_LEN) { 1909 printf("max-pkt-len can not be less than %d\n", 1910 RTE_ETHER_MIN_LEN); 1911 return; 1912 } 1913 if (res->value == port->dev_conf.rxmode.max_rx_pkt_len) 1914 return; 1915 1916 ret = eth_dev_info_get_print_err(pid, &port->dev_info); 1917 if (ret != 0) { 1918 printf("rte_eth_dev_info_get() failed for port %u\n", 1919 pid); 1920 return; 1921 } 1922 1923 max_rx_pkt_len_backup = port->dev_conf.rxmode.max_rx_pkt_len; 1924 1925 port->dev_conf.rxmode.max_rx_pkt_len = res->value; 1926 if (update_jumbo_frame_offload(pid) != 0) 1927 port->dev_conf.rxmode.max_rx_pkt_len = max_rx_pkt_len_backup; 1928 } else { 1929 printf("Unknown parameter\n"); 1930 return; 1931 } 1932 } 1933 1934 init_port_config(); 1935 1936 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 1937 } 1938 1939 cmdline_parse_token_string_t cmd_config_max_pkt_len_port = 1940 TOKEN_STRING_INITIALIZER(struct cmd_config_max_pkt_len_result, port, 1941 "port"); 1942 cmdline_parse_token_string_t cmd_config_max_pkt_len_keyword = 1943 TOKEN_STRING_INITIALIZER(struct cmd_config_max_pkt_len_result, keyword, 1944 "config"); 1945 cmdline_parse_token_string_t cmd_config_max_pkt_len_all = 1946 TOKEN_STRING_INITIALIZER(struct cmd_config_max_pkt_len_result, all, 1947 "all"); 1948 cmdline_parse_token_string_t cmd_config_max_pkt_len_name = 1949 TOKEN_STRING_INITIALIZER(struct cmd_config_max_pkt_len_result, name, 1950 "max-pkt-len"); 1951 cmdline_parse_token_num_t cmd_config_max_pkt_len_value = 1952 TOKEN_NUM_INITIALIZER(struct cmd_config_max_pkt_len_result, value, 1953 RTE_UINT32); 1954 1955 cmdline_parse_inst_t cmd_config_max_pkt_len = { 1956 .f = cmd_config_max_pkt_len_parsed, 1957 .data = NULL, 1958 .help_str = "port config all max-pkt-len <value>", 1959 .tokens = { 1960 (void *)&cmd_config_max_pkt_len_port, 1961 (void *)&cmd_config_max_pkt_len_keyword, 1962 (void *)&cmd_config_max_pkt_len_all, 1963 (void *)&cmd_config_max_pkt_len_name, 1964 (void *)&cmd_config_max_pkt_len_value, 1965 NULL, 1966 }, 1967 }; 1968 1969 /* *** config max LRO aggregated packet size *** */ 1970 struct cmd_config_max_lro_pkt_size_result { 1971 cmdline_fixed_string_t port; 1972 cmdline_fixed_string_t keyword; 1973 cmdline_fixed_string_t all; 1974 cmdline_fixed_string_t name; 1975 uint32_t value; 1976 }; 1977 1978 static void 1979 cmd_config_max_lro_pkt_size_parsed(void *parsed_result, 1980 __rte_unused struct cmdline *cl, 1981 __rte_unused void *data) 1982 { 1983 struct cmd_config_max_lro_pkt_size_result *res = parsed_result; 1984 portid_t pid; 1985 1986 if (!all_ports_stopped()) { 1987 printf("Please stop all ports first\n"); 1988 return; 1989 } 1990 1991 RTE_ETH_FOREACH_DEV(pid) { 1992 struct rte_port *port = &ports[pid]; 1993 1994 if (!strcmp(res->name, "max-lro-pkt-size")) { 1995 if (res->value == 1996 port->dev_conf.rxmode.max_lro_pkt_size) 1997 return; 1998 1999 port->dev_conf.rxmode.max_lro_pkt_size = res->value; 2000 } else { 2001 printf("Unknown parameter\n"); 2002 return; 2003 } 2004 } 2005 2006 init_port_config(); 2007 2008 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 2009 } 2010 2011 cmdline_parse_token_string_t cmd_config_max_lro_pkt_size_port = 2012 TOKEN_STRING_INITIALIZER(struct cmd_config_max_lro_pkt_size_result, 2013 port, "port"); 2014 cmdline_parse_token_string_t cmd_config_max_lro_pkt_size_keyword = 2015 TOKEN_STRING_INITIALIZER(struct cmd_config_max_lro_pkt_size_result, 2016 keyword, "config"); 2017 cmdline_parse_token_string_t cmd_config_max_lro_pkt_size_all = 2018 TOKEN_STRING_INITIALIZER(struct cmd_config_max_lro_pkt_size_result, 2019 all, "all"); 2020 cmdline_parse_token_string_t cmd_config_max_lro_pkt_size_name = 2021 TOKEN_STRING_INITIALIZER(struct cmd_config_max_lro_pkt_size_result, 2022 name, "max-lro-pkt-size"); 2023 cmdline_parse_token_num_t cmd_config_max_lro_pkt_size_value = 2024 TOKEN_NUM_INITIALIZER(struct cmd_config_max_lro_pkt_size_result, 2025 value, RTE_UINT32); 2026 2027 cmdline_parse_inst_t cmd_config_max_lro_pkt_size = { 2028 .f = cmd_config_max_lro_pkt_size_parsed, 2029 .data = NULL, 2030 .help_str = "port config all max-lro-pkt-size <value>", 2031 .tokens = { 2032 (void *)&cmd_config_max_lro_pkt_size_port, 2033 (void *)&cmd_config_max_lro_pkt_size_keyword, 2034 (void *)&cmd_config_max_lro_pkt_size_all, 2035 (void *)&cmd_config_max_lro_pkt_size_name, 2036 (void *)&cmd_config_max_lro_pkt_size_value, 2037 NULL, 2038 }, 2039 }; 2040 2041 /* *** configure port MTU *** */ 2042 struct cmd_config_mtu_result { 2043 cmdline_fixed_string_t port; 2044 cmdline_fixed_string_t keyword; 2045 cmdline_fixed_string_t mtu; 2046 portid_t port_id; 2047 uint16_t value; 2048 }; 2049 2050 static void 2051 cmd_config_mtu_parsed(void *parsed_result, 2052 __rte_unused struct cmdline *cl, 2053 __rte_unused void *data) 2054 { 2055 struct cmd_config_mtu_result *res = parsed_result; 2056 2057 if (res->value < RTE_ETHER_MIN_LEN) { 2058 printf("mtu cannot be less than %d\n", RTE_ETHER_MIN_LEN); 2059 return; 2060 } 2061 port_mtu_set(res->port_id, res->value); 2062 } 2063 2064 cmdline_parse_token_string_t cmd_config_mtu_port = 2065 TOKEN_STRING_INITIALIZER(struct cmd_config_mtu_result, port, 2066 "port"); 2067 cmdline_parse_token_string_t cmd_config_mtu_keyword = 2068 TOKEN_STRING_INITIALIZER(struct cmd_config_mtu_result, keyword, 2069 "config"); 2070 cmdline_parse_token_string_t cmd_config_mtu_mtu = 2071 TOKEN_STRING_INITIALIZER(struct cmd_config_mtu_result, keyword, 2072 "mtu"); 2073 cmdline_parse_token_num_t cmd_config_mtu_port_id = 2074 TOKEN_NUM_INITIALIZER(struct cmd_config_mtu_result, port_id, 2075 RTE_UINT16); 2076 cmdline_parse_token_num_t cmd_config_mtu_value = 2077 TOKEN_NUM_INITIALIZER(struct cmd_config_mtu_result, value, 2078 RTE_UINT16); 2079 2080 cmdline_parse_inst_t cmd_config_mtu = { 2081 .f = cmd_config_mtu_parsed, 2082 .data = NULL, 2083 .help_str = "port config mtu <port_id> <value>", 2084 .tokens = { 2085 (void *)&cmd_config_mtu_port, 2086 (void *)&cmd_config_mtu_keyword, 2087 (void *)&cmd_config_mtu_mtu, 2088 (void *)&cmd_config_mtu_port_id, 2089 (void *)&cmd_config_mtu_value, 2090 NULL, 2091 }, 2092 }; 2093 2094 /* *** configure rx mode *** */ 2095 struct cmd_config_rx_mode_flag { 2096 cmdline_fixed_string_t port; 2097 cmdline_fixed_string_t keyword; 2098 cmdline_fixed_string_t all; 2099 cmdline_fixed_string_t name; 2100 cmdline_fixed_string_t value; 2101 }; 2102 2103 static void 2104 cmd_config_rx_mode_flag_parsed(void *parsed_result, 2105 __rte_unused struct cmdline *cl, 2106 __rte_unused void *data) 2107 { 2108 struct cmd_config_rx_mode_flag *res = parsed_result; 2109 2110 if (!all_ports_stopped()) { 2111 printf("Please stop all ports first\n"); 2112 return; 2113 } 2114 2115 if (!strcmp(res->name, "drop-en")) { 2116 if (!strcmp(res->value, "on")) 2117 rx_drop_en = 1; 2118 else if (!strcmp(res->value, "off")) 2119 rx_drop_en = 0; 2120 else { 2121 printf("Unknown parameter\n"); 2122 return; 2123 } 2124 } else { 2125 printf("Unknown parameter\n"); 2126 return; 2127 } 2128 2129 init_port_config(); 2130 2131 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 2132 } 2133 2134 cmdline_parse_token_string_t cmd_config_rx_mode_flag_port = 2135 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, port, "port"); 2136 cmdline_parse_token_string_t cmd_config_rx_mode_flag_keyword = 2137 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, keyword, 2138 "config"); 2139 cmdline_parse_token_string_t cmd_config_rx_mode_flag_all = 2140 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, all, "all"); 2141 cmdline_parse_token_string_t cmd_config_rx_mode_flag_name = 2142 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, name, 2143 "drop-en"); 2144 cmdline_parse_token_string_t cmd_config_rx_mode_flag_value = 2145 TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, value, 2146 "on#off"); 2147 2148 cmdline_parse_inst_t cmd_config_rx_mode_flag = { 2149 .f = cmd_config_rx_mode_flag_parsed, 2150 .data = NULL, 2151 .help_str = "port config all drop-en on|off", 2152 .tokens = { 2153 (void *)&cmd_config_rx_mode_flag_port, 2154 (void *)&cmd_config_rx_mode_flag_keyword, 2155 (void *)&cmd_config_rx_mode_flag_all, 2156 (void *)&cmd_config_rx_mode_flag_name, 2157 (void *)&cmd_config_rx_mode_flag_value, 2158 NULL, 2159 }, 2160 }; 2161 2162 /* *** configure rss *** */ 2163 struct cmd_config_rss { 2164 cmdline_fixed_string_t port; 2165 cmdline_fixed_string_t keyword; 2166 cmdline_fixed_string_t all; 2167 cmdline_fixed_string_t name; 2168 cmdline_fixed_string_t value; 2169 }; 2170 2171 static void 2172 cmd_config_rss_parsed(void *parsed_result, 2173 __rte_unused struct cmdline *cl, 2174 __rte_unused void *data) 2175 { 2176 struct cmd_config_rss *res = parsed_result; 2177 struct rte_eth_rss_conf rss_conf = { .rss_key_len = 0, }; 2178 struct rte_eth_dev_info dev_info = { .flow_type_rss_offloads = 0, }; 2179 int use_default = 0; 2180 int all_updated = 1; 2181 int diag; 2182 uint16_t i; 2183 int ret; 2184 2185 if (!strcmp(res->value, "all")) 2186 rss_conf.rss_hf = ETH_RSS_ETH | ETH_RSS_VLAN | ETH_RSS_IP | 2187 ETH_RSS_TCP | ETH_RSS_UDP | ETH_RSS_SCTP | 2188 ETH_RSS_L2_PAYLOAD | ETH_RSS_L2TPV3 | ETH_RSS_ESP | 2189 ETH_RSS_AH | ETH_RSS_PFCP | ETH_RSS_GTPU | 2190 ETH_RSS_ECPRI; 2191 else if (!strcmp(res->value, "eth")) 2192 rss_conf.rss_hf = ETH_RSS_ETH; 2193 else if (!strcmp(res->value, "vlan")) 2194 rss_conf.rss_hf = ETH_RSS_VLAN; 2195 else if (!strcmp(res->value, "ip")) 2196 rss_conf.rss_hf = ETH_RSS_IP; 2197 else if (!strcmp(res->value, "udp")) 2198 rss_conf.rss_hf = ETH_RSS_UDP; 2199 else if (!strcmp(res->value, "tcp")) 2200 rss_conf.rss_hf = ETH_RSS_TCP; 2201 else if (!strcmp(res->value, "sctp")) 2202 rss_conf.rss_hf = ETH_RSS_SCTP; 2203 else if (!strcmp(res->value, "ether")) 2204 rss_conf.rss_hf = ETH_RSS_L2_PAYLOAD; 2205 else if (!strcmp(res->value, "port")) 2206 rss_conf.rss_hf = ETH_RSS_PORT; 2207 else if (!strcmp(res->value, "vxlan")) 2208 rss_conf.rss_hf = ETH_RSS_VXLAN; 2209 else if (!strcmp(res->value, "geneve")) 2210 rss_conf.rss_hf = ETH_RSS_GENEVE; 2211 else if (!strcmp(res->value, "nvgre")) 2212 rss_conf.rss_hf = ETH_RSS_NVGRE; 2213 else if (!strcmp(res->value, "l3-pre32")) 2214 rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE32; 2215 else if (!strcmp(res->value, "l3-pre40")) 2216 rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE40; 2217 else if (!strcmp(res->value, "l3-pre48")) 2218 rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE48; 2219 else if (!strcmp(res->value, "l3-pre56")) 2220 rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE56; 2221 else if (!strcmp(res->value, "l3-pre64")) 2222 rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE64; 2223 else if (!strcmp(res->value, "l3-pre96")) 2224 rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE96; 2225 else if (!strcmp(res->value, "l3-src-only")) 2226 rss_conf.rss_hf = ETH_RSS_L3_SRC_ONLY; 2227 else if (!strcmp(res->value, "l3-dst-only")) 2228 rss_conf.rss_hf = ETH_RSS_L3_DST_ONLY; 2229 else if (!strcmp(res->value, "l4-src-only")) 2230 rss_conf.rss_hf = ETH_RSS_L4_SRC_ONLY; 2231 else if (!strcmp(res->value, "l4-dst-only")) 2232 rss_conf.rss_hf = ETH_RSS_L4_DST_ONLY; 2233 else if (!strcmp(res->value, "l2-src-only")) 2234 rss_conf.rss_hf = ETH_RSS_L2_SRC_ONLY; 2235 else if (!strcmp(res->value, "l2-dst-only")) 2236 rss_conf.rss_hf = ETH_RSS_L2_DST_ONLY; 2237 else if (!strcmp(res->value, "l2tpv3")) 2238 rss_conf.rss_hf = ETH_RSS_L2TPV3; 2239 else if (!strcmp(res->value, "esp")) 2240 rss_conf.rss_hf = ETH_RSS_ESP; 2241 else if (!strcmp(res->value, "ah")) 2242 rss_conf.rss_hf = ETH_RSS_AH; 2243 else if (!strcmp(res->value, "pfcp")) 2244 rss_conf.rss_hf = ETH_RSS_PFCP; 2245 else if (!strcmp(res->value, "pppoe")) 2246 rss_conf.rss_hf = ETH_RSS_PPPOE; 2247 else if (!strcmp(res->value, "gtpu")) 2248 rss_conf.rss_hf = ETH_RSS_GTPU; 2249 else if (!strcmp(res->value, "ecpri")) 2250 rss_conf.rss_hf = ETH_RSS_ECPRI; 2251 else if (!strcmp(res->value, "mpls")) 2252 rss_conf.rss_hf = ETH_RSS_MPLS; 2253 else if (!strcmp(res->value, "none")) 2254 rss_conf.rss_hf = 0; 2255 else if (!strcmp(res->value, "level-default")) { 2256 rss_hf &= (~ETH_RSS_LEVEL_MASK); 2257 rss_conf.rss_hf = (rss_hf | ETH_RSS_LEVEL_PMD_DEFAULT); 2258 } else if (!strcmp(res->value, "level-outer")) { 2259 rss_hf &= (~ETH_RSS_LEVEL_MASK); 2260 rss_conf.rss_hf = (rss_hf | ETH_RSS_LEVEL_OUTERMOST); 2261 } else if (!strcmp(res->value, "level-inner")) { 2262 rss_hf &= (~ETH_RSS_LEVEL_MASK); 2263 rss_conf.rss_hf = (rss_hf | ETH_RSS_LEVEL_INNERMOST); 2264 } else if (!strcmp(res->value, "default")) 2265 use_default = 1; 2266 else if (isdigit(res->value[0]) && atoi(res->value) > 0 && 2267 atoi(res->value) < 64) 2268 rss_conf.rss_hf = 1ULL << atoi(res->value); 2269 else { 2270 printf("Unknown parameter\n"); 2271 return; 2272 } 2273 rss_conf.rss_key = NULL; 2274 /* Update global configuration for RSS types. */ 2275 RTE_ETH_FOREACH_DEV(i) { 2276 struct rte_eth_rss_conf local_rss_conf; 2277 2278 ret = eth_dev_info_get_print_err(i, &dev_info); 2279 if (ret != 0) 2280 return; 2281 2282 if (use_default) 2283 rss_conf.rss_hf = dev_info.flow_type_rss_offloads; 2284 2285 local_rss_conf = rss_conf; 2286 local_rss_conf.rss_hf = rss_conf.rss_hf & 2287 dev_info.flow_type_rss_offloads; 2288 if (local_rss_conf.rss_hf != rss_conf.rss_hf) { 2289 printf("Port %u modified RSS hash function based on hardware support," 2290 "requested:%#"PRIx64" configured:%#"PRIx64"\n", 2291 i, rss_conf.rss_hf, local_rss_conf.rss_hf); 2292 } 2293 diag = rte_eth_dev_rss_hash_update(i, &local_rss_conf); 2294 if (diag < 0) { 2295 all_updated = 0; 2296 printf("Configuration of RSS hash at ethernet port %d " 2297 "failed with error (%d): %s.\n", 2298 i, -diag, strerror(-diag)); 2299 } 2300 } 2301 if (all_updated && !use_default) { 2302 rss_hf = rss_conf.rss_hf; 2303 printf("rss_hf %#"PRIx64"\n", rss_hf); 2304 } 2305 } 2306 2307 cmdline_parse_token_string_t cmd_config_rss_port = 2308 TOKEN_STRING_INITIALIZER(struct cmd_config_rss, port, "port"); 2309 cmdline_parse_token_string_t cmd_config_rss_keyword = 2310 TOKEN_STRING_INITIALIZER(struct cmd_config_rss, keyword, "config"); 2311 cmdline_parse_token_string_t cmd_config_rss_all = 2312 TOKEN_STRING_INITIALIZER(struct cmd_config_rss, all, "all"); 2313 cmdline_parse_token_string_t cmd_config_rss_name = 2314 TOKEN_STRING_INITIALIZER(struct cmd_config_rss, name, "rss"); 2315 cmdline_parse_token_string_t cmd_config_rss_value = 2316 TOKEN_STRING_INITIALIZER(struct cmd_config_rss, value, NULL); 2317 2318 cmdline_parse_inst_t cmd_config_rss = { 2319 .f = cmd_config_rss_parsed, 2320 .data = NULL, 2321 .help_str = "port config all rss " 2322 "all|default|eth|vlan|ip|tcp|udp|sctp|ether|port|vxlan|geneve|" 2323 "nvgre|vxlan-gpe|l2tpv3|esp|ah|pfcp|ecpri|mpls|none|level-default|" 2324 "level-outer|level-inner|<flowtype_id>", 2325 .tokens = { 2326 (void *)&cmd_config_rss_port, 2327 (void *)&cmd_config_rss_keyword, 2328 (void *)&cmd_config_rss_all, 2329 (void *)&cmd_config_rss_name, 2330 (void *)&cmd_config_rss_value, 2331 NULL, 2332 }, 2333 }; 2334 2335 /* *** configure rss hash key *** */ 2336 struct cmd_config_rss_hash_key { 2337 cmdline_fixed_string_t port; 2338 cmdline_fixed_string_t config; 2339 portid_t port_id; 2340 cmdline_fixed_string_t rss_hash_key; 2341 cmdline_fixed_string_t rss_type; 2342 cmdline_fixed_string_t key; 2343 }; 2344 2345 static uint8_t 2346 hexa_digit_to_value(char hexa_digit) 2347 { 2348 if ((hexa_digit >= '0') && (hexa_digit <= '9')) 2349 return (uint8_t) (hexa_digit - '0'); 2350 if ((hexa_digit >= 'a') && (hexa_digit <= 'f')) 2351 return (uint8_t) ((hexa_digit - 'a') + 10); 2352 if ((hexa_digit >= 'A') && (hexa_digit <= 'F')) 2353 return (uint8_t) ((hexa_digit - 'A') + 10); 2354 /* Invalid hexa digit */ 2355 return 0xFF; 2356 } 2357 2358 static uint8_t 2359 parse_and_check_key_hexa_digit(char *key, int idx) 2360 { 2361 uint8_t hexa_v; 2362 2363 hexa_v = hexa_digit_to_value(key[idx]); 2364 if (hexa_v == 0xFF) 2365 printf("invalid key: character %c at position %d is not a " 2366 "valid hexa digit\n", key[idx], idx); 2367 return hexa_v; 2368 } 2369 2370 static void 2371 cmd_config_rss_hash_key_parsed(void *parsed_result, 2372 __rte_unused struct cmdline *cl, 2373 __rte_unused void *data) 2374 { 2375 struct cmd_config_rss_hash_key *res = parsed_result; 2376 uint8_t hash_key[RSS_HASH_KEY_LENGTH]; 2377 uint8_t xdgt0; 2378 uint8_t xdgt1; 2379 int i; 2380 struct rte_eth_dev_info dev_info; 2381 uint8_t hash_key_size; 2382 uint32_t key_len; 2383 int ret; 2384 2385 ret = eth_dev_info_get_print_err(res->port_id, &dev_info); 2386 if (ret != 0) 2387 return; 2388 2389 if (dev_info.hash_key_size > 0 && 2390 dev_info.hash_key_size <= sizeof(hash_key)) 2391 hash_key_size = dev_info.hash_key_size; 2392 else { 2393 printf("dev_info did not provide a valid hash key size\n"); 2394 return; 2395 } 2396 /* Check the length of the RSS hash key */ 2397 key_len = strlen(res->key); 2398 if (key_len != (hash_key_size * 2)) { 2399 printf("key length: %d invalid - key must be a string of %d" 2400 " hexa-decimal numbers\n", 2401 (int) key_len, hash_key_size * 2); 2402 return; 2403 } 2404 /* Translate RSS hash key into binary representation */ 2405 for (i = 0; i < hash_key_size; i++) { 2406 xdgt0 = parse_and_check_key_hexa_digit(res->key, (i * 2)); 2407 if (xdgt0 == 0xFF) 2408 return; 2409 xdgt1 = parse_and_check_key_hexa_digit(res->key, (i * 2) + 1); 2410 if (xdgt1 == 0xFF) 2411 return; 2412 hash_key[i] = (uint8_t) ((xdgt0 * 16) + xdgt1); 2413 } 2414 port_rss_hash_key_update(res->port_id, res->rss_type, hash_key, 2415 hash_key_size); 2416 } 2417 2418 cmdline_parse_token_string_t cmd_config_rss_hash_key_port = 2419 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, port, "port"); 2420 cmdline_parse_token_string_t cmd_config_rss_hash_key_config = 2421 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, config, 2422 "config"); 2423 cmdline_parse_token_num_t cmd_config_rss_hash_key_port_id = 2424 TOKEN_NUM_INITIALIZER(struct cmd_config_rss_hash_key, port_id, 2425 RTE_UINT16); 2426 cmdline_parse_token_string_t cmd_config_rss_hash_key_rss_hash_key = 2427 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, 2428 rss_hash_key, "rss-hash-key"); 2429 cmdline_parse_token_string_t cmd_config_rss_hash_key_rss_type = 2430 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, rss_type, 2431 "ipv4#ipv4-frag#ipv4-tcp#ipv4-udp#ipv4-sctp#" 2432 "ipv4-other#ipv6#ipv6-frag#ipv6-tcp#ipv6-udp#" 2433 "ipv6-sctp#ipv6-other#l2-payload#ipv6-ex#" 2434 "ipv6-tcp-ex#ipv6-udp-ex#" 2435 "l3-src-only#l3-dst-only#l4-src-only#l4-dst-only#" 2436 "l2-src-only#l2-dst-only#s-vlan#c-vlan#" 2437 "l2tpv3#esp#ah#pfcp#pppoe#gtpu#ecpri#mpls"); 2438 cmdline_parse_token_string_t cmd_config_rss_hash_key_value = 2439 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, key, NULL); 2440 2441 cmdline_parse_inst_t cmd_config_rss_hash_key = { 2442 .f = cmd_config_rss_hash_key_parsed, 2443 .data = NULL, 2444 .help_str = "port config <port_id> rss-hash-key " 2445 "ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|" 2446 "ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|" 2447 "l2-payload|ipv6-ex|ipv6-tcp-ex|ipv6-udp-ex|" 2448 "l3-src-only|l3-dst-only|l4-src-only|l4-dst-only|" 2449 "l2-src-only|l2-dst-only|s-vlan|c-vlan|" 2450 "l2tpv3|esp|ah|pfcp|pppoe|gtpu|ecpri|mpls " 2451 "<string of hex digits (variable length, NIC dependent)>", 2452 .tokens = { 2453 (void *)&cmd_config_rss_hash_key_port, 2454 (void *)&cmd_config_rss_hash_key_config, 2455 (void *)&cmd_config_rss_hash_key_port_id, 2456 (void *)&cmd_config_rss_hash_key_rss_hash_key, 2457 (void *)&cmd_config_rss_hash_key_rss_type, 2458 (void *)&cmd_config_rss_hash_key_value, 2459 NULL, 2460 }, 2461 }; 2462 2463 /* *** cleanup txq mbufs *** */ 2464 struct cmd_cleanup_txq_mbufs_result { 2465 cmdline_fixed_string_t port; 2466 cmdline_fixed_string_t keyword; 2467 cmdline_fixed_string_t name; 2468 uint16_t port_id; 2469 uint16_t queue_id; 2470 uint32_t free_cnt; 2471 }; 2472 2473 static void 2474 cmd_cleanup_txq_mbufs_parsed(void *parsed_result, 2475 __rte_unused struct cmdline *cl, 2476 __rte_unused void *data) 2477 { 2478 struct cmd_cleanup_txq_mbufs_result *res = parsed_result; 2479 uint16_t port_id = res->port_id; 2480 uint16_t queue_id = res->queue_id; 2481 uint32_t free_cnt = res->free_cnt; 2482 struct rte_eth_txq_info qinfo; 2483 int ret; 2484 2485 if (test_done == 0) { 2486 printf("Please stop forwarding first\n"); 2487 return; 2488 } 2489 2490 if (rte_eth_tx_queue_info_get(port_id, queue_id, &qinfo)) { 2491 printf("Failed to get port %u Tx queue %u info\n", 2492 port_id, queue_id); 2493 return; 2494 } 2495 2496 if (qinfo.queue_state != RTE_ETH_QUEUE_STATE_STARTED) { 2497 printf("Tx queue %u not started\n", queue_id); 2498 return; 2499 } 2500 2501 ret = rte_eth_tx_done_cleanup(port_id, queue_id, free_cnt); 2502 if (ret < 0) { 2503 printf("Failed to cleanup mbuf for port %u Tx queue %u " 2504 "error desc: %s(%d)\n", 2505 port_id, queue_id, strerror(-ret), ret); 2506 return; 2507 } 2508 2509 printf("Cleanup port %u Tx queue %u mbuf nums: %u\n", 2510 port_id, queue_id, ret); 2511 } 2512 2513 cmdline_parse_token_string_t cmd_cleanup_txq_mbufs_port = 2514 TOKEN_STRING_INITIALIZER(struct cmd_cleanup_txq_mbufs_result, port, 2515 "port"); 2516 cmdline_parse_token_string_t cmd_cleanup_txq_mbufs_cleanup = 2517 TOKEN_STRING_INITIALIZER(struct cmd_cleanup_txq_mbufs_result, keyword, 2518 "cleanup"); 2519 cmdline_parse_token_num_t cmd_cleanup_txq_mbufs_port_id = 2520 TOKEN_NUM_INITIALIZER(struct cmd_cleanup_txq_mbufs_result, port_id, 2521 RTE_UINT16); 2522 cmdline_parse_token_string_t cmd_cleanup_txq_mbufs_txq = 2523 TOKEN_STRING_INITIALIZER(struct cmd_cleanup_txq_mbufs_result, name, 2524 "txq"); 2525 cmdline_parse_token_num_t cmd_cleanup_txq_mbufs_queue_id = 2526 TOKEN_NUM_INITIALIZER(struct cmd_cleanup_txq_mbufs_result, queue_id, 2527 RTE_UINT16); 2528 cmdline_parse_token_num_t cmd_cleanup_txq_mbufs_free_cnt = 2529 TOKEN_NUM_INITIALIZER(struct cmd_cleanup_txq_mbufs_result, free_cnt, 2530 RTE_UINT32); 2531 2532 cmdline_parse_inst_t cmd_cleanup_txq_mbufs = { 2533 .f = cmd_cleanup_txq_mbufs_parsed, 2534 .data = NULL, 2535 .help_str = "port cleanup <port_id> txq <queue_id> <free_cnt>", 2536 .tokens = { 2537 (void *)&cmd_cleanup_txq_mbufs_port, 2538 (void *)&cmd_cleanup_txq_mbufs_cleanup, 2539 (void *)&cmd_cleanup_txq_mbufs_port_id, 2540 (void *)&cmd_cleanup_txq_mbufs_txq, 2541 (void *)&cmd_cleanup_txq_mbufs_queue_id, 2542 (void *)&cmd_cleanup_txq_mbufs_free_cnt, 2543 NULL, 2544 }, 2545 }; 2546 2547 /* *** configure port rxq/txq ring size *** */ 2548 struct cmd_config_rxtx_ring_size { 2549 cmdline_fixed_string_t port; 2550 cmdline_fixed_string_t config; 2551 portid_t portid; 2552 cmdline_fixed_string_t rxtxq; 2553 uint16_t qid; 2554 cmdline_fixed_string_t rsize; 2555 uint16_t size; 2556 }; 2557 2558 static void 2559 cmd_config_rxtx_ring_size_parsed(void *parsed_result, 2560 __rte_unused struct cmdline *cl, 2561 __rte_unused void *data) 2562 { 2563 struct cmd_config_rxtx_ring_size *res = parsed_result; 2564 struct rte_port *port; 2565 uint8_t isrx; 2566 2567 if (port_id_is_invalid(res->portid, ENABLED_WARN)) 2568 return; 2569 2570 if (res->portid == (portid_t)RTE_PORT_ALL) { 2571 printf("Invalid port id\n"); 2572 return; 2573 } 2574 2575 port = &ports[res->portid]; 2576 2577 if (!strcmp(res->rxtxq, "rxq")) 2578 isrx = 1; 2579 else if (!strcmp(res->rxtxq, "txq")) 2580 isrx = 0; 2581 else { 2582 printf("Unknown parameter\n"); 2583 return; 2584 } 2585 2586 if (isrx && rx_queue_id_is_invalid(res->qid)) 2587 return; 2588 else if (!isrx && tx_queue_id_is_invalid(res->qid)) 2589 return; 2590 2591 if (isrx && res->size != 0 && res->size <= rx_free_thresh) { 2592 printf("Invalid rx ring_size, must > rx_free_thresh: %d\n", 2593 rx_free_thresh); 2594 return; 2595 } 2596 2597 if (isrx) 2598 port->nb_rx_desc[res->qid] = res->size; 2599 else 2600 port->nb_tx_desc[res->qid] = res->size; 2601 2602 cmd_reconfig_device_queue(res->portid, 0, 1); 2603 } 2604 2605 cmdline_parse_token_string_t cmd_config_rxtx_ring_size_port = 2606 TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_ring_size, 2607 port, "port"); 2608 cmdline_parse_token_string_t cmd_config_rxtx_ring_size_config = 2609 TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_ring_size, 2610 config, "config"); 2611 cmdline_parse_token_num_t cmd_config_rxtx_ring_size_portid = 2612 TOKEN_NUM_INITIALIZER(struct cmd_config_rxtx_ring_size, 2613 portid, RTE_UINT16); 2614 cmdline_parse_token_string_t cmd_config_rxtx_ring_size_rxtxq = 2615 TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_ring_size, 2616 rxtxq, "rxq#txq"); 2617 cmdline_parse_token_num_t cmd_config_rxtx_ring_size_qid = 2618 TOKEN_NUM_INITIALIZER(struct cmd_config_rxtx_ring_size, 2619 qid, RTE_UINT16); 2620 cmdline_parse_token_string_t cmd_config_rxtx_ring_size_rsize = 2621 TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_ring_size, 2622 rsize, "ring_size"); 2623 cmdline_parse_token_num_t cmd_config_rxtx_ring_size_size = 2624 TOKEN_NUM_INITIALIZER(struct cmd_config_rxtx_ring_size, 2625 size, RTE_UINT16); 2626 2627 cmdline_parse_inst_t cmd_config_rxtx_ring_size = { 2628 .f = cmd_config_rxtx_ring_size_parsed, 2629 .data = NULL, 2630 .help_str = "port config <port_id> rxq|txq <queue_id> ring_size <value>", 2631 .tokens = { 2632 (void *)&cmd_config_rxtx_ring_size_port, 2633 (void *)&cmd_config_rxtx_ring_size_config, 2634 (void *)&cmd_config_rxtx_ring_size_portid, 2635 (void *)&cmd_config_rxtx_ring_size_rxtxq, 2636 (void *)&cmd_config_rxtx_ring_size_qid, 2637 (void *)&cmd_config_rxtx_ring_size_rsize, 2638 (void *)&cmd_config_rxtx_ring_size_size, 2639 NULL, 2640 }, 2641 }; 2642 2643 /* *** configure port rxq/txq start/stop *** */ 2644 struct cmd_config_rxtx_queue { 2645 cmdline_fixed_string_t port; 2646 portid_t portid; 2647 cmdline_fixed_string_t rxtxq; 2648 uint16_t qid; 2649 cmdline_fixed_string_t opname; 2650 }; 2651 2652 static void 2653 cmd_config_rxtx_queue_parsed(void *parsed_result, 2654 __rte_unused struct cmdline *cl, 2655 __rte_unused void *data) 2656 { 2657 struct cmd_config_rxtx_queue *res = parsed_result; 2658 uint8_t isrx; 2659 uint8_t isstart; 2660 int ret = 0; 2661 2662 if (test_done == 0) { 2663 printf("Please stop forwarding first\n"); 2664 return; 2665 } 2666 2667 if (port_id_is_invalid(res->portid, ENABLED_WARN)) 2668 return; 2669 2670 if (port_is_started(res->portid) != 1) { 2671 printf("Please start port %u first\n", res->portid); 2672 return; 2673 } 2674 2675 if (!strcmp(res->rxtxq, "rxq")) 2676 isrx = 1; 2677 else if (!strcmp(res->rxtxq, "txq")) 2678 isrx = 0; 2679 else { 2680 printf("Unknown parameter\n"); 2681 return; 2682 } 2683 2684 if (isrx && rx_queue_id_is_invalid(res->qid)) 2685 return; 2686 else if (!isrx && tx_queue_id_is_invalid(res->qid)) 2687 return; 2688 2689 if (!strcmp(res->opname, "start")) 2690 isstart = 1; 2691 else if (!strcmp(res->opname, "stop")) 2692 isstart = 0; 2693 else { 2694 printf("Unknown parameter\n"); 2695 return; 2696 } 2697 2698 if (isstart && isrx) 2699 ret = rte_eth_dev_rx_queue_start(res->portid, res->qid); 2700 else if (!isstart && isrx) 2701 ret = rte_eth_dev_rx_queue_stop(res->portid, res->qid); 2702 else if (isstart && !isrx) 2703 ret = rte_eth_dev_tx_queue_start(res->portid, res->qid); 2704 else 2705 ret = rte_eth_dev_tx_queue_stop(res->portid, res->qid); 2706 2707 if (ret == -ENOTSUP) 2708 printf("Function not supported in PMD driver\n"); 2709 } 2710 2711 cmdline_parse_token_string_t cmd_config_rxtx_queue_port = 2712 TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_queue, port, "port"); 2713 cmdline_parse_token_num_t cmd_config_rxtx_queue_portid = 2714 TOKEN_NUM_INITIALIZER(struct cmd_config_rxtx_queue, portid, RTE_UINT16); 2715 cmdline_parse_token_string_t cmd_config_rxtx_queue_rxtxq = 2716 TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_queue, rxtxq, "rxq#txq"); 2717 cmdline_parse_token_num_t cmd_config_rxtx_queue_qid = 2718 TOKEN_NUM_INITIALIZER(struct cmd_config_rxtx_queue, qid, RTE_UINT16); 2719 cmdline_parse_token_string_t cmd_config_rxtx_queue_opname = 2720 TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_queue, opname, 2721 "start#stop"); 2722 2723 cmdline_parse_inst_t cmd_config_rxtx_queue = { 2724 .f = cmd_config_rxtx_queue_parsed, 2725 .data = NULL, 2726 .help_str = "port <port_id> rxq|txq <queue_id> start|stop", 2727 .tokens = { 2728 (void *)&cmd_config_rxtx_queue_port, 2729 (void *)&cmd_config_rxtx_queue_portid, 2730 (void *)&cmd_config_rxtx_queue_rxtxq, 2731 (void *)&cmd_config_rxtx_queue_qid, 2732 (void *)&cmd_config_rxtx_queue_opname, 2733 NULL, 2734 }, 2735 }; 2736 2737 /* *** configure port rxq/txq deferred start on/off *** */ 2738 struct cmd_config_deferred_start_rxtx_queue { 2739 cmdline_fixed_string_t port; 2740 portid_t port_id; 2741 cmdline_fixed_string_t rxtxq; 2742 uint16_t qid; 2743 cmdline_fixed_string_t opname; 2744 cmdline_fixed_string_t state; 2745 }; 2746 2747 static void 2748 cmd_config_deferred_start_rxtx_queue_parsed(void *parsed_result, 2749 __rte_unused struct cmdline *cl, 2750 __rte_unused void *data) 2751 { 2752 struct cmd_config_deferred_start_rxtx_queue *res = parsed_result; 2753 struct rte_port *port; 2754 uint8_t isrx; 2755 uint8_t ison; 2756 uint8_t needreconfig = 0; 2757 2758 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 2759 return; 2760 2761 if (port_is_started(res->port_id) != 0) { 2762 printf("Please stop port %u first\n", res->port_id); 2763 return; 2764 } 2765 2766 port = &ports[res->port_id]; 2767 2768 isrx = !strcmp(res->rxtxq, "rxq"); 2769 2770 if (isrx && rx_queue_id_is_invalid(res->qid)) 2771 return; 2772 else if (!isrx && tx_queue_id_is_invalid(res->qid)) 2773 return; 2774 2775 ison = !strcmp(res->state, "on"); 2776 2777 if (isrx && port->rx_conf[res->qid].rx_deferred_start != ison) { 2778 port->rx_conf[res->qid].rx_deferred_start = ison; 2779 needreconfig = 1; 2780 } else if (!isrx && port->tx_conf[res->qid].tx_deferred_start != ison) { 2781 port->tx_conf[res->qid].tx_deferred_start = ison; 2782 needreconfig = 1; 2783 } 2784 2785 if (needreconfig) 2786 cmd_reconfig_device_queue(res->port_id, 0, 1); 2787 } 2788 2789 cmdline_parse_token_string_t cmd_config_deferred_start_rxtx_queue_port = 2790 TOKEN_STRING_INITIALIZER(struct cmd_config_deferred_start_rxtx_queue, 2791 port, "port"); 2792 cmdline_parse_token_num_t cmd_config_deferred_start_rxtx_queue_port_id = 2793 TOKEN_NUM_INITIALIZER(struct cmd_config_deferred_start_rxtx_queue, 2794 port_id, RTE_UINT16); 2795 cmdline_parse_token_string_t cmd_config_deferred_start_rxtx_queue_rxtxq = 2796 TOKEN_STRING_INITIALIZER(struct cmd_config_deferred_start_rxtx_queue, 2797 rxtxq, "rxq#txq"); 2798 cmdline_parse_token_num_t cmd_config_deferred_start_rxtx_queue_qid = 2799 TOKEN_NUM_INITIALIZER(struct cmd_config_deferred_start_rxtx_queue, 2800 qid, RTE_UINT16); 2801 cmdline_parse_token_string_t cmd_config_deferred_start_rxtx_queue_opname = 2802 TOKEN_STRING_INITIALIZER(struct cmd_config_deferred_start_rxtx_queue, 2803 opname, "deferred_start"); 2804 cmdline_parse_token_string_t cmd_config_deferred_start_rxtx_queue_state = 2805 TOKEN_STRING_INITIALIZER(struct cmd_config_deferred_start_rxtx_queue, 2806 state, "on#off"); 2807 2808 cmdline_parse_inst_t cmd_config_deferred_start_rxtx_queue = { 2809 .f = cmd_config_deferred_start_rxtx_queue_parsed, 2810 .data = NULL, 2811 .help_str = "port <port_id> rxq|txq <queue_id> deferred_start on|off", 2812 .tokens = { 2813 (void *)&cmd_config_deferred_start_rxtx_queue_port, 2814 (void *)&cmd_config_deferred_start_rxtx_queue_port_id, 2815 (void *)&cmd_config_deferred_start_rxtx_queue_rxtxq, 2816 (void *)&cmd_config_deferred_start_rxtx_queue_qid, 2817 (void *)&cmd_config_deferred_start_rxtx_queue_opname, 2818 (void *)&cmd_config_deferred_start_rxtx_queue_state, 2819 NULL, 2820 }, 2821 }; 2822 2823 /* *** configure port rxq/txq setup *** */ 2824 struct cmd_setup_rxtx_queue { 2825 cmdline_fixed_string_t port; 2826 portid_t portid; 2827 cmdline_fixed_string_t rxtxq; 2828 uint16_t qid; 2829 cmdline_fixed_string_t setup; 2830 }; 2831 2832 /* Common CLI fields for queue setup */ 2833 cmdline_parse_token_string_t cmd_setup_rxtx_queue_port = 2834 TOKEN_STRING_INITIALIZER(struct cmd_setup_rxtx_queue, port, "port"); 2835 cmdline_parse_token_num_t cmd_setup_rxtx_queue_portid = 2836 TOKEN_NUM_INITIALIZER(struct cmd_setup_rxtx_queue, portid, RTE_UINT16); 2837 cmdline_parse_token_string_t cmd_setup_rxtx_queue_rxtxq = 2838 TOKEN_STRING_INITIALIZER(struct cmd_setup_rxtx_queue, rxtxq, "rxq#txq"); 2839 cmdline_parse_token_num_t cmd_setup_rxtx_queue_qid = 2840 TOKEN_NUM_INITIALIZER(struct cmd_setup_rxtx_queue, qid, RTE_UINT16); 2841 cmdline_parse_token_string_t cmd_setup_rxtx_queue_setup = 2842 TOKEN_STRING_INITIALIZER(struct cmd_setup_rxtx_queue, setup, "setup"); 2843 2844 static void 2845 cmd_setup_rxtx_queue_parsed( 2846 void *parsed_result, 2847 __rte_unused struct cmdline *cl, 2848 __rte_unused void *data) 2849 { 2850 struct cmd_setup_rxtx_queue *res = parsed_result; 2851 struct rte_port *port; 2852 struct rte_mempool *mp; 2853 unsigned int socket_id; 2854 uint8_t isrx = 0; 2855 int ret; 2856 2857 if (port_id_is_invalid(res->portid, ENABLED_WARN)) 2858 return; 2859 2860 if (res->portid == (portid_t)RTE_PORT_ALL) { 2861 printf("Invalid port id\n"); 2862 return; 2863 } 2864 2865 if (!strcmp(res->rxtxq, "rxq")) 2866 isrx = 1; 2867 else if (!strcmp(res->rxtxq, "txq")) 2868 isrx = 0; 2869 else { 2870 printf("Unknown parameter\n"); 2871 return; 2872 } 2873 2874 if (isrx && rx_queue_id_is_invalid(res->qid)) { 2875 printf("Invalid rx queue\n"); 2876 return; 2877 } else if (!isrx && tx_queue_id_is_invalid(res->qid)) { 2878 printf("Invalid tx queue\n"); 2879 return; 2880 } 2881 2882 port = &ports[res->portid]; 2883 if (isrx) { 2884 socket_id = rxring_numa[res->portid]; 2885 if (!numa_support || socket_id == NUMA_NO_CONFIG) 2886 socket_id = port->socket_id; 2887 2888 mp = mbuf_pool_find(socket_id, 0); 2889 if (mp == NULL) { 2890 printf("Failed to setup RX queue: " 2891 "No mempool allocation" 2892 " on the socket %d\n", 2893 rxring_numa[res->portid]); 2894 return; 2895 } 2896 ret = rx_queue_setup(res->portid, 2897 res->qid, 2898 port->nb_rx_desc[res->qid], 2899 socket_id, 2900 &port->rx_conf[res->qid], 2901 mp); 2902 if (ret) 2903 printf("Failed to setup RX queue\n"); 2904 } else { 2905 socket_id = txring_numa[res->portid]; 2906 if (!numa_support || socket_id == NUMA_NO_CONFIG) 2907 socket_id = port->socket_id; 2908 2909 if (port->nb_tx_desc[res->qid] < tx_pkt_nb_segs) { 2910 printf("Failed to setup TX queue: not enough descriptors\n"); 2911 return; 2912 } 2913 ret = rte_eth_tx_queue_setup(res->portid, 2914 res->qid, 2915 port->nb_tx_desc[res->qid], 2916 socket_id, 2917 &port->tx_conf[res->qid]); 2918 if (ret) 2919 printf("Failed to setup TX queue\n"); 2920 } 2921 } 2922 2923 cmdline_parse_inst_t cmd_setup_rxtx_queue = { 2924 .f = cmd_setup_rxtx_queue_parsed, 2925 .data = NULL, 2926 .help_str = "port <port_id> rxq|txq <queue_idx> setup", 2927 .tokens = { 2928 (void *)&cmd_setup_rxtx_queue_port, 2929 (void *)&cmd_setup_rxtx_queue_portid, 2930 (void *)&cmd_setup_rxtx_queue_rxtxq, 2931 (void *)&cmd_setup_rxtx_queue_qid, 2932 (void *)&cmd_setup_rxtx_queue_setup, 2933 NULL, 2934 }, 2935 }; 2936 2937 2938 /* *** Configure RSS RETA *** */ 2939 struct cmd_config_rss_reta { 2940 cmdline_fixed_string_t port; 2941 cmdline_fixed_string_t keyword; 2942 portid_t port_id; 2943 cmdline_fixed_string_t name; 2944 cmdline_fixed_string_t list_name; 2945 cmdline_fixed_string_t list_of_items; 2946 }; 2947 2948 static int 2949 parse_reta_config(const char *str, 2950 struct rte_eth_rss_reta_entry64 *reta_conf, 2951 uint16_t nb_entries) 2952 { 2953 int i; 2954 unsigned size; 2955 uint16_t hash_index, idx, shift; 2956 uint16_t nb_queue; 2957 char s[256]; 2958 const char *p, *p0 = str; 2959 char *end; 2960 enum fieldnames { 2961 FLD_HASH_INDEX = 0, 2962 FLD_QUEUE, 2963 _NUM_FLD 2964 }; 2965 unsigned long int_fld[_NUM_FLD]; 2966 char *str_fld[_NUM_FLD]; 2967 2968 while ((p = strchr(p0,'(')) != NULL) { 2969 ++p; 2970 if((p0 = strchr(p,')')) == NULL) 2971 return -1; 2972 2973 size = p0 - p; 2974 if(size >= sizeof(s)) 2975 return -1; 2976 2977 snprintf(s, sizeof(s), "%.*s", size, p); 2978 if (rte_strsplit(s, sizeof(s), str_fld, _NUM_FLD, ',') != _NUM_FLD) 2979 return -1; 2980 for (i = 0; i < _NUM_FLD; i++) { 2981 errno = 0; 2982 int_fld[i] = strtoul(str_fld[i], &end, 0); 2983 if (errno != 0 || end == str_fld[i] || 2984 int_fld[i] > 65535) 2985 return -1; 2986 } 2987 2988 hash_index = (uint16_t)int_fld[FLD_HASH_INDEX]; 2989 nb_queue = (uint16_t)int_fld[FLD_QUEUE]; 2990 2991 if (hash_index >= nb_entries) { 2992 printf("Invalid RETA hash index=%d\n", hash_index); 2993 return -1; 2994 } 2995 2996 idx = hash_index / RTE_RETA_GROUP_SIZE; 2997 shift = hash_index % RTE_RETA_GROUP_SIZE; 2998 reta_conf[idx].mask |= (1ULL << shift); 2999 reta_conf[idx].reta[shift] = nb_queue; 3000 } 3001 3002 return 0; 3003 } 3004 3005 static void 3006 cmd_set_rss_reta_parsed(void *parsed_result, 3007 __rte_unused struct cmdline *cl, 3008 __rte_unused void *data) 3009 { 3010 int ret; 3011 struct rte_eth_dev_info dev_info; 3012 struct rte_eth_rss_reta_entry64 reta_conf[8]; 3013 struct cmd_config_rss_reta *res = parsed_result; 3014 3015 ret = eth_dev_info_get_print_err(res->port_id, &dev_info); 3016 if (ret != 0) 3017 return; 3018 3019 if (dev_info.reta_size == 0) { 3020 printf("Redirection table size is 0 which is " 3021 "invalid for RSS\n"); 3022 return; 3023 } else 3024 printf("The reta size of port %d is %u\n", 3025 res->port_id, dev_info.reta_size); 3026 if (dev_info.reta_size > ETH_RSS_RETA_SIZE_512) { 3027 printf("Currently do not support more than %u entries of " 3028 "redirection table\n", ETH_RSS_RETA_SIZE_512); 3029 return; 3030 } 3031 3032 memset(reta_conf, 0, sizeof(reta_conf)); 3033 if (!strcmp(res->list_name, "reta")) { 3034 if (parse_reta_config(res->list_of_items, reta_conf, 3035 dev_info.reta_size)) { 3036 printf("Invalid RSS Redirection Table " 3037 "config entered\n"); 3038 return; 3039 } 3040 ret = rte_eth_dev_rss_reta_update(res->port_id, 3041 reta_conf, dev_info.reta_size); 3042 if (ret != 0) 3043 printf("Bad redirection table parameter, " 3044 "return code = %d \n", ret); 3045 } 3046 } 3047 3048 cmdline_parse_token_string_t cmd_config_rss_reta_port = 3049 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_reta, port, "port"); 3050 cmdline_parse_token_string_t cmd_config_rss_reta_keyword = 3051 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_reta, keyword, "config"); 3052 cmdline_parse_token_num_t cmd_config_rss_reta_port_id = 3053 TOKEN_NUM_INITIALIZER(struct cmd_config_rss_reta, port_id, RTE_UINT16); 3054 cmdline_parse_token_string_t cmd_config_rss_reta_name = 3055 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_reta, name, "rss"); 3056 cmdline_parse_token_string_t cmd_config_rss_reta_list_name = 3057 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_reta, list_name, "reta"); 3058 cmdline_parse_token_string_t cmd_config_rss_reta_list_of_items = 3059 TOKEN_STRING_INITIALIZER(struct cmd_config_rss_reta, list_of_items, 3060 NULL); 3061 cmdline_parse_inst_t cmd_config_rss_reta = { 3062 .f = cmd_set_rss_reta_parsed, 3063 .data = NULL, 3064 .help_str = "port config <port_id> rss reta <hash,queue[,hash,queue]*>", 3065 .tokens = { 3066 (void *)&cmd_config_rss_reta_port, 3067 (void *)&cmd_config_rss_reta_keyword, 3068 (void *)&cmd_config_rss_reta_port_id, 3069 (void *)&cmd_config_rss_reta_name, 3070 (void *)&cmd_config_rss_reta_list_name, 3071 (void *)&cmd_config_rss_reta_list_of_items, 3072 NULL, 3073 }, 3074 }; 3075 3076 /* *** SHOW PORT RETA INFO *** */ 3077 struct cmd_showport_reta { 3078 cmdline_fixed_string_t show; 3079 cmdline_fixed_string_t port; 3080 portid_t port_id; 3081 cmdline_fixed_string_t rss; 3082 cmdline_fixed_string_t reta; 3083 uint16_t size; 3084 cmdline_fixed_string_t list_of_items; 3085 }; 3086 3087 static int 3088 showport_parse_reta_config(struct rte_eth_rss_reta_entry64 *conf, 3089 uint16_t nb_entries, 3090 char *str) 3091 { 3092 uint32_t size; 3093 const char *p, *p0 = str; 3094 char s[256]; 3095 char *end; 3096 char *str_fld[8]; 3097 uint16_t i; 3098 uint16_t num = (nb_entries + RTE_RETA_GROUP_SIZE - 1) / 3099 RTE_RETA_GROUP_SIZE; 3100 int ret; 3101 3102 p = strchr(p0, '('); 3103 if (p == NULL) 3104 return -1; 3105 p++; 3106 p0 = strchr(p, ')'); 3107 if (p0 == NULL) 3108 return -1; 3109 size = p0 - p; 3110 if (size >= sizeof(s)) { 3111 printf("The string size exceeds the internal buffer size\n"); 3112 return -1; 3113 } 3114 snprintf(s, sizeof(s), "%.*s", size, p); 3115 ret = rte_strsplit(s, sizeof(s), str_fld, num, ','); 3116 if (ret <= 0 || ret != num) { 3117 printf("The bits of masks do not match the number of " 3118 "reta entries: %u\n", num); 3119 return -1; 3120 } 3121 for (i = 0; i < ret; i++) 3122 conf[i].mask = (uint64_t)strtoul(str_fld[i], &end, 0); 3123 3124 return 0; 3125 } 3126 3127 static void 3128 cmd_showport_reta_parsed(void *parsed_result, 3129 __rte_unused struct cmdline *cl, 3130 __rte_unused void *data) 3131 { 3132 struct cmd_showport_reta *res = parsed_result; 3133 struct rte_eth_rss_reta_entry64 reta_conf[8]; 3134 struct rte_eth_dev_info dev_info; 3135 uint16_t max_reta_size; 3136 int ret; 3137 3138 ret = eth_dev_info_get_print_err(res->port_id, &dev_info); 3139 if (ret != 0) 3140 return; 3141 3142 max_reta_size = RTE_MIN(dev_info.reta_size, ETH_RSS_RETA_SIZE_512); 3143 if (res->size == 0 || res->size > max_reta_size) { 3144 printf("Invalid redirection table size: %u (1-%u)\n", 3145 res->size, max_reta_size); 3146 return; 3147 } 3148 3149 memset(reta_conf, 0, sizeof(reta_conf)); 3150 if (showport_parse_reta_config(reta_conf, res->size, 3151 res->list_of_items) < 0) { 3152 printf("Invalid string: %s for reta masks\n", 3153 res->list_of_items); 3154 return; 3155 } 3156 port_rss_reta_info(res->port_id, reta_conf, res->size); 3157 } 3158 3159 cmdline_parse_token_string_t cmd_showport_reta_show = 3160 TOKEN_STRING_INITIALIZER(struct cmd_showport_reta, show, "show"); 3161 cmdline_parse_token_string_t cmd_showport_reta_port = 3162 TOKEN_STRING_INITIALIZER(struct cmd_showport_reta, port, "port"); 3163 cmdline_parse_token_num_t cmd_showport_reta_port_id = 3164 TOKEN_NUM_INITIALIZER(struct cmd_showport_reta, port_id, RTE_UINT16); 3165 cmdline_parse_token_string_t cmd_showport_reta_rss = 3166 TOKEN_STRING_INITIALIZER(struct cmd_showport_reta, rss, "rss"); 3167 cmdline_parse_token_string_t cmd_showport_reta_reta = 3168 TOKEN_STRING_INITIALIZER(struct cmd_showport_reta, reta, "reta"); 3169 cmdline_parse_token_num_t cmd_showport_reta_size = 3170 TOKEN_NUM_INITIALIZER(struct cmd_showport_reta, size, RTE_UINT16); 3171 cmdline_parse_token_string_t cmd_showport_reta_list_of_items = 3172 TOKEN_STRING_INITIALIZER(struct cmd_showport_reta, 3173 list_of_items, NULL); 3174 3175 cmdline_parse_inst_t cmd_showport_reta = { 3176 .f = cmd_showport_reta_parsed, 3177 .data = NULL, 3178 .help_str = "show port <port_id> rss reta <size> <mask0[,mask1]*>", 3179 .tokens = { 3180 (void *)&cmd_showport_reta_show, 3181 (void *)&cmd_showport_reta_port, 3182 (void *)&cmd_showport_reta_port_id, 3183 (void *)&cmd_showport_reta_rss, 3184 (void *)&cmd_showport_reta_reta, 3185 (void *)&cmd_showport_reta_size, 3186 (void *)&cmd_showport_reta_list_of_items, 3187 NULL, 3188 }, 3189 }; 3190 3191 /* *** Show RSS hash configuration *** */ 3192 struct cmd_showport_rss_hash { 3193 cmdline_fixed_string_t show; 3194 cmdline_fixed_string_t port; 3195 portid_t port_id; 3196 cmdline_fixed_string_t rss_hash; 3197 cmdline_fixed_string_t rss_type; 3198 cmdline_fixed_string_t key; /* optional argument */ 3199 }; 3200 3201 static void cmd_showport_rss_hash_parsed(void *parsed_result, 3202 __rte_unused struct cmdline *cl, 3203 void *show_rss_key) 3204 { 3205 struct cmd_showport_rss_hash *res = parsed_result; 3206 3207 port_rss_hash_conf_show(res->port_id, show_rss_key != NULL); 3208 } 3209 3210 cmdline_parse_token_string_t cmd_showport_rss_hash_show = 3211 TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, show, "show"); 3212 cmdline_parse_token_string_t cmd_showport_rss_hash_port = 3213 TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, port, "port"); 3214 cmdline_parse_token_num_t cmd_showport_rss_hash_port_id = 3215 TOKEN_NUM_INITIALIZER(struct cmd_showport_rss_hash, port_id, 3216 RTE_UINT16); 3217 cmdline_parse_token_string_t cmd_showport_rss_hash_rss_hash = 3218 TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, rss_hash, 3219 "rss-hash"); 3220 cmdline_parse_token_string_t cmd_showport_rss_hash_rss_key = 3221 TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, key, "key"); 3222 3223 cmdline_parse_inst_t cmd_showport_rss_hash = { 3224 .f = cmd_showport_rss_hash_parsed, 3225 .data = NULL, 3226 .help_str = "show port <port_id> rss-hash", 3227 .tokens = { 3228 (void *)&cmd_showport_rss_hash_show, 3229 (void *)&cmd_showport_rss_hash_port, 3230 (void *)&cmd_showport_rss_hash_port_id, 3231 (void *)&cmd_showport_rss_hash_rss_hash, 3232 NULL, 3233 }, 3234 }; 3235 3236 cmdline_parse_inst_t cmd_showport_rss_hash_key = { 3237 .f = cmd_showport_rss_hash_parsed, 3238 .data = (void *)1, 3239 .help_str = "show port <port_id> rss-hash key", 3240 .tokens = { 3241 (void *)&cmd_showport_rss_hash_show, 3242 (void *)&cmd_showport_rss_hash_port, 3243 (void *)&cmd_showport_rss_hash_port_id, 3244 (void *)&cmd_showport_rss_hash_rss_hash, 3245 (void *)&cmd_showport_rss_hash_rss_key, 3246 NULL, 3247 }, 3248 }; 3249 3250 /* *** Configure DCB *** */ 3251 struct cmd_config_dcb { 3252 cmdline_fixed_string_t port; 3253 cmdline_fixed_string_t config; 3254 portid_t port_id; 3255 cmdline_fixed_string_t dcb; 3256 cmdline_fixed_string_t vt; 3257 cmdline_fixed_string_t vt_en; 3258 uint8_t num_tcs; 3259 cmdline_fixed_string_t pfc; 3260 cmdline_fixed_string_t pfc_en; 3261 }; 3262 3263 static void 3264 cmd_config_dcb_parsed(void *parsed_result, 3265 __rte_unused struct cmdline *cl, 3266 __rte_unused void *data) 3267 { 3268 struct cmd_config_dcb *res = parsed_result; 3269 struct rte_eth_dcb_info dcb_info; 3270 portid_t port_id = res->port_id; 3271 struct rte_port *port; 3272 uint8_t pfc_en; 3273 int ret; 3274 3275 port = &ports[port_id]; 3276 /** Check if the port is not started **/ 3277 if (port->port_status != RTE_PORT_STOPPED) { 3278 printf("Please stop port %d first\n", port_id); 3279 return; 3280 } 3281 3282 if ((res->num_tcs != ETH_4_TCS) && (res->num_tcs != ETH_8_TCS)) { 3283 printf("The invalid number of traffic class," 3284 " only 4 or 8 allowed.\n"); 3285 return; 3286 } 3287 3288 if (nb_fwd_lcores < res->num_tcs) { 3289 printf("nb_cores shouldn't be less than number of TCs.\n"); 3290 return; 3291 } 3292 3293 /* Check whether the port supports the report of DCB info. */ 3294 ret = rte_eth_dev_get_dcb_info(port_id, &dcb_info); 3295 if (ret == -ENOTSUP) { 3296 printf("rte_eth_dev_get_dcb_info not supported.\n"); 3297 return; 3298 } 3299 3300 if (!strncmp(res->pfc_en, "on", 2)) 3301 pfc_en = 1; 3302 else 3303 pfc_en = 0; 3304 3305 /* DCB in VT mode */ 3306 if (!strncmp(res->vt_en, "on", 2)) 3307 ret = init_port_dcb_config(port_id, DCB_VT_ENABLED, 3308 (enum rte_eth_nb_tcs)res->num_tcs, 3309 pfc_en); 3310 else 3311 ret = init_port_dcb_config(port_id, DCB_ENABLED, 3312 (enum rte_eth_nb_tcs)res->num_tcs, 3313 pfc_en); 3314 if (ret != 0) { 3315 printf("Cannot initialize network ports.\n"); 3316 return; 3317 } 3318 3319 fwd_config_setup(); 3320 3321 cmd_reconfig_device_queue(port_id, 1, 1); 3322 } 3323 3324 cmdline_parse_token_string_t cmd_config_dcb_port = 3325 TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, port, "port"); 3326 cmdline_parse_token_string_t cmd_config_dcb_config = 3327 TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, config, "config"); 3328 cmdline_parse_token_num_t cmd_config_dcb_port_id = 3329 TOKEN_NUM_INITIALIZER(struct cmd_config_dcb, port_id, RTE_UINT16); 3330 cmdline_parse_token_string_t cmd_config_dcb_dcb = 3331 TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, dcb, "dcb"); 3332 cmdline_parse_token_string_t cmd_config_dcb_vt = 3333 TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, vt, "vt"); 3334 cmdline_parse_token_string_t cmd_config_dcb_vt_en = 3335 TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, vt_en, "on#off"); 3336 cmdline_parse_token_num_t cmd_config_dcb_num_tcs = 3337 TOKEN_NUM_INITIALIZER(struct cmd_config_dcb, num_tcs, RTE_UINT8); 3338 cmdline_parse_token_string_t cmd_config_dcb_pfc= 3339 TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, pfc, "pfc"); 3340 cmdline_parse_token_string_t cmd_config_dcb_pfc_en = 3341 TOKEN_STRING_INITIALIZER(struct cmd_config_dcb, pfc_en, "on#off"); 3342 3343 cmdline_parse_inst_t cmd_config_dcb = { 3344 .f = cmd_config_dcb_parsed, 3345 .data = NULL, 3346 .help_str = "port config <port-id> dcb vt on|off <num_tcs> pfc on|off", 3347 .tokens = { 3348 (void *)&cmd_config_dcb_port, 3349 (void *)&cmd_config_dcb_config, 3350 (void *)&cmd_config_dcb_port_id, 3351 (void *)&cmd_config_dcb_dcb, 3352 (void *)&cmd_config_dcb_vt, 3353 (void *)&cmd_config_dcb_vt_en, 3354 (void *)&cmd_config_dcb_num_tcs, 3355 (void *)&cmd_config_dcb_pfc, 3356 (void *)&cmd_config_dcb_pfc_en, 3357 NULL, 3358 }, 3359 }; 3360 3361 /* *** configure number of packets per burst *** */ 3362 struct cmd_config_burst { 3363 cmdline_fixed_string_t port; 3364 cmdline_fixed_string_t keyword; 3365 cmdline_fixed_string_t all; 3366 cmdline_fixed_string_t name; 3367 uint16_t value; 3368 }; 3369 3370 static void 3371 cmd_config_burst_parsed(void *parsed_result, 3372 __rte_unused struct cmdline *cl, 3373 __rte_unused void *data) 3374 { 3375 struct cmd_config_burst *res = parsed_result; 3376 struct rte_eth_dev_info dev_info; 3377 uint16_t rec_nb_pkts; 3378 int ret; 3379 3380 if (!all_ports_stopped()) { 3381 printf("Please stop all ports first\n"); 3382 return; 3383 } 3384 3385 if (!strcmp(res->name, "burst")) { 3386 if (res->value == 0) { 3387 /* If user gives a value of zero, query the PMD for 3388 * its recommended Rx burst size. Testpmd uses a single 3389 * size for all ports, so assume all ports are the same 3390 * NIC model and use the values from Port 0. 3391 */ 3392 ret = eth_dev_info_get_print_err(0, &dev_info); 3393 if (ret != 0) 3394 return; 3395 3396 rec_nb_pkts = dev_info.default_rxportconf.burst_size; 3397 3398 if (rec_nb_pkts == 0) { 3399 printf("PMD does not recommend a burst size.\n" 3400 "User provided value must be between" 3401 " 1 and %d\n", MAX_PKT_BURST); 3402 return; 3403 } else if (rec_nb_pkts > MAX_PKT_BURST) { 3404 printf("PMD recommended burst size of %d" 3405 " exceeds maximum value of %d\n", 3406 rec_nb_pkts, MAX_PKT_BURST); 3407 return; 3408 } 3409 printf("Using PMD-provided burst value of %d\n", 3410 rec_nb_pkts); 3411 nb_pkt_per_burst = rec_nb_pkts; 3412 } else if (res->value > MAX_PKT_BURST) { 3413 printf("burst must be >= 1 && <= %d\n", MAX_PKT_BURST); 3414 return; 3415 } else 3416 nb_pkt_per_burst = res->value; 3417 } else { 3418 printf("Unknown parameter\n"); 3419 return; 3420 } 3421 3422 init_port_config(); 3423 3424 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 3425 } 3426 3427 cmdline_parse_token_string_t cmd_config_burst_port = 3428 TOKEN_STRING_INITIALIZER(struct cmd_config_burst, port, "port"); 3429 cmdline_parse_token_string_t cmd_config_burst_keyword = 3430 TOKEN_STRING_INITIALIZER(struct cmd_config_burst, keyword, "config"); 3431 cmdline_parse_token_string_t cmd_config_burst_all = 3432 TOKEN_STRING_INITIALIZER(struct cmd_config_burst, all, "all"); 3433 cmdline_parse_token_string_t cmd_config_burst_name = 3434 TOKEN_STRING_INITIALIZER(struct cmd_config_burst, name, "burst"); 3435 cmdline_parse_token_num_t cmd_config_burst_value = 3436 TOKEN_NUM_INITIALIZER(struct cmd_config_burst, value, RTE_UINT16); 3437 3438 cmdline_parse_inst_t cmd_config_burst = { 3439 .f = cmd_config_burst_parsed, 3440 .data = NULL, 3441 .help_str = "port config all burst <value>", 3442 .tokens = { 3443 (void *)&cmd_config_burst_port, 3444 (void *)&cmd_config_burst_keyword, 3445 (void *)&cmd_config_burst_all, 3446 (void *)&cmd_config_burst_name, 3447 (void *)&cmd_config_burst_value, 3448 NULL, 3449 }, 3450 }; 3451 3452 /* *** configure rx/tx queues *** */ 3453 struct cmd_config_thresh { 3454 cmdline_fixed_string_t port; 3455 cmdline_fixed_string_t keyword; 3456 cmdline_fixed_string_t all; 3457 cmdline_fixed_string_t name; 3458 uint8_t value; 3459 }; 3460 3461 static void 3462 cmd_config_thresh_parsed(void *parsed_result, 3463 __rte_unused struct cmdline *cl, 3464 __rte_unused void *data) 3465 { 3466 struct cmd_config_thresh *res = parsed_result; 3467 3468 if (!all_ports_stopped()) { 3469 printf("Please stop all ports first\n"); 3470 return; 3471 } 3472 3473 if (!strcmp(res->name, "txpt")) 3474 tx_pthresh = res->value; 3475 else if(!strcmp(res->name, "txht")) 3476 tx_hthresh = res->value; 3477 else if(!strcmp(res->name, "txwt")) 3478 tx_wthresh = res->value; 3479 else if(!strcmp(res->name, "rxpt")) 3480 rx_pthresh = res->value; 3481 else if(!strcmp(res->name, "rxht")) 3482 rx_hthresh = res->value; 3483 else if(!strcmp(res->name, "rxwt")) 3484 rx_wthresh = res->value; 3485 else { 3486 printf("Unknown parameter\n"); 3487 return; 3488 } 3489 3490 init_port_config(); 3491 3492 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 3493 } 3494 3495 cmdline_parse_token_string_t cmd_config_thresh_port = 3496 TOKEN_STRING_INITIALIZER(struct cmd_config_thresh, port, "port"); 3497 cmdline_parse_token_string_t cmd_config_thresh_keyword = 3498 TOKEN_STRING_INITIALIZER(struct cmd_config_thresh, keyword, "config"); 3499 cmdline_parse_token_string_t cmd_config_thresh_all = 3500 TOKEN_STRING_INITIALIZER(struct cmd_config_thresh, all, "all"); 3501 cmdline_parse_token_string_t cmd_config_thresh_name = 3502 TOKEN_STRING_INITIALIZER(struct cmd_config_thresh, name, 3503 "txpt#txht#txwt#rxpt#rxht#rxwt"); 3504 cmdline_parse_token_num_t cmd_config_thresh_value = 3505 TOKEN_NUM_INITIALIZER(struct cmd_config_thresh, value, RTE_UINT8); 3506 3507 cmdline_parse_inst_t cmd_config_thresh = { 3508 .f = cmd_config_thresh_parsed, 3509 .data = NULL, 3510 .help_str = "port config all txpt|txht|txwt|rxpt|rxht|rxwt <value>", 3511 .tokens = { 3512 (void *)&cmd_config_thresh_port, 3513 (void *)&cmd_config_thresh_keyword, 3514 (void *)&cmd_config_thresh_all, 3515 (void *)&cmd_config_thresh_name, 3516 (void *)&cmd_config_thresh_value, 3517 NULL, 3518 }, 3519 }; 3520 3521 /* *** configure free/rs threshold *** */ 3522 struct cmd_config_threshold { 3523 cmdline_fixed_string_t port; 3524 cmdline_fixed_string_t keyword; 3525 cmdline_fixed_string_t all; 3526 cmdline_fixed_string_t name; 3527 uint16_t value; 3528 }; 3529 3530 static void 3531 cmd_config_threshold_parsed(void *parsed_result, 3532 __rte_unused struct cmdline *cl, 3533 __rte_unused void *data) 3534 { 3535 struct cmd_config_threshold *res = parsed_result; 3536 3537 if (!all_ports_stopped()) { 3538 printf("Please stop all ports first\n"); 3539 return; 3540 } 3541 3542 if (!strcmp(res->name, "txfreet")) 3543 tx_free_thresh = res->value; 3544 else if (!strcmp(res->name, "txrst")) 3545 tx_rs_thresh = res->value; 3546 else if (!strcmp(res->name, "rxfreet")) 3547 rx_free_thresh = res->value; 3548 else { 3549 printf("Unknown parameter\n"); 3550 return; 3551 } 3552 3553 init_port_config(); 3554 3555 cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); 3556 } 3557 3558 cmdline_parse_token_string_t cmd_config_threshold_port = 3559 TOKEN_STRING_INITIALIZER(struct cmd_config_threshold, port, "port"); 3560 cmdline_parse_token_string_t cmd_config_threshold_keyword = 3561 TOKEN_STRING_INITIALIZER(struct cmd_config_threshold, keyword, 3562 "config"); 3563 cmdline_parse_token_string_t cmd_config_threshold_all = 3564 TOKEN_STRING_INITIALIZER(struct cmd_config_threshold, all, "all"); 3565 cmdline_parse_token_string_t cmd_config_threshold_name = 3566 TOKEN_STRING_INITIALIZER(struct cmd_config_threshold, name, 3567 "txfreet#txrst#rxfreet"); 3568 cmdline_parse_token_num_t cmd_config_threshold_value = 3569 TOKEN_NUM_INITIALIZER(struct cmd_config_threshold, value, RTE_UINT16); 3570 3571 cmdline_parse_inst_t cmd_config_threshold = { 3572 .f = cmd_config_threshold_parsed, 3573 .data = NULL, 3574 .help_str = "port config all txfreet|txrst|rxfreet <value>", 3575 .tokens = { 3576 (void *)&cmd_config_threshold_port, 3577 (void *)&cmd_config_threshold_keyword, 3578 (void *)&cmd_config_threshold_all, 3579 (void *)&cmd_config_threshold_name, 3580 (void *)&cmd_config_threshold_value, 3581 NULL, 3582 }, 3583 }; 3584 3585 /* *** stop *** */ 3586 struct cmd_stop_result { 3587 cmdline_fixed_string_t stop; 3588 }; 3589 3590 static void cmd_stop_parsed(__rte_unused void *parsed_result, 3591 __rte_unused struct cmdline *cl, 3592 __rte_unused void *data) 3593 { 3594 stop_packet_forwarding(); 3595 } 3596 3597 cmdline_parse_token_string_t cmd_stop_stop = 3598 TOKEN_STRING_INITIALIZER(struct cmd_stop_result, stop, "stop"); 3599 3600 cmdline_parse_inst_t cmd_stop = { 3601 .f = cmd_stop_parsed, 3602 .data = NULL, 3603 .help_str = "stop: Stop packet forwarding", 3604 .tokens = { 3605 (void *)&cmd_stop_stop, 3606 NULL, 3607 }, 3608 }; 3609 3610 /* *** SET CORELIST and PORTLIST CONFIGURATION *** */ 3611 3612 unsigned int 3613 parse_item_list(const char *str, const char *item_name, unsigned int max_items, 3614 unsigned int *parsed_items, int check_unique_values) 3615 { 3616 unsigned int nb_item; 3617 unsigned int value; 3618 unsigned int i; 3619 unsigned int j; 3620 int value_ok; 3621 char c; 3622 3623 /* 3624 * First parse all items in the list and store their value. 3625 */ 3626 value = 0; 3627 nb_item = 0; 3628 value_ok = 0; 3629 for (i = 0; i < strnlen(str, STR_TOKEN_SIZE); i++) { 3630 c = str[i]; 3631 if ((c >= '0') && (c <= '9')) { 3632 value = (unsigned int) (value * 10 + (c - '0')); 3633 value_ok = 1; 3634 continue; 3635 } 3636 if (c != ',') { 3637 printf("character %c is not a decimal digit\n", c); 3638 return 0; 3639 } 3640 if (! value_ok) { 3641 printf("No valid value before comma\n"); 3642 return 0; 3643 } 3644 if (nb_item < max_items) { 3645 parsed_items[nb_item] = value; 3646 value_ok = 0; 3647 value = 0; 3648 } 3649 nb_item++; 3650 } 3651 if (nb_item >= max_items) { 3652 printf("Number of %s = %u > %u (maximum items)\n", 3653 item_name, nb_item + 1, max_items); 3654 return 0; 3655 } 3656 parsed_items[nb_item++] = value; 3657 if (! check_unique_values) 3658 return nb_item; 3659 3660 /* 3661 * Then, check that all values in the list are differents. 3662 * No optimization here... 3663 */ 3664 for (i = 0; i < nb_item; i++) { 3665 for (j = i + 1; j < nb_item; j++) { 3666 if (parsed_items[j] == parsed_items[i]) { 3667 printf("duplicated %s %u at index %u and %u\n", 3668 item_name, parsed_items[i], i, j); 3669 return 0; 3670 } 3671 } 3672 } 3673 return nb_item; 3674 } 3675 3676 struct cmd_set_list_result { 3677 cmdline_fixed_string_t cmd_keyword; 3678 cmdline_fixed_string_t list_name; 3679 cmdline_fixed_string_t list_of_items; 3680 }; 3681 3682 static void cmd_set_list_parsed(void *parsed_result, 3683 __rte_unused struct cmdline *cl, 3684 __rte_unused void *data) 3685 { 3686 struct cmd_set_list_result *res; 3687 union { 3688 unsigned int lcorelist[RTE_MAX_LCORE]; 3689 unsigned int portlist[RTE_MAX_ETHPORTS]; 3690 } parsed_items; 3691 unsigned int nb_item; 3692 3693 if (test_done == 0) { 3694 printf("Please stop forwarding first\n"); 3695 return; 3696 } 3697 3698 res = parsed_result; 3699 if (!strcmp(res->list_name, "corelist")) { 3700 nb_item = parse_item_list(res->list_of_items, "core", 3701 RTE_MAX_LCORE, 3702 parsed_items.lcorelist, 1); 3703 if (nb_item > 0) { 3704 set_fwd_lcores_list(parsed_items.lcorelist, nb_item); 3705 fwd_config_setup(); 3706 } 3707 return; 3708 } 3709 if (!strcmp(res->list_name, "portlist")) { 3710 nb_item = parse_item_list(res->list_of_items, "port", 3711 RTE_MAX_ETHPORTS, 3712 parsed_items.portlist, 1); 3713 if (nb_item > 0) { 3714 set_fwd_ports_list(parsed_items.portlist, nb_item); 3715 fwd_config_setup(); 3716 } 3717 } 3718 } 3719 3720 cmdline_parse_token_string_t cmd_set_list_keyword = 3721 TOKEN_STRING_INITIALIZER(struct cmd_set_list_result, cmd_keyword, 3722 "set"); 3723 cmdline_parse_token_string_t cmd_set_list_name = 3724 TOKEN_STRING_INITIALIZER(struct cmd_set_list_result, list_name, 3725 "corelist#portlist"); 3726 cmdline_parse_token_string_t cmd_set_list_of_items = 3727 TOKEN_STRING_INITIALIZER(struct cmd_set_list_result, list_of_items, 3728 NULL); 3729 3730 cmdline_parse_inst_t cmd_set_fwd_list = { 3731 .f = cmd_set_list_parsed, 3732 .data = NULL, 3733 .help_str = "set corelist|portlist <list0[,list1]*>", 3734 .tokens = { 3735 (void *)&cmd_set_list_keyword, 3736 (void *)&cmd_set_list_name, 3737 (void *)&cmd_set_list_of_items, 3738 NULL, 3739 }, 3740 }; 3741 3742 /* *** SET COREMASK and PORTMASK CONFIGURATION *** */ 3743 3744 struct cmd_setmask_result { 3745 cmdline_fixed_string_t set; 3746 cmdline_fixed_string_t mask; 3747 uint64_t hexavalue; 3748 }; 3749 3750 static void cmd_set_mask_parsed(void *parsed_result, 3751 __rte_unused struct cmdline *cl, 3752 __rte_unused void *data) 3753 { 3754 struct cmd_setmask_result *res = parsed_result; 3755 3756 if (test_done == 0) { 3757 printf("Please stop forwarding first\n"); 3758 return; 3759 } 3760 if (!strcmp(res->mask, "coremask")) { 3761 set_fwd_lcores_mask(res->hexavalue); 3762 fwd_config_setup(); 3763 } else if (!strcmp(res->mask, "portmask")) { 3764 set_fwd_ports_mask(res->hexavalue); 3765 fwd_config_setup(); 3766 } 3767 } 3768 3769 cmdline_parse_token_string_t cmd_setmask_set = 3770 TOKEN_STRING_INITIALIZER(struct cmd_setmask_result, set, "set"); 3771 cmdline_parse_token_string_t cmd_setmask_mask = 3772 TOKEN_STRING_INITIALIZER(struct cmd_setmask_result, mask, 3773 "coremask#portmask"); 3774 cmdline_parse_token_num_t cmd_setmask_value = 3775 TOKEN_NUM_INITIALIZER(struct cmd_setmask_result, hexavalue, RTE_UINT64); 3776 3777 cmdline_parse_inst_t cmd_set_fwd_mask = { 3778 .f = cmd_set_mask_parsed, 3779 .data = NULL, 3780 .help_str = "set coremask|portmask <hexadecimal value>", 3781 .tokens = { 3782 (void *)&cmd_setmask_set, 3783 (void *)&cmd_setmask_mask, 3784 (void *)&cmd_setmask_value, 3785 NULL, 3786 }, 3787 }; 3788 3789 /* 3790 * SET NBPORT, NBCORE, PACKET BURST, and VERBOSE LEVEL CONFIGURATION 3791 */ 3792 struct cmd_set_result { 3793 cmdline_fixed_string_t set; 3794 cmdline_fixed_string_t what; 3795 uint16_t value; 3796 }; 3797 3798 static void cmd_set_parsed(void *parsed_result, 3799 __rte_unused struct cmdline *cl, 3800 __rte_unused void *data) 3801 { 3802 struct cmd_set_result *res = parsed_result; 3803 if (!strcmp(res->what, "nbport")) { 3804 set_fwd_ports_number(res->value); 3805 fwd_config_setup(); 3806 } else if (!strcmp(res->what, "nbcore")) { 3807 set_fwd_lcores_number(res->value); 3808 fwd_config_setup(); 3809 } else if (!strcmp(res->what, "burst")) 3810 set_nb_pkt_per_burst(res->value); 3811 else if (!strcmp(res->what, "verbose")) 3812 set_verbose_level(res->value); 3813 } 3814 3815 cmdline_parse_token_string_t cmd_set_set = 3816 TOKEN_STRING_INITIALIZER(struct cmd_set_result, set, "set"); 3817 cmdline_parse_token_string_t cmd_set_what = 3818 TOKEN_STRING_INITIALIZER(struct cmd_set_result, what, 3819 "nbport#nbcore#burst#verbose"); 3820 cmdline_parse_token_num_t cmd_set_value = 3821 TOKEN_NUM_INITIALIZER(struct cmd_set_result, value, RTE_UINT16); 3822 3823 cmdline_parse_inst_t cmd_set_numbers = { 3824 .f = cmd_set_parsed, 3825 .data = NULL, 3826 .help_str = "set nbport|nbcore|burst|verbose <value>", 3827 .tokens = { 3828 (void *)&cmd_set_set, 3829 (void *)&cmd_set_what, 3830 (void *)&cmd_set_value, 3831 NULL, 3832 }, 3833 }; 3834 3835 /* *** SET LOG LEVEL CONFIGURATION *** */ 3836 3837 struct cmd_set_log_result { 3838 cmdline_fixed_string_t set; 3839 cmdline_fixed_string_t log; 3840 cmdline_fixed_string_t type; 3841 uint32_t level; 3842 }; 3843 3844 static void 3845 cmd_set_log_parsed(void *parsed_result, 3846 __rte_unused struct cmdline *cl, 3847 __rte_unused void *data) 3848 { 3849 struct cmd_set_log_result *res; 3850 int ret; 3851 3852 res = parsed_result; 3853 if (!strcmp(res->type, "global")) 3854 rte_log_set_global_level(res->level); 3855 else { 3856 ret = rte_log_set_level_regexp(res->type, res->level); 3857 if (ret < 0) 3858 printf("Unable to set log level\n"); 3859 } 3860 } 3861 3862 cmdline_parse_token_string_t cmd_set_log_set = 3863 TOKEN_STRING_INITIALIZER(struct cmd_set_log_result, set, "set"); 3864 cmdline_parse_token_string_t cmd_set_log_log = 3865 TOKEN_STRING_INITIALIZER(struct cmd_set_log_result, log, "log"); 3866 cmdline_parse_token_string_t cmd_set_log_type = 3867 TOKEN_STRING_INITIALIZER(struct cmd_set_log_result, type, NULL); 3868 cmdline_parse_token_num_t cmd_set_log_level = 3869 TOKEN_NUM_INITIALIZER(struct cmd_set_log_result, level, RTE_UINT32); 3870 3871 cmdline_parse_inst_t cmd_set_log = { 3872 .f = cmd_set_log_parsed, 3873 .data = NULL, 3874 .help_str = "set log global|<type> <level>", 3875 .tokens = { 3876 (void *)&cmd_set_log_set, 3877 (void *)&cmd_set_log_log, 3878 (void *)&cmd_set_log_type, 3879 (void *)&cmd_set_log_level, 3880 NULL, 3881 }, 3882 }; 3883 3884 /* *** SET SEGMENT OFFSETS OF RX PACKETS SPLIT *** */ 3885 3886 struct cmd_set_rxoffs_result { 3887 cmdline_fixed_string_t cmd_keyword; 3888 cmdline_fixed_string_t rxoffs; 3889 cmdline_fixed_string_t seg_offsets; 3890 }; 3891 3892 static void 3893 cmd_set_rxoffs_parsed(void *parsed_result, 3894 __rte_unused struct cmdline *cl, 3895 __rte_unused void *data) 3896 { 3897 struct cmd_set_rxoffs_result *res; 3898 unsigned int seg_offsets[MAX_SEGS_BUFFER_SPLIT]; 3899 unsigned int nb_segs; 3900 3901 res = parsed_result; 3902 nb_segs = parse_item_list(res->seg_offsets, "segment offsets", 3903 MAX_SEGS_BUFFER_SPLIT, seg_offsets, 0); 3904 if (nb_segs > 0) 3905 set_rx_pkt_offsets(seg_offsets, nb_segs); 3906 cmd_reconfig_device_queue(RTE_PORT_ALL, 0, 1); 3907 } 3908 3909 cmdline_parse_token_string_t cmd_set_rxoffs_keyword = 3910 TOKEN_STRING_INITIALIZER(struct cmd_set_rxoffs_result, 3911 cmd_keyword, "set"); 3912 cmdline_parse_token_string_t cmd_set_rxoffs_name = 3913 TOKEN_STRING_INITIALIZER(struct cmd_set_rxoffs_result, 3914 rxoffs, "rxoffs"); 3915 cmdline_parse_token_string_t cmd_set_rxoffs_offsets = 3916 TOKEN_STRING_INITIALIZER(struct cmd_set_rxoffs_result, 3917 seg_offsets, NULL); 3918 3919 cmdline_parse_inst_t cmd_set_rxoffs = { 3920 .f = cmd_set_rxoffs_parsed, 3921 .data = NULL, 3922 .help_str = "set rxoffs <len0[,len1]*>", 3923 .tokens = { 3924 (void *)&cmd_set_rxoffs_keyword, 3925 (void *)&cmd_set_rxoffs_name, 3926 (void *)&cmd_set_rxoffs_offsets, 3927 NULL, 3928 }, 3929 }; 3930 3931 /* *** SET SEGMENT LENGTHS OF RX PACKETS SPLIT *** */ 3932 3933 struct cmd_set_rxpkts_result { 3934 cmdline_fixed_string_t cmd_keyword; 3935 cmdline_fixed_string_t rxpkts; 3936 cmdline_fixed_string_t seg_lengths; 3937 }; 3938 3939 static void 3940 cmd_set_rxpkts_parsed(void *parsed_result, 3941 __rte_unused struct cmdline *cl, 3942 __rte_unused void *data) 3943 { 3944 struct cmd_set_rxpkts_result *res; 3945 unsigned int seg_lengths[MAX_SEGS_BUFFER_SPLIT]; 3946 unsigned int nb_segs; 3947 3948 res = parsed_result; 3949 nb_segs = parse_item_list(res->seg_lengths, "segment lengths", 3950 MAX_SEGS_BUFFER_SPLIT, seg_lengths, 0); 3951 if (nb_segs > 0) 3952 set_rx_pkt_segments(seg_lengths, nb_segs); 3953 cmd_reconfig_device_queue(RTE_PORT_ALL, 0, 1); 3954 } 3955 3956 cmdline_parse_token_string_t cmd_set_rxpkts_keyword = 3957 TOKEN_STRING_INITIALIZER(struct cmd_set_rxpkts_result, 3958 cmd_keyword, "set"); 3959 cmdline_parse_token_string_t cmd_set_rxpkts_name = 3960 TOKEN_STRING_INITIALIZER(struct cmd_set_rxpkts_result, 3961 rxpkts, "rxpkts"); 3962 cmdline_parse_token_string_t cmd_set_rxpkts_lengths = 3963 TOKEN_STRING_INITIALIZER(struct cmd_set_rxpkts_result, 3964 seg_lengths, NULL); 3965 3966 cmdline_parse_inst_t cmd_set_rxpkts = { 3967 .f = cmd_set_rxpkts_parsed, 3968 .data = NULL, 3969 .help_str = "set rxpkts <len0[,len1]*>", 3970 .tokens = { 3971 (void *)&cmd_set_rxpkts_keyword, 3972 (void *)&cmd_set_rxpkts_name, 3973 (void *)&cmd_set_rxpkts_lengths, 3974 NULL, 3975 }, 3976 }; 3977 3978 /* *** SET SEGMENT LENGTHS OF TXONLY PACKETS *** */ 3979 3980 struct cmd_set_txpkts_result { 3981 cmdline_fixed_string_t cmd_keyword; 3982 cmdline_fixed_string_t txpkts; 3983 cmdline_fixed_string_t seg_lengths; 3984 }; 3985 3986 static void 3987 cmd_set_txpkts_parsed(void *parsed_result, 3988 __rte_unused struct cmdline *cl, 3989 __rte_unused void *data) 3990 { 3991 struct cmd_set_txpkts_result *res; 3992 unsigned seg_lengths[RTE_MAX_SEGS_PER_PKT]; 3993 unsigned int nb_segs; 3994 3995 res = parsed_result; 3996 nb_segs = parse_item_list(res->seg_lengths, "segment lengths", 3997 RTE_MAX_SEGS_PER_PKT, seg_lengths, 0); 3998 if (nb_segs > 0) 3999 set_tx_pkt_segments(seg_lengths, nb_segs); 4000 } 4001 4002 cmdline_parse_token_string_t cmd_set_txpkts_keyword = 4003 TOKEN_STRING_INITIALIZER(struct cmd_set_txpkts_result, 4004 cmd_keyword, "set"); 4005 cmdline_parse_token_string_t cmd_set_txpkts_name = 4006 TOKEN_STRING_INITIALIZER(struct cmd_set_txpkts_result, 4007 txpkts, "txpkts"); 4008 cmdline_parse_token_string_t cmd_set_txpkts_lengths = 4009 TOKEN_STRING_INITIALIZER(struct cmd_set_txpkts_result, 4010 seg_lengths, NULL); 4011 4012 cmdline_parse_inst_t cmd_set_txpkts = { 4013 .f = cmd_set_txpkts_parsed, 4014 .data = NULL, 4015 .help_str = "set txpkts <len0[,len1]*>", 4016 .tokens = { 4017 (void *)&cmd_set_txpkts_keyword, 4018 (void *)&cmd_set_txpkts_name, 4019 (void *)&cmd_set_txpkts_lengths, 4020 NULL, 4021 }, 4022 }; 4023 4024 /* *** SET COPY AND SPLIT POLICY ON TX PACKETS *** */ 4025 4026 struct cmd_set_txsplit_result { 4027 cmdline_fixed_string_t cmd_keyword; 4028 cmdline_fixed_string_t txsplit; 4029 cmdline_fixed_string_t mode; 4030 }; 4031 4032 static void 4033 cmd_set_txsplit_parsed(void *parsed_result, 4034 __rte_unused struct cmdline *cl, 4035 __rte_unused void *data) 4036 { 4037 struct cmd_set_txsplit_result *res; 4038 4039 res = parsed_result; 4040 set_tx_pkt_split(res->mode); 4041 } 4042 4043 cmdline_parse_token_string_t cmd_set_txsplit_keyword = 4044 TOKEN_STRING_INITIALIZER(struct cmd_set_txsplit_result, 4045 cmd_keyword, "set"); 4046 cmdline_parse_token_string_t cmd_set_txsplit_name = 4047 TOKEN_STRING_INITIALIZER(struct cmd_set_txsplit_result, 4048 txsplit, "txsplit"); 4049 cmdline_parse_token_string_t cmd_set_txsplit_mode = 4050 TOKEN_STRING_INITIALIZER(struct cmd_set_txsplit_result, 4051 mode, NULL); 4052 4053 cmdline_parse_inst_t cmd_set_txsplit = { 4054 .f = cmd_set_txsplit_parsed, 4055 .data = NULL, 4056 .help_str = "set txsplit on|off|rand", 4057 .tokens = { 4058 (void *)&cmd_set_txsplit_keyword, 4059 (void *)&cmd_set_txsplit_name, 4060 (void *)&cmd_set_txsplit_mode, 4061 NULL, 4062 }, 4063 }; 4064 4065 /* *** SET TIMES FOR TXONLY PACKETS SCHEDULING ON TIMESTAMPS *** */ 4066 4067 struct cmd_set_txtimes_result { 4068 cmdline_fixed_string_t cmd_keyword; 4069 cmdline_fixed_string_t txtimes; 4070 cmdline_fixed_string_t tx_times; 4071 }; 4072 4073 static void 4074 cmd_set_txtimes_parsed(void *parsed_result, 4075 __rte_unused struct cmdline *cl, 4076 __rte_unused void *data) 4077 { 4078 struct cmd_set_txtimes_result *res; 4079 unsigned int tx_times[2] = {0, 0}; 4080 unsigned int n_times; 4081 4082 res = parsed_result; 4083 n_times = parse_item_list(res->tx_times, "tx times", 4084 2, tx_times, 0); 4085 if (n_times == 2) 4086 set_tx_pkt_times(tx_times); 4087 } 4088 4089 cmdline_parse_token_string_t cmd_set_txtimes_keyword = 4090 TOKEN_STRING_INITIALIZER(struct cmd_set_txtimes_result, 4091 cmd_keyword, "set"); 4092 cmdline_parse_token_string_t cmd_set_txtimes_name = 4093 TOKEN_STRING_INITIALIZER(struct cmd_set_txtimes_result, 4094 txtimes, "txtimes"); 4095 cmdline_parse_token_string_t cmd_set_txtimes_value = 4096 TOKEN_STRING_INITIALIZER(struct cmd_set_txtimes_result, 4097 tx_times, NULL); 4098 4099 cmdline_parse_inst_t cmd_set_txtimes = { 4100 .f = cmd_set_txtimes_parsed, 4101 .data = NULL, 4102 .help_str = "set txtimes <inter_burst>,<intra_burst>", 4103 .tokens = { 4104 (void *)&cmd_set_txtimes_keyword, 4105 (void *)&cmd_set_txtimes_name, 4106 (void *)&cmd_set_txtimes_value, 4107 NULL, 4108 }, 4109 }; 4110 4111 /* *** ADD/REMOVE ALL VLAN IDENTIFIERS TO/FROM A PORT VLAN RX FILTER *** */ 4112 struct cmd_rx_vlan_filter_all_result { 4113 cmdline_fixed_string_t rx_vlan; 4114 cmdline_fixed_string_t what; 4115 cmdline_fixed_string_t all; 4116 portid_t port_id; 4117 }; 4118 4119 static void 4120 cmd_rx_vlan_filter_all_parsed(void *parsed_result, 4121 __rte_unused struct cmdline *cl, 4122 __rte_unused void *data) 4123 { 4124 struct cmd_rx_vlan_filter_all_result *res = parsed_result; 4125 4126 if (!strcmp(res->what, "add")) 4127 rx_vlan_all_filter_set(res->port_id, 1); 4128 else 4129 rx_vlan_all_filter_set(res->port_id, 0); 4130 } 4131 4132 cmdline_parse_token_string_t cmd_rx_vlan_filter_all_rx_vlan = 4133 TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_all_result, 4134 rx_vlan, "rx_vlan"); 4135 cmdline_parse_token_string_t cmd_rx_vlan_filter_all_what = 4136 TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_all_result, 4137 what, "add#rm"); 4138 cmdline_parse_token_string_t cmd_rx_vlan_filter_all_all = 4139 TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_all_result, 4140 all, "all"); 4141 cmdline_parse_token_num_t cmd_rx_vlan_filter_all_portid = 4142 TOKEN_NUM_INITIALIZER(struct cmd_rx_vlan_filter_all_result, 4143 port_id, RTE_UINT16); 4144 4145 cmdline_parse_inst_t cmd_rx_vlan_filter_all = { 4146 .f = cmd_rx_vlan_filter_all_parsed, 4147 .data = NULL, 4148 .help_str = "rx_vlan add|rm all <port_id>: " 4149 "Add/Remove all identifiers to/from the set of VLAN " 4150 "identifiers filtered by a port", 4151 .tokens = { 4152 (void *)&cmd_rx_vlan_filter_all_rx_vlan, 4153 (void *)&cmd_rx_vlan_filter_all_what, 4154 (void *)&cmd_rx_vlan_filter_all_all, 4155 (void *)&cmd_rx_vlan_filter_all_portid, 4156 NULL, 4157 }, 4158 }; 4159 4160 /* *** VLAN OFFLOAD SET ON A PORT *** */ 4161 struct cmd_vlan_offload_result { 4162 cmdline_fixed_string_t vlan; 4163 cmdline_fixed_string_t set; 4164 cmdline_fixed_string_t vlan_type; 4165 cmdline_fixed_string_t what; 4166 cmdline_fixed_string_t on; 4167 cmdline_fixed_string_t port_id; 4168 }; 4169 4170 static void 4171 cmd_vlan_offload_parsed(void *parsed_result, 4172 __rte_unused struct cmdline *cl, 4173 __rte_unused void *data) 4174 { 4175 int on; 4176 struct cmd_vlan_offload_result *res = parsed_result; 4177 char *str; 4178 int i, len = 0; 4179 portid_t port_id = 0; 4180 unsigned int tmp; 4181 4182 str = res->port_id; 4183 len = strnlen(str, STR_TOKEN_SIZE); 4184 i = 0; 4185 /* Get port_id first */ 4186 while(i < len){ 4187 if(str[i] == ',') 4188 break; 4189 4190 i++; 4191 } 4192 str[i]='\0'; 4193 tmp = strtoul(str, NULL, 0); 4194 /* If port_id greater that what portid_t can represent, return */ 4195 if(tmp >= RTE_MAX_ETHPORTS) 4196 return; 4197 port_id = (portid_t)tmp; 4198 4199 if (!strcmp(res->on, "on")) 4200 on = 1; 4201 else 4202 on = 0; 4203 4204 if (!strcmp(res->what, "strip")) 4205 rx_vlan_strip_set(port_id, on); 4206 else if(!strcmp(res->what, "stripq")){ 4207 uint16_t queue_id = 0; 4208 4209 /* No queue_id, return */ 4210 if(i + 1 >= len) { 4211 printf("must specify (port,queue_id)\n"); 4212 return; 4213 } 4214 tmp = strtoul(str + i + 1, NULL, 0); 4215 /* If queue_id greater that what 16-bits can represent, return */ 4216 if(tmp > 0xffff) 4217 return; 4218 4219 queue_id = (uint16_t)tmp; 4220 rx_vlan_strip_set_on_queue(port_id, queue_id, on); 4221 } 4222 else if (!strcmp(res->what, "filter")) 4223 rx_vlan_filter_set(port_id, on); 4224 else if (!strcmp(res->what, "qinq_strip")) 4225 rx_vlan_qinq_strip_set(port_id, on); 4226 else 4227 vlan_extend_set(port_id, on); 4228 4229 return; 4230 } 4231 4232 cmdline_parse_token_string_t cmd_vlan_offload_vlan = 4233 TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result, 4234 vlan, "vlan"); 4235 cmdline_parse_token_string_t cmd_vlan_offload_set = 4236 TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result, 4237 set, "set"); 4238 cmdline_parse_token_string_t cmd_vlan_offload_what = 4239 TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result, 4240 what, "strip#filter#qinq_strip#extend#stripq"); 4241 cmdline_parse_token_string_t cmd_vlan_offload_on = 4242 TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result, 4243 on, "on#off"); 4244 cmdline_parse_token_string_t cmd_vlan_offload_portid = 4245 TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result, 4246 port_id, NULL); 4247 4248 cmdline_parse_inst_t cmd_vlan_offload = { 4249 .f = cmd_vlan_offload_parsed, 4250 .data = NULL, 4251 .help_str = "vlan set strip|filter|qinq_strip|extend|stripq on|off " 4252 "<port_id[,queue_id]>: " 4253 "Strip/Filter/QinQ for rx side Extend for both rx/tx sides", 4254 .tokens = { 4255 (void *)&cmd_vlan_offload_vlan, 4256 (void *)&cmd_vlan_offload_set, 4257 (void *)&cmd_vlan_offload_what, 4258 (void *)&cmd_vlan_offload_on, 4259 (void *)&cmd_vlan_offload_portid, 4260 NULL, 4261 }, 4262 }; 4263 4264 /* *** VLAN TPID SET ON A PORT *** */ 4265 struct cmd_vlan_tpid_result { 4266 cmdline_fixed_string_t vlan; 4267 cmdline_fixed_string_t set; 4268 cmdline_fixed_string_t vlan_type; 4269 cmdline_fixed_string_t what; 4270 uint16_t tp_id; 4271 portid_t port_id; 4272 }; 4273 4274 static void 4275 cmd_vlan_tpid_parsed(void *parsed_result, 4276 __rte_unused struct cmdline *cl, 4277 __rte_unused void *data) 4278 { 4279 struct cmd_vlan_tpid_result *res = parsed_result; 4280 enum rte_vlan_type vlan_type; 4281 4282 if (!strcmp(res->vlan_type, "inner")) 4283 vlan_type = ETH_VLAN_TYPE_INNER; 4284 else if (!strcmp(res->vlan_type, "outer")) 4285 vlan_type = ETH_VLAN_TYPE_OUTER; 4286 else { 4287 printf("Unknown vlan type\n"); 4288 return; 4289 } 4290 vlan_tpid_set(res->port_id, vlan_type, res->tp_id); 4291 } 4292 4293 cmdline_parse_token_string_t cmd_vlan_tpid_vlan = 4294 TOKEN_STRING_INITIALIZER(struct cmd_vlan_tpid_result, 4295 vlan, "vlan"); 4296 cmdline_parse_token_string_t cmd_vlan_tpid_set = 4297 TOKEN_STRING_INITIALIZER(struct cmd_vlan_tpid_result, 4298 set, "set"); 4299 cmdline_parse_token_string_t cmd_vlan_type = 4300 TOKEN_STRING_INITIALIZER(struct cmd_vlan_tpid_result, 4301 vlan_type, "inner#outer"); 4302 cmdline_parse_token_string_t cmd_vlan_tpid_what = 4303 TOKEN_STRING_INITIALIZER(struct cmd_vlan_tpid_result, 4304 what, "tpid"); 4305 cmdline_parse_token_num_t cmd_vlan_tpid_tpid = 4306 TOKEN_NUM_INITIALIZER(struct cmd_vlan_tpid_result, 4307 tp_id, RTE_UINT16); 4308 cmdline_parse_token_num_t cmd_vlan_tpid_portid = 4309 TOKEN_NUM_INITIALIZER(struct cmd_vlan_tpid_result, 4310 port_id, RTE_UINT16); 4311 4312 cmdline_parse_inst_t cmd_vlan_tpid = { 4313 .f = cmd_vlan_tpid_parsed, 4314 .data = NULL, 4315 .help_str = "vlan set inner|outer tpid <tp_id> <port_id>: " 4316 "Set the VLAN Ether type", 4317 .tokens = { 4318 (void *)&cmd_vlan_tpid_vlan, 4319 (void *)&cmd_vlan_tpid_set, 4320 (void *)&cmd_vlan_type, 4321 (void *)&cmd_vlan_tpid_what, 4322 (void *)&cmd_vlan_tpid_tpid, 4323 (void *)&cmd_vlan_tpid_portid, 4324 NULL, 4325 }, 4326 }; 4327 4328 /* *** ADD/REMOVE A VLAN IDENTIFIER TO/FROM A PORT VLAN RX FILTER *** */ 4329 struct cmd_rx_vlan_filter_result { 4330 cmdline_fixed_string_t rx_vlan; 4331 cmdline_fixed_string_t what; 4332 uint16_t vlan_id; 4333 portid_t port_id; 4334 }; 4335 4336 static void 4337 cmd_rx_vlan_filter_parsed(void *parsed_result, 4338 __rte_unused struct cmdline *cl, 4339 __rte_unused void *data) 4340 { 4341 struct cmd_rx_vlan_filter_result *res = parsed_result; 4342 4343 if (!strcmp(res->what, "add")) 4344 rx_vft_set(res->port_id, res->vlan_id, 1); 4345 else 4346 rx_vft_set(res->port_id, res->vlan_id, 0); 4347 } 4348 4349 cmdline_parse_token_string_t cmd_rx_vlan_filter_rx_vlan = 4350 TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_result, 4351 rx_vlan, "rx_vlan"); 4352 cmdline_parse_token_string_t cmd_rx_vlan_filter_what = 4353 TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_result, 4354 what, "add#rm"); 4355 cmdline_parse_token_num_t cmd_rx_vlan_filter_vlanid = 4356 TOKEN_NUM_INITIALIZER(struct cmd_rx_vlan_filter_result, 4357 vlan_id, RTE_UINT16); 4358 cmdline_parse_token_num_t cmd_rx_vlan_filter_portid = 4359 TOKEN_NUM_INITIALIZER(struct cmd_rx_vlan_filter_result, 4360 port_id, RTE_UINT16); 4361 4362 cmdline_parse_inst_t cmd_rx_vlan_filter = { 4363 .f = cmd_rx_vlan_filter_parsed, 4364 .data = NULL, 4365 .help_str = "rx_vlan add|rm <vlan_id> <port_id>: " 4366 "Add/Remove a VLAN identifier to/from the set of VLAN " 4367 "identifiers filtered by a port", 4368 .tokens = { 4369 (void *)&cmd_rx_vlan_filter_rx_vlan, 4370 (void *)&cmd_rx_vlan_filter_what, 4371 (void *)&cmd_rx_vlan_filter_vlanid, 4372 (void *)&cmd_rx_vlan_filter_portid, 4373 NULL, 4374 }, 4375 }; 4376 4377 /* *** ENABLE HARDWARE INSERTION OF VLAN HEADER IN TX PACKETS *** */ 4378 struct cmd_tx_vlan_set_result { 4379 cmdline_fixed_string_t tx_vlan; 4380 cmdline_fixed_string_t set; 4381 portid_t port_id; 4382 uint16_t vlan_id; 4383 }; 4384 4385 static void 4386 cmd_tx_vlan_set_parsed(void *parsed_result, 4387 __rte_unused struct cmdline *cl, 4388 __rte_unused void *data) 4389 { 4390 struct cmd_tx_vlan_set_result *res = parsed_result; 4391 4392 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 4393 return; 4394 4395 if (!port_is_stopped(res->port_id)) { 4396 printf("Please stop port %d first\n", res->port_id); 4397 return; 4398 } 4399 4400 tx_vlan_set(res->port_id, res->vlan_id); 4401 4402 cmd_reconfig_device_queue(res->port_id, 1, 1); 4403 } 4404 4405 cmdline_parse_token_string_t cmd_tx_vlan_set_tx_vlan = 4406 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_result, 4407 tx_vlan, "tx_vlan"); 4408 cmdline_parse_token_string_t cmd_tx_vlan_set_set = 4409 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_result, 4410 set, "set"); 4411 cmdline_parse_token_num_t cmd_tx_vlan_set_portid = 4412 TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_result, 4413 port_id, RTE_UINT16); 4414 cmdline_parse_token_num_t cmd_tx_vlan_set_vlanid = 4415 TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_result, 4416 vlan_id, RTE_UINT16); 4417 4418 cmdline_parse_inst_t cmd_tx_vlan_set = { 4419 .f = cmd_tx_vlan_set_parsed, 4420 .data = NULL, 4421 .help_str = "tx_vlan set <port_id> <vlan_id>: " 4422 "Enable hardware insertion of a single VLAN header " 4423 "with a given TAG Identifier in packets sent on a port", 4424 .tokens = { 4425 (void *)&cmd_tx_vlan_set_tx_vlan, 4426 (void *)&cmd_tx_vlan_set_set, 4427 (void *)&cmd_tx_vlan_set_portid, 4428 (void *)&cmd_tx_vlan_set_vlanid, 4429 NULL, 4430 }, 4431 }; 4432 4433 /* *** ENABLE HARDWARE INSERTION OF Double VLAN HEADER IN TX PACKETS *** */ 4434 struct cmd_tx_vlan_set_qinq_result { 4435 cmdline_fixed_string_t tx_vlan; 4436 cmdline_fixed_string_t set; 4437 portid_t port_id; 4438 uint16_t vlan_id; 4439 uint16_t vlan_id_outer; 4440 }; 4441 4442 static void 4443 cmd_tx_vlan_set_qinq_parsed(void *parsed_result, 4444 __rte_unused struct cmdline *cl, 4445 __rte_unused void *data) 4446 { 4447 struct cmd_tx_vlan_set_qinq_result *res = parsed_result; 4448 4449 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 4450 return; 4451 4452 if (!port_is_stopped(res->port_id)) { 4453 printf("Please stop port %d first\n", res->port_id); 4454 return; 4455 } 4456 4457 tx_qinq_set(res->port_id, res->vlan_id, res->vlan_id_outer); 4458 4459 cmd_reconfig_device_queue(res->port_id, 1, 1); 4460 } 4461 4462 cmdline_parse_token_string_t cmd_tx_vlan_set_qinq_tx_vlan = 4463 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_qinq_result, 4464 tx_vlan, "tx_vlan"); 4465 cmdline_parse_token_string_t cmd_tx_vlan_set_qinq_set = 4466 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_qinq_result, 4467 set, "set"); 4468 cmdline_parse_token_num_t cmd_tx_vlan_set_qinq_portid = 4469 TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_qinq_result, 4470 port_id, RTE_UINT16); 4471 cmdline_parse_token_num_t cmd_tx_vlan_set_qinq_vlanid = 4472 TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_qinq_result, 4473 vlan_id, RTE_UINT16); 4474 cmdline_parse_token_num_t cmd_tx_vlan_set_qinq_vlanid_outer = 4475 TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_qinq_result, 4476 vlan_id_outer, RTE_UINT16); 4477 4478 cmdline_parse_inst_t cmd_tx_vlan_set_qinq = { 4479 .f = cmd_tx_vlan_set_qinq_parsed, 4480 .data = NULL, 4481 .help_str = "tx_vlan set <port_id> <vlan_id> <outer_vlan_id>: " 4482 "Enable hardware insertion of double VLAN header " 4483 "with given TAG Identifiers in packets sent on a port", 4484 .tokens = { 4485 (void *)&cmd_tx_vlan_set_qinq_tx_vlan, 4486 (void *)&cmd_tx_vlan_set_qinq_set, 4487 (void *)&cmd_tx_vlan_set_qinq_portid, 4488 (void *)&cmd_tx_vlan_set_qinq_vlanid, 4489 (void *)&cmd_tx_vlan_set_qinq_vlanid_outer, 4490 NULL, 4491 }, 4492 }; 4493 4494 /* *** ENABLE/DISABLE PORT BASED TX VLAN INSERTION *** */ 4495 struct cmd_tx_vlan_set_pvid_result { 4496 cmdline_fixed_string_t tx_vlan; 4497 cmdline_fixed_string_t set; 4498 cmdline_fixed_string_t pvid; 4499 portid_t port_id; 4500 uint16_t vlan_id; 4501 cmdline_fixed_string_t mode; 4502 }; 4503 4504 static void 4505 cmd_tx_vlan_set_pvid_parsed(void *parsed_result, 4506 __rte_unused struct cmdline *cl, 4507 __rte_unused void *data) 4508 { 4509 struct cmd_tx_vlan_set_pvid_result *res = parsed_result; 4510 4511 if (strcmp(res->mode, "on") == 0) 4512 tx_vlan_pvid_set(res->port_id, res->vlan_id, 1); 4513 else 4514 tx_vlan_pvid_set(res->port_id, res->vlan_id, 0); 4515 } 4516 4517 cmdline_parse_token_string_t cmd_tx_vlan_set_pvid_tx_vlan = 4518 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_pvid_result, 4519 tx_vlan, "tx_vlan"); 4520 cmdline_parse_token_string_t cmd_tx_vlan_set_pvid_set = 4521 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_pvid_result, 4522 set, "set"); 4523 cmdline_parse_token_string_t cmd_tx_vlan_set_pvid_pvid = 4524 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_pvid_result, 4525 pvid, "pvid"); 4526 cmdline_parse_token_num_t cmd_tx_vlan_set_pvid_port_id = 4527 TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_pvid_result, 4528 port_id, RTE_UINT16); 4529 cmdline_parse_token_num_t cmd_tx_vlan_set_pvid_vlan_id = 4530 TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_pvid_result, 4531 vlan_id, RTE_UINT16); 4532 cmdline_parse_token_string_t cmd_tx_vlan_set_pvid_mode = 4533 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_pvid_result, 4534 mode, "on#off"); 4535 4536 cmdline_parse_inst_t cmd_tx_vlan_set_pvid = { 4537 .f = cmd_tx_vlan_set_pvid_parsed, 4538 .data = NULL, 4539 .help_str = "tx_vlan set pvid <port_id> <vlan_id> on|off", 4540 .tokens = { 4541 (void *)&cmd_tx_vlan_set_pvid_tx_vlan, 4542 (void *)&cmd_tx_vlan_set_pvid_set, 4543 (void *)&cmd_tx_vlan_set_pvid_pvid, 4544 (void *)&cmd_tx_vlan_set_pvid_port_id, 4545 (void *)&cmd_tx_vlan_set_pvid_vlan_id, 4546 (void *)&cmd_tx_vlan_set_pvid_mode, 4547 NULL, 4548 }, 4549 }; 4550 4551 /* *** DISABLE HARDWARE INSERTION OF VLAN HEADER IN TX PACKETS *** */ 4552 struct cmd_tx_vlan_reset_result { 4553 cmdline_fixed_string_t tx_vlan; 4554 cmdline_fixed_string_t reset; 4555 portid_t port_id; 4556 }; 4557 4558 static void 4559 cmd_tx_vlan_reset_parsed(void *parsed_result, 4560 __rte_unused struct cmdline *cl, 4561 __rte_unused void *data) 4562 { 4563 struct cmd_tx_vlan_reset_result *res = parsed_result; 4564 4565 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 4566 return; 4567 4568 if (!port_is_stopped(res->port_id)) { 4569 printf("Please stop port %d first\n", res->port_id); 4570 return; 4571 } 4572 4573 tx_vlan_reset(res->port_id); 4574 4575 cmd_reconfig_device_queue(res->port_id, 1, 1); 4576 } 4577 4578 cmdline_parse_token_string_t cmd_tx_vlan_reset_tx_vlan = 4579 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_reset_result, 4580 tx_vlan, "tx_vlan"); 4581 cmdline_parse_token_string_t cmd_tx_vlan_reset_reset = 4582 TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_reset_result, 4583 reset, "reset"); 4584 cmdline_parse_token_num_t cmd_tx_vlan_reset_portid = 4585 TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_reset_result, 4586 port_id, RTE_UINT16); 4587 4588 cmdline_parse_inst_t cmd_tx_vlan_reset = { 4589 .f = cmd_tx_vlan_reset_parsed, 4590 .data = NULL, 4591 .help_str = "tx_vlan reset <port_id>: Disable hardware insertion of a " 4592 "VLAN header in packets sent on a port", 4593 .tokens = { 4594 (void *)&cmd_tx_vlan_reset_tx_vlan, 4595 (void *)&cmd_tx_vlan_reset_reset, 4596 (void *)&cmd_tx_vlan_reset_portid, 4597 NULL, 4598 }, 4599 }; 4600 4601 4602 /* *** ENABLE HARDWARE INSERTION OF CHECKSUM IN TX PACKETS *** */ 4603 struct cmd_csum_result { 4604 cmdline_fixed_string_t csum; 4605 cmdline_fixed_string_t mode; 4606 cmdline_fixed_string_t proto; 4607 cmdline_fixed_string_t hwsw; 4608 portid_t port_id; 4609 }; 4610 4611 static void 4612 csum_show(int port_id) 4613 { 4614 struct rte_eth_dev_info dev_info; 4615 uint64_t tx_offloads; 4616 int ret; 4617 4618 tx_offloads = ports[port_id].dev_conf.txmode.offloads; 4619 printf("Parse tunnel is %s\n", 4620 (ports[port_id].parse_tunnel) ? "on" : "off"); 4621 printf("IP checksum offload is %s\n", 4622 (tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) ? "hw" : "sw"); 4623 printf("UDP checksum offload is %s\n", 4624 (tx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM) ? "hw" : "sw"); 4625 printf("TCP checksum offload is %s\n", 4626 (tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM) ? "hw" : "sw"); 4627 printf("SCTP checksum offload is %s\n", 4628 (tx_offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) ? "hw" : "sw"); 4629 printf("Outer-Ip checksum offload is %s\n", 4630 (tx_offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) ? "hw" : "sw"); 4631 printf("Outer-Udp checksum offload is %s\n", 4632 (tx_offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM) ? "hw" : "sw"); 4633 4634 /* display warnings if configuration is not supported by the NIC */ 4635 ret = eth_dev_info_get_print_err(port_id, &dev_info); 4636 if (ret != 0) 4637 return; 4638 4639 if ((tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) && 4640 (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) == 0) { 4641 printf("Warning: hardware IP checksum enabled but not " 4642 "supported by port %d\n", port_id); 4643 } 4644 if ((tx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM) && 4645 (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) == 0) { 4646 printf("Warning: hardware UDP checksum enabled but not " 4647 "supported by port %d\n", port_id); 4648 } 4649 if ((tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM) && 4650 (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) == 0) { 4651 printf("Warning: hardware TCP checksum enabled but not " 4652 "supported by port %d\n", port_id); 4653 } 4654 if ((tx_offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) && 4655 (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) == 0) { 4656 printf("Warning: hardware SCTP checksum enabled but not " 4657 "supported by port %d\n", port_id); 4658 } 4659 if ((tx_offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) && 4660 (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) == 0) { 4661 printf("Warning: hardware outer IP checksum enabled but not " 4662 "supported by port %d\n", port_id); 4663 } 4664 if ((tx_offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM) && 4665 (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM) 4666 == 0) { 4667 printf("Warning: hardware outer UDP checksum enabled but not " 4668 "supported by port %d\n", port_id); 4669 } 4670 } 4671 4672 static void 4673 cmd_config_queue_tx_offloads(struct rte_port *port) 4674 { 4675 int k; 4676 4677 /* Apply queue tx offloads configuration */ 4678 for (k = 0; k < port->dev_info.max_tx_queues; k++) 4679 port->tx_conf[k].offloads = 4680 port->dev_conf.txmode.offloads; 4681 } 4682 4683 static void 4684 cmd_csum_parsed(void *parsed_result, 4685 __rte_unused struct cmdline *cl, 4686 __rte_unused void *data) 4687 { 4688 struct cmd_csum_result *res = parsed_result; 4689 int hw = 0; 4690 uint64_t csum_offloads = 0; 4691 struct rte_eth_dev_info dev_info; 4692 int ret; 4693 4694 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) { 4695 printf("invalid port %d\n", res->port_id); 4696 return; 4697 } 4698 if (!port_is_stopped(res->port_id)) { 4699 printf("Please stop port %d first\n", res->port_id); 4700 return; 4701 } 4702 4703 ret = eth_dev_info_get_print_err(res->port_id, &dev_info); 4704 if (ret != 0) 4705 return; 4706 4707 if (!strcmp(res->mode, "set")) { 4708 4709 if (!strcmp(res->hwsw, "hw")) 4710 hw = 1; 4711 4712 if (!strcmp(res->proto, "ip")) { 4713 if (hw == 0 || (dev_info.tx_offload_capa & 4714 DEV_TX_OFFLOAD_IPV4_CKSUM)) { 4715 csum_offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM; 4716 } else { 4717 printf("IP checksum offload is not supported " 4718 "by port %u\n", res->port_id); 4719 } 4720 } else if (!strcmp(res->proto, "udp")) { 4721 if (hw == 0 || (dev_info.tx_offload_capa & 4722 DEV_TX_OFFLOAD_UDP_CKSUM)) { 4723 csum_offloads |= DEV_TX_OFFLOAD_UDP_CKSUM; 4724 } else { 4725 printf("UDP checksum offload is not supported " 4726 "by port %u\n", res->port_id); 4727 } 4728 } else if (!strcmp(res->proto, "tcp")) { 4729 if (hw == 0 || (dev_info.tx_offload_capa & 4730 DEV_TX_OFFLOAD_TCP_CKSUM)) { 4731 csum_offloads |= DEV_TX_OFFLOAD_TCP_CKSUM; 4732 } else { 4733 printf("TCP checksum offload is not supported " 4734 "by port %u\n", res->port_id); 4735 } 4736 } else if (!strcmp(res->proto, "sctp")) { 4737 if (hw == 0 || (dev_info.tx_offload_capa & 4738 DEV_TX_OFFLOAD_SCTP_CKSUM)) { 4739 csum_offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM; 4740 } else { 4741 printf("SCTP checksum offload is not supported " 4742 "by port %u\n", res->port_id); 4743 } 4744 } else if (!strcmp(res->proto, "outer-ip")) { 4745 if (hw == 0 || (dev_info.tx_offload_capa & 4746 DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)) { 4747 csum_offloads |= 4748 DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM; 4749 } else { 4750 printf("Outer IP checksum offload is not " 4751 "supported by port %u\n", res->port_id); 4752 } 4753 } else if (!strcmp(res->proto, "outer-udp")) { 4754 if (hw == 0 || (dev_info.tx_offload_capa & 4755 DEV_TX_OFFLOAD_OUTER_UDP_CKSUM)) { 4756 csum_offloads |= 4757 DEV_TX_OFFLOAD_OUTER_UDP_CKSUM; 4758 } else { 4759 printf("Outer UDP checksum offload is not " 4760 "supported by port %u\n", res->port_id); 4761 } 4762 } 4763 4764 if (hw) { 4765 ports[res->port_id].dev_conf.txmode.offloads |= 4766 csum_offloads; 4767 } else { 4768 ports[res->port_id].dev_conf.txmode.offloads &= 4769 (~csum_offloads); 4770 } 4771 cmd_config_queue_tx_offloads(&ports[res->port_id]); 4772 } 4773 csum_show(res->port_id); 4774 4775 cmd_reconfig_device_queue(res->port_id, 1, 1); 4776 } 4777 4778 cmdline_parse_token_string_t cmd_csum_csum = 4779 TOKEN_STRING_INITIALIZER(struct cmd_csum_result, 4780 csum, "csum"); 4781 cmdline_parse_token_string_t cmd_csum_mode = 4782 TOKEN_STRING_INITIALIZER(struct cmd_csum_result, 4783 mode, "set"); 4784 cmdline_parse_token_string_t cmd_csum_proto = 4785 TOKEN_STRING_INITIALIZER(struct cmd_csum_result, 4786 proto, "ip#tcp#udp#sctp#outer-ip#outer-udp"); 4787 cmdline_parse_token_string_t cmd_csum_hwsw = 4788 TOKEN_STRING_INITIALIZER(struct cmd_csum_result, 4789 hwsw, "hw#sw"); 4790 cmdline_parse_token_num_t cmd_csum_portid = 4791 TOKEN_NUM_INITIALIZER(struct cmd_csum_result, 4792 port_id, RTE_UINT16); 4793 4794 cmdline_parse_inst_t cmd_csum_set = { 4795 .f = cmd_csum_parsed, 4796 .data = NULL, 4797 .help_str = "csum set ip|tcp|udp|sctp|outer-ip|outer-udp hw|sw <port_id>: " 4798 "Enable/Disable hardware calculation of L3/L4 checksum when " 4799 "using csum forward engine", 4800 .tokens = { 4801 (void *)&cmd_csum_csum, 4802 (void *)&cmd_csum_mode, 4803 (void *)&cmd_csum_proto, 4804 (void *)&cmd_csum_hwsw, 4805 (void *)&cmd_csum_portid, 4806 NULL, 4807 }, 4808 }; 4809 4810 cmdline_parse_token_string_t cmd_csum_mode_show = 4811 TOKEN_STRING_INITIALIZER(struct cmd_csum_result, 4812 mode, "show"); 4813 4814 cmdline_parse_inst_t cmd_csum_show = { 4815 .f = cmd_csum_parsed, 4816 .data = NULL, 4817 .help_str = "csum show <port_id>: Show checksum offload configuration", 4818 .tokens = { 4819 (void *)&cmd_csum_csum, 4820 (void *)&cmd_csum_mode_show, 4821 (void *)&cmd_csum_portid, 4822 NULL, 4823 }, 4824 }; 4825 4826 /* Enable/disable tunnel parsing */ 4827 struct cmd_csum_tunnel_result { 4828 cmdline_fixed_string_t csum; 4829 cmdline_fixed_string_t parse; 4830 cmdline_fixed_string_t onoff; 4831 portid_t port_id; 4832 }; 4833 4834 static void 4835 cmd_csum_tunnel_parsed(void *parsed_result, 4836 __rte_unused struct cmdline *cl, 4837 __rte_unused void *data) 4838 { 4839 struct cmd_csum_tunnel_result *res = parsed_result; 4840 4841 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 4842 return; 4843 4844 if (!strcmp(res->onoff, "on")) 4845 ports[res->port_id].parse_tunnel = 1; 4846 else 4847 ports[res->port_id].parse_tunnel = 0; 4848 4849 csum_show(res->port_id); 4850 } 4851 4852 cmdline_parse_token_string_t cmd_csum_tunnel_csum = 4853 TOKEN_STRING_INITIALIZER(struct cmd_csum_tunnel_result, 4854 csum, "csum"); 4855 cmdline_parse_token_string_t cmd_csum_tunnel_parse = 4856 TOKEN_STRING_INITIALIZER(struct cmd_csum_tunnel_result, 4857 parse, "parse-tunnel"); 4858 cmdline_parse_token_string_t cmd_csum_tunnel_onoff = 4859 TOKEN_STRING_INITIALIZER(struct cmd_csum_tunnel_result, 4860 onoff, "on#off"); 4861 cmdline_parse_token_num_t cmd_csum_tunnel_portid = 4862 TOKEN_NUM_INITIALIZER(struct cmd_csum_tunnel_result, 4863 port_id, RTE_UINT16); 4864 4865 cmdline_parse_inst_t cmd_csum_tunnel = { 4866 .f = cmd_csum_tunnel_parsed, 4867 .data = NULL, 4868 .help_str = "csum parse-tunnel on|off <port_id>: " 4869 "Enable/Disable parsing of tunnels for csum engine", 4870 .tokens = { 4871 (void *)&cmd_csum_tunnel_csum, 4872 (void *)&cmd_csum_tunnel_parse, 4873 (void *)&cmd_csum_tunnel_onoff, 4874 (void *)&cmd_csum_tunnel_portid, 4875 NULL, 4876 }, 4877 }; 4878 4879 /* *** ENABLE HARDWARE SEGMENTATION IN TX NON-TUNNELED PACKETS *** */ 4880 struct cmd_tso_set_result { 4881 cmdline_fixed_string_t tso; 4882 cmdline_fixed_string_t mode; 4883 uint16_t tso_segsz; 4884 portid_t port_id; 4885 }; 4886 4887 static void 4888 cmd_tso_set_parsed(void *parsed_result, 4889 __rte_unused struct cmdline *cl, 4890 __rte_unused void *data) 4891 { 4892 struct cmd_tso_set_result *res = parsed_result; 4893 struct rte_eth_dev_info dev_info; 4894 int ret; 4895 4896 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 4897 return; 4898 if (!port_is_stopped(res->port_id)) { 4899 printf("Please stop port %d first\n", res->port_id); 4900 return; 4901 } 4902 4903 if (!strcmp(res->mode, "set")) 4904 ports[res->port_id].tso_segsz = res->tso_segsz; 4905 4906 ret = eth_dev_info_get_print_err(res->port_id, &dev_info); 4907 if (ret != 0) 4908 return; 4909 4910 if ((ports[res->port_id].tso_segsz != 0) && 4911 (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) { 4912 printf("Error: TSO is not supported by port %d\n", 4913 res->port_id); 4914 return; 4915 } 4916 4917 if (ports[res->port_id].tso_segsz == 0) { 4918 ports[res->port_id].dev_conf.txmode.offloads &= 4919 ~DEV_TX_OFFLOAD_TCP_TSO; 4920 printf("TSO for non-tunneled packets is disabled\n"); 4921 } else { 4922 ports[res->port_id].dev_conf.txmode.offloads |= 4923 DEV_TX_OFFLOAD_TCP_TSO; 4924 printf("TSO segment size for non-tunneled packets is %d\n", 4925 ports[res->port_id].tso_segsz); 4926 } 4927 cmd_config_queue_tx_offloads(&ports[res->port_id]); 4928 4929 /* display warnings if configuration is not supported by the NIC */ 4930 ret = eth_dev_info_get_print_err(res->port_id, &dev_info); 4931 if (ret != 0) 4932 return; 4933 4934 if ((ports[res->port_id].tso_segsz != 0) && 4935 (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) { 4936 printf("Warning: TSO enabled but not " 4937 "supported by port %d\n", res->port_id); 4938 } 4939 4940 cmd_reconfig_device_queue(res->port_id, 1, 1); 4941 } 4942 4943 cmdline_parse_token_string_t cmd_tso_set_tso = 4944 TOKEN_STRING_INITIALIZER(struct cmd_tso_set_result, 4945 tso, "tso"); 4946 cmdline_parse_token_string_t cmd_tso_set_mode = 4947 TOKEN_STRING_INITIALIZER(struct cmd_tso_set_result, 4948 mode, "set"); 4949 cmdline_parse_token_num_t cmd_tso_set_tso_segsz = 4950 TOKEN_NUM_INITIALIZER(struct cmd_tso_set_result, 4951 tso_segsz, RTE_UINT16); 4952 cmdline_parse_token_num_t cmd_tso_set_portid = 4953 TOKEN_NUM_INITIALIZER(struct cmd_tso_set_result, 4954 port_id, RTE_UINT16); 4955 4956 cmdline_parse_inst_t cmd_tso_set = { 4957 .f = cmd_tso_set_parsed, 4958 .data = NULL, 4959 .help_str = "tso set <tso_segsz> <port_id>: " 4960 "Set TSO segment size of non-tunneled packets for csum engine " 4961 "(0 to disable)", 4962 .tokens = { 4963 (void *)&cmd_tso_set_tso, 4964 (void *)&cmd_tso_set_mode, 4965 (void *)&cmd_tso_set_tso_segsz, 4966 (void *)&cmd_tso_set_portid, 4967 NULL, 4968 }, 4969 }; 4970 4971 cmdline_parse_token_string_t cmd_tso_show_mode = 4972 TOKEN_STRING_INITIALIZER(struct cmd_tso_set_result, 4973 mode, "show"); 4974 4975 4976 cmdline_parse_inst_t cmd_tso_show = { 4977 .f = cmd_tso_set_parsed, 4978 .data = NULL, 4979 .help_str = "tso show <port_id>: " 4980 "Show TSO segment size of non-tunneled packets for csum engine", 4981 .tokens = { 4982 (void *)&cmd_tso_set_tso, 4983 (void *)&cmd_tso_show_mode, 4984 (void *)&cmd_tso_set_portid, 4985 NULL, 4986 }, 4987 }; 4988 4989 /* *** ENABLE HARDWARE SEGMENTATION IN TX TUNNELED PACKETS *** */ 4990 struct cmd_tunnel_tso_set_result { 4991 cmdline_fixed_string_t tso; 4992 cmdline_fixed_string_t mode; 4993 uint16_t tso_segsz; 4994 portid_t port_id; 4995 }; 4996 4997 static struct rte_eth_dev_info 4998 check_tunnel_tso_nic_support(portid_t port_id) 4999 { 5000 struct rte_eth_dev_info dev_info; 5001 5002 if (eth_dev_info_get_print_err(port_id, &dev_info) != 0) 5003 return dev_info; 5004 5005 if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO)) 5006 printf("Warning: VXLAN TUNNEL TSO not supported therefore " 5007 "not enabled for port %d\n", port_id); 5008 if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO)) 5009 printf("Warning: GRE TUNNEL TSO not supported therefore " 5010 "not enabled for port %d\n", port_id); 5011 if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO)) 5012 printf("Warning: IPIP TUNNEL TSO not supported therefore " 5013 "not enabled for port %d\n", port_id); 5014 if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO)) 5015 printf("Warning: GENEVE TUNNEL TSO not supported therefore " 5016 "not enabled for port %d\n", port_id); 5017 if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IP_TNL_TSO)) 5018 printf("Warning: IP TUNNEL TSO not supported therefore " 5019 "not enabled for port %d\n", port_id); 5020 if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_TNL_TSO)) 5021 printf("Warning: UDP TUNNEL TSO not supported therefore " 5022 "not enabled for port %d\n", port_id); 5023 return dev_info; 5024 } 5025 5026 static void 5027 cmd_tunnel_tso_set_parsed(void *parsed_result, 5028 __rte_unused struct cmdline *cl, 5029 __rte_unused void *data) 5030 { 5031 struct cmd_tunnel_tso_set_result *res = parsed_result; 5032 struct rte_eth_dev_info dev_info; 5033 5034 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 5035 return; 5036 if (!port_is_stopped(res->port_id)) { 5037 printf("Please stop port %d first\n", res->port_id); 5038 return; 5039 } 5040 5041 if (!strcmp(res->mode, "set")) 5042 ports[res->port_id].tunnel_tso_segsz = res->tso_segsz; 5043 5044 dev_info = check_tunnel_tso_nic_support(res->port_id); 5045 if (ports[res->port_id].tunnel_tso_segsz == 0) { 5046 ports[res->port_id].dev_conf.txmode.offloads &= 5047 ~(DEV_TX_OFFLOAD_VXLAN_TNL_TSO | 5048 DEV_TX_OFFLOAD_GRE_TNL_TSO | 5049 DEV_TX_OFFLOAD_IPIP_TNL_TSO | 5050 DEV_TX_OFFLOAD_GENEVE_TNL_TSO | 5051 DEV_TX_OFFLOAD_IP_TNL_TSO | 5052 DEV_TX_OFFLOAD_UDP_TNL_TSO); 5053 printf("TSO for tunneled packets is disabled\n"); 5054 } else { 5055 uint64_t tso_offloads = (DEV_TX_OFFLOAD_VXLAN_TNL_TSO | 5056 DEV_TX_OFFLOAD_GRE_TNL_TSO | 5057 DEV_TX_OFFLOAD_IPIP_TNL_TSO | 5058 DEV_TX_OFFLOAD_GENEVE_TNL_TSO | 5059 DEV_TX_OFFLOAD_IP_TNL_TSO | 5060 DEV_TX_OFFLOAD_UDP_TNL_TSO); 5061 5062 ports[res->port_id].dev_conf.txmode.offloads |= 5063 (tso_offloads & dev_info.tx_offload_capa); 5064 printf("TSO segment size for tunneled packets is %d\n", 5065 ports[res->port_id].tunnel_tso_segsz); 5066 5067 /* Below conditions are needed to make it work: 5068 * (1) tunnel TSO is supported by the NIC; 5069 * (2) "csum parse_tunnel" must be set so that tunneled pkts 5070 * are recognized; 5071 * (3) for tunneled pkts with outer L3 of IPv4, 5072 * "csum set outer-ip" must be set to hw, because after tso, 5073 * total_len of outer IP header is changed, and the checksum 5074 * of outer IP header calculated by sw should be wrong; that 5075 * is not necessary for IPv6 tunneled pkts because there's no 5076 * checksum in IP header anymore. 5077 */ 5078 5079 if (!ports[res->port_id].parse_tunnel) 5080 printf("Warning: csum parse_tunnel must be set " 5081 "so that tunneled packets are recognized\n"); 5082 if (!(ports[res->port_id].dev_conf.txmode.offloads & 5083 DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)) 5084 printf("Warning: csum set outer-ip must be set to hw " 5085 "if outer L3 is IPv4; not necessary for IPv6\n"); 5086 } 5087 5088 cmd_config_queue_tx_offloads(&ports[res->port_id]); 5089 cmd_reconfig_device_queue(res->port_id, 1, 1); 5090 } 5091 5092 cmdline_parse_token_string_t cmd_tunnel_tso_set_tso = 5093 TOKEN_STRING_INITIALIZER(struct cmd_tunnel_tso_set_result, 5094 tso, "tunnel_tso"); 5095 cmdline_parse_token_string_t cmd_tunnel_tso_set_mode = 5096 TOKEN_STRING_INITIALIZER(struct cmd_tunnel_tso_set_result, 5097 mode, "set"); 5098 cmdline_parse_token_num_t cmd_tunnel_tso_set_tso_segsz = 5099 TOKEN_NUM_INITIALIZER(struct cmd_tunnel_tso_set_result, 5100 tso_segsz, RTE_UINT16); 5101 cmdline_parse_token_num_t cmd_tunnel_tso_set_portid = 5102 TOKEN_NUM_INITIALIZER(struct cmd_tunnel_tso_set_result, 5103 port_id, RTE_UINT16); 5104 5105 cmdline_parse_inst_t cmd_tunnel_tso_set = { 5106 .f = cmd_tunnel_tso_set_parsed, 5107 .data = NULL, 5108 .help_str = "tunnel_tso set <tso_segsz> <port_id>: " 5109 "Set TSO segment size of tunneled packets for csum engine " 5110 "(0 to disable)", 5111 .tokens = { 5112 (void *)&cmd_tunnel_tso_set_tso, 5113 (void *)&cmd_tunnel_tso_set_mode, 5114 (void *)&cmd_tunnel_tso_set_tso_segsz, 5115 (void *)&cmd_tunnel_tso_set_portid, 5116 NULL, 5117 }, 5118 }; 5119 5120 cmdline_parse_token_string_t cmd_tunnel_tso_show_mode = 5121 TOKEN_STRING_INITIALIZER(struct cmd_tunnel_tso_set_result, 5122 mode, "show"); 5123 5124 5125 cmdline_parse_inst_t cmd_tunnel_tso_show = { 5126 .f = cmd_tunnel_tso_set_parsed, 5127 .data = NULL, 5128 .help_str = "tunnel_tso show <port_id> " 5129 "Show TSO segment size of tunneled packets for csum engine", 5130 .tokens = { 5131 (void *)&cmd_tunnel_tso_set_tso, 5132 (void *)&cmd_tunnel_tso_show_mode, 5133 (void *)&cmd_tunnel_tso_set_portid, 5134 NULL, 5135 }, 5136 }; 5137 5138 /* *** SET GRO FOR A PORT *** */ 5139 struct cmd_gro_enable_result { 5140 cmdline_fixed_string_t cmd_set; 5141 cmdline_fixed_string_t cmd_port; 5142 cmdline_fixed_string_t cmd_keyword; 5143 cmdline_fixed_string_t cmd_onoff; 5144 portid_t cmd_pid; 5145 }; 5146 5147 static void 5148 cmd_gro_enable_parsed(void *parsed_result, 5149 __rte_unused struct cmdline *cl, 5150 __rte_unused void *data) 5151 { 5152 struct cmd_gro_enable_result *res; 5153 5154 res = parsed_result; 5155 if (!strcmp(res->cmd_keyword, "gro")) 5156 setup_gro(res->cmd_onoff, res->cmd_pid); 5157 } 5158 5159 cmdline_parse_token_string_t cmd_gro_enable_set = 5160 TOKEN_STRING_INITIALIZER(struct cmd_gro_enable_result, 5161 cmd_set, "set"); 5162 cmdline_parse_token_string_t cmd_gro_enable_port = 5163 TOKEN_STRING_INITIALIZER(struct cmd_gro_enable_result, 5164 cmd_keyword, "port"); 5165 cmdline_parse_token_num_t cmd_gro_enable_pid = 5166 TOKEN_NUM_INITIALIZER(struct cmd_gro_enable_result, 5167 cmd_pid, RTE_UINT16); 5168 cmdline_parse_token_string_t cmd_gro_enable_keyword = 5169 TOKEN_STRING_INITIALIZER(struct cmd_gro_enable_result, 5170 cmd_keyword, "gro"); 5171 cmdline_parse_token_string_t cmd_gro_enable_onoff = 5172 TOKEN_STRING_INITIALIZER(struct cmd_gro_enable_result, 5173 cmd_onoff, "on#off"); 5174 5175 cmdline_parse_inst_t cmd_gro_enable = { 5176 .f = cmd_gro_enable_parsed, 5177 .data = NULL, 5178 .help_str = "set port <port_id> gro on|off", 5179 .tokens = { 5180 (void *)&cmd_gro_enable_set, 5181 (void *)&cmd_gro_enable_port, 5182 (void *)&cmd_gro_enable_pid, 5183 (void *)&cmd_gro_enable_keyword, 5184 (void *)&cmd_gro_enable_onoff, 5185 NULL, 5186 }, 5187 }; 5188 5189 /* *** DISPLAY GRO CONFIGURATION *** */ 5190 struct cmd_gro_show_result { 5191 cmdline_fixed_string_t cmd_show; 5192 cmdline_fixed_string_t cmd_port; 5193 cmdline_fixed_string_t cmd_keyword; 5194 portid_t cmd_pid; 5195 }; 5196 5197 static void 5198 cmd_gro_show_parsed(void *parsed_result, 5199 __rte_unused struct cmdline *cl, 5200 __rte_unused void *data) 5201 { 5202 struct cmd_gro_show_result *res; 5203 5204 res = parsed_result; 5205 if (!strcmp(res->cmd_keyword, "gro")) 5206 show_gro(res->cmd_pid); 5207 } 5208 5209 cmdline_parse_token_string_t cmd_gro_show_show = 5210 TOKEN_STRING_INITIALIZER(struct cmd_gro_show_result, 5211 cmd_show, "show"); 5212 cmdline_parse_token_string_t cmd_gro_show_port = 5213 TOKEN_STRING_INITIALIZER(struct cmd_gro_show_result, 5214 cmd_port, "port"); 5215 cmdline_parse_token_num_t cmd_gro_show_pid = 5216 TOKEN_NUM_INITIALIZER(struct cmd_gro_show_result, 5217 cmd_pid, RTE_UINT16); 5218 cmdline_parse_token_string_t cmd_gro_show_keyword = 5219 TOKEN_STRING_INITIALIZER(struct cmd_gro_show_result, 5220 cmd_keyword, "gro"); 5221 5222 cmdline_parse_inst_t cmd_gro_show = { 5223 .f = cmd_gro_show_parsed, 5224 .data = NULL, 5225 .help_str = "show port <port_id> gro", 5226 .tokens = { 5227 (void *)&cmd_gro_show_show, 5228 (void *)&cmd_gro_show_port, 5229 (void *)&cmd_gro_show_pid, 5230 (void *)&cmd_gro_show_keyword, 5231 NULL, 5232 }, 5233 }; 5234 5235 /* *** SET FLUSH CYCLES FOR GRO *** */ 5236 struct cmd_gro_flush_result { 5237 cmdline_fixed_string_t cmd_set; 5238 cmdline_fixed_string_t cmd_keyword; 5239 cmdline_fixed_string_t cmd_flush; 5240 uint8_t cmd_cycles; 5241 }; 5242 5243 static void 5244 cmd_gro_flush_parsed(void *parsed_result, 5245 __rte_unused struct cmdline *cl, 5246 __rte_unused void *data) 5247 { 5248 struct cmd_gro_flush_result *res; 5249 5250 res = parsed_result; 5251 if ((!strcmp(res->cmd_keyword, "gro")) && 5252 (!strcmp(res->cmd_flush, "flush"))) 5253 setup_gro_flush_cycles(res->cmd_cycles); 5254 } 5255 5256 cmdline_parse_token_string_t cmd_gro_flush_set = 5257 TOKEN_STRING_INITIALIZER(struct cmd_gro_flush_result, 5258 cmd_set, "set"); 5259 cmdline_parse_token_string_t cmd_gro_flush_keyword = 5260 TOKEN_STRING_INITIALIZER(struct cmd_gro_flush_result, 5261 cmd_keyword, "gro"); 5262 cmdline_parse_token_string_t cmd_gro_flush_flush = 5263 TOKEN_STRING_INITIALIZER(struct cmd_gro_flush_result, 5264 cmd_flush, "flush"); 5265 cmdline_parse_token_num_t cmd_gro_flush_cycles = 5266 TOKEN_NUM_INITIALIZER(struct cmd_gro_flush_result, 5267 cmd_cycles, RTE_UINT8); 5268 5269 cmdline_parse_inst_t cmd_gro_flush = { 5270 .f = cmd_gro_flush_parsed, 5271 .data = NULL, 5272 .help_str = "set gro flush <cycles>", 5273 .tokens = { 5274 (void *)&cmd_gro_flush_set, 5275 (void *)&cmd_gro_flush_keyword, 5276 (void *)&cmd_gro_flush_flush, 5277 (void *)&cmd_gro_flush_cycles, 5278 NULL, 5279 }, 5280 }; 5281 5282 /* *** ENABLE/DISABLE GSO *** */ 5283 struct cmd_gso_enable_result { 5284 cmdline_fixed_string_t cmd_set; 5285 cmdline_fixed_string_t cmd_port; 5286 cmdline_fixed_string_t cmd_keyword; 5287 cmdline_fixed_string_t cmd_mode; 5288 portid_t cmd_pid; 5289 }; 5290 5291 static void 5292 cmd_gso_enable_parsed(void *parsed_result, 5293 __rte_unused struct cmdline *cl, 5294 __rte_unused void *data) 5295 { 5296 struct cmd_gso_enable_result *res; 5297 5298 res = parsed_result; 5299 if (!strcmp(res->cmd_keyword, "gso")) 5300 setup_gso(res->cmd_mode, res->cmd_pid); 5301 } 5302 5303 cmdline_parse_token_string_t cmd_gso_enable_set = 5304 TOKEN_STRING_INITIALIZER(struct cmd_gso_enable_result, 5305 cmd_set, "set"); 5306 cmdline_parse_token_string_t cmd_gso_enable_port = 5307 TOKEN_STRING_INITIALIZER(struct cmd_gso_enable_result, 5308 cmd_port, "port"); 5309 cmdline_parse_token_string_t cmd_gso_enable_keyword = 5310 TOKEN_STRING_INITIALIZER(struct cmd_gso_enable_result, 5311 cmd_keyword, "gso"); 5312 cmdline_parse_token_string_t cmd_gso_enable_mode = 5313 TOKEN_STRING_INITIALIZER(struct cmd_gso_enable_result, 5314 cmd_mode, "on#off"); 5315 cmdline_parse_token_num_t cmd_gso_enable_pid = 5316 TOKEN_NUM_INITIALIZER(struct cmd_gso_enable_result, 5317 cmd_pid, RTE_UINT16); 5318 5319 cmdline_parse_inst_t cmd_gso_enable = { 5320 .f = cmd_gso_enable_parsed, 5321 .data = NULL, 5322 .help_str = "set port <port_id> gso on|off", 5323 .tokens = { 5324 (void *)&cmd_gso_enable_set, 5325 (void *)&cmd_gso_enable_port, 5326 (void *)&cmd_gso_enable_pid, 5327 (void *)&cmd_gso_enable_keyword, 5328 (void *)&cmd_gso_enable_mode, 5329 NULL, 5330 }, 5331 }; 5332 5333 /* *** SET MAX PACKET LENGTH FOR GSO SEGMENTS *** */ 5334 struct cmd_gso_size_result { 5335 cmdline_fixed_string_t cmd_set; 5336 cmdline_fixed_string_t cmd_keyword; 5337 cmdline_fixed_string_t cmd_segsz; 5338 uint16_t cmd_size; 5339 }; 5340 5341 static void 5342 cmd_gso_size_parsed(void *parsed_result, 5343 __rte_unused struct cmdline *cl, 5344 __rte_unused void *data) 5345 { 5346 struct cmd_gso_size_result *res = parsed_result; 5347 5348 if (test_done == 0) { 5349 printf("Before setting GSO segsz, please first" 5350 " stop forwarding\n"); 5351 return; 5352 } 5353 5354 if (!strcmp(res->cmd_keyword, "gso") && 5355 !strcmp(res->cmd_segsz, "segsz")) { 5356 if (res->cmd_size < RTE_GSO_SEG_SIZE_MIN) 5357 printf("gso_size should be larger than %zu." 5358 " Please input a legal value\n", 5359 RTE_GSO_SEG_SIZE_MIN); 5360 else 5361 gso_max_segment_size = res->cmd_size; 5362 } 5363 } 5364 5365 cmdline_parse_token_string_t cmd_gso_size_set = 5366 TOKEN_STRING_INITIALIZER(struct cmd_gso_size_result, 5367 cmd_set, "set"); 5368 cmdline_parse_token_string_t cmd_gso_size_keyword = 5369 TOKEN_STRING_INITIALIZER(struct cmd_gso_size_result, 5370 cmd_keyword, "gso"); 5371 cmdline_parse_token_string_t cmd_gso_size_segsz = 5372 TOKEN_STRING_INITIALIZER(struct cmd_gso_size_result, 5373 cmd_segsz, "segsz"); 5374 cmdline_parse_token_num_t cmd_gso_size_size = 5375 TOKEN_NUM_INITIALIZER(struct cmd_gso_size_result, 5376 cmd_size, RTE_UINT16); 5377 5378 cmdline_parse_inst_t cmd_gso_size = { 5379 .f = cmd_gso_size_parsed, 5380 .data = NULL, 5381 .help_str = "set gso segsz <length>", 5382 .tokens = { 5383 (void *)&cmd_gso_size_set, 5384 (void *)&cmd_gso_size_keyword, 5385 (void *)&cmd_gso_size_segsz, 5386 (void *)&cmd_gso_size_size, 5387 NULL, 5388 }, 5389 }; 5390 5391 /* *** SHOW GSO CONFIGURATION *** */ 5392 struct cmd_gso_show_result { 5393 cmdline_fixed_string_t cmd_show; 5394 cmdline_fixed_string_t cmd_port; 5395 cmdline_fixed_string_t cmd_keyword; 5396 portid_t cmd_pid; 5397 }; 5398 5399 static void 5400 cmd_gso_show_parsed(void *parsed_result, 5401 __rte_unused struct cmdline *cl, 5402 __rte_unused void *data) 5403 { 5404 struct cmd_gso_show_result *res = parsed_result; 5405 5406 if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { 5407 printf("invalid port id %u\n", res->cmd_pid); 5408 return; 5409 } 5410 if (!strcmp(res->cmd_keyword, "gso")) { 5411 if (gso_ports[res->cmd_pid].enable) { 5412 printf("Max GSO'd packet size: %uB\n" 5413 "Supported GSO types: TCP/IPv4, " 5414 "UDP/IPv4, VxLAN with inner " 5415 "TCP/IPv4 packet, GRE with inner " 5416 "TCP/IPv4 packet\n", 5417 gso_max_segment_size); 5418 } else 5419 printf("GSO is not enabled on Port %u\n", res->cmd_pid); 5420 } 5421 } 5422 5423 cmdline_parse_token_string_t cmd_gso_show_show = 5424 TOKEN_STRING_INITIALIZER(struct cmd_gso_show_result, 5425 cmd_show, "show"); 5426 cmdline_parse_token_string_t cmd_gso_show_port = 5427 TOKEN_STRING_INITIALIZER(struct cmd_gso_show_result, 5428 cmd_port, "port"); 5429 cmdline_parse_token_string_t cmd_gso_show_keyword = 5430 TOKEN_STRING_INITIALIZER(struct cmd_gso_show_result, 5431 cmd_keyword, "gso"); 5432 cmdline_parse_token_num_t cmd_gso_show_pid = 5433 TOKEN_NUM_INITIALIZER(struct cmd_gso_show_result, 5434 cmd_pid, RTE_UINT16); 5435 5436 cmdline_parse_inst_t cmd_gso_show = { 5437 .f = cmd_gso_show_parsed, 5438 .data = NULL, 5439 .help_str = "show port <port_id> gso", 5440 .tokens = { 5441 (void *)&cmd_gso_show_show, 5442 (void *)&cmd_gso_show_port, 5443 (void *)&cmd_gso_show_pid, 5444 (void *)&cmd_gso_show_keyword, 5445 NULL, 5446 }, 5447 }; 5448 5449 /* *** ENABLE/DISABLE FLUSH ON RX STREAMS *** */ 5450 struct cmd_set_flush_rx { 5451 cmdline_fixed_string_t set; 5452 cmdline_fixed_string_t flush_rx; 5453 cmdline_fixed_string_t mode; 5454 }; 5455 5456 static void 5457 cmd_set_flush_rx_parsed(void *parsed_result, 5458 __rte_unused struct cmdline *cl, 5459 __rte_unused void *data) 5460 { 5461 struct cmd_set_flush_rx *res = parsed_result; 5462 no_flush_rx = (uint8_t)((strcmp(res->mode, "on") == 0) ? 0 : 1); 5463 } 5464 5465 cmdline_parse_token_string_t cmd_setflushrx_set = 5466 TOKEN_STRING_INITIALIZER(struct cmd_set_flush_rx, 5467 set, "set"); 5468 cmdline_parse_token_string_t cmd_setflushrx_flush_rx = 5469 TOKEN_STRING_INITIALIZER(struct cmd_set_flush_rx, 5470 flush_rx, "flush_rx"); 5471 cmdline_parse_token_string_t cmd_setflushrx_mode = 5472 TOKEN_STRING_INITIALIZER(struct cmd_set_flush_rx, 5473 mode, "on#off"); 5474 5475 5476 cmdline_parse_inst_t cmd_set_flush_rx = { 5477 .f = cmd_set_flush_rx_parsed, 5478 .help_str = "set flush_rx on|off: Enable/Disable flush on rx streams", 5479 .data = NULL, 5480 .tokens = { 5481 (void *)&cmd_setflushrx_set, 5482 (void *)&cmd_setflushrx_flush_rx, 5483 (void *)&cmd_setflushrx_mode, 5484 NULL, 5485 }, 5486 }; 5487 5488 /* *** ENABLE/DISABLE LINK STATUS CHECK *** */ 5489 struct cmd_set_link_check { 5490 cmdline_fixed_string_t set; 5491 cmdline_fixed_string_t link_check; 5492 cmdline_fixed_string_t mode; 5493 }; 5494 5495 static void 5496 cmd_set_link_check_parsed(void *parsed_result, 5497 __rte_unused struct cmdline *cl, 5498 __rte_unused void *data) 5499 { 5500 struct cmd_set_link_check *res = parsed_result; 5501 no_link_check = (uint8_t)((strcmp(res->mode, "on") == 0) ? 0 : 1); 5502 } 5503 5504 cmdline_parse_token_string_t cmd_setlinkcheck_set = 5505 TOKEN_STRING_INITIALIZER(struct cmd_set_link_check, 5506 set, "set"); 5507 cmdline_parse_token_string_t cmd_setlinkcheck_link_check = 5508 TOKEN_STRING_INITIALIZER(struct cmd_set_link_check, 5509 link_check, "link_check"); 5510 cmdline_parse_token_string_t cmd_setlinkcheck_mode = 5511 TOKEN_STRING_INITIALIZER(struct cmd_set_link_check, 5512 mode, "on#off"); 5513 5514 5515 cmdline_parse_inst_t cmd_set_link_check = { 5516 .f = cmd_set_link_check_parsed, 5517 .help_str = "set link_check on|off: Enable/Disable link status check " 5518 "when starting/stopping a port", 5519 .data = NULL, 5520 .tokens = { 5521 (void *)&cmd_setlinkcheck_set, 5522 (void *)&cmd_setlinkcheck_link_check, 5523 (void *)&cmd_setlinkcheck_mode, 5524 NULL, 5525 }, 5526 }; 5527 5528 /* *** SET NIC BYPASS MODE *** */ 5529 struct cmd_set_bypass_mode_result { 5530 cmdline_fixed_string_t set; 5531 cmdline_fixed_string_t bypass; 5532 cmdline_fixed_string_t mode; 5533 cmdline_fixed_string_t value; 5534 portid_t port_id; 5535 }; 5536 5537 static void 5538 cmd_set_bypass_mode_parsed(void *parsed_result, 5539 __rte_unused struct cmdline *cl, 5540 __rte_unused void *data) 5541 { 5542 struct cmd_set_bypass_mode_result *res = parsed_result; 5543 portid_t port_id = res->port_id; 5544 int32_t rc = -EINVAL; 5545 5546 #if defined RTE_NET_IXGBE && defined RTE_LIBRTE_IXGBE_BYPASS 5547 uint32_t bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NORMAL; 5548 5549 if (!strcmp(res->value, "bypass")) 5550 bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_BYPASS; 5551 else if (!strcmp(res->value, "isolate")) 5552 bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_ISOLATE; 5553 else 5554 bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NORMAL; 5555 5556 /* Set the bypass mode for the relevant port. */ 5557 rc = rte_pmd_ixgbe_bypass_state_set(port_id, &bypass_mode); 5558 #endif 5559 if (rc != 0) 5560 printf("\t Failed to set bypass mode for port = %d.\n", port_id); 5561 } 5562 5563 cmdline_parse_token_string_t cmd_setbypass_mode_set = 5564 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_mode_result, 5565 set, "set"); 5566 cmdline_parse_token_string_t cmd_setbypass_mode_bypass = 5567 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_mode_result, 5568 bypass, "bypass"); 5569 cmdline_parse_token_string_t cmd_setbypass_mode_mode = 5570 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_mode_result, 5571 mode, "mode"); 5572 cmdline_parse_token_string_t cmd_setbypass_mode_value = 5573 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_mode_result, 5574 value, "normal#bypass#isolate"); 5575 cmdline_parse_token_num_t cmd_setbypass_mode_port = 5576 TOKEN_NUM_INITIALIZER(struct cmd_set_bypass_mode_result, 5577 port_id, RTE_UINT16); 5578 5579 cmdline_parse_inst_t cmd_set_bypass_mode = { 5580 .f = cmd_set_bypass_mode_parsed, 5581 .help_str = "set bypass mode normal|bypass|isolate <port_id>: " 5582 "Set the NIC bypass mode for port_id", 5583 .data = NULL, 5584 .tokens = { 5585 (void *)&cmd_setbypass_mode_set, 5586 (void *)&cmd_setbypass_mode_bypass, 5587 (void *)&cmd_setbypass_mode_mode, 5588 (void *)&cmd_setbypass_mode_value, 5589 (void *)&cmd_setbypass_mode_port, 5590 NULL, 5591 }, 5592 }; 5593 5594 /* *** SET NIC BYPASS EVENT *** */ 5595 struct cmd_set_bypass_event_result { 5596 cmdline_fixed_string_t set; 5597 cmdline_fixed_string_t bypass; 5598 cmdline_fixed_string_t event; 5599 cmdline_fixed_string_t event_value; 5600 cmdline_fixed_string_t mode; 5601 cmdline_fixed_string_t mode_value; 5602 portid_t port_id; 5603 }; 5604 5605 static void 5606 cmd_set_bypass_event_parsed(void *parsed_result, 5607 __rte_unused struct cmdline *cl, 5608 __rte_unused void *data) 5609 { 5610 int32_t rc = -EINVAL; 5611 struct cmd_set_bypass_event_result *res = parsed_result; 5612 portid_t port_id = res->port_id; 5613 5614 #if defined RTE_NET_IXGBE && defined RTE_LIBRTE_IXGBE_BYPASS 5615 uint32_t bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_NONE; 5616 uint32_t bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NORMAL; 5617 5618 if (!strcmp(res->event_value, "timeout")) 5619 bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_TIMEOUT; 5620 else if (!strcmp(res->event_value, "os_on")) 5621 bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_OS_ON; 5622 else if (!strcmp(res->event_value, "os_off")) 5623 bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_OS_OFF; 5624 else if (!strcmp(res->event_value, "power_on")) 5625 bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_POWER_ON; 5626 else if (!strcmp(res->event_value, "power_off")) 5627 bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_POWER_OFF; 5628 else 5629 bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_NONE; 5630 5631 if (!strcmp(res->mode_value, "bypass")) 5632 bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_BYPASS; 5633 else if (!strcmp(res->mode_value, "isolate")) 5634 bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_ISOLATE; 5635 else 5636 bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NORMAL; 5637 5638 /* Set the watchdog timeout. */ 5639 if (bypass_event == RTE_PMD_IXGBE_BYPASS_EVENT_TIMEOUT) { 5640 5641 rc = -EINVAL; 5642 if (RTE_PMD_IXGBE_BYPASS_TMT_VALID(bypass_timeout)) { 5643 rc = rte_pmd_ixgbe_bypass_wd_timeout_store(port_id, 5644 bypass_timeout); 5645 } 5646 if (rc != 0) { 5647 printf("Failed to set timeout value %u " 5648 "for port %d, errto code: %d.\n", 5649 bypass_timeout, port_id, rc); 5650 } 5651 } 5652 5653 /* Set the bypass event to transition to bypass mode. */ 5654 rc = rte_pmd_ixgbe_bypass_event_store(port_id, bypass_event, 5655 bypass_mode); 5656 #endif 5657 5658 if (rc != 0) 5659 printf("\t Failed to set bypass event for port = %d.\n", 5660 port_id); 5661 } 5662 5663 cmdline_parse_token_string_t cmd_setbypass_event_set = 5664 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result, 5665 set, "set"); 5666 cmdline_parse_token_string_t cmd_setbypass_event_bypass = 5667 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result, 5668 bypass, "bypass"); 5669 cmdline_parse_token_string_t cmd_setbypass_event_event = 5670 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result, 5671 event, "event"); 5672 cmdline_parse_token_string_t cmd_setbypass_event_event_value = 5673 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result, 5674 event_value, "none#timeout#os_off#os_on#power_on#power_off"); 5675 cmdline_parse_token_string_t cmd_setbypass_event_mode = 5676 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result, 5677 mode, "mode"); 5678 cmdline_parse_token_string_t cmd_setbypass_event_mode_value = 5679 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_event_result, 5680 mode_value, "normal#bypass#isolate"); 5681 cmdline_parse_token_num_t cmd_setbypass_event_port = 5682 TOKEN_NUM_INITIALIZER(struct cmd_set_bypass_event_result, 5683 port_id, RTE_UINT16); 5684 5685 cmdline_parse_inst_t cmd_set_bypass_event = { 5686 .f = cmd_set_bypass_event_parsed, 5687 .help_str = "set bypass event none|timeout|os_on|os_off|power_on|" 5688 "power_off mode normal|bypass|isolate <port_id>: " 5689 "Set the NIC bypass event mode for port_id", 5690 .data = NULL, 5691 .tokens = { 5692 (void *)&cmd_setbypass_event_set, 5693 (void *)&cmd_setbypass_event_bypass, 5694 (void *)&cmd_setbypass_event_event, 5695 (void *)&cmd_setbypass_event_event_value, 5696 (void *)&cmd_setbypass_event_mode, 5697 (void *)&cmd_setbypass_event_mode_value, 5698 (void *)&cmd_setbypass_event_port, 5699 NULL, 5700 }, 5701 }; 5702 5703 5704 /* *** SET NIC BYPASS TIMEOUT *** */ 5705 struct cmd_set_bypass_timeout_result { 5706 cmdline_fixed_string_t set; 5707 cmdline_fixed_string_t bypass; 5708 cmdline_fixed_string_t timeout; 5709 cmdline_fixed_string_t value; 5710 }; 5711 5712 static void 5713 cmd_set_bypass_timeout_parsed(void *parsed_result, 5714 __rte_unused struct cmdline *cl, 5715 __rte_unused void *data) 5716 { 5717 __rte_unused struct cmd_set_bypass_timeout_result *res = parsed_result; 5718 5719 #if defined RTE_NET_IXGBE && defined RTE_LIBRTE_IXGBE_BYPASS 5720 if (!strcmp(res->value, "1.5")) 5721 bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_1_5_SEC; 5722 else if (!strcmp(res->value, "2")) 5723 bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_2_SEC; 5724 else if (!strcmp(res->value, "3")) 5725 bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_3_SEC; 5726 else if (!strcmp(res->value, "4")) 5727 bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_4_SEC; 5728 else if (!strcmp(res->value, "8")) 5729 bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_8_SEC; 5730 else if (!strcmp(res->value, "16")) 5731 bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_16_SEC; 5732 else if (!strcmp(res->value, "32")) 5733 bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_32_SEC; 5734 else 5735 bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_OFF; 5736 #endif 5737 } 5738 5739 cmdline_parse_token_string_t cmd_setbypass_timeout_set = 5740 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_timeout_result, 5741 set, "set"); 5742 cmdline_parse_token_string_t cmd_setbypass_timeout_bypass = 5743 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_timeout_result, 5744 bypass, "bypass"); 5745 cmdline_parse_token_string_t cmd_setbypass_timeout_timeout = 5746 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_timeout_result, 5747 timeout, "timeout"); 5748 cmdline_parse_token_string_t cmd_setbypass_timeout_value = 5749 TOKEN_STRING_INITIALIZER(struct cmd_set_bypass_timeout_result, 5750 value, "0#1.5#2#3#4#8#16#32"); 5751 5752 cmdline_parse_inst_t cmd_set_bypass_timeout = { 5753 .f = cmd_set_bypass_timeout_parsed, 5754 .help_str = "set bypass timeout 0|1.5|2|3|4|8|16|32: " 5755 "Set the NIC bypass watchdog timeout in seconds", 5756 .data = NULL, 5757 .tokens = { 5758 (void *)&cmd_setbypass_timeout_set, 5759 (void *)&cmd_setbypass_timeout_bypass, 5760 (void *)&cmd_setbypass_timeout_timeout, 5761 (void *)&cmd_setbypass_timeout_value, 5762 NULL, 5763 }, 5764 }; 5765 5766 /* *** SHOW NIC BYPASS MODE *** */ 5767 struct cmd_show_bypass_config_result { 5768 cmdline_fixed_string_t show; 5769 cmdline_fixed_string_t bypass; 5770 cmdline_fixed_string_t config; 5771 portid_t port_id; 5772 }; 5773 5774 static void 5775 cmd_show_bypass_config_parsed(void *parsed_result, 5776 __rte_unused struct cmdline *cl, 5777 __rte_unused void *data) 5778 { 5779 struct cmd_show_bypass_config_result *res = parsed_result; 5780 portid_t port_id = res->port_id; 5781 int rc = -EINVAL; 5782 #if defined RTE_NET_IXGBE && defined RTE_LIBRTE_IXGBE_BYPASS 5783 uint32_t event_mode; 5784 uint32_t bypass_mode; 5785 uint32_t timeout = bypass_timeout; 5786 unsigned int i; 5787 5788 static const char * const timeouts[RTE_PMD_IXGBE_BYPASS_TMT_NUM] = 5789 {"off", "1.5", "2", "3", "4", "8", "16", "32"}; 5790 static const char * const modes[RTE_PMD_IXGBE_BYPASS_MODE_NUM] = 5791 {"UNKNOWN", "normal", "bypass", "isolate"}; 5792 static const char * const events[RTE_PMD_IXGBE_BYPASS_EVENT_NUM] = { 5793 "NONE", 5794 "OS/board on", 5795 "power supply on", 5796 "OS/board off", 5797 "power supply off", 5798 "timeout"}; 5799 5800 /* Display the bypass mode.*/ 5801 if (rte_pmd_ixgbe_bypass_state_show(port_id, &bypass_mode) != 0) { 5802 printf("\tFailed to get bypass mode for port = %d\n", port_id); 5803 return; 5804 } 5805 else { 5806 if (!RTE_PMD_IXGBE_BYPASS_MODE_VALID(bypass_mode)) 5807 bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NONE; 5808 5809 printf("\tbypass mode = %s\n", modes[bypass_mode]); 5810 } 5811 5812 /* Display the bypass timeout.*/ 5813 if (!RTE_PMD_IXGBE_BYPASS_TMT_VALID(timeout)) 5814 timeout = RTE_PMD_IXGBE_BYPASS_TMT_OFF; 5815 5816 printf("\tbypass timeout = %s\n", timeouts[timeout]); 5817 5818 /* Display the bypass events and associated modes. */ 5819 for (i = RTE_PMD_IXGBE_BYPASS_EVENT_START; i < RTE_DIM(events); i++) { 5820 5821 if (rte_pmd_ixgbe_bypass_event_show(port_id, i, &event_mode)) { 5822 printf("\tFailed to get bypass mode for event = %s\n", 5823 events[i]); 5824 } else { 5825 if (!RTE_PMD_IXGBE_BYPASS_MODE_VALID(event_mode)) 5826 event_mode = RTE_PMD_IXGBE_BYPASS_MODE_NONE; 5827 5828 printf("\tbypass event: %-16s = %s\n", events[i], 5829 modes[event_mode]); 5830 } 5831 } 5832 #endif 5833 if (rc != 0) 5834 printf("\tFailed to get bypass configuration for port = %d\n", 5835 port_id); 5836 } 5837 5838 cmdline_parse_token_string_t cmd_showbypass_config_show = 5839 TOKEN_STRING_INITIALIZER(struct cmd_show_bypass_config_result, 5840 show, "show"); 5841 cmdline_parse_token_string_t cmd_showbypass_config_bypass = 5842 TOKEN_STRING_INITIALIZER(struct cmd_show_bypass_config_result, 5843 bypass, "bypass"); 5844 cmdline_parse_token_string_t cmd_showbypass_config_config = 5845 TOKEN_STRING_INITIALIZER(struct cmd_show_bypass_config_result, 5846 config, "config"); 5847 cmdline_parse_token_num_t cmd_showbypass_config_port = 5848 TOKEN_NUM_INITIALIZER(struct cmd_show_bypass_config_result, 5849 port_id, RTE_UINT16); 5850 5851 cmdline_parse_inst_t cmd_show_bypass_config = { 5852 .f = cmd_show_bypass_config_parsed, 5853 .help_str = "show bypass config <port_id>: " 5854 "Show the NIC bypass config for port_id", 5855 .data = NULL, 5856 .tokens = { 5857 (void *)&cmd_showbypass_config_show, 5858 (void *)&cmd_showbypass_config_bypass, 5859 (void *)&cmd_showbypass_config_config, 5860 (void *)&cmd_showbypass_config_port, 5861 NULL, 5862 }, 5863 }; 5864 5865 #ifdef RTE_NET_BOND 5866 /* *** SET BONDING MODE *** */ 5867 struct cmd_set_bonding_mode_result { 5868 cmdline_fixed_string_t set; 5869 cmdline_fixed_string_t bonding; 5870 cmdline_fixed_string_t mode; 5871 uint8_t value; 5872 portid_t port_id; 5873 }; 5874 5875 static void cmd_set_bonding_mode_parsed(void *parsed_result, 5876 __rte_unused struct cmdline *cl, 5877 __rte_unused void *data) 5878 { 5879 struct cmd_set_bonding_mode_result *res = parsed_result; 5880 portid_t port_id = res->port_id; 5881 5882 /* Set the bonding mode for the relevant port. */ 5883 if (0 != rte_eth_bond_mode_set(port_id, res->value)) 5884 printf("\t Failed to set bonding mode for port = %d.\n", port_id); 5885 } 5886 5887 cmdline_parse_token_string_t cmd_setbonding_mode_set = 5888 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result, 5889 set, "set"); 5890 cmdline_parse_token_string_t cmd_setbonding_mode_bonding = 5891 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result, 5892 bonding, "bonding"); 5893 cmdline_parse_token_string_t cmd_setbonding_mode_mode = 5894 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result, 5895 mode, "mode"); 5896 cmdline_parse_token_num_t cmd_setbonding_mode_value = 5897 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_mode_result, 5898 value, RTE_UINT8); 5899 cmdline_parse_token_num_t cmd_setbonding_mode_port = 5900 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_mode_result, 5901 port_id, RTE_UINT16); 5902 5903 cmdline_parse_inst_t cmd_set_bonding_mode = { 5904 .f = cmd_set_bonding_mode_parsed, 5905 .help_str = "set bonding mode <mode_value> <port_id>: " 5906 "Set the bonding mode for port_id", 5907 .data = NULL, 5908 .tokens = { 5909 (void *) &cmd_setbonding_mode_set, 5910 (void *) &cmd_setbonding_mode_bonding, 5911 (void *) &cmd_setbonding_mode_mode, 5912 (void *) &cmd_setbonding_mode_value, 5913 (void *) &cmd_setbonding_mode_port, 5914 NULL 5915 } 5916 }; 5917 5918 /* *** SET BONDING SLOW_QUEUE SW/HW *** */ 5919 struct cmd_set_bonding_lacp_dedicated_queues_result { 5920 cmdline_fixed_string_t set; 5921 cmdline_fixed_string_t bonding; 5922 cmdline_fixed_string_t lacp; 5923 cmdline_fixed_string_t dedicated_queues; 5924 portid_t port_id; 5925 cmdline_fixed_string_t mode; 5926 }; 5927 5928 static void cmd_set_bonding_lacp_dedicated_queues_parsed(void *parsed_result, 5929 __rte_unused struct cmdline *cl, 5930 __rte_unused void *data) 5931 { 5932 struct cmd_set_bonding_lacp_dedicated_queues_result *res = parsed_result; 5933 portid_t port_id = res->port_id; 5934 struct rte_port *port; 5935 5936 port = &ports[port_id]; 5937 5938 /** Check if the port is not started **/ 5939 if (port->port_status != RTE_PORT_STOPPED) { 5940 printf("Please stop port %d first\n", port_id); 5941 return; 5942 } 5943 5944 if (!strcmp(res->mode, "enable")) { 5945 if (rte_eth_bond_8023ad_dedicated_queues_enable(port_id) == 0) 5946 printf("Dedicate queues for LACP control packets" 5947 " enabled\n"); 5948 else 5949 printf("Enabling dedicate queues for LACP control " 5950 "packets on port %d failed\n", port_id); 5951 } else if (!strcmp(res->mode, "disable")) { 5952 if (rte_eth_bond_8023ad_dedicated_queues_disable(port_id) == 0) 5953 printf("Dedicated queues for LACP control packets " 5954 "disabled\n"); 5955 else 5956 printf("Disabling dedicated queues for LACP control " 5957 "traffic on port %d failed\n", port_id); 5958 } 5959 } 5960 5961 cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_set = 5962 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result, 5963 set, "set"); 5964 cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_bonding = 5965 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result, 5966 bonding, "bonding"); 5967 cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_lacp = 5968 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result, 5969 lacp, "lacp"); 5970 cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_dedicated_queues = 5971 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result, 5972 dedicated_queues, "dedicated_queues"); 5973 cmdline_parse_token_num_t cmd_setbonding_lacp_dedicated_queues_port_id = 5974 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result, 5975 port_id, RTE_UINT16); 5976 cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_mode = 5977 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result, 5978 mode, "enable#disable"); 5979 5980 cmdline_parse_inst_t cmd_set_lacp_dedicated_queues = { 5981 .f = cmd_set_bonding_lacp_dedicated_queues_parsed, 5982 .help_str = "set bonding lacp dedicated_queues <port_id> " 5983 "enable|disable: " 5984 "Enable/disable dedicated queues for LACP control traffic for port_id", 5985 .data = NULL, 5986 .tokens = { 5987 (void *)&cmd_setbonding_lacp_dedicated_queues_set, 5988 (void *)&cmd_setbonding_lacp_dedicated_queues_bonding, 5989 (void *)&cmd_setbonding_lacp_dedicated_queues_lacp, 5990 (void *)&cmd_setbonding_lacp_dedicated_queues_dedicated_queues, 5991 (void *)&cmd_setbonding_lacp_dedicated_queues_port_id, 5992 (void *)&cmd_setbonding_lacp_dedicated_queues_mode, 5993 NULL 5994 } 5995 }; 5996 5997 /* *** SET BALANCE XMIT POLICY *** */ 5998 struct cmd_set_bonding_balance_xmit_policy_result { 5999 cmdline_fixed_string_t set; 6000 cmdline_fixed_string_t bonding; 6001 cmdline_fixed_string_t balance_xmit_policy; 6002 portid_t port_id; 6003 cmdline_fixed_string_t policy; 6004 }; 6005 6006 static void cmd_set_bonding_balance_xmit_policy_parsed(void *parsed_result, 6007 __rte_unused struct cmdline *cl, 6008 __rte_unused void *data) 6009 { 6010 struct cmd_set_bonding_balance_xmit_policy_result *res = parsed_result; 6011 portid_t port_id = res->port_id; 6012 uint8_t policy; 6013 6014 if (!strcmp(res->policy, "l2")) { 6015 policy = BALANCE_XMIT_POLICY_LAYER2; 6016 } else if (!strcmp(res->policy, "l23")) { 6017 policy = BALANCE_XMIT_POLICY_LAYER23; 6018 } else if (!strcmp(res->policy, "l34")) { 6019 policy = BALANCE_XMIT_POLICY_LAYER34; 6020 } else { 6021 printf("\t Invalid xmit policy selection"); 6022 return; 6023 } 6024 6025 /* Set the bonding mode for the relevant port. */ 6026 if (0 != rte_eth_bond_xmit_policy_set(port_id, policy)) { 6027 printf("\t Failed to set bonding balance xmit policy for port = %d.\n", 6028 port_id); 6029 } 6030 } 6031 6032 cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_set = 6033 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result, 6034 set, "set"); 6035 cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_bonding = 6036 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result, 6037 bonding, "bonding"); 6038 cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_balance_xmit_policy = 6039 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result, 6040 balance_xmit_policy, "balance_xmit_policy"); 6041 cmdline_parse_token_num_t cmd_setbonding_balance_xmit_policy_port = 6042 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result, 6043 port_id, RTE_UINT16); 6044 cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_policy = 6045 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result, 6046 policy, "l2#l23#l34"); 6047 6048 cmdline_parse_inst_t cmd_set_balance_xmit_policy = { 6049 .f = cmd_set_bonding_balance_xmit_policy_parsed, 6050 .help_str = "set bonding balance_xmit_policy <port_id> " 6051 "l2|l23|l34: " 6052 "Set the bonding balance_xmit_policy for port_id", 6053 .data = NULL, 6054 .tokens = { 6055 (void *)&cmd_setbonding_balance_xmit_policy_set, 6056 (void *)&cmd_setbonding_balance_xmit_policy_bonding, 6057 (void *)&cmd_setbonding_balance_xmit_policy_balance_xmit_policy, 6058 (void *)&cmd_setbonding_balance_xmit_policy_port, 6059 (void *)&cmd_setbonding_balance_xmit_policy_policy, 6060 NULL 6061 } 6062 }; 6063 6064 /* *** SHOW NIC BONDING CONFIGURATION *** */ 6065 struct cmd_show_bonding_config_result { 6066 cmdline_fixed_string_t show; 6067 cmdline_fixed_string_t bonding; 6068 cmdline_fixed_string_t config; 6069 portid_t port_id; 6070 }; 6071 6072 static void cmd_show_bonding_config_parsed(void *parsed_result, 6073 __rte_unused struct cmdline *cl, 6074 __rte_unused void *data) 6075 { 6076 struct cmd_show_bonding_config_result *res = parsed_result; 6077 int bonding_mode, agg_mode; 6078 portid_t slaves[RTE_MAX_ETHPORTS]; 6079 int num_slaves, num_active_slaves; 6080 int primary_id; 6081 int i; 6082 portid_t port_id = res->port_id; 6083 6084 /* Display the bonding mode.*/ 6085 bonding_mode = rte_eth_bond_mode_get(port_id); 6086 if (bonding_mode < 0) { 6087 printf("\tFailed to get bonding mode for port = %d\n", port_id); 6088 return; 6089 } else 6090 printf("\tBonding mode: %d\n", bonding_mode); 6091 6092 if (bonding_mode == BONDING_MODE_BALANCE) { 6093 int balance_xmit_policy; 6094 6095 balance_xmit_policy = rte_eth_bond_xmit_policy_get(port_id); 6096 if (balance_xmit_policy < 0) { 6097 printf("\tFailed to get balance xmit policy for port = %d\n", 6098 port_id); 6099 return; 6100 } else { 6101 printf("\tBalance Xmit Policy: "); 6102 6103 switch (balance_xmit_policy) { 6104 case BALANCE_XMIT_POLICY_LAYER2: 6105 printf("BALANCE_XMIT_POLICY_LAYER2"); 6106 break; 6107 case BALANCE_XMIT_POLICY_LAYER23: 6108 printf("BALANCE_XMIT_POLICY_LAYER23"); 6109 break; 6110 case BALANCE_XMIT_POLICY_LAYER34: 6111 printf("BALANCE_XMIT_POLICY_LAYER34"); 6112 break; 6113 } 6114 printf("\n"); 6115 } 6116 } 6117 6118 if (bonding_mode == BONDING_MODE_8023AD) { 6119 agg_mode = rte_eth_bond_8023ad_agg_selection_get(port_id); 6120 printf("\tIEEE802.3AD Aggregator Mode: "); 6121 switch (agg_mode) { 6122 case AGG_BANDWIDTH: 6123 printf("bandwidth"); 6124 break; 6125 case AGG_STABLE: 6126 printf("stable"); 6127 break; 6128 case AGG_COUNT: 6129 printf("count"); 6130 break; 6131 } 6132 printf("\n"); 6133 } 6134 6135 num_slaves = rte_eth_bond_slaves_get(port_id, slaves, RTE_MAX_ETHPORTS); 6136 6137 if (num_slaves < 0) { 6138 printf("\tFailed to get slave list for port = %d\n", port_id); 6139 return; 6140 } 6141 if (num_slaves > 0) { 6142 printf("\tSlaves (%d): [", num_slaves); 6143 for (i = 0; i < num_slaves - 1; i++) 6144 printf("%d ", slaves[i]); 6145 6146 printf("%d]\n", slaves[num_slaves - 1]); 6147 } else { 6148 printf("\tSlaves: []\n"); 6149 6150 } 6151 6152 num_active_slaves = rte_eth_bond_active_slaves_get(port_id, slaves, 6153 RTE_MAX_ETHPORTS); 6154 6155 if (num_active_slaves < 0) { 6156 printf("\tFailed to get active slave list for port = %d\n", port_id); 6157 return; 6158 } 6159 if (num_active_slaves > 0) { 6160 printf("\tActive Slaves (%d): [", num_active_slaves); 6161 for (i = 0; i < num_active_slaves - 1; i++) 6162 printf("%d ", slaves[i]); 6163 6164 printf("%d]\n", slaves[num_active_slaves - 1]); 6165 6166 } else { 6167 printf("\tActive Slaves: []\n"); 6168 6169 } 6170 6171 primary_id = rte_eth_bond_primary_get(port_id); 6172 if (primary_id < 0) { 6173 printf("\tFailed to get primary slave for port = %d\n", port_id); 6174 return; 6175 } else 6176 printf("\tPrimary: [%d]\n", primary_id); 6177 6178 } 6179 6180 cmdline_parse_token_string_t cmd_showbonding_config_show = 6181 TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result, 6182 show, "show"); 6183 cmdline_parse_token_string_t cmd_showbonding_config_bonding = 6184 TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result, 6185 bonding, "bonding"); 6186 cmdline_parse_token_string_t cmd_showbonding_config_config = 6187 TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result, 6188 config, "config"); 6189 cmdline_parse_token_num_t cmd_showbonding_config_port = 6190 TOKEN_NUM_INITIALIZER(struct cmd_show_bonding_config_result, 6191 port_id, RTE_UINT16); 6192 6193 cmdline_parse_inst_t cmd_show_bonding_config = { 6194 .f = cmd_show_bonding_config_parsed, 6195 .help_str = "show bonding config <port_id>: " 6196 "Show the bonding config for port_id", 6197 .data = NULL, 6198 .tokens = { 6199 (void *)&cmd_showbonding_config_show, 6200 (void *)&cmd_showbonding_config_bonding, 6201 (void *)&cmd_showbonding_config_config, 6202 (void *)&cmd_showbonding_config_port, 6203 NULL 6204 } 6205 }; 6206 6207 /* *** SET BONDING PRIMARY *** */ 6208 struct cmd_set_bonding_primary_result { 6209 cmdline_fixed_string_t set; 6210 cmdline_fixed_string_t bonding; 6211 cmdline_fixed_string_t primary; 6212 portid_t slave_id; 6213 portid_t port_id; 6214 }; 6215 6216 static void cmd_set_bonding_primary_parsed(void *parsed_result, 6217 __rte_unused struct cmdline *cl, 6218 __rte_unused void *data) 6219 { 6220 struct cmd_set_bonding_primary_result *res = parsed_result; 6221 portid_t master_port_id = res->port_id; 6222 portid_t slave_port_id = res->slave_id; 6223 6224 /* Set the primary slave for a bonded device. */ 6225 if (0 != rte_eth_bond_primary_set(master_port_id, slave_port_id)) { 6226 printf("\t Failed to set primary slave for port = %d.\n", 6227 master_port_id); 6228 return; 6229 } 6230 init_port_config(); 6231 } 6232 6233 cmdline_parse_token_string_t cmd_setbonding_primary_set = 6234 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result, 6235 set, "set"); 6236 cmdline_parse_token_string_t cmd_setbonding_primary_bonding = 6237 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result, 6238 bonding, "bonding"); 6239 cmdline_parse_token_string_t cmd_setbonding_primary_primary = 6240 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result, 6241 primary, "primary"); 6242 cmdline_parse_token_num_t cmd_setbonding_primary_slave = 6243 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_primary_result, 6244 slave_id, RTE_UINT16); 6245 cmdline_parse_token_num_t cmd_setbonding_primary_port = 6246 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_primary_result, 6247 port_id, RTE_UINT16); 6248 6249 cmdline_parse_inst_t cmd_set_bonding_primary = { 6250 .f = cmd_set_bonding_primary_parsed, 6251 .help_str = "set bonding primary <slave_id> <port_id>: " 6252 "Set the primary slave for port_id", 6253 .data = NULL, 6254 .tokens = { 6255 (void *)&cmd_setbonding_primary_set, 6256 (void *)&cmd_setbonding_primary_bonding, 6257 (void *)&cmd_setbonding_primary_primary, 6258 (void *)&cmd_setbonding_primary_slave, 6259 (void *)&cmd_setbonding_primary_port, 6260 NULL 6261 } 6262 }; 6263 6264 /* *** ADD SLAVE *** */ 6265 struct cmd_add_bonding_slave_result { 6266 cmdline_fixed_string_t add; 6267 cmdline_fixed_string_t bonding; 6268 cmdline_fixed_string_t slave; 6269 portid_t slave_id; 6270 portid_t port_id; 6271 }; 6272 6273 static void cmd_add_bonding_slave_parsed(void *parsed_result, 6274 __rte_unused struct cmdline *cl, 6275 __rte_unused void *data) 6276 { 6277 struct cmd_add_bonding_slave_result *res = parsed_result; 6278 portid_t master_port_id = res->port_id; 6279 portid_t slave_port_id = res->slave_id; 6280 6281 /* add the slave for a bonded device. */ 6282 if (0 != rte_eth_bond_slave_add(master_port_id, slave_port_id)) { 6283 printf("\t Failed to add slave %d to master port = %d.\n", 6284 slave_port_id, master_port_id); 6285 return; 6286 } 6287 init_port_config(); 6288 set_port_slave_flag(slave_port_id); 6289 } 6290 6291 cmdline_parse_token_string_t cmd_addbonding_slave_add = 6292 TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result, 6293 add, "add"); 6294 cmdline_parse_token_string_t cmd_addbonding_slave_bonding = 6295 TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result, 6296 bonding, "bonding"); 6297 cmdline_parse_token_string_t cmd_addbonding_slave_slave = 6298 TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result, 6299 slave, "slave"); 6300 cmdline_parse_token_num_t cmd_addbonding_slave_slaveid = 6301 TOKEN_NUM_INITIALIZER(struct cmd_add_bonding_slave_result, 6302 slave_id, RTE_UINT16); 6303 cmdline_parse_token_num_t cmd_addbonding_slave_port = 6304 TOKEN_NUM_INITIALIZER(struct cmd_add_bonding_slave_result, 6305 port_id, RTE_UINT16); 6306 6307 cmdline_parse_inst_t cmd_add_bonding_slave = { 6308 .f = cmd_add_bonding_slave_parsed, 6309 .help_str = "add bonding slave <slave_id> <port_id>: " 6310 "Add a slave device to a bonded device", 6311 .data = NULL, 6312 .tokens = { 6313 (void *)&cmd_addbonding_slave_add, 6314 (void *)&cmd_addbonding_slave_bonding, 6315 (void *)&cmd_addbonding_slave_slave, 6316 (void *)&cmd_addbonding_slave_slaveid, 6317 (void *)&cmd_addbonding_slave_port, 6318 NULL 6319 } 6320 }; 6321 6322 /* *** REMOVE SLAVE *** */ 6323 struct cmd_remove_bonding_slave_result { 6324 cmdline_fixed_string_t remove; 6325 cmdline_fixed_string_t bonding; 6326 cmdline_fixed_string_t slave; 6327 portid_t slave_id; 6328 portid_t port_id; 6329 }; 6330 6331 static void cmd_remove_bonding_slave_parsed(void *parsed_result, 6332 __rte_unused struct cmdline *cl, 6333 __rte_unused void *data) 6334 { 6335 struct cmd_remove_bonding_slave_result *res = parsed_result; 6336 portid_t master_port_id = res->port_id; 6337 portid_t slave_port_id = res->slave_id; 6338 6339 /* remove the slave from a bonded device. */ 6340 if (0 != rte_eth_bond_slave_remove(master_port_id, slave_port_id)) { 6341 printf("\t Failed to remove slave %d from master port = %d.\n", 6342 slave_port_id, master_port_id); 6343 return; 6344 } 6345 init_port_config(); 6346 clear_port_slave_flag(slave_port_id); 6347 } 6348 6349 cmdline_parse_token_string_t cmd_removebonding_slave_remove = 6350 TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result, 6351 remove, "remove"); 6352 cmdline_parse_token_string_t cmd_removebonding_slave_bonding = 6353 TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result, 6354 bonding, "bonding"); 6355 cmdline_parse_token_string_t cmd_removebonding_slave_slave = 6356 TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result, 6357 slave, "slave"); 6358 cmdline_parse_token_num_t cmd_removebonding_slave_slaveid = 6359 TOKEN_NUM_INITIALIZER(struct cmd_remove_bonding_slave_result, 6360 slave_id, RTE_UINT16); 6361 cmdline_parse_token_num_t cmd_removebonding_slave_port = 6362 TOKEN_NUM_INITIALIZER(struct cmd_remove_bonding_slave_result, 6363 port_id, RTE_UINT16); 6364 6365 cmdline_parse_inst_t cmd_remove_bonding_slave = { 6366 .f = cmd_remove_bonding_slave_parsed, 6367 .help_str = "remove bonding slave <slave_id> <port_id>: " 6368 "Remove a slave device from a bonded device", 6369 .data = NULL, 6370 .tokens = { 6371 (void *)&cmd_removebonding_slave_remove, 6372 (void *)&cmd_removebonding_slave_bonding, 6373 (void *)&cmd_removebonding_slave_slave, 6374 (void *)&cmd_removebonding_slave_slaveid, 6375 (void *)&cmd_removebonding_slave_port, 6376 NULL 6377 } 6378 }; 6379 6380 /* *** CREATE BONDED DEVICE *** */ 6381 struct cmd_create_bonded_device_result { 6382 cmdline_fixed_string_t create; 6383 cmdline_fixed_string_t bonded; 6384 cmdline_fixed_string_t device; 6385 uint8_t mode; 6386 uint8_t socket; 6387 }; 6388 6389 static int bond_dev_num = 0; 6390 6391 static void cmd_create_bonded_device_parsed(void *parsed_result, 6392 __rte_unused struct cmdline *cl, 6393 __rte_unused void *data) 6394 { 6395 struct cmd_create_bonded_device_result *res = parsed_result; 6396 char ethdev_name[RTE_ETH_NAME_MAX_LEN]; 6397 int port_id; 6398 int ret; 6399 6400 if (test_done == 0) { 6401 printf("Please stop forwarding first\n"); 6402 return; 6403 } 6404 6405 snprintf(ethdev_name, RTE_ETH_NAME_MAX_LEN, "net_bonding_testpmd_%d", 6406 bond_dev_num++); 6407 6408 /* Create a new bonded device. */ 6409 port_id = rte_eth_bond_create(ethdev_name, res->mode, res->socket); 6410 if (port_id < 0) { 6411 printf("\t Failed to create bonded device.\n"); 6412 return; 6413 } else { 6414 printf("Created new bonded device %s on (port %d).\n", ethdev_name, 6415 port_id); 6416 6417 /* Update number of ports */ 6418 nb_ports = rte_eth_dev_count_avail(); 6419 reconfig(port_id, res->socket); 6420 ret = rte_eth_promiscuous_enable(port_id); 6421 if (ret != 0) 6422 printf("Failed to enable promiscuous mode for port %u: %s - ignore\n", 6423 port_id, rte_strerror(-ret)); 6424 6425 ports[port_id].need_setup = 0; 6426 ports[port_id].port_status = RTE_PORT_STOPPED; 6427 } 6428 6429 } 6430 6431 cmdline_parse_token_string_t cmd_createbonded_device_create = 6432 TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result, 6433 create, "create"); 6434 cmdline_parse_token_string_t cmd_createbonded_device_bonded = 6435 TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result, 6436 bonded, "bonded"); 6437 cmdline_parse_token_string_t cmd_createbonded_device_device = 6438 TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result, 6439 device, "device"); 6440 cmdline_parse_token_num_t cmd_createbonded_device_mode = 6441 TOKEN_NUM_INITIALIZER(struct cmd_create_bonded_device_result, 6442 mode, RTE_UINT8); 6443 cmdline_parse_token_num_t cmd_createbonded_device_socket = 6444 TOKEN_NUM_INITIALIZER(struct cmd_create_bonded_device_result, 6445 socket, RTE_UINT8); 6446 6447 cmdline_parse_inst_t cmd_create_bonded_device = { 6448 .f = cmd_create_bonded_device_parsed, 6449 .help_str = "create bonded device <mode> <socket>: " 6450 "Create a new bonded device with specific bonding mode and socket", 6451 .data = NULL, 6452 .tokens = { 6453 (void *)&cmd_createbonded_device_create, 6454 (void *)&cmd_createbonded_device_bonded, 6455 (void *)&cmd_createbonded_device_device, 6456 (void *)&cmd_createbonded_device_mode, 6457 (void *)&cmd_createbonded_device_socket, 6458 NULL 6459 } 6460 }; 6461 6462 /* *** SET MAC ADDRESS IN BONDED DEVICE *** */ 6463 struct cmd_set_bond_mac_addr_result { 6464 cmdline_fixed_string_t set; 6465 cmdline_fixed_string_t bonding; 6466 cmdline_fixed_string_t mac_addr; 6467 uint16_t port_num; 6468 struct rte_ether_addr address; 6469 }; 6470 6471 static void cmd_set_bond_mac_addr_parsed(void *parsed_result, 6472 __rte_unused struct cmdline *cl, 6473 __rte_unused void *data) 6474 { 6475 struct cmd_set_bond_mac_addr_result *res = parsed_result; 6476 int ret; 6477 6478 if (port_id_is_invalid(res->port_num, ENABLED_WARN)) 6479 return; 6480 6481 ret = rte_eth_bond_mac_address_set(res->port_num, &res->address); 6482 6483 /* check the return value and print it if is < 0 */ 6484 if (ret < 0) 6485 printf("set_bond_mac_addr error: (%s)\n", strerror(-ret)); 6486 } 6487 6488 cmdline_parse_token_string_t cmd_set_bond_mac_addr_set = 6489 TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, set, "set"); 6490 cmdline_parse_token_string_t cmd_set_bond_mac_addr_bonding = 6491 TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, bonding, 6492 "bonding"); 6493 cmdline_parse_token_string_t cmd_set_bond_mac_addr_mac = 6494 TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, mac_addr, 6495 "mac_addr"); 6496 cmdline_parse_token_num_t cmd_set_bond_mac_addr_portnum = 6497 TOKEN_NUM_INITIALIZER(struct cmd_set_bond_mac_addr_result, 6498 port_num, RTE_UINT16); 6499 cmdline_parse_token_etheraddr_t cmd_set_bond_mac_addr_addr = 6500 TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_bond_mac_addr_result, address); 6501 6502 cmdline_parse_inst_t cmd_set_bond_mac_addr = { 6503 .f = cmd_set_bond_mac_addr_parsed, 6504 .data = (void *) 0, 6505 .help_str = "set bonding mac_addr <port_id> <mac_addr>", 6506 .tokens = { 6507 (void *)&cmd_set_bond_mac_addr_set, 6508 (void *)&cmd_set_bond_mac_addr_bonding, 6509 (void *)&cmd_set_bond_mac_addr_mac, 6510 (void *)&cmd_set_bond_mac_addr_portnum, 6511 (void *)&cmd_set_bond_mac_addr_addr, 6512 NULL 6513 } 6514 }; 6515 6516 6517 /* *** SET LINK STATUS MONITORING POLLING PERIOD ON BONDED DEVICE *** */ 6518 struct cmd_set_bond_mon_period_result { 6519 cmdline_fixed_string_t set; 6520 cmdline_fixed_string_t bonding; 6521 cmdline_fixed_string_t mon_period; 6522 uint16_t port_num; 6523 uint32_t period_ms; 6524 }; 6525 6526 static void cmd_set_bond_mon_period_parsed(void *parsed_result, 6527 __rte_unused struct cmdline *cl, 6528 __rte_unused void *data) 6529 { 6530 struct cmd_set_bond_mon_period_result *res = parsed_result; 6531 int ret; 6532 6533 ret = rte_eth_bond_link_monitoring_set(res->port_num, res->period_ms); 6534 6535 /* check the return value and print it if is < 0 */ 6536 if (ret < 0) 6537 printf("set_bond_mac_addr error: (%s)\n", strerror(-ret)); 6538 } 6539 6540 cmdline_parse_token_string_t cmd_set_bond_mon_period_set = 6541 TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mon_period_result, 6542 set, "set"); 6543 cmdline_parse_token_string_t cmd_set_bond_mon_period_bonding = 6544 TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mon_period_result, 6545 bonding, "bonding"); 6546 cmdline_parse_token_string_t cmd_set_bond_mon_period_mon_period = 6547 TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mon_period_result, 6548 mon_period, "mon_period"); 6549 cmdline_parse_token_num_t cmd_set_bond_mon_period_portnum = 6550 TOKEN_NUM_INITIALIZER(struct cmd_set_bond_mon_period_result, 6551 port_num, RTE_UINT16); 6552 cmdline_parse_token_num_t cmd_set_bond_mon_period_period_ms = 6553 TOKEN_NUM_INITIALIZER(struct cmd_set_bond_mon_period_result, 6554 period_ms, RTE_UINT32); 6555 6556 cmdline_parse_inst_t cmd_set_bond_mon_period = { 6557 .f = cmd_set_bond_mon_period_parsed, 6558 .data = (void *) 0, 6559 .help_str = "set bonding mon_period <port_id> <period_ms>", 6560 .tokens = { 6561 (void *)&cmd_set_bond_mon_period_set, 6562 (void *)&cmd_set_bond_mon_period_bonding, 6563 (void *)&cmd_set_bond_mon_period_mon_period, 6564 (void *)&cmd_set_bond_mon_period_portnum, 6565 (void *)&cmd_set_bond_mon_period_period_ms, 6566 NULL 6567 } 6568 }; 6569 6570 6571 6572 struct cmd_set_bonding_agg_mode_policy_result { 6573 cmdline_fixed_string_t set; 6574 cmdline_fixed_string_t bonding; 6575 cmdline_fixed_string_t agg_mode; 6576 uint16_t port_num; 6577 cmdline_fixed_string_t policy; 6578 }; 6579 6580 6581 static void 6582 cmd_set_bonding_agg_mode(void *parsed_result, 6583 __rte_unused struct cmdline *cl, 6584 __rte_unused void *data) 6585 { 6586 struct cmd_set_bonding_agg_mode_policy_result *res = parsed_result; 6587 uint8_t policy = AGG_BANDWIDTH; 6588 6589 if (!strcmp(res->policy, "bandwidth")) 6590 policy = AGG_BANDWIDTH; 6591 else if (!strcmp(res->policy, "stable")) 6592 policy = AGG_STABLE; 6593 else if (!strcmp(res->policy, "count")) 6594 policy = AGG_COUNT; 6595 6596 rte_eth_bond_8023ad_agg_selection_set(res->port_num, policy); 6597 } 6598 6599 6600 cmdline_parse_token_string_t cmd_set_bonding_agg_mode_set = 6601 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result, 6602 set, "set"); 6603 cmdline_parse_token_string_t cmd_set_bonding_agg_mode_bonding = 6604 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result, 6605 bonding, "bonding"); 6606 6607 cmdline_parse_token_string_t cmd_set_bonding_agg_mode_agg_mode = 6608 TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result, 6609 agg_mode, "agg_mode"); 6610 6611 cmdline_parse_token_num_t cmd_set_bonding_agg_mode_portnum = 6612 TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result, 6613 port_num, RTE_UINT16); 6614 6615 cmdline_parse_token_string_t cmd_set_bonding_agg_mode_policy_string = 6616 TOKEN_STRING_INITIALIZER( 6617 struct cmd_set_bonding_balance_xmit_policy_result, 6618 policy, "stable#bandwidth#count"); 6619 6620 cmdline_parse_inst_t cmd_set_bonding_agg_mode_policy = { 6621 .f = cmd_set_bonding_agg_mode, 6622 .data = (void *) 0, 6623 .help_str = "set bonding mode IEEE802.3AD aggregator policy <port_id> <agg_name>", 6624 .tokens = { 6625 (void *)&cmd_set_bonding_agg_mode_set, 6626 (void *)&cmd_set_bonding_agg_mode_bonding, 6627 (void *)&cmd_set_bonding_agg_mode_agg_mode, 6628 (void *)&cmd_set_bonding_agg_mode_portnum, 6629 (void *)&cmd_set_bonding_agg_mode_policy_string, 6630 NULL 6631 } 6632 }; 6633 6634 6635 #endif /* RTE_NET_BOND */ 6636 6637 /* *** SET FORWARDING MODE *** */ 6638 struct cmd_set_fwd_mode_result { 6639 cmdline_fixed_string_t set; 6640 cmdline_fixed_string_t fwd; 6641 cmdline_fixed_string_t mode; 6642 }; 6643 6644 static void cmd_set_fwd_mode_parsed(void *parsed_result, 6645 __rte_unused struct cmdline *cl, 6646 __rte_unused void *data) 6647 { 6648 struct cmd_set_fwd_mode_result *res = parsed_result; 6649 6650 retry_enabled = 0; 6651 set_pkt_forwarding_mode(res->mode); 6652 } 6653 6654 cmdline_parse_token_string_t cmd_setfwd_set = 6655 TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_mode_result, set, "set"); 6656 cmdline_parse_token_string_t cmd_setfwd_fwd = 6657 TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_mode_result, fwd, "fwd"); 6658 cmdline_parse_token_string_t cmd_setfwd_mode = 6659 TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_mode_result, mode, 6660 "" /* defined at init */); 6661 6662 cmdline_parse_inst_t cmd_set_fwd_mode = { 6663 .f = cmd_set_fwd_mode_parsed, 6664 .data = NULL, 6665 .help_str = NULL, /* defined at init */ 6666 .tokens = { 6667 (void *)&cmd_setfwd_set, 6668 (void *)&cmd_setfwd_fwd, 6669 (void *)&cmd_setfwd_mode, 6670 NULL, 6671 }, 6672 }; 6673 6674 static void cmd_set_fwd_mode_init(void) 6675 { 6676 char *modes, *c; 6677 static char token[128]; 6678 static char help[256]; 6679 cmdline_parse_token_string_t *token_struct; 6680 6681 modes = list_pkt_forwarding_modes(); 6682 snprintf(help, sizeof(help), "set fwd %s: " 6683 "Set packet forwarding mode", modes); 6684 cmd_set_fwd_mode.help_str = help; 6685 6686 /* string token separator is # */ 6687 for (c = token; *modes != '\0'; modes++) 6688 if (*modes == '|') 6689 *c++ = '#'; 6690 else 6691 *c++ = *modes; 6692 token_struct = (cmdline_parse_token_string_t*)cmd_set_fwd_mode.tokens[2]; 6693 token_struct->string_data.str = token; 6694 } 6695 6696 /* *** SET RETRY FORWARDING MODE *** */ 6697 struct cmd_set_fwd_retry_mode_result { 6698 cmdline_fixed_string_t set; 6699 cmdline_fixed_string_t fwd; 6700 cmdline_fixed_string_t mode; 6701 cmdline_fixed_string_t retry; 6702 }; 6703 6704 static void cmd_set_fwd_retry_mode_parsed(void *parsed_result, 6705 __rte_unused struct cmdline *cl, 6706 __rte_unused void *data) 6707 { 6708 struct cmd_set_fwd_retry_mode_result *res = parsed_result; 6709 6710 retry_enabled = 1; 6711 set_pkt_forwarding_mode(res->mode); 6712 } 6713 6714 cmdline_parse_token_string_t cmd_setfwd_retry_set = 6715 TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_retry_mode_result, 6716 set, "set"); 6717 cmdline_parse_token_string_t cmd_setfwd_retry_fwd = 6718 TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_retry_mode_result, 6719 fwd, "fwd"); 6720 cmdline_parse_token_string_t cmd_setfwd_retry_mode = 6721 TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_retry_mode_result, 6722 mode, 6723 "" /* defined at init */); 6724 cmdline_parse_token_string_t cmd_setfwd_retry_retry = 6725 TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_retry_mode_result, 6726 retry, "retry"); 6727 6728 cmdline_parse_inst_t cmd_set_fwd_retry_mode = { 6729 .f = cmd_set_fwd_retry_mode_parsed, 6730 .data = NULL, 6731 .help_str = NULL, /* defined at init */ 6732 .tokens = { 6733 (void *)&cmd_setfwd_retry_set, 6734 (void *)&cmd_setfwd_retry_fwd, 6735 (void *)&cmd_setfwd_retry_mode, 6736 (void *)&cmd_setfwd_retry_retry, 6737 NULL, 6738 }, 6739 }; 6740 6741 static void cmd_set_fwd_retry_mode_init(void) 6742 { 6743 char *modes, *c; 6744 static char token[128]; 6745 static char help[256]; 6746 cmdline_parse_token_string_t *token_struct; 6747 6748 modes = list_pkt_forwarding_retry_modes(); 6749 snprintf(help, sizeof(help), "set fwd %s retry: " 6750 "Set packet forwarding mode with retry", modes); 6751 cmd_set_fwd_retry_mode.help_str = help; 6752 6753 /* string token separator is # */ 6754 for (c = token; *modes != '\0'; modes++) 6755 if (*modes == '|') 6756 *c++ = '#'; 6757 else 6758 *c++ = *modes; 6759 token_struct = (cmdline_parse_token_string_t *) 6760 cmd_set_fwd_retry_mode.tokens[2]; 6761 token_struct->string_data.str = token; 6762 } 6763 6764 /* *** SET BURST TX DELAY TIME RETRY NUMBER *** */ 6765 struct cmd_set_burst_tx_retry_result { 6766 cmdline_fixed_string_t set; 6767 cmdline_fixed_string_t burst; 6768 cmdline_fixed_string_t tx; 6769 cmdline_fixed_string_t delay; 6770 uint32_t time; 6771 cmdline_fixed_string_t retry; 6772 uint32_t retry_num; 6773 }; 6774 6775 static void cmd_set_burst_tx_retry_parsed(void *parsed_result, 6776 __rte_unused struct cmdline *cl, 6777 __rte_unused void *data) 6778 { 6779 struct cmd_set_burst_tx_retry_result *res = parsed_result; 6780 6781 if (!strcmp(res->set, "set") && !strcmp(res->burst, "burst") 6782 && !strcmp(res->tx, "tx")) { 6783 if (!strcmp(res->delay, "delay")) 6784 burst_tx_delay_time = res->time; 6785 if (!strcmp(res->retry, "retry")) 6786 burst_tx_retry_num = res->retry_num; 6787 } 6788 6789 } 6790 6791 cmdline_parse_token_string_t cmd_set_burst_tx_retry_set = 6792 TOKEN_STRING_INITIALIZER(struct cmd_set_burst_tx_retry_result, set, "set"); 6793 cmdline_parse_token_string_t cmd_set_burst_tx_retry_burst = 6794 TOKEN_STRING_INITIALIZER(struct cmd_set_burst_tx_retry_result, burst, 6795 "burst"); 6796 cmdline_parse_token_string_t cmd_set_burst_tx_retry_tx = 6797 TOKEN_STRING_INITIALIZER(struct cmd_set_burst_tx_retry_result, tx, "tx"); 6798 cmdline_parse_token_string_t cmd_set_burst_tx_retry_delay = 6799 TOKEN_STRING_INITIALIZER(struct cmd_set_burst_tx_retry_result, delay, "delay"); 6800 cmdline_parse_token_num_t cmd_set_burst_tx_retry_time = 6801 TOKEN_NUM_INITIALIZER(struct cmd_set_burst_tx_retry_result, time, 6802 RTE_UINT32); 6803 cmdline_parse_token_string_t cmd_set_burst_tx_retry_retry = 6804 TOKEN_STRING_INITIALIZER(struct cmd_set_burst_tx_retry_result, retry, "retry"); 6805 cmdline_parse_token_num_t cmd_set_burst_tx_retry_retry_num = 6806 TOKEN_NUM_INITIALIZER(struct cmd_set_burst_tx_retry_result, retry_num, 6807 RTE_UINT32); 6808 6809 cmdline_parse_inst_t cmd_set_burst_tx_retry = { 6810 .f = cmd_set_burst_tx_retry_parsed, 6811 .help_str = "set burst tx delay <delay_usec> retry <num_retry>", 6812 .tokens = { 6813 (void *)&cmd_set_burst_tx_retry_set, 6814 (void *)&cmd_set_burst_tx_retry_burst, 6815 (void *)&cmd_set_burst_tx_retry_tx, 6816 (void *)&cmd_set_burst_tx_retry_delay, 6817 (void *)&cmd_set_burst_tx_retry_time, 6818 (void *)&cmd_set_burst_tx_retry_retry, 6819 (void *)&cmd_set_burst_tx_retry_retry_num, 6820 NULL, 6821 }, 6822 }; 6823 6824 /* *** SET PROMISC MODE *** */ 6825 struct cmd_set_promisc_mode_result { 6826 cmdline_fixed_string_t set; 6827 cmdline_fixed_string_t promisc; 6828 cmdline_fixed_string_t port_all; /* valid if "allports" argument == 1 */ 6829 uint16_t port_num; /* valid if "allports" argument == 0 */ 6830 cmdline_fixed_string_t mode; 6831 }; 6832 6833 static void cmd_set_promisc_mode_parsed(void *parsed_result, 6834 __rte_unused struct cmdline *cl, 6835 void *allports) 6836 { 6837 struct cmd_set_promisc_mode_result *res = parsed_result; 6838 int enable; 6839 portid_t i; 6840 6841 if (!strcmp(res->mode, "on")) 6842 enable = 1; 6843 else 6844 enable = 0; 6845 6846 /* all ports */ 6847 if (allports) { 6848 RTE_ETH_FOREACH_DEV(i) 6849 eth_set_promisc_mode(i, enable); 6850 } else { 6851 eth_set_promisc_mode(res->port_num, enable); 6852 } 6853 } 6854 6855 cmdline_parse_token_string_t cmd_setpromisc_set = 6856 TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, set, "set"); 6857 cmdline_parse_token_string_t cmd_setpromisc_promisc = 6858 TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, promisc, 6859 "promisc"); 6860 cmdline_parse_token_string_t cmd_setpromisc_portall = 6861 TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, port_all, 6862 "all"); 6863 cmdline_parse_token_num_t cmd_setpromisc_portnum = 6864 TOKEN_NUM_INITIALIZER(struct cmd_set_promisc_mode_result, port_num, 6865 RTE_UINT16); 6866 cmdline_parse_token_string_t cmd_setpromisc_mode = 6867 TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, mode, 6868 "on#off"); 6869 6870 cmdline_parse_inst_t cmd_set_promisc_mode_all = { 6871 .f = cmd_set_promisc_mode_parsed, 6872 .data = (void *)1, 6873 .help_str = "set promisc all on|off: Set promisc mode for all ports", 6874 .tokens = { 6875 (void *)&cmd_setpromisc_set, 6876 (void *)&cmd_setpromisc_promisc, 6877 (void *)&cmd_setpromisc_portall, 6878 (void *)&cmd_setpromisc_mode, 6879 NULL, 6880 }, 6881 }; 6882 6883 cmdline_parse_inst_t cmd_set_promisc_mode_one = { 6884 .f = cmd_set_promisc_mode_parsed, 6885 .data = (void *)0, 6886 .help_str = "set promisc <port_id> on|off: Set promisc mode on port_id", 6887 .tokens = { 6888 (void *)&cmd_setpromisc_set, 6889 (void *)&cmd_setpromisc_promisc, 6890 (void *)&cmd_setpromisc_portnum, 6891 (void *)&cmd_setpromisc_mode, 6892 NULL, 6893 }, 6894 }; 6895 6896 /* *** SET ALLMULTI MODE *** */ 6897 struct cmd_set_allmulti_mode_result { 6898 cmdline_fixed_string_t set; 6899 cmdline_fixed_string_t allmulti; 6900 cmdline_fixed_string_t port_all; /* valid if "allports" argument == 1 */ 6901 uint16_t port_num; /* valid if "allports" argument == 0 */ 6902 cmdline_fixed_string_t mode; 6903 }; 6904 6905 static void cmd_set_allmulti_mode_parsed(void *parsed_result, 6906 __rte_unused struct cmdline *cl, 6907 void *allports) 6908 { 6909 struct cmd_set_allmulti_mode_result *res = parsed_result; 6910 int enable; 6911 portid_t i; 6912 6913 if (!strcmp(res->mode, "on")) 6914 enable = 1; 6915 else 6916 enable = 0; 6917 6918 /* all ports */ 6919 if (allports) { 6920 RTE_ETH_FOREACH_DEV(i) { 6921 eth_set_allmulticast_mode(i, enable); 6922 } 6923 } 6924 else { 6925 eth_set_allmulticast_mode(res->port_num, enable); 6926 } 6927 } 6928 6929 cmdline_parse_token_string_t cmd_setallmulti_set = 6930 TOKEN_STRING_INITIALIZER(struct cmd_set_allmulti_mode_result, set, "set"); 6931 cmdline_parse_token_string_t cmd_setallmulti_allmulti = 6932 TOKEN_STRING_INITIALIZER(struct cmd_set_allmulti_mode_result, allmulti, 6933 "allmulti"); 6934 cmdline_parse_token_string_t cmd_setallmulti_portall = 6935 TOKEN_STRING_INITIALIZER(struct cmd_set_allmulti_mode_result, port_all, 6936 "all"); 6937 cmdline_parse_token_num_t cmd_setallmulti_portnum = 6938 TOKEN_NUM_INITIALIZER(struct cmd_set_allmulti_mode_result, port_num, 6939 RTE_UINT16); 6940 cmdline_parse_token_string_t cmd_setallmulti_mode = 6941 TOKEN_STRING_INITIALIZER(struct cmd_set_allmulti_mode_result, mode, 6942 "on#off"); 6943 6944 cmdline_parse_inst_t cmd_set_allmulti_mode_all = { 6945 .f = cmd_set_allmulti_mode_parsed, 6946 .data = (void *)1, 6947 .help_str = "set allmulti all on|off: Set allmulti mode for all ports", 6948 .tokens = { 6949 (void *)&cmd_setallmulti_set, 6950 (void *)&cmd_setallmulti_allmulti, 6951 (void *)&cmd_setallmulti_portall, 6952 (void *)&cmd_setallmulti_mode, 6953 NULL, 6954 }, 6955 }; 6956 6957 cmdline_parse_inst_t cmd_set_allmulti_mode_one = { 6958 .f = cmd_set_allmulti_mode_parsed, 6959 .data = (void *)0, 6960 .help_str = "set allmulti <port_id> on|off: " 6961 "Set allmulti mode on port_id", 6962 .tokens = { 6963 (void *)&cmd_setallmulti_set, 6964 (void *)&cmd_setallmulti_allmulti, 6965 (void *)&cmd_setallmulti_portnum, 6966 (void *)&cmd_setallmulti_mode, 6967 NULL, 6968 }, 6969 }; 6970 6971 /* *** GET CURRENT ETHERNET LINK FLOW CONTROL *** */ 6972 struct cmd_link_flow_ctrl_show { 6973 cmdline_fixed_string_t show; 6974 cmdline_fixed_string_t port; 6975 portid_t port_id; 6976 cmdline_fixed_string_t flow_ctrl; 6977 }; 6978 6979 cmdline_parse_token_string_t cmd_lfc_show_show = 6980 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_show, 6981 show, "show"); 6982 cmdline_parse_token_string_t cmd_lfc_show_port = 6983 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_show, 6984 port, "port"); 6985 cmdline_parse_token_num_t cmd_lfc_show_portid = 6986 TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_show, 6987 port_id, RTE_UINT16); 6988 cmdline_parse_token_string_t cmd_lfc_show_flow_ctrl = 6989 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_show, 6990 flow_ctrl, "flow_ctrl"); 6991 6992 static void 6993 cmd_link_flow_ctrl_show_parsed(void *parsed_result, 6994 __rte_unused struct cmdline *cl, 6995 __rte_unused void *data) 6996 { 6997 struct cmd_link_flow_ctrl_show *res = parsed_result; 6998 static const char *info_border = "*********************"; 6999 struct rte_eth_fc_conf fc_conf; 7000 bool rx_fc_en = false; 7001 bool tx_fc_en = false; 7002 int ret; 7003 7004 ret = rte_eth_dev_flow_ctrl_get(res->port_id, &fc_conf); 7005 if (ret != 0) { 7006 printf("Failed to get current flow ctrl information: err = %d\n", 7007 ret); 7008 return; 7009 } 7010 7011 if (fc_conf.mode == RTE_FC_RX_PAUSE || fc_conf.mode == RTE_FC_FULL) 7012 rx_fc_en = true; 7013 if (fc_conf.mode == RTE_FC_TX_PAUSE || fc_conf.mode == RTE_FC_FULL) 7014 tx_fc_en = true; 7015 7016 printf("\n%s Flow control infos for port %-2d %s\n", 7017 info_border, res->port_id, info_border); 7018 printf("FC mode:\n"); 7019 printf(" Rx pause: %s\n", rx_fc_en ? "on" : "off"); 7020 printf(" Tx pause: %s\n", tx_fc_en ? "on" : "off"); 7021 printf("Autoneg: %s\n", fc_conf.autoneg ? "on" : "off"); 7022 printf("Pause time: 0x%x\n", fc_conf.pause_time); 7023 printf("High waterline: 0x%x\n", fc_conf.high_water); 7024 printf("Low waterline: 0x%x\n", fc_conf.low_water); 7025 printf("Send XON: %s\n", fc_conf.send_xon ? "on" : "off"); 7026 printf("Forward MAC control frames: %s\n", 7027 fc_conf.mac_ctrl_frame_fwd ? "on" : "off"); 7028 printf("\n%s************** End ***********%s\n", 7029 info_border, info_border); 7030 } 7031 7032 cmdline_parse_inst_t cmd_link_flow_control_show = { 7033 .f = cmd_link_flow_ctrl_show_parsed, 7034 .data = NULL, 7035 .help_str = "show port <port_id> flow_ctrl", 7036 .tokens = { 7037 (void *)&cmd_lfc_show_show, 7038 (void *)&cmd_lfc_show_port, 7039 (void *)&cmd_lfc_show_portid, 7040 (void *)&cmd_lfc_show_flow_ctrl, 7041 NULL, 7042 }, 7043 }; 7044 7045 /* *** SETUP ETHERNET LINK FLOW CONTROL *** */ 7046 struct cmd_link_flow_ctrl_set_result { 7047 cmdline_fixed_string_t set; 7048 cmdline_fixed_string_t flow_ctrl; 7049 cmdline_fixed_string_t rx; 7050 cmdline_fixed_string_t rx_lfc_mode; 7051 cmdline_fixed_string_t tx; 7052 cmdline_fixed_string_t tx_lfc_mode; 7053 cmdline_fixed_string_t mac_ctrl_frame_fwd; 7054 cmdline_fixed_string_t mac_ctrl_frame_fwd_mode; 7055 cmdline_fixed_string_t autoneg_str; 7056 cmdline_fixed_string_t autoneg; 7057 cmdline_fixed_string_t hw_str; 7058 uint32_t high_water; 7059 cmdline_fixed_string_t lw_str; 7060 uint32_t low_water; 7061 cmdline_fixed_string_t pt_str; 7062 uint16_t pause_time; 7063 cmdline_fixed_string_t xon_str; 7064 uint16_t send_xon; 7065 portid_t port_id; 7066 }; 7067 7068 cmdline_parse_token_string_t cmd_lfc_set_set = 7069 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7070 set, "set"); 7071 cmdline_parse_token_string_t cmd_lfc_set_flow_ctrl = 7072 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7073 flow_ctrl, "flow_ctrl"); 7074 cmdline_parse_token_string_t cmd_lfc_set_rx = 7075 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7076 rx, "rx"); 7077 cmdline_parse_token_string_t cmd_lfc_set_rx_mode = 7078 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7079 rx_lfc_mode, "on#off"); 7080 cmdline_parse_token_string_t cmd_lfc_set_tx = 7081 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7082 tx, "tx"); 7083 cmdline_parse_token_string_t cmd_lfc_set_tx_mode = 7084 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7085 tx_lfc_mode, "on#off"); 7086 cmdline_parse_token_string_t cmd_lfc_set_high_water_str = 7087 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7088 hw_str, "high_water"); 7089 cmdline_parse_token_num_t cmd_lfc_set_high_water = 7090 TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7091 high_water, RTE_UINT32); 7092 cmdline_parse_token_string_t cmd_lfc_set_low_water_str = 7093 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7094 lw_str, "low_water"); 7095 cmdline_parse_token_num_t cmd_lfc_set_low_water = 7096 TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7097 low_water, RTE_UINT32); 7098 cmdline_parse_token_string_t cmd_lfc_set_pause_time_str = 7099 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7100 pt_str, "pause_time"); 7101 cmdline_parse_token_num_t cmd_lfc_set_pause_time = 7102 TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7103 pause_time, RTE_UINT16); 7104 cmdline_parse_token_string_t cmd_lfc_set_send_xon_str = 7105 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7106 xon_str, "send_xon"); 7107 cmdline_parse_token_num_t cmd_lfc_set_send_xon = 7108 TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7109 send_xon, RTE_UINT16); 7110 cmdline_parse_token_string_t cmd_lfc_set_mac_ctrl_frame_fwd_mode = 7111 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7112 mac_ctrl_frame_fwd, "mac_ctrl_frame_fwd"); 7113 cmdline_parse_token_string_t cmd_lfc_set_mac_ctrl_frame_fwd = 7114 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7115 mac_ctrl_frame_fwd_mode, "on#off"); 7116 cmdline_parse_token_string_t cmd_lfc_set_autoneg_str = 7117 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7118 autoneg_str, "autoneg"); 7119 cmdline_parse_token_string_t cmd_lfc_set_autoneg = 7120 TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7121 autoneg, "on#off"); 7122 cmdline_parse_token_num_t cmd_lfc_set_portid = 7123 TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result, 7124 port_id, RTE_UINT16); 7125 7126 /* forward declaration */ 7127 static void 7128 cmd_link_flow_ctrl_set_parsed(void *parsed_result, struct cmdline *cl, 7129 void *data); 7130 7131 cmdline_parse_inst_t cmd_link_flow_control_set = { 7132 .f = cmd_link_flow_ctrl_set_parsed, 7133 .data = NULL, 7134 .help_str = "set flow_ctrl rx on|off tx on|off <high_water> " 7135 "<low_water> <pause_time> <send_xon> mac_ctrl_frame_fwd on|off " 7136 "autoneg on|off <port_id>: Configure the Ethernet flow control", 7137 .tokens = { 7138 (void *)&cmd_lfc_set_set, 7139 (void *)&cmd_lfc_set_flow_ctrl, 7140 (void *)&cmd_lfc_set_rx, 7141 (void *)&cmd_lfc_set_rx_mode, 7142 (void *)&cmd_lfc_set_tx, 7143 (void *)&cmd_lfc_set_tx_mode, 7144 (void *)&cmd_lfc_set_high_water, 7145 (void *)&cmd_lfc_set_low_water, 7146 (void *)&cmd_lfc_set_pause_time, 7147 (void *)&cmd_lfc_set_send_xon, 7148 (void *)&cmd_lfc_set_mac_ctrl_frame_fwd_mode, 7149 (void *)&cmd_lfc_set_mac_ctrl_frame_fwd, 7150 (void *)&cmd_lfc_set_autoneg_str, 7151 (void *)&cmd_lfc_set_autoneg, 7152 (void *)&cmd_lfc_set_portid, 7153 NULL, 7154 }, 7155 }; 7156 7157 cmdline_parse_inst_t cmd_link_flow_control_set_rx = { 7158 .f = cmd_link_flow_ctrl_set_parsed, 7159 .data = (void *)&cmd_link_flow_control_set_rx, 7160 .help_str = "set flow_ctrl rx on|off <port_id>: " 7161 "Change rx flow control parameter", 7162 .tokens = { 7163 (void *)&cmd_lfc_set_set, 7164 (void *)&cmd_lfc_set_flow_ctrl, 7165 (void *)&cmd_lfc_set_rx, 7166 (void *)&cmd_lfc_set_rx_mode, 7167 (void *)&cmd_lfc_set_portid, 7168 NULL, 7169 }, 7170 }; 7171 7172 cmdline_parse_inst_t cmd_link_flow_control_set_tx = { 7173 .f = cmd_link_flow_ctrl_set_parsed, 7174 .data = (void *)&cmd_link_flow_control_set_tx, 7175 .help_str = "set flow_ctrl tx on|off <port_id>: " 7176 "Change tx flow control parameter", 7177 .tokens = { 7178 (void *)&cmd_lfc_set_set, 7179 (void *)&cmd_lfc_set_flow_ctrl, 7180 (void *)&cmd_lfc_set_tx, 7181 (void *)&cmd_lfc_set_tx_mode, 7182 (void *)&cmd_lfc_set_portid, 7183 NULL, 7184 }, 7185 }; 7186 7187 cmdline_parse_inst_t cmd_link_flow_control_set_hw = { 7188 .f = cmd_link_flow_ctrl_set_parsed, 7189 .data = (void *)&cmd_link_flow_control_set_hw, 7190 .help_str = "set flow_ctrl high_water <value> <port_id>: " 7191 "Change high water flow control parameter", 7192 .tokens = { 7193 (void *)&cmd_lfc_set_set, 7194 (void *)&cmd_lfc_set_flow_ctrl, 7195 (void *)&cmd_lfc_set_high_water_str, 7196 (void *)&cmd_lfc_set_high_water, 7197 (void *)&cmd_lfc_set_portid, 7198 NULL, 7199 }, 7200 }; 7201 7202 cmdline_parse_inst_t cmd_link_flow_control_set_lw = { 7203 .f = cmd_link_flow_ctrl_set_parsed, 7204 .data = (void *)&cmd_link_flow_control_set_lw, 7205 .help_str = "set flow_ctrl low_water <value> <port_id>: " 7206 "Change low water flow control parameter", 7207 .tokens = { 7208 (void *)&cmd_lfc_set_set, 7209 (void *)&cmd_lfc_set_flow_ctrl, 7210 (void *)&cmd_lfc_set_low_water_str, 7211 (void *)&cmd_lfc_set_low_water, 7212 (void *)&cmd_lfc_set_portid, 7213 NULL, 7214 }, 7215 }; 7216 7217 cmdline_parse_inst_t cmd_link_flow_control_set_pt = { 7218 .f = cmd_link_flow_ctrl_set_parsed, 7219 .data = (void *)&cmd_link_flow_control_set_pt, 7220 .help_str = "set flow_ctrl pause_time <value> <port_id>: " 7221 "Change pause time flow control parameter", 7222 .tokens = { 7223 (void *)&cmd_lfc_set_set, 7224 (void *)&cmd_lfc_set_flow_ctrl, 7225 (void *)&cmd_lfc_set_pause_time_str, 7226 (void *)&cmd_lfc_set_pause_time, 7227 (void *)&cmd_lfc_set_portid, 7228 NULL, 7229 }, 7230 }; 7231 7232 cmdline_parse_inst_t cmd_link_flow_control_set_xon = { 7233 .f = cmd_link_flow_ctrl_set_parsed, 7234 .data = (void *)&cmd_link_flow_control_set_xon, 7235 .help_str = "set flow_ctrl send_xon <value> <port_id>: " 7236 "Change send_xon flow control parameter", 7237 .tokens = { 7238 (void *)&cmd_lfc_set_set, 7239 (void *)&cmd_lfc_set_flow_ctrl, 7240 (void *)&cmd_lfc_set_send_xon_str, 7241 (void *)&cmd_lfc_set_send_xon, 7242 (void *)&cmd_lfc_set_portid, 7243 NULL, 7244 }, 7245 }; 7246 7247 cmdline_parse_inst_t cmd_link_flow_control_set_macfwd = { 7248 .f = cmd_link_flow_ctrl_set_parsed, 7249 .data = (void *)&cmd_link_flow_control_set_macfwd, 7250 .help_str = "set flow_ctrl mac_ctrl_frame_fwd on|off <port_id>: " 7251 "Change mac ctrl fwd flow control parameter", 7252 .tokens = { 7253 (void *)&cmd_lfc_set_set, 7254 (void *)&cmd_lfc_set_flow_ctrl, 7255 (void *)&cmd_lfc_set_mac_ctrl_frame_fwd_mode, 7256 (void *)&cmd_lfc_set_mac_ctrl_frame_fwd, 7257 (void *)&cmd_lfc_set_portid, 7258 NULL, 7259 }, 7260 }; 7261 7262 cmdline_parse_inst_t cmd_link_flow_control_set_autoneg = { 7263 .f = cmd_link_flow_ctrl_set_parsed, 7264 .data = (void *)&cmd_link_flow_control_set_autoneg, 7265 .help_str = "set flow_ctrl autoneg on|off <port_id>: " 7266 "Change autoneg flow control parameter", 7267 .tokens = { 7268 (void *)&cmd_lfc_set_set, 7269 (void *)&cmd_lfc_set_flow_ctrl, 7270 (void *)&cmd_lfc_set_autoneg_str, 7271 (void *)&cmd_lfc_set_autoneg, 7272 (void *)&cmd_lfc_set_portid, 7273 NULL, 7274 }, 7275 }; 7276 7277 static void 7278 cmd_link_flow_ctrl_set_parsed(void *parsed_result, 7279 __rte_unused struct cmdline *cl, 7280 void *data) 7281 { 7282 struct cmd_link_flow_ctrl_set_result *res = parsed_result; 7283 cmdline_parse_inst_t *cmd = data; 7284 struct rte_eth_fc_conf fc_conf; 7285 int rx_fc_en = 0; 7286 int tx_fc_en = 0; 7287 int ret; 7288 7289 /* 7290 * Rx on/off, flow control is enabled/disabled on RX side. This can indicate 7291 * the RTE_FC_TX_PAUSE, Transmit pause frame at the Rx side. 7292 * Tx on/off, flow control is enabled/disabled on TX side. This can indicate 7293 * the RTE_FC_RX_PAUSE, Respond to the pause frame at the Tx side. 7294 */ 7295 static enum rte_eth_fc_mode rx_tx_onoff_2_lfc_mode[2][2] = { 7296 {RTE_FC_NONE, RTE_FC_TX_PAUSE}, {RTE_FC_RX_PAUSE, RTE_FC_FULL} 7297 }; 7298 7299 /* Partial command line, retrieve current configuration */ 7300 if (cmd) { 7301 ret = rte_eth_dev_flow_ctrl_get(res->port_id, &fc_conf); 7302 if (ret != 0) { 7303 printf("cannot get current flow ctrl parameters, return" 7304 "code = %d\n", ret); 7305 return; 7306 } 7307 7308 if ((fc_conf.mode == RTE_FC_RX_PAUSE) || 7309 (fc_conf.mode == RTE_FC_FULL)) 7310 rx_fc_en = 1; 7311 if ((fc_conf.mode == RTE_FC_TX_PAUSE) || 7312 (fc_conf.mode == RTE_FC_FULL)) 7313 tx_fc_en = 1; 7314 } 7315 7316 if (!cmd || cmd == &cmd_link_flow_control_set_rx) 7317 rx_fc_en = (!strcmp(res->rx_lfc_mode, "on")) ? 1 : 0; 7318 7319 if (!cmd || cmd == &cmd_link_flow_control_set_tx) 7320 tx_fc_en = (!strcmp(res->tx_lfc_mode, "on")) ? 1 : 0; 7321 7322 fc_conf.mode = rx_tx_onoff_2_lfc_mode[rx_fc_en][tx_fc_en]; 7323 7324 if (!cmd || cmd == &cmd_link_flow_control_set_hw) 7325 fc_conf.high_water = res->high_water; 7326 7327 if (!cmd || cmd == &cmd_link_flow_control_set_lw) 7328 fc_conf.low_water = res->low_water; 7329 7330 if (!cmd || cmd == &cmd_link_flow_control_set_pt) 7331 fc_conf.pause_time = res->pause_time; 7332 7333 if (!cmd || cmd == &cmd_link_flow_control_set_xon) 7334 fc_conf.send_xon = res->send_xon; 7335 7336 if (!cmd || cmd == &cmd_link_flow_control_set_macfwd) { 7337 if (!strcmp(res->mac_ctrl_frame_fwd_mode, "on")) 7338 fc_conf.mac_ctrl_frame_fwd = 1; 7339 else 7340 fc_conf.mac_ctrl_frame_fwd = 0; 7341 } 7342 7343 if (!cmd || cmd == &cmd_link_flow_control_set_autoneg) 7344 fc_conf.autoneg = (!strcmp(res->autoneg, "on")) ? 1 : 0; 7345 7346 ret = rte_eth_dev_flow_ctrl_set(res->port_id, &fc_conf); 7347 if (ret != 0) 7348 printf("bad flow contrl parameter, return code = %d \n", ret); 7349 } 7350 7351 /* *** SETUP ETHERNET PRIORITY FLOW CONTROL *** */ 7352 struct cmd_priority_flow_ctrl_set_result { 7353 cmdline_fixed_string_t set; 7354 cmdline_fixed_string_t pfc_ctrl; 7355 cmdline_fixed_string_t rx; 7356 cmdline_fixed_string_t rx_pfc_mode; 7357 cmdline_fixed_string_t tx; 7358 cmdline_fixed_string_t tx_pfc_mode; 7359 uint32_t high_water; 7360 uint32_t low_water; 7361 uint16_t pause_time; 7362 uint8_t priority; 7363 portid_t port_id; 7364 }; 7365 7366 static void 7367 cmd_priority_flow_ctrl_set_parsed(void *parsed_result, 7368 __rte_unused struct cmdline *cl, 7369 __rte_unused void *data) 7370 { 7371 struct cmd_priority_flow_ctrl_set_result *res = parsed_result; 7372 struct rte_eth_pfc_conf pfc_conf; 7373 int rx_fc_enable, tx_fc_enable; 7374 int ret; 7375 7376 /* 7377 * Rx on/off, flow control is enabled/disabled on RX side. This can indicate 7378 * the RTE_FC_TX_PAUSE, Transmit pause frame at the Rx side. 7379 * Tx on/off, flow control is enabled/disabled on TX side. This can indicate 7380 * the RTE_FC_RX_PAUSE, Respond to the pause frame at the Tx side. 7381 */ 7382 static enum rte_eth_fc_mode rx_tx_onoff_2_pfc_mode[2][2] = { 7383 {RTE_FC_NONE, RTE_FC_TX_PAUSE}, {RTE_FC_RX_PAUSE, RTE_FC_FULL} 7384 }; 7385 7386 memset(&pfc_conf, 0, sizeof(struct rte_eth_pfc_conf)); 7387 rx_fc_enable = (!strncmp(res->rx_pfc_mode, "on",2)) ? 1 : 0; 7388 tx_fc_enable = (!strncmp(res->tx_pfc_mode, "on",2)) ? 1 : 0; 7389 pfc_conf.fc.mode = rx_tx_onoff_2_pfc_mode[rx_fc_enable][tx_fc_enable]; 7390 pfc_conf.fc.high_water = res->high_water; 7391 pfc_conf.fc.low_water = res->low_water; 7392 pfc_conf.fc.pause_time = res->pause_time; 7393 pfc_conf.priority = res->priority; 7394 7395 ret = rte_eth_dev_priority_flow_ctrl_set(res->port_id, &pfc_conf); 7396 if (ret != 0) 7397 printf("bad priority flow contrl parameter, return code = %d \n", ret); 7398 } 7399 7400 cmdline_parse_token_string_t cmd_pfc_set_set = 7401 TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 7402 set, "set"); 7403 cmdline_parse_token_string_t cmd_pfc_set_flow_ctrl = 7404 TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 7405 pfc_ctrl, "pfc_ctrl"); 7406 cmdline_parse_token_string_t cmd_pfc_set_rx = 7407 TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 7408 rx, "rx"); 7409 cmdline_parse_token_string_t cmd_pfc_set_rx_mode = 7410 TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 7411 rx_pfc_mode, "on#off"); 7412 cmdline_parse_token_string_t cmd_pfc_set_tx = 7413 TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 7414 tx, "tx"); 7415 cmdline_parse_token_string_t cmd_pfc_set_tx_mode = 7416 TOKEN_STRING_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 7417 tx_pfc_mode, "on#off"); 7418 cmdline_parse_token_num_t cmd_pfc_set_high_water = 7419 TOKEN_NUM_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 7420 high_water, RTE_UINT32); 7421 cmdline_parse_token_num_t cmd_pfc_set_low_water = 7422 TOKEN_NUM_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 7423 low_water, RTE_UINT32); 7424 cmdline_parse_token_num_t cmd_pfc_set_pause_time = 7425 TOKEN_NUM_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 7426 pause_time, RTE_UINT16); 7427 cmdline_parse_token_num_t cmd_pfc_set_priority = 7428 TOKEN_NUM_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 7429 priority, RTE_UINT8); 7430 cmdline_parse_token_num_t cmd_pfc_set_portid = 7431 TOKEN_NUM_INITIALIZER(struct cmd_priority_flow_ctrl_set_result, 7432 port_id, RTE_UINT16); 7433 7434 cmdline_parse_inst_t cmd_priority_flow_control_set = { 7435 .f = cmd_priority_flow_ctrl_set_parsed, 7436 .data = NULL, 7437 .help_str = "set pfc_ctrl rx on|off tx on|off <high_water> <low_water> " 7438 "<pause_time> <priority> <port_id>: " 7439 "Configure the Ethernet priority flow control", 7440 .tokens = { 7441 (void *)&cmd_pfc_set_set, 7442 (void *)&cmd_pfc_set_flow_ctrl, 7443 (void *)&cmd_pfc_set_rx, 7444 (void *)&cmd_pfc_set_rx_mode, 7445 (void *)&cmd_pfc_set_tx, 7446 (void *)&cmd_pfc_set_tx_mode, 7447 (void *)&cmd_pfc_set_high_water, 7448 (void *)&cmd_pfc_set_low_water, 7449 (void *)&cmd_pfc_set_pause_time, 7450 (void *)&cmd_pfc_set_priority, 7451 (void *)&cmd_pfc_set_portid, 7452 NULL, 7453 }, 7454 }; 7455 7456 /* *** RESET CONFIGURATION *** */ 7457 struct cmd_reset_result { 7458 cmdline_fixed_string_t reset; 7459 cmdline_fixed_string_t def; 7460 }; 7461 7462 static void cmd_reset_parsed(__rte_unused void *parsed_result, 7463 struct cmdline *cl, 7464 __rte_unused void *data) 7465 { 7466 cmdline_printf(cl, "Reset to default forwarding configuration...\n"); 7467 set_def_fwd_config(); 7468 } 7469 7470 cmdline_parse_token_string_t cmd_reset_set = 7471 TOKEN_STRING_INITIALIZER(struct cmd_reset_result, reset, "set"); 7472 cmdline_parse_token_string_t cmd_reset_def = 7473 TOKEN_STRING_INITIALIZER(struct cmd_reset_result, def, 7474 "default"); 7475 7476 cmdline_parse_inst_t cmd_reset = { 7477 .f = cmd_reset_parsed, 7478 .data = NULL, 7479 .help_str = "set default: Reset default forwarding configuration", 7480 .tokens = { 7481 (void *)&cmd_reset_set, 7482 (void *)&cmd_reset_def, 7483 NULL, 7484 }, 7485 }; 7486 7487 /* *** START FORWARDING *** */ 7488 struct cmd_start_result { 7489 cmdline_fixed_string_t start; 7490 }; 7491 7492 cmdline_parse_token_string_t cmd_start_start = 7493 TOKEN_STRING_INITIALIZER(struct cmd_start_result, start, "start"); 7494 7495 static void cmd_start_parsed(__rte_unused void *parsed_result, 7496 __rte_unused struct cmdline *cl, 7497 __rte_unused void *data) 7498 { 7499 start_packet_forwarding(0); 7500 } 7501 7502 cmdline_parse_inst_t cmd_start = { 7503 .f = cmd_start_parsed, 7504 .data = NULL, 7505 .help_str = "start: Start packet forwarding", 7506 .tokens = { 7507 (void *)&cmd_start_start, 7508 NULL, 7509 }, 7510 }; 7511 7512 /* *** START FORWARDING WITH ONE TX BURST FIRST *** */ 7513 struct cmd_start_tx_first_result { 7514 cmdline_fixed_string_t start; 7515 cmdline_fixed_string_t tx_first; 7516 }; 7517 7518 static void 7519 cmd_start_tx_first_parsed(__rte_unused void *parsed_result, 7520 __rte_unused struct cmdline *cl, 7521 __rte_unused void *data) 7522 { 7523 start_packet_forwarding(1); 7524 } 7525 7526 cmdline_parse_token_string_t cmd_start_tx_first_start = 7527 TOKEN_STRING_INITIALIZER(struct cmd_start_tx_first_result, start, 7528 "start"); 7529 cmdline_parse_token_string_t cmd_start_tx_first_tx_first = 7530 TOKEN_STRING_INITIALIZER(struct cmd_start_tx_first_result, 7531 tx_first, "tx_first"); 7532 7533 cmdline_parse_inst_t cmd_start_tx_first = { 7534 .f = cmd_start_tx_first_parsed, 7535 .data = NULL, 7536 .help_str = "start tx_first: Start packet forwarding, " 7537 "after sending 1 burst of packets", 7538 .tokens = { 7539 (void *)&cmd_start_tx_first_start, 7540 (void *)&cmd_start_tx_first_tx_first, 7541 NULL, 7542 }, 7543 }; 7544 7545 /* *** START FORWARDING WITH N TX BURST FIRST *** */ 7546 struct cmd_start_tx_first_n_result { 7547 cmdline_fixed_string_t start; 7548 cmdline_fixed_string_t tx_first; 7549 uint32_t tx_num; 7550 }; 7551 7552 static void 7553 cmd_start_tx_first_n_parsed(void *parsed_result, 7554 __rte_unused struct cmdline *cl, 7555 __rte_unused void *data) 7556 { 7557 struct cmd_start_tx_first_n_result *res = parsed_result; 7558 7559 start_packet_forwarding(res->tx_num); 7560 } 7561 7562 cmdline_parse_token_string_t cmd_start_tx_first_n_start = 7563 TOKEN_STRING_INITIALIZER(struct cmd_start_tx_first_n_result, 7564 start, "start"); 7565 cmdline_parse_token_string_t cmd_start_tx_first_n_tx_first = 7566 TOKEN_STRING_INITIALIZER(struct cmd_start_tx_first_n_result, 7567 tx_first, "tx_first"); 7568 cmdline_parse_token_num_t cmd_start_tx_first_n_tx_num = 7569 TOKEN_NUM_INITIALIZER(struct cmd_start_tx_first_n_result, 7570 tx_num, RTE_UINT32); 7571 7572 cmdline_parse_inst_t cmd_start_tx_first_n = { 7573 .f = cmd_start_tx_first_n_parsed, 7574 .data = NULL, 7575 .help_str = "start tx_first <num>: " 7576 "packet forwarding, after sending <num> bursts of packets", 7577 .tokens = { 7578 (void *)&cmd_start_tx_first_n_start, 7579 (void *)&cmd_start_tx_first_n_tx_first, 7580 (void *)&cmd_start_tx_first_n_tx_num, 7581 NULL, 7582 }, 7583 }; 7584 7585 /* *** SET LINK UP *** */ 7586 struct cmd_set_link_up_result { 7587 cmdline_fixed_string_t set; 7588 cmdline_fixed_string_t link_up; 7589 cmdline_fixed_string_t port; 7590 portid_t port_id; 7591 }; 7592 7593 cmdline_parse_token_string_t cmd_set_link_up_set = 7594 TOKEN_STRING_INITIALIZER(struct cmd_set_link_up_result, set, "set"); 7595 cmdline_parse_token_string_t cmd_set_link_up_link_up = 7596 TOKEN_STRING_INITIALIZER(struct cmd_set_link_up_result, link_up, 7597 "link-up"); 7598 cmdline_parse_token_string_t cmd_set_link_up_port = 7599 TOKEN_STRING_INITIALIZER(struct cmd_set_link_up_result, port, "port"); 7600 cmdline_parse_token_num_t cmd_set_link_up_port_id = 7601 TOKEN_NUM_INITIALIZER(struct cmd_set_link_up_result, port_id, 7602 RTE_UINT16); 7603 7604 static void cmd_set_link_up_parsed(__rte_unused void *parsed_result, 7605 __rte_unused struct cmdline *cl, 7606 __rte_unused void *data) 7607 { 7608 struct cmd_set_link_up_result *res = parsed_result; 7609 dev_set_link_up(res->port_id); 7610 } 7611 7612 cmdline_parse_inst_t cmd_set_link_up = { 7613 .f = cmd_set_link_up_parsed, 7614 .data = NULL, 7615 .help_str = "set link-up port <port id>", 7616 .tokens = { 7617 (void *)&cmd_set_link_up_set, 7618 (void *)&cmd_set_link_up_link_up, 7619 (void *)&cmd_set_link_up_port, 7620 (void *)&cmd_set_link_up_port_id, 7621 NULL, 7622 }, 7623 }; 7624 7625 /* *** SET LINK DOWN *** */ 7626 struct cmd_set_link_down_result { 7627 cmdline_fixed_string_t set; 7628 cmdline_fixed_string_t link_down; 7629 cmdline_fixed_string_t port; 7630 portid_t port_id; 7631 }; 7632 7633 cmdline_parse_token_string_t cmd_set_link_down_set = 7634 TOKEN_STRING_INITIALIZER(struct cmd_set_link_down_result, set, "set"); 7635 cmdline_parse_token_string_t cmd_set_link_down_link_down = 7636 TOKEN_STRING_INITIALIZER(struct cmd_set_link_down_result, link_down, 7637 "link-down"); 7638 cmdline_parse_token_string_t cmd_set_link_down_port = 7639 TOKEN_STRING_INITIALIZER(struct cmd_set_link_down_result, port, "port"); 7640 cmdline_parse_token_num_t cmd_set_link_down_port_id = 7641 TOKEN_NUM_INITIALIZER(struct cmd_set_link_down_result, port_id, 7642 RTE_UINT16); 7643 7644 static void cmd_set_link_down_parsed( 7645 __rte_unused void *parsed_result, 7646 __rte_unused struct cmdline *cl, 7647 __rte_unused void *data) 7648 { 7649 struct cmd_set_link_down_result *res = parsed_result; 7650 dev_set_link_down(res->port_id); 7651 } 7652 7653 cmdline_parse_inst_t cmd_set_link_down = { 7654 .f = cmd_set_link_down_parsed, 7655 .data = NULL, 7656 .help_str = "set link-down port <port id>", 7657 .tokens = { 7658 (void *)&cmd_set_link_down_set, 7659 (void *)&cmd_set_link_down_link_down, 7660 (void *)&cmd_set_link_down_port, 7661 (void *)&cmd_set_link_down_port_id, 7662 NULL, 7663 }, 7664 }; 7665 7666 /* *** SHOW CFG *** */ 7667 struct cmd_showcfg_result { 7668 cmdline_fixed_string_t show; 7669 cmdline_fixed_string_t cfg; 7670 cmdline_fixed_string_t what; 7671 }; 7672 7673 static void cmd_showcfg_parsed(void *parsed_result, 7674 __rte_unused struct cmdline *cl, 7675 __rte_unused void *data) 7676 { 7677 struct cmd_showcfg_result *res = parsed_result; 7678 if (!strcmp(res->what, "rxtx")) 7679 rxtx_config_display(); 7680 else if (!strcmp(res->what, "cores")) 7681 fwd_lcores_config_display(); 7682 else if (!strcmp(res->what, "fwd")) 7683 pkt_fwd_config_display(&cur_fwd_config); 7684 else if (!strcmp(res->what, "rxoffs")) 7685 show_rx_pkt_offsets(); 7686 else if (!strcmp(res->what, "rxpkts")) 7687 show_rx_pkt_segments(); 7688 else if (!strcmp(res->what, "txpkts")) 7689 show_tx_pkt_segments(); 7690 else if (!strcmp(res->what, "txtimes")) 7691 show_tx_pkt_times(); 7692 } 7693 7694 cmdline_parse_token_string_t cmd_showcfg_show = 7695 TOKEN_STRING_INITIALIZER(struct cmd_showcfg_result, show, "show"); 7696 cmdline_parse_token_string_t cmd_showcfg_port = 7697 TOKEN_STRING_INITIALIZER(struct cmd_showcfg_result, cfg, "config"); 7698 cmdline_parse_token_string_t cmd_showcfg_what = 7699 TOKEN_STRING_INITIALIZER(struct cmd_showcfg_result, what, 7700 "rxtx#cores#fwd#rxoffs#rxpkts#txpkts#txtimes"); 7701 7702 cmdline_parse_inst_t cmd_showcfg = { 7703 .f = cmd_showcfg_parsed, 7704 .data = NULL, 7705 .help_str = "show config rxtx|cores|fwd|rxoffs|rxpkts|txpkts|txtimes", 7706 .tokens = { 7707 (void *)&cmd_showcfg_show, 7708 (void *)&cmd_showcfg_port, 7709 (void *)&cmd_showcfg_what, 7710 NULL, 7711 }, 7712 }; 7713 7714 /* *** SHOW ALL PORT INFO *** */ 7715 struct cmd_showportall_result { 7716 cmdline_fixed_string_t show; 7717 cmdline_fixed_string_t port; 7718 cmdline_fixed_string_t what; 7719 cmdline_fixed_string_t all; 7720 }; 7721 7722 static void cmd_showportall_parsed(void *parsed_result, 7723 __rte_unused struct cmdline *cl, 7724 __rte_unused void *data) 7725 { 7726 portid_t i; 7727 7728 struct cmd_showportall_result *res = parsed_result; 7729 if (!strcmp(res->show, "clear")) { 7730 if (!strcmp(res->what, "stats")) 7731 RTE_ETH_FOREACH_DEV(i) 7732 nic_stats_clear(i); 7733 else if (!strcmp(res->what, "xstats")) 7734 RTE_ETH_FOREACH_DEV(i) 7735 nic_xstats_clear(i); 7736 } else if (!strcmp(res->what, "info")) 7737 RTE_ETH_FOREACH_DEV(i) 7738 port_infos_display(i); 7739 else if (!strcmp(res->what, "summary")) { 7740 port_summary_header_display(); 7741 RTE_ETH_FOREACH_DEV(i) 7742 port_summary_display(i); 7743 } 7744 else if (!strcmp(res->what, "stats")) 7745 RTE_ETH_FOREACH_DEV(i) 7746 nic_stats_display(i); 7747 else if (!strcmp(res->what, "xstats")) 7748 RTE_ETH_FOREACH_DEV(i) 7749 nic_xstats_display(i); 7750 #if defined(RTE_NET_I40E) || defined(RTE_NET_IXGBE) 7751 else if (!strcmp(res->what, "fdir")) 7752 RTE_ETH_FOREACH_DEV(i) 7753 fdir_get_infos(i); 7754 #endif 7755 else if (!strcmp(res->what, "dcb_tc")) 7756 RTE_ETH_FOREACH_DEV(i) 7757 port_dcb_info_display(i); 7758 } 7759 7760 cmdline_parse_token_string_t cmd_showportall_show = 7761 TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, show, 7762 "show#clear"); 7763 cmdline_parse_token_string_t cmd_showportall_port = 7764 TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, port, "port"); 7765 cmdline_parse_token_string_t cmd_showportall_what = 7766 TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, what, 7767 "info#summary#stats#xstats#fdir#dcb_tc"); 7768 cmdline_parse_token_string_t cmd_showportall_all = 7769 TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, all, "all"); 7770 cmdline_parse_inst_t cmd_showportall = { 7771 .f = cmd_showportall_parsed, 7772 .data = NULL, 7773 .help_str = "show|clear port " 7774 "info|summary|stats|xstats|fdir|dcb_tc all", 7775 .tokens = { 7776 (void *)&cmd_showportall_show, 7777 (void *)&cmd_showportall_port, 7778 (void *)&cmd_showportall_what, 7779 (void *)&cmd_showportall_all, 7780 NULL, 7781 }, 7782 }; 7783 7784 /* *** SHOW PORT INFO *** */ 7785 struct cmd_showport_result { 7786 cmdline_fixed_string_t show; 7787 cmdline_fixed_string_t port; 7788 cmdline_fixed_string_t what; 7789 uint16_t portnum; 7790 }; 7791 7792 static void cmd_showport_parsed(void *parsed_result, 7793 __rte_unused struct cmdline *cl, 7794 __rte_unused void *data) 7795 { 7796 struct cmd_showport_result *res = parsed_result; 7797 if (!strcmp(res->show, "clear")) { 7798 if (!strcmp(res->what, "stats")) 7799 nic_stats_clear(res->portnum); 7800 else if (!strcmp(res->what, "xstats")) 7801 nic_xstats_clear(res->portnum); 7802 } else if (!strcmp(res->what, "info")) 7803 port_infos_display(res->portnum); 7804 else if (!strcmp(res->what, "summary")) { 7805 port_summary_header_display(); 7806 port_summary_display(res->portnum); 7807 } 7808 else if (!strcmp(res->what, "stats")) 7809 nic_stats_display(res->portnum); 7810 else if (!strcmp(res->what, "xstats")) 7811 nic_xstats_display(res->portnum); 7812 #if defined(RTE_NET_I40E) || defined(RTE_NET_IXGBE) 7813 else if (!strcmp(res->what, "fdir")) 7814 fdir_get_infos(res->portnum); 7815 #endif 7816 else if (!strcmp(res->what, "dcb_tc")) 7817 port_dcb_info_display(res->portnum); 7818 } 7819 7820 cmdline_parse_token_string_t cmd_showport_show = 7821 TOKEN_STRING_INITIALIZER(struct cmd_showport_result, show, 7822 "show#clear"); 7823 cmdline_parse_token_string_t cmd_showport_port = 7824 TOKEN_STRING_INITIALIZER(struct cmd_showport_result, port, "port"); 7825 cmdline_parse_token_string_t cmd_showport_what = 7826 TOKEN_STRING_INITIALIZER(struct cmd_showport_result, what, 7827 "info#summary#stats#xstats#fdir#dcb_tc"); 7828 cmdline_parse_token_num_t cmd_showport_portnum = 7829 TOKEN_NUM_INITIALIZER(struct cmd_showport_result, portnum, RTE_UINT16); 7830 7831 cmdline_parse_inst_t cmd_showport = { 7832 .f = cmd_showport_parsed, 7833 .data = NULL, 7834 .help_str = "show|clear port " 7835 "info|summary|stats|xstats|fdir|dcb_tc " 7836 "<port_id>", 7837 .tokens = { 7838 (void *)&cmd_showport_show, 7839 (void *)&cmd_showport_port, 7840 (void *)&cmd_showport_what, 7841 (void *)&cmd_showport_portnum, 7842 NULL, 7843 }, 7844 }; 7845 7846 /* *** SHOW DEVICE INFO *** */ 7847 struct cmd_showdevice_result { 7848 cmdline_fixed_string_t show; 7849 cmdline_fixed_string_t device; 7850 cmdline_fixed_string_t what; 7851 cmdline_fixed_string_t identifier; 7852 }; 7853 7854 static void cmd_showdevice_parsed(void *parsed_result, 7855 __rte_unused struct cmdline *cl, 7856 __rte_unused void *data) 7857 { 7858 struct cmd_showdevice_result *res = parsed_result; 7859 if (!strcmp(res->what, "info")) { 7860 if (!strcmp(res->identifier, "all")) 7861 device_infos_display(NULL); 7862 else 7863 device_infos_display(res->identifier); 7864 } 7865 } 7866 7867 cmdline_parse_token_string_t cmd_showdevice_show = 7868 TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result, show, 7869 "show"); 7870 cmdline_parse_token_string_t cmd_showdevice_device = 7871 TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result, device, "device"); 7872 cmdline_parse_token_string_t cmd_showdevice_what = 7873 TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result, what, 7874 "info"); 7875 cmdline_parse_token_string_t cmd_showdevice_identifier = 7876 TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result, 7877 identifier, NULL); 7878 7879 cmdline_parse_inst_t cmd_showdevice = { 7880 .f = cmd_showdevice_parsed, 7881 .data = NULL, 7882 .help_str = "show device info <identifier>|all", 7883 .tokens = { 7884 (void *)&cmd_showdevice_show, 7885 (void *)&cmd_showdevice_device, 7886 (void *)&cmd_showdevice_what, 7887 (void *)&cmd_showdevice_identifier, 7888 NULL, 7889 }, 7890 }; 7891 7892 /* *** SHOW MODULE EEPROM/EEPROM port INFO *** */ 7893 struct cmd_showeeprom_result { 7894 cmdline_fixed_string_t show; 7895 cmdline_fixed_string_t port; 7896 uint16_t portnum; 7897 cmdline_fixed_string_t type; 7898 }; 7899 7900 static void cmd_showeeprom_parsed(void *parsed_result, 7901 __rte_unused struct cmdline *cl, 7902 __rte_unused void *data) 7903 { 7904 struct cmd_showeeprom_result *res = parsed_result; 7905 7906 if (!strcmp(res->type, "eeprom")) 7907 port_eeprom_display(res->portnum); 7908 else if (!strcmp(res->type, "module_eeprom")) 7909 port_module_eeprom_display(res->portnum); 7910 else 7911 printf("Unknown argument\n"); 7912 } 7913 7914 cmdline_parse_token_string_t cmd_showeeprom_show = 7915 TOKEN_STRING_INITIALIZER(struct cmd_showeeprom_result, show, "show"); 7916 cmdline_parse_token_string_t cmd_showeeprom_port = 7917 TOKEN_STRING_INITIALIZER(struct cmd_showeeprom_result, port, "port"); 7918 cmdline_parse_token_num_t cmd_showeeprom_portnum = 7919 TOKEN_NUM_INITIALIZER(struct cmd_showeeprom_result, portnum, 7920 RTE_UINT16); 7921 cmdline_parse_token_string_t cmd_showeeprom_type = 7922 TOKEN_STRING_INITIALIZER(struct cmd_showeeprom_result, type, "module_eeprom#eeprom"); 7923 7924 cmdline_parse_inst_t cmd_showeeprom = { 7925 .f = cmd_showeeprom_parsed, 7926 .data = NULL, 7927 .help_str = "show port <port_id> module_eeprom|eeprom", 7928 .tokens = { 7929 (void *)&cmd_showeeprom_show, 7930 (void *)&cmd_showeeprom_port, 7931 (void *)&cmd_showeeprom_portnum, 7932 (void *)&cmd_showeeprom_type, 7933 NULL, 7934 }, 7935 }; 7936 7937 /* *** SHOW QUEUE INFO *** */ 7938 struct cmd_showqueue_result { 7939 cmdline_fixed_string_t show; 7940 cmdline_fixed_string_t type; 7941 cmdline_fixed_string_t what; 7942 uint16_t portnum; 7943 uint16_t queuenum; 7944 }; 7945 7946 static void 7947 cmd_showqueue_parsed(void *parsed_result, 7948 __rte_unused struct cmdline *cl, 7949 __rte_unused void *data) 7950 { 7951 struct cmd_showqueue_result *res = parsed_result; 7952 7953 if (!strcmp(res->type, "rxq")) 7954 rx_queue_infos_display(res->portnum, res->queuenum); 7955 else if (!strcmp(res->type, "txq")) 7956 tx_queue_infos_display(res->portnum, res->queuenum); 7957 } 7958 7959 cmdline_parse_token_string_t cmd_showqueue_show = 7960 TOKEN_STRING_INITIALIZER(struct cmd_showqueue_result, show, "show"); 7961 cmdline_parse_token_string_t cmd_showqueue_type = 7962 TOKEN_STRING_INITIALIZER(struct cmd_showqueue_result, type, "rxq#txq"); 7963 cmdline_parse_token_string_t cmd_showqueue_what = 7964 TOKEN_STRING_INITIALIZER(struct cmd_showqueue_result, what, "info"); 7965 cmdline_parse_token_num_t cmd_showqueue_portnum = 7966 TOKEN_NUM_INITIALIZER(struct cmd_showqueue_result, portnum, 7967 RTE_UINT16); 7968 cmdline_parse_token_num_t cmd_showqueue_queuenum = 7969 TOKEN_NUM_INITIALIZER(struct cmd_showqueue_result, queuenum, 7970 RTE_UINT16); 7971 7972 cmdline_parse_inst_t cmd_showqueue = { 7973 .f = cmd_showqueue_parsed, 7974 .data = NULL, 7975 .help_str = "show rxq|txq info <port_id> <queue_id>", 7976 .tokens = { 7977 (void *)&cmd_showqueue_show, 7978 (void *)&cmd_showqueue_type, 7979 (void *)&cmd_showqueue_what, 7980 (void *)&cmd_showqueue_portnum, 7981 (void *)&cmd_showqueue_queuenum, 7982 NULL, 7983 }, 7984 }; 7985 7986 /* show/clear fwd engine statistics */ 7987 struct fwd_result { 7988 cmdline_fixed_string_t action; 7989 cmdline_fixed_string_t fwd; 7990 cmdline_fixed_string_t stats; 7991 cmdline_fixed_string_t all; 7992 }; 7993 7994 cmdline_parse_token_string_t cmd_fwd_action = 7995 TOKEN_STRING_INITIALIZER(struct fwd_result, action, "show#clear"); 7996 cmdline_parse_token_string_t cmd_fwd_fwd = 7997 TOKEN_STRING_INITIALIZER(struct fwd_result, fwd, "fwd"); 7998 cmdline_parse_token_string_t cmd_fwd_stats = 7999 TOKEN_STRING_INITIALIZER(struct fwd_result, stats, "stats"); 8000 cmdline_parse_token_string_t cmd_fwd_all = 8001 TOKEN_STRING_INITIALIZER(struct fwd_result, all, "all"); 8002 8003 static void 8004 cmd_showfwdall_parsed(void *parsed_result, 8005 __rte_unused struct cmdline *cl, 8006 __rte_unused void *data) 8007 { 8008 struct fwd_result *res = parsed_result; 8009 8010 if (!strcmp(res->action, "show")) 8011 fwd_stats_display(); 8012 else 8013 fwd_stats_reset(); 8014 } 8015 8016 static cmdline_parse_inst_t cmd_showfwdall = { 8017 .f = cmd_showfwdall_parsed, 8018 .data = NULL, 8019 .help_str = "show|clear fwd stats all", 8020 .tokens = { 8021 (void *)&cmd_fwd_action, 8022 (void *)&cmd_fwd_fwd, 8023 (void *)&cmd_fwd_stats, 8024 (void *)&cmd_fwd_all, 8025 NULL, 8026 }, 8027 }; 8028 8029 /* *** READ PORT REGISTER *** */ 8030 struct cmd_read_reg_result { 8031 cmdline_fixed_string_t read; 8032 cmdline_fixed_string_t reg; 8033 portid_t port_id; 8034 uint32_t reg_off; 8035 }; 8036 8037 static void 8038 cmd_read_reg_parsed(void *parsed_result, 8039 __rte_unused struct cmdline *cl, 8040 __rte_unused void *data) 8041 { 8042 struct cmd_read_reg_result *res = parsed_result; 8043 port_reg_display(res->port_id, res->reg_off); 8044 } 8045 8046 cmdline_parse_token_string_t cmd_read_reg_read = 8047 TOKEN_STRING_INITIALIZER(struct cmd_read_reg_result, read, "read"); 8048 cmdline_parse_token_string_t cmd_read_reg_reg = 8049 TOKEN_STRING_INITIALIZER(struct cmd_read_reg_result, reg, "reg"); 8050 cmdline_parse_token_num_t cmd_read_reg_port_id = 8051 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_result, port_id, RTE_UINT16); 8052 cmdline_parse_token_num_t cmd_read_reg_reg_off = 8053 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_result, reg_off, RTE_UINT32); 8054 8055 cmdline_parse_inst_t cmd_read_reg = { 8056 .f = cmd_read_reg_parsed, 8057 .data = NULL, 8058 .help_str = "read reg <port_id> <reg_off>", 8059 .tokens = { 8060 (void *)&cmd_read_reg_read, 8061 (void *)&cmd_read_reg_reg, 8062 (void *)&cmd_read_reg_port_id, 8063 (void *)&cmd_read_reg_reg_off, 8064 NULL, 8065 }, 8066 }; 8067 8068 /* *** READ PORT REGISTER BIT FIELD *** */ 8069 struct cmd_read_reg_bit_field_result { 8070 cmdline_fixed_string_t read; 8071 cmdline_fixed_string_t regfield; 8072 portid_t port_id; 8073 uint32_t reg_off; 8074 uint8_t bit1_pos; 8075 uint8_t bit2_pos; 8076 }; 8077 8078 static void 8079 cmd_read_reg_bit_field_parsed(void *parsed_result, 8080 __rte_unused struct cmdline *cl, 8081 __rte_unused void *data) 8082 { 8083 struct cmd_read_reg_bit_field_result *res = parsed_result; 8084 port_reg_bit_field_display(res->port_id, res->reg_off, 8085 res->bit1_pos, res->bit2_pos); 8086 } 8087 8088 cmdline_parse_token_string_t cmd_read_reg_bit_field_read = 8089 TOKEN_STRING_INITIALIZER(struct cmd_read_reg_bit_field_result, read, 8090 "read"); 8091 cmdline_parse_token_string_t cmd_read_reg_bit_field_regfield = 8092 TOKEN_STRING_INITIALIZER(struct cmd_read_reg_bit_field_result, 8093 regfield, "regfield"); 8094 cmdline_parse_token_num_t cmd_read_reg_bit_field_port_id = 8095 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_field_result, port_id, 8096 RTE_UINT16); 8097 cmdline_parse_token_num_t cmd_read_reg_bit_field_reg_off = 8098 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_field_result, reg_off, 8099 RTE_UINT32); 8100 cmdline_parse_token_num_t cmd_read_reg_bit_field_bit1_pos = 8101 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_field_result, bit1_pos, 8102 RTE_UINT8); 8103 cmdline_parse_token_num_t cmd_read_reg_bit_field_bit2_pos = 8104 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_field_result, bit2_pos, 8105 RTE_UINT8); 8106 8107 cmdline_parse_inst_t cmd_read_reg_bit_field = { 8108 .f = cmd_read_reg_bit_field_parsed, 8109 .data = NULL, 8110 .help_str = "read regfield <port_id> <reg_off> <bit_x> <bit_y>: " 8111 "Read register bit field between bit_x and bit_y included", 8112 .tokens = { 8113 (void *)&cmd_read_reg_bit_field_read, 8114 (void *)&cmd_read_reg_bit_field_regfield, 8115 (void *)&cmd_read_reg_bit_field_port_id, 8116 (void *)&cmd_read_reg_bit_field_reg_off, 8117 (void *)&cmd_read_reg_bit_field_bit1_pos, 8118 (void *)&cmd_read_reg_bit_field_bit2_pos, 8119 NULL, 8120 }, 8121 }; 8122 8123 /* *** READ PORT REGISTER BIT *** */ 8124 struct cmd_read_reg_bit_result { 8125 cmdline_fixed_string_t read; 8126 cmdline_fixed_string_t regbit; 8127 portid_t port_id; 8128 uint32_t reg_off; 8129 uint8_t bit_pos; 8130 }; 8131 8132 static void 8133 cmd_read_reg_bit_parsed(void *parsed_result, 8134 __rte_unused struct cmdline *cl, 8135 __rte_unused void *data) 8136 { 8137 struct cmd_read_reg_bit_result *res = parsed_result; 8138 port_reg_bit_display(res->port_id, res->reg_off, res->bit_pos); 8139 } 8140 8141 cmdline_parse_token_string_t cmd_read_reg_bit_read = 8142 TOKEN_STRING_INITIALIZER(struct cmd_read_reg_bit_result, read, "read"); 8143 cmdline_parse_token_string_t cmd_read_reg_bit_regbit = 8144 TOKEN_STRING_INITIALIZER(struct cmd_read_reg_bit_result, 8145 regbit, "regbit"); 8146 cmdline_parse_token_num_t cmd_read_reg_bit_port_id = 8147 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_result, port_id, 8148 RTE_UINT16); 8149 cmdline_parse_token_num_t cmd_read_reg_bit_reg_off = 8150 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_result, reg_off, 8151 RTE_UINT32); 8152 cmdline_parse_token_num_t cmd_read_reg_bit_bit_pos = 8153 TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_result, bit_pos, 8154 RTE_UINT8); 8155 8156 cmdline_parse_inst_t cmd_read_reg_bit = { 8157 .f = cmd_read_reg_bit_parsed, 8158 .data = NULL, 8159 .help_str = "read regbit <port_id> <reg_off> <bit_x>: 0 <= bit_x <= 31", 8160 .tokens = { 8161 (void *)&cmd_read_reg_bit_read, 8162 (void *)&cmd_read_reg_bit_regbit, 8163 (void *)&cmd_read_reg_bit_port_id, 8164 (void *)&cmd_read_reg_bit_reg_off, 8165 (void *)&cmd_read_reg_bit_bit_pos, 8166 NULL, 8167 }, 8168 }; 8169 8170 /* *** WRITE PORT REGISTER *** */ 8171 struct cmd_write_reg_result { 8172 cmdline_fixed_string_t write; 8173 cmdline_fixed_string_t reg; 8174 portid_t port_id; 8175 uint32_t reg_off; 8176 uint32_t value; 8177 }; 8178 8179 static void 8180 cmd_write_reg_parsed(void *parsed_result, 8181 __rte_unused struct cmdline *cl, 8182 __rte_unused void *data) 8183 { 8184 struct cmd_write_reg_result *res = parsed_result; 8185 port_reg_set(res->port_id, res->reg_off, res->value); 8186 } 8187 8188 cmdline_parse_token_string_t cmd_write_reg_write = 8189 TOKEN_STRING_INITIALIZER(struct cmd_write_reg_result, write, "write"); 8190 cmdline_parse_token_string_t cmd_write_reg_reg = 8191 TOKEN_STRING_INITIALIZER(struct cmd_write_reg_result, reg, "reg"); 8192 cmdline_parse_token_num_t cmd_write_reg_port_id = 8193 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_result, port_id, RTE_UINT16); 8194 cmdline_parse_token_num_t cmd_write_reg_reg_off = 8195 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_result, reg_off, RTE_UINT32); 8196 cmdline_parse_token_num_t cmd_write_reg_value = 8197 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_result, value, RTE_UINT32); 8198 8199 cmdline_parse_inst_t cmd_write_reg = { 8200 .f = cmd_write_reg_parsed, 8201 .data = NULL, 8202 .help_str = "write reg <port_id> <reg_off> <reg_value>", 8203 .tokens = { 8204 (void *)&cmd_write_reg_write, 8205 (void *)&cmd_write_reg_reg, 8206 (void *)&cmd_write_reg_port_id, 8207 (void *)&cmd_write_reg_reg_off, 8208 (void *)&cmd_write_reg_value, 8209 NULL, 8210 }, 8211 }; 8212 8213 /* *** WRITE PORT REGISTER BIT FIELD *** */ 8214 struct cmd_write_reg_bit_field_result { 8215 cmdline_fixed_string_t write; 8216 cmdline_fixed_string_t regfield; 8217 portid_t port_id; 8218 uint32_t reg_off; 8219 uint8_t bit1_pos; 8220 uint8_t bit2_pos; 8221 uint32_t value; 8222 }; 8223 8224 static void 8225 cmd_write_reg_bit_field_parsed(void *parsed_result, 8226 __rte_unused struct cmdline *cl, 8227 __rte_unused void *data) 8228 { 8229 struct cmd_write_reg_bit_field_result *res = parsed_result; 8230 port_reg_bit_field_set(res->port_id, res->reg_off, 8231 res->bit1_pos, res->bit2_pos, res->value); 8232 } 8233 8234 cmdline_parse_token_string_t cmd_write_reg_bit_field_write = 8235 TOKEN_STRING_INITIALIZER(struct cmd_write_reg_bit_field_result, write, 8236 "write"); 8237 cmdline_parse_token_string_t cmd_write_reg_bit_field_regfield = 8238 TOKEN_STRING_INITIALIZER(struct cmd_write_reg_bit_field_result, 8239 regfield, "regfield"); 8240 cmdline_parse_token_num_t cmd_write_reg_bit_field_port_id = 8241 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, port_id, 8242 RTE_UINT16); 8243 cmdline_parse_token_num_t cmd_write_reg_bit_field_reg_off = 8244 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, reg_off, 8245 RTE_UINT32); 8246 cmdline_parse_token_num_t cmd_write_reg_bit_field_bit1_pos = 8247 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, bit1_pos, 8248 RTE_UINT8); 8249 cmdline_parse_token_num_t cmd_write_reg_bit_field_bit2_pos = 8250 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, bit2_pos, 8251 RTE_UINT8); 8252 cmdline_parse_token_num_t cmd_write_reg_bit_field_value = 8253 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, value, 8254 RTE_UINT32); 8255 8256 cmdline_parse_inst_t cmd_write_reg_bit_field = { 8257 .f = cmd_write_reg_bit_field_parsed, 8258 .data = NULL, 8259 .help_str = "write regfield <port_id> <reg_off> <bit_x> <bit_y> " 8260 "<reg_value>: " 8261 "Set register bit field between bit_x and bit_y included", 8262 .tokens = { 8263 (void *)&cmd_write_reg_bit_field_write, 8264 (void *)&cmd_write_reg_bit_field_regfield, 8265 (void *)&cmd_write_reg_bit_field_port_id, 8266 (void *)&cmd_write_reg_bit_field_reg_off, 8267 (void *)&cmd_write_reg_bit_field_bit1_pos, 8268 (void *)&cmd_write_reg_bit_field_bit2_pos, 8269 (void *)&cmd_write_reg_bit_field_value, 8270 NULL, 8271 }, 8272 }; 8273 8274 /* *** WRITE PORT REGISTER BIT *** */ 8275 struct cmd_write_reg_bit_result { 8276 cmdline_fixed_string_t write; 8277 cmdline_fixed_string_t regbit; 8278 portid_t port_id; 8279 uint32_t reg_off; 8280 uint8_t bit_pos; 8281 uint8_t value; 8282 }; 8283 8284 static void 8285 cmd_write_reg_bit_parsed(void *parsed_result, 8286 __rte_unused struct cmdline *cl, 8287 __rte_unused void *data) 8288 { 8289 struct cmd_write_reg_bit_result *res = parsed_result; 8290 port_reg_bit_set(res->port_id, res->reg_off, res->bit_pos, res->value); 8291 } 8292 8293 cmdline_parse_token_string_t cmd_write_reg_bit_write = 8294 TOKEN_STRING_INITIALIZER(struct cmd_write_reg_bit_result, write, 8295 "write"); 8296 cmdline_parse_token_string_t cmd_write_reg_bit_regbit = 8297 TOKEN_STRING_INITIALIZER(struct cmd_write_reg_bit_result, 8298 regbit, "regbit"); 8299 cmdline_parse_token_num_t cmd_write_reg_bit_port_id = 8300 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_result, port_id, 8301 RTE_UINT16); 8302 cmdline_parse_token_num_t cmd_write_reg_bit_reg_off = 8303 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_result, reg_off, 8304 RTE_UINT32); 8305 cmdline_parse_token_num_t cmd_write_reg_bit_bit_pos = 8306 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_result, bit_pos, 8307 RTE_UINT8); 8308 cmdline_parse_token_num_t cmd_write_reg_bit_value = 8309 TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_result, value, 8310 RTE_UINT8); 8311 8312 cmdline_parse_inst_t cmd_write_reg_bit = { 8313 .f = cmd_write_reg_bit_parsed, 8314 .data = NULL, 8315 .help_str = "write regbit <port_id> <reg_off> <bit_x> 0|1: " 8316 "0 <= bit_x <= 31", 8317 .tokens = { 8318 (void *)&cmd_write_reg_bit_write, 8319 (void *)&cmd_write_reg_bit_regbit, 8320 (void *)&cmd_write_reg_bit_port_id, 8321 (void *)&cmd_write_reg_bit_reg_off, 8322 (void *)&cmd_write_reg_bit_bit_pos, 8323 (void *)&cmd_write_reg_bit_value, 8324 NULL, 8325 }, 8326 }; 8327 8328 /* *** READ A RING DESCRIPTOR OF A PORT RX/TX QUEUE *** */ 8329 struct cmd_read_rxd_txd_result { 8330 cmdline_fixed_string_t read; 8331 cmdline_fixed_string_t rxd_txd; 8332 portid_t port_id; 8333 uint16_t queue_id; 8334 uint16_t desc_id; 8335 }; 8336 8337 static void 8338 cmd_read_rxd_txd_parsed(void *parsed_result, 8339 __rte_unused struct cmdline *cl, 8340 __rte_unused void *data) 8341 { 8342 struct cmd_read_rxd_txd_result *res = parsed_result; 8343 8344 if (!strcmp(res->rxd_txd, "rxd")) 8345 rx_ring_desc_display(res->port_id, res->queue_id, res->desc_id); 8346 else if (!strcmp(res->rxd_txd, "txd")) 8347 tx_ring_desc_display(res->port_id, res->queue_id, res->desc_id); 8348 } 8349 8350 cmdline_parse_token_string_t cmd_read_rxd_txd_read = 8351 TOKEN_STRING_INITIALIZER(struct cmd_read_rxd_txd_result, read, "read"); 8352 cmdline_parse_token_string_t cmd_read_rxd_txd_rxd_txd = 8353 TOKEN_STRING_INITIALIZER(struct cmd_read_rxd_txd_result, rxd_txd, 8354 "rxd#txd"); 8355 cmdline_parse_token_num_t cmd_read_rxd_txd_port_id = 8356 TOKEN_NUM_INITIALIZER(struct cmd_read_rxd_txd_result, port_id, 8357 RTE_UINT16); 8358 cmdline_parse_token_num_t cmd_read_rxd_txd_queue_id = 8359 TOKEN_NUM_INITIALIZER(struct cmd_read_rxd_txd_result, queue_id, 8360 RTE_UINT16); 8361 cmdline_parse_token_num_t cmd_read_rxd_txd_desc_id = 8362 TOKEN_NUM_INITIALIZER(struct cmd_read_rxd_txd_result, desc_id, 8363 RTE_UINT16); 8364 8365 cmdline_parse_inst_t cmd_read_rxd_txd = { 8366 .f = cmd_read_rxd_txd_parsed, 8367 .data = NULL, 8368 .help_str = "read rxd|txd <port_id> <queue_id> <desc_id>", 8369 .tokens = { 8370 (void *)&cmd_read_rxd_txd_read, 8371 (void *)&cmd_read_rxd_txd_rxd_txd, 8372 (void *)&cmd_read_rxd_txd_port_id, 8373 (void *)&cmd_read_rxd_txd_queue_id, 8374 (void *)&cmd_read_rxd_txd_desc_id, 8375 NULL, 8376 }, 8377 }; 8378 8379 /* *** QUIT *** */ 8380 struct cmd_quit_result { 8381 cmdline_fixed_string_t quit; 8382 }; 8383 8384 static void cmd_quit_parsed(__rte_unused void *parsed_result, 8385 struct cmdline *cl, 8386 __rte_unused void *data) 8387 { 8388 cmdline_quit(cl); 8389 } 8390 8391 cmdline_parse_token_string_t cmd_quit_quit = 8392 TOKEN_STRING_INITIALIZER(struct cmd_quit_result, quit, "quit"); 8393 8394 cmdline_parse_inst_t cmd_quit = { 8395 .f = cmd_quit_parsed, 8396 .data = NULL, 8397 .help_str = "quit: Exit application", 8398 .tokens = { 8399 (void *)&cmd_quit_quit, 8400 NULL, 8401 }, 8402 }; 8403 8404 /* *** ADD/REMOVE MAC ADDRESS FROM A PORT *** */ 8405 struct cmd_mac_addr_result { 8406 cmdline_fixed_string_t mac_addr_cmd; 8407 cmdline_fixed_string_t what; 8408 uint16_t port_num; 8409 struct rte_ether_addr address; 8410 }; 8411 8412 static void cmd_mac_addr_parsed(void *parsed_result, 8413 __rte_unused struct cmdline *cl, 8414 __rte_unused void *data) 8415 { 8416 struct cmd_mac_addr_result *res = parsed_result; 8417 int ret; 8418 8419 if (strcmp(res->what, "add") == 0) 8420 ret = rte_eth_dev_mac_addr_add(res->port_num, &res->address, 0); 8421 else if (strcmp(res->what, "set") == 0) 8422 ret = rte_eth_dev_default_mac_addr_set(res->port_num, 8423 &res->address); 8424 else 8425 ret = rte_eth_dev_mac_addr_remove(res->port_num, &res->address); 8426 8427 /* check the return value and print it if is < 0 */ 8428 if(ret < 0) 8429 printf("mac_addr_cmd error: (%s)\n", strerror(-ret)); 8430 8431 } 8432 8433 cmdline_parse_token_string_t cmd_mac_addr_cmd = 8434 TOKEN_STRING_INITIALIZER(struct cmd_mac_addr_result, mac_addr_cmd, 8435 "mac_addr"); 8436 cmdline_parse_token_string_t cmd_mac_addr_what = 8437 TOKEN_STRING_INITIALIZER(struct cmd_mac_addr_result, what, 8438 "add#remove#set"); 8439 cmdline_parse_token_num_t cmd_mac_addr_portnum = 8440 TOKEN_NUM_INITIALIZER(struct cmd_mac_addr_result, port_num, 8441 RTE_UINT16); 8442 cmdline_parse_token_etheraddr_t cmd_mac_addr_addr = 8443 TOKEN_ETHERADDR_INITIALIZER(struct cmd_mac_addr_result, address); 8444 8445 cmdline_parse_inst_t cmd_mac_addr = { 8446 .f = cmd_mac_addr_parsed, 8447 .data = (void *)0, 8448 .help_str = "mac_addr add|remove|set <port_id> <mac_addr>: " 8449 "Add/Remove/Set MAC address on port_id", 8450 .tokens = { 8451 (void *)&cmd_mac_addr_cmd, 8452 (void *)&cmd_mac_addr_what, 8453 (void *)&cmd_mac_addr_portnum, 8454 (void *)&cmd_mac_addr_addr, 8455 NULL, 8456 }, 8457 }; 8458 8459 /* *** SET THE PEER ADDRESS FOR CERTAIN PORT *** */ 8460 struct cmd_eth_peer_result { 8461 cmdline_fixed_string_t set; 8462 cmdline_fixed_string_t eth_peer; 8463 portid_t port_id; 8464 cmdline_fixed_string_t peer_addr; 8465 }; 8466 8467 static void cmd_set_eth_peer_parsed(void *parsed_result, 8468 __rte_unused struct cmdline *cl, 8469 __rte_unused void *data) 8470 { 8471 struct cmd_eth_peer_result *res = parsed_result; 8472 8473 if (test_done == 0) { 8474 printf("Please stop forwarding first\n"); 8475 return; 8476 } 8477 if (!strcmp(res->eth_peer, "eth-peer")) { 8478 set_fwd_eth_peer(res->port_id, res->peer_addr); 8479 fwd_config_setup(); 8480 } 8481 } 8482 cmdline_parse_token_string_t cmd_eth_peer_set = 8483 TOKEN_STRING_INITIALIZER(struct cmd_eth_peer_result, set, "set"); 8484 cmdline_parse_token_string_t cmd_eth_peer = 8485 TOKEN_STRING_INITIALIZER(struct cmd_eth_peer_result, eth_peer, "eth-peer"); 8486 cmdline_parse_token_num_t cmd_eth_peer_port_id = 8487 TOKEN_NUM_INITIALIZER(struct cmd_eth_peer_result, port_id, 8488 RTE_UINT16); 8489 cmdline_parse_token_string_t cmd_eth_peer_addr = 8490 TOKEN_STRING_INITIALIZER(struct cmd_eth_peer_result, peer_addr, NULL); 8491 8492 cmdline_parse_inst_t cmd_set_fwd_eth_peer = { 8493 .f = cmd_set_eth_peer_parsed, 8494 .data = NULL, 8495 .help_str = "set eth-peer <port_id> <peer_mac>", 8496 .tokens = { 8497 (void *)&cmd_eth_peer_set, 8498 (void *)&cmd_eth_peer, 8499 (void *)&cmd_eth_peer_port_id, 8500 (void *)&cmd_eth_peer_addr, 8501 NULL, 8502 }, 8503 }; 8504 8505 /* *** CONFIGURE QUEUE STATS COUNTER MAPPINGS *** */ 8506 struct cmd_set_qmap_result { 8507 cmdline_fixed_string_t set; 8508 cmdline_fixed_string_t qmap; 8509 cmdline_fixed_string_t what; 8510 portid_t port_id; 8511 uint16_t queue_id; 8512 uint8_t map_value; 8513 }; 8514 8515 static void 8516 cmd_set_qmap_parsed(void *parsed_result, 8517 __rte_unused struct cmdline *cl, 8518 __rte_unused void *data) 8519 { 8520 struct cmd_set_qmap_result *res = parsed_result; 8521 int is_rx = (strcmp(res->what, "tx") == 0) ? 0 : 1; 8522 8523 set_qmap(res->port_id, (uint8_t)is_rx, res->queue_id, res->map_value); 8524 } 8525 8526 cmdline_parse_token_string_t cmd_setqmap_set = 8527 TOKEN_STRING_INITIALIZER(struct cmd_set_qmap_result, 8528 set, "set"); 8529 cmdline_parse_token_string_t cmd_setqmap_qmap = 8530 TOKEN_STRING_INITIALIZER(struct cmd_set_qmap_result, 8531 qmap, "stat_qmap"); 8532 cmdline_parse_token_string_t cmd_setqmap_what = 8533 TOKEN_STRING_INITIALIZER(struct cmd_set_qmap_result, 8534 what, "tx#rx"); 8535 cmdline_parse_token_num_t cmd_setqmap_portid = 8536 TOKEN_NUM_INITIALIZER(struct cmd_set_qmap_result, 8537 port_id, RTE_UINT16); 8538 cmdline_parse_token_num_t cmd_setqmap_queueid = 8539 TOKEN_NUM_INITIALIZER(struct cmd_set_qmap_result, 8540 queue_id, RTE_UINT16); 8541 cmdline_parse_token_num_t cmd_setqmap_mapvalue = 8542 TOKEN_NUM_INITIALIZER(struct cmd_set_qmap_result, 8543 map_value, RTE_UINT8); 8544 8545 cmdline_parse_inst_t cmd_set_qmap = { 8546 .f = cmd_set_qmap_parsed, 8547 .data = NULL, 8548 .help_str = "set stat_qmap rx|tx <port_id> <queue_id> <map_value>: " 8549 "Set statistics mapping value on tx|rx queue_id of port_id", 8550 .tokens = { 8551 (void *)&cmd_setqmap_set, 8552 (void *)&cmd_setqmap_qmap, 8553 (void *)&cmd_setqmap_what, 8554 (void *)&cmd_setqmap_portid, 8555 (void *)&cmd_setqmap_queueid, 8556 (void *)&cmd_setqmap_mapvalue, 8557 NULL, 8558 }, 8559 }; 8560 8561 /* *** SET OPTION TO HIDE ZERO VALUES FOR XSTATS DISPLAY *** */ 8562 struct cmd_set_xstats_hide_zero_result { 8563 cmdline_fixed_string_t keyword; 8564 cmdline_fixed_string_t name; 8565 cmdline_fixed_string_t on_off; 8566 }; 8567 8568 static void 8569 cmd_set_xstats_hide_zero_parsed(void *parsed_result, 8570 __rte_unused struct cmdline *cl, 8571 __rte_unused void *data) 8572 { 8573 struct cmd_set_xstats_hide_zero_result *res; 8574 uint16_t on_off = 0; 8575 8576 res = parsed_result; 8577 on_off = !strcmp(res->on_off, "on") ? 1 : 0; 8578 set_xstats_hide_zero(on_off); 8579 } 8580 8581 cmdline_parse_token_string_t cmd_set_xstats_hide_zero_keyword = 8582 TOKEN_STRING_INITIALIZER(struct cmd_set_xstats_hide_zero_result, 8583 keyword, "set"); 8584 cmdline_parse_token_string_t cmd_set_xstats_hide_zero_name = 8585 TOKEN_STRING_INITIALIZER(struct cmd_set_xstats_hide_zero_result, 8586 name, "xstats-hide-zero"); 8587 cmdline_parse_token_string_t cmd_set_xstats_hide_zero_on_off = 8588 TOKEN_STRING_INITIALIZER(struct cmd_set_xstats_hide_zero_result, 8589 on_off, "on#off"); 8590 8591 cmdline_parse_inst_t cmd_set_xstats_hide_zero = { 8592 .f = cmd_set_xstats_hide_zero_parsed, 8593 .data = NULL, 8594 .help_str = "set xstats-hide-zero on|off", 8595 .tokens = { 8596 (void *)&cmd_set_xstats_hide_zero_keyword, 8597 (void *)&cmd_set_xstats_hide_zero_name, 8598 (void *)&cmd_set_xstats_hide_zero_on_off, 8599 NULL, 8600 }, 8601 }; 8602 8603 /* *** SET OPTION TO ENABLE MEASUREMENT OF CPU CYCLES *** */ 8604 struct cmd_set_record_core_cycles_result { 8605 cmdline_fixed_string_t keyword; 8606 cmdline_fixed_string_t name; 8607 cmdline_fixed_string_t on_off; 8608 }; 8609 8610 static void 8611 cmd_set_record_core_cycles_parsed(void *parsed_result, 8612 __rte_unused struct cmdline *cl, 8613 __rte_unused void *data) 8614 { 8615 struct cmd_set_record_core_cycles_result *res; 8616 uint16_t on_off = 0; 8617 8618 res = parsed_result; 8619 on_off = !strcmp(res->on_off, "on") ? 1 : 0; 8620 set_record_core_cycles(on_off); 8621 } 8622 8623 cmdline_parse_token_string_t cmd_set_record_core_cycles_keyword = 8624 TOKEN_STRING_INITIALIZER(struct cmd_set_record_core_cycles_result, 8625 keyword, "set"); 8626 cmdline_parse_token_string_t cmd_set_record_core_cycles_name = 8627 TOKEN_STRING_INITIALIZER(struct cmd_set_record_core_cycles_result, 8628 name, "record-core-cycles"); 8629 cmdline_parse_token_string_t cmd_set_record_core_cycles_on_off = 8630 TOKEN_STRING_INITIALIZER(struct cmd_set_record_core_cycles_result, 8631 on_off, "on#off"); 8632 8633 cmdline_parse_inst_t cmd_set_record_core_cycles = { 8634 .f = cmd_set_record_core_cycles_parsed, 8635 .data = NULL, 8636 .help_str = "set record-core-cycles on|off", 8637 .tokens = { 8638 (void *)&cmd_set_record_core_cycles_keyword, 8639 (void *)&cmd_set_record_core_cycles_name, 8640 (void *)&cmd_set_record_core_cycles_on_off, 8641 NULL, 8642 }, 8643 }; 8644 8645 /* *** SET OPTION TO ENABLE DISPLAY OF RX AND TX BURSTS *** */ 8646 struct cmd_set_record_burst_stats_result { 8647 cmdline_fixed_string_t keyword; 8648 cmdline_fixed_string_t name; 8649 cmdline_fixed_string_t on_off; 8650 }; 8651 8652 static void 8653 cmd_set_record_burst_stats_parsed(void *parsed_result, 8654 __rte_unused struct cmdline *cl, 8655 __rte_unused void *data) 8656 { 8657 struct cmd_set_record_burst_stats_result *res; 8658 uint16_t on_off = 0; 8659 8660 res = parsed_result; 8661 on_off = !strcmp(res->on_off, "on") ? 1 : 0; 8662 set_record_burst_stats(on_off); 8663 } 8664 8665 cmdline_parse_token_string_t cmd_set_record_burst_stats_keyword = 8666 TOKEN_STRING_INITIALIZER(struct cmd_set_record_burst_stats_result, 8667 keyword, "set"); 8668 cmdline_parse_token_string_t cmd_set_record_burst_stats_name = 8669 TOKEN_STRING_INITIALIZER(struct cmd_set_record_burst_stats_result, 8670 name, "record-burst-stats"); 8671 cmdline_parse_token_string_t cmd_set_record_burst_stats_on_off = 8672 TOKEN_STRING_INITIALIZER(struct cmd_set_record_burst_stats_result, 8673 on_off, "on#off"); 8674 8675 cmdline_parse_inst_t cmd_set_record_burst_stats = { 8676 .f = cmd_set_record_burst_stats_parsed, 8677 .data = NULL, 8678 .help_str = "set record-burst-stats on|off", 8679 .tokens = { 8680 (void *)&cmd_set_record_burst_stats_keyword, 8681 (void *)&cmd_set_record_burst_stats_name, 8682 (void *)&cmd_set_record_burst_stats_on_off, 8683 NULL, 8684 }, 8685 }; 8686 8687 /* *** CONFIGURE UNICAST HASH TABLE *** */ 8688 struct cmd_set_uc_hash_table { 8689 cmdline_fixed_string_t set; 8690 cmdline_fixed_string_t port; 8691 portid_t port_id; 8692 cmdline_fixed_string_t what; 8693 struct rte_ether_addr address; 8694 cmdline_fixed_string_t mode; 8695 }; 8696 8697 static void 8698 cmd_set_uc_hash_parsed(void *parsed_result, 8699 __rte_unused struct cmdline *cl, 8700 __rte_unused void *data) 8701 { 8702 int ret=0; 8703 struct cmd_set_uc_hash_table *res = parsed_result; 8704 8705 int is_on = (strcmp(res->mode, "on") == 0) ? 1 : 0; 8706 8707 if (strcmp(res->what, "uta") == 0) 8708 ret = rte_eth_dev_uc_hash_table_set(res->port_id, 8709 &res->address,(uint8_t)is_on); 8710 if (ret < 0) 8711 printf("bad unicast hash table parameter, return code = %d \n", ret); 8712 8713 } 8714 8715 cmdline_parse_token_string_t cmd_set_uc_hash_set = 8716 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_hash_table, 8717 set, "set"); 8718 cmdline_parse_token_string_t cmd_set_uc_hash_port = 8719 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_hash_table, 8720 port, "port"); 8721 cmdline_parse_token_num_t cmd_set_uc_hash_portid = 8722 TOKEN_NUM_INITIALIZER(struct cmd_set_uc_hash_table, 8723 port_id, RTE_UINT16); 8724 cmdline_parse_token_string_t cmd_set_uc_hash_what = 8725 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_hash_table, 8726 what, "uta"); 8727 cmdline_parse_token_etheraddr_t cmd_set_uc_hash_mac = 8728 TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_uc_hash_table, 8729 address); 8730 cmdline_parse_token_string_t cmd_set_uc_hash_mode = 8731 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_hash_table, 8732 mode, "on#off"); 8733 8734 cmdline_parse_inst_t cmd_set_uc_hash_filter = { 8735 .f = cmd_set_uc_hash_parsed, 8736 .data = NULL, 8737 .help_str = "set port <port_id> uta <mac_addr> on|off)", 8738 .tokens = { 8739 (void *)&cmd_set_uc_hash_set, 8740 (void *)&cmd_set_uc_hash_port, 8741 (void *)&cmd_set_uc_hash_portid, 8742 (void *)&cmd_set_uc_hash_what, 8743 (void *)&cmd_set_uc_hash_mac, 8744 (void *)&cmd_set_uc_hash_mode, 8745 NULL, 8746 }, 8747 }; 8748 8749 struct cmd_set_uc_all_hash_table { 8750 cmdline_fixed_string_t set; 8751 cmdline_fixed_string_t port; 8752 portid_t port_id; 8753 cmdline_fixed_string_t what; 8754 cmdline_fixed_string_t value; 8755 cmdline_fixed_string_t mode; 8756 }; 8757 8758 static void 8759 cmd_set_uc_all_hash_parsed(void *parsed_result, 8760 __rte_unused struct cmdline *cl, 8761 __rte_unused void *data) 8762 { 8763 int ret=0; 8764 struct cmd_set_uc_all_hash_table *res = parsed_result; 8765 8766 int is_on = (strcmp(res->mode, "on") == 0) ? 1 : 0; 8767 8768 if ((strcmp(res->what, "uta") == 0) && 8769 (strcmp(res->value, "all") == 0)) 8770 ret = rte_eth_dev_uc_all_hash_table_set(res->port_id,(uint8_t) is_on); 8771 if (ret < 0) 8772 printf("bad unicast hash table parameter," 8773 "return code = %d \n", ret); 8774 } 8775 8776 cmdline_parse_token_string_t cmd_set_uc_all_hash_set = 8777 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table, 8778 set, "set"); 8779 cmdline_parse_token_string_t cmd_set_uc_all_hash_port = 8780 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table, 8781 port, "port"); 8782 cmdline_parse_token_num_t cmd_set_uc_all_hash_portid = 8783 TOKEN_NUM_INITIALIZER(struct cmd_set_uc_all_hash_table, 8784 port_id, RTE_UINT16); 8785 cmdline_parse_token_string_t cmd_set_uc_all_hash_what = 8786 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table, 8787 what, "uta"); 8788 cmdline_parse_token_string_t cmd_set_uc_all_hash_value = 8789 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table, 8790 value,"all"); 8791 cmdline_parse_token_string_t cmd_set_uc_all_hash_mode = 8792 TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table, 8793 mode, "on#off"); 8794 8795 cmdline_parse_inst_t cmd_set_uc_all_hash_filter = { 8796 .f = cmd_set_uc_all_hash_parsed, 8797 .data = NULL, 8798 .help_str = "set port <port_id> uta all on|off", 8799 .tokens = { 8800 (void *)&cmd_set_uc_all_hash_set, 8801 (void *)&cmd_set_uc_all_hash_port, 8802 (void *)&cmd_set_uc_all_hash_portid, 8803 (void *)&cmd_set_uc_all_hash_what, 8804 (void *)&cmd_set_uc_all_hash_value, 8805 (void *)&cmd_set_uc_all_hash_mode, 8806 NULL, 8807 }, 8808 }; 8809 8810 /* *** CONFIGURE VF TRAFFIC CONTROL *** */ 8811 struct cmd_set_vf_traffic { 8812 cmdline_fixed_string_t set; 8813 cmdline_fixed_string_t port; 8814 portid_t port_id; 8815 cmdline_fixed_string_t vf; 8816 uint8_t vf_id; 8817 cmdline_fixed_string_t what; 8818 cmdline_fixed_string_t mode; 8819 }; 8820 8821 static void 8822 cmd_set_vf_traffic_parsed(void *parsed_result, 8823 __rte_unused struct cmdline *cl, 8824 __rte_unused void *data) 8825 { 8826 struct cmd_set_vf_traffic *res = parsed_result; 8827 int is_rx = (strcmp(res->what, "rx") == 0) ? 1 : 0; 8828 int is_on = (strcmp(res->mode, "on") == 0) ? 1 : 0; 8829 8830 set_vf_traffic(res->port_id, (uint8_t)is_rx, res->vf_id,(uint8_t) is_on); 8831 } 8832 8833 cmdline_parse_token_string_t cmd_setvf_traffic_set = 8834 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_traffic, 8835 set, "set"); 8836 cmdline_parse_token_string_t cmd_setvf_traffic_port = 8837 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_traffic, 8838 port, "port"); 8839 cmdline_parse_token_num_t cmd_setvf_traffic_portid = 8840 TOKEN_NUM_INITIALIZER(struct cmd_set_vf_traffic, 8841 port_id, RTE_UINT16); 8842 cmdline_parse_token_string_t cmd_setvf_traffic_vf = 8843 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_traffic, 8844 vf, "vf"); 8845 cmdline_parse_token_num_t cmd_setvf_traffic_vfid = 8846 TOKEN_NUM_INITIALIZER(struct cmd_set_vf_traffic, 8847 vf_id, RTE_UINT8); 8848 cmdline_parse_token_string_t cmd_setvf_traffic_what = 8849 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_traffic, 8850 what, "tx#rx"); 8851 cmdline_parse_token_string_t cmd_setvf_traffic_mode = 8852 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_traffic, 8853 mode, "on#off"); 8854 8855 cmdline_parse_inst_t cmd_set_vf_traffic = { 8856 .f = cmd_set_vf_traffic_parsed, 8857 .data = NULL, 8858 .help_str = "set port <port_id> vf <vf_id> rx|tx on|off", 8859 .tokens = { 8860 (void *)&cmd_setvf_traffic_set, 8861 (void *)&cmd_setvf_traffic_port, 8862 (void *)&cmd_setvf_traffic_portid, 8863 (void *)&cmd_setvf_traffic_vf, 8864 (void *)&cmd_setvf_traffic_vfid, 8865 (void *)&cmd_setvf_traffic_what, 8866 (void *)&cmd_setvf_traffic_mode, 8867 NULL, 8868 }, 8869 }; 8870 8871 /* *** CONFIGURE VF RECEIVE MODE *** */ 8872 struct cmd_set_vf_rxmode { 8873 cmdline_fixed_string_t set; 8874 cmdline_fixed_string_t port; 8875 portid_t port_id; 8876 cmdline_fixed_string_t vf; 8877 uint8_t vf_id; 8878 cmdline_fixed_string_t what; 8879 cmdline_fixed_string_t mode; 8880 cmdline_fixed_string_t on; 8881 }; 8882 8883 static void 8884 cmd_set_vf_rxmode_parsed(void *parsed_result, 8885 __rte_unused struct cmdline *cl, 8886 __rte_unused void *data) 8887 { 8888 int ret = -ENOTSUP; 8889 uint16_t vf_rxmode = 0; 8890 struct cmd_set_vf_rxmode *res = parsed_result; 8891 8892 int is_on = (strcmp(res->on, "on") == 0) ? 1 : 0; 8893 if (!strcmp(res->what,"rxmode")) { 8894 if (!strcmp(res->mode, "AUPE")) 8895 vf_rxmode |= ETH_VMDQ_ACCEPT_UNTAG; 8896 else if (!strcmp(res->mode, "ROPE")) 8897 vf_rxmode |= ETH_VMDQ_ACCEPT_HASH_UC; 8898 else if (!strcmp(res->mode, "BAM")) 8899 vf_rxmode |= ETH_VMDQ_ACCEPT_BROADCAST; 8900 else if (!strncmp(res->mode, "MPE",3)) 8901 vf_rxmode |= ETH_VMDQ_ACCEPT_MULTICAST; 8902 } 8903 8904 RTE_SET_USED(is_on); 8905 8906 #ifdef RTE_NET_IXGBE 8907 if (ret == -ENOTSUP) 8908 ret = rte_pmd_ixgbe_set_vf_rxmode(res->port_id, res->vf_id, 8909 vf_rxmode, (uint8_t)is_on); 8910 #endif 8911 #ifdef RTE_NET_BNXT 8912 if (ret == -ENOTSUP) 8913 ret = rte_pmd_bnxt_set_vf_rxmode(res->port_id, res->vf_id, 8914 vf_rxmode, (uint8_t)is_on); 8915 #endif 8916 if (ret < 0) 8917 printf("bad VF receive mode parameter, return code = %d \n", 8918 ret); 8919 } 8920 8921 cmdline_parse_token_string_t cmd_set_vf_rxmode_set = 8922 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode, 8923 set, "set"); 8924 cmdline_parse_token_string_t cmd_set_vf_rxmode_port = 8925 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode, 8926 port, "port"); 8927 cmdline_parse_token_num_t cmd_set_vf_rxmode_portid = 8928 TOKEN_NUM_INITIALIZER(struct cmd_set_vf_rxmode, 8929 port_id, RTE_UINT16); 8930 cmdline_parse_token_string_t cmd_set_vf_rxmode_vf = 8931 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode, 8932 vf, "vf"); 8933 cmdline_parse_token_num_t cmd_set_vf_rxmode_vfid = 8934 TOKEN_NUM_INITIALIZER(struct cmd_set_vf_rxmode, 8935 vf_id, RTE_UINT8); 8936 cmdline_parse_token_string_t cmd_set_vf_rxmode_what = 8937 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode, 8938 what, "rxmode"); 8939 cmdline_parse_token_string_t cmd_set_vf_rxmode_mode = 8940 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode, 8941 mode, "AUPE#ROPE#BAM#MPE"); 8942 cmdline_parse_token_string_t cmd_set_vf_rxmode_on = 8943 TOKEN_STRING_INITIALIZER(struct cmd_set_vf_rxmode, 8944 on, "on#off"); 8945 8946 cmdline_parse_inst_t cmd_set_vf_rxmode = { 8947 .f = cmd_set_vf_rxmode_parsed, 8948 .data = NULL, 8949 .help_str = "set port <port_id> vf <vf_id> rxmode " 8950 "AUPE|ROPE|BAM|MPE on|off", 8951 .tokens = { 8952 (void *)&cmd_set_vf_rxmode_set, 8953 (void *)&cmd_set_vf_rxmode_port, 8954 (void *)&cmd_set_vf_rxmode_portid, 8955 (void *)&cmd_set_vf_rxmode_vf, 8956 (void *)&cmd_set_vf_rxmode_vfid, 8957 (void *)&cmd_set_vf_rxmode_what, 8958 (void *)&cmd_set_vf_rxmode_mode, 8959 (void *)&cmd_set_vf_rxmode_on, 8960 NULL, 8961 }, 8962 }; 8963 8964 /* *** ADD MAC ADDRESS FILTER FOR A VF OF A PORT *** */ 8965 struct cmd_vf_mac_addr_result { 8966 cmdline_fixed_string_t mac_addr_cmd; 8967 cmdline_fixed_string_t what; 8968 cmdline_fixed_string_t port; 8969 uint16_t port_num; 8970 cmdline_fixed_string_t vf; 8971 uint8_t vf_num; 8972 struct rte_ether_addr address; 8973 }; 8974 8975 static void cmd_vf_mac_addr_parsed(void *parsed_result, 8976 __rte_unused struct cmdline *cl, 8977 __rte_unused void *data) 8978 { 8979 struct cmd_vf_mac_addr_result *res = parsed_result; 8980 int ret = -ENOTSUP; 8981 8982 if (strcmp(res->what, "add") != 0) 8983 return; 8984 8985 #ifdef RTE_NET_I40E 8986 if (ret == -ENOTSUP) 8987 ret = rte_pmd_i40e_add_vf_mac_addr(res->port_num, res->vf_num, 8988 &res->address); 8989 #endif 8990 #ifdef RTE_NET_BNXT 8991 if (ret == -ENOTSUP) 8992 ret = rte_pmd_bnxt_mac_addr_add(res->port_num, &res->address, 8993 res->vf_num); 8994 #endif 8995 8996 if(ret < 0) 8997 printf("vf_mac_addr_cmd error: (%s)\n", strerror(-ret)); 8998 8999 } 9000 9001 cmdline_parse_token_string_t cmd_vf_mac_addr_cmd = 9002 TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result, 9003 mac_addr_cmd,"mac_addr"); 9004 cmdline_parse_token_string_t cmd_vf_mac_addr_what = 9005 TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result, 9006 what,"add"); 9007 cmdline_parse_token_string_t cmd_vf_mac_addr_port = 9008 TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result, 9009 port,"port"); 9010 cmdline_parse_token_num_t cmd_vf_mac_addr_portnum = 9011 TOKEN_NUM_INITIALIZER(struct cmd_vf_mac_addr_result, 9012 port_num, RTE_UINT16); 9013 cmdline_parse_token_string_t cmd_vf_mac_addr_vf = 9014 TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result, 9015 vf,"vf"); 9016 cmdline_parse_token_num_t cmd_vf_mac_addr_vfnum = 9017 TOKEN_NUM_INITIALIZER(struct cmd_vf_mac_addr_result, 9018 vf_num, RTE_UINT8); 9019 cmdline_parse_token_etheraddr_t cmd_vf_mac_addr_addr = 9020 TOKEN_ETHERADDR_INITIALIZER(struct cmd_vf_mac_addr_result, 9021 address); 9022 9023 cmdline_parse_inst_t cmd_vf_mac_addr_filter = { 9024 .f = cmd_vf_mac_addr_parsed, 9025 .data = (void *)0, 9026 .help_str = "mac_addr add port <port_id> vf <vf_id> <mac_addr>: " 9027 "Add MAC address filtering for a VF on port_id", 9028 .tokens = { 9029 (void *)&cmd_vf_mac_addr_cmd, 9030 (void *)&cmd_vf_mac_addr_what, 9031 (void *)&cmd_vf_mac_addr_port, 9032 (void *)&cmd_vf_mac_addr_portnum, 9033 (void *)&cmd_vf_mac_addr_vf, 9034 (void *)&cmd_vf_mac_addr_vfnum, 9035 (void *)&cmd_vf_mac_addr_addr, 9036 NULL, 9037 }, 9038 }; 9039 9040 /* *** ADD/REMOVE A VLAN IDENTIFIER TO/FROM A PORT VLAN RX FILTER *** */ 9041 struct cmd_vf_rx_vlan_filter { 9042 cmdline_fixed_string_t rx_vlan; 9043 cmdline_fixed_string_t what; 9044 uint16_t vlan_id; 9045 cmdline_fixed_string_t port; 9046 portid_t port_id; 9047 cmdline_fixed_string_t vf; 9048 uint64_t vf_mask; 9049 }; 9050 9051 static void 9052 cmd_vf_rx_vlan_filter_parsed(void *parsed_result, 9053 __rte_unused struct cmdline *cl, 9054 __rte_unused void *data) 9055 { 9056 struct cmd_vf_rx_vlan_filter *res = parsed_result; 9057 int ret = -ENOTSUP; 9058 9059 __rte_unused int is_add = (strcmp(res->what, "add") == 0) ? 1 : 0; 9060 9061 #ifdef RTE_NET_IXGBE 9062 if (ret == -ENOTSUP) 9063 ret = rte_pmd_ixgbe_set_vf_vlan_filter(res->port_id, 9064 res->vlan_id, res->vf_mask, is_add); 9065 #endif 9066 #ifdef RTE_NET_I40E 9067 if (ret == -ENOTSUP) 9068 ret = rte_pmd_i40e_set_vf_vlan_filter(res->port_id, 9069 res->vlan_id, res->vf_mask, is_add); 9070 #endif 9071 #ifdef RTE_NET_BNXT 9072 if (ret == -ENOTSUP) 9073 ret = rte_pmd_bnxt_set_vf_vlan_filter(res->port_id, 9074 res->vlan_id, res->vf_mask, is_add); 9075 #endif 9076 9077 switch (ret) { 9078 case 0: 9079 break; 9080 case -EINVAL: 9081 printf("invalid vlan_id %d or vf_mask %"PRIu64"\n", 9082 res->vlan_id, res->vf_mask); 9083 break; 9084 case -ENODEV: 9085 printf("invalid port_id %d\n", res->port_id); 9086 break; 9087 case -ENOTSUP: 9088 printf("function not implemented or supported\n"); 9089 break; 9090 default: 9091 printf("programming error: (%s)\n", strerror(-ret)); 9092 } 9093 } 9094 9095 cmdline_parse_token_string_t cmd_vf_rx_vlan_filter_rx_vlan = 9096 TOKEN_STRING_INITIALIZER(struct cmd_vf_rx_vlan_filter, 9097 rx_vlan, "rx_vlan"); 9098 cmdline_parse_token_string_t cmd_vf_rx_vlan_filter_what = 9099 TOKEN_STRING_INITIALIZER(struct cmd_vf_rx_vlan_filter, 9100 what, "add#rm"); 9101 cmdline_parse_token_num_t cmd_vf_rx_vlan_filter_vlanid = 9102 TOKEN_NUM_INITIALIZER(struct cmd_vf_rx_vlan_filter, 9103 vlan_id, RTE_UINT16); 9104 cmdline_parse_token_string_t cmd_vf_rx_vlan_filter_port = 9105 TOKEN_STRING_INITIALIZER(struct cmd_vf_rx_vlan_filter, 9106 port, "port"); 9107 cmdline_parse_token_num_t cmd_vf_rx_vlan_filter_portid = 9108 TOKEN_NUM_INITIALIZER(struct cmd_vf_rx_vlan_filter, 9109 port_id, RTE_UINT16); 9110 cmdline_parse_token_string_t cmd_vf_rx_vlan_filter_vf = 9111 TOKEN_STRING_INITIALIZER(struct cmd_vf_rx_vlan_filter, 9112 vf, "vf"); 9113 cmdline_parse_token_num_t cmd_vf_rx_vlan_filter_vf_mask = 9114 TOKEN_NUM_INITIALIZER(struct cmd_vf_rx_vlan_filter, 9115 vf_mask, RTE_UINT64); 9116 9117 cmdline_parse_inst_t cmd_vf_rxvlan_filter = { 9118 .f = cmd_vf_rx_vlan_filter_parsed, 9119 .data = NULL, 9120 .help_str = "rx_vlan add|rm <vlan_id> port <port_id> vf <vf_mask>: " 9121 "(vf_mask = hexadecimal VF mask)", 9122 .tokens = { 9123 (void *)&cmd_vf_rx_vlan_filter_rx_vlan, 9124 (void *)&cmd_vf_rx_vlan_filter_what, 9125 (void *)&cmd_vf_rx_vlan_filter_vlanid, 9126 (void *)&cmd_vf_rx_vlan_filter_port, 9127 (void *)&cmd_vf_rx_vlan_filter_portid, 9128 (void *)&cmd_vf_rx_vlan_filter_vf, 9129 (void *)&cmd_vf_rx_vlan_filter_vf_mask, 9130 NULL, 9131 }, 9132 }; 9133 9134 /* *** SET RATE LIMIT FOR A QUEUE OF A PORT *** */ 9135 struct cmd_queue_rate_limit_result { 9136 cmdline_fixed_string_t set; 9137 cmdline_fixed_string_t port; 9138 uint16_t port_num; 9139 cmdline_fixed_string_t queue; 9140 uint8_t queue_num; 9141 cmdline_fixed_string_t rate; 9142 uint16_t rate_num; 9143 }; 9144 9145 static void cmd_queue_rate_limit_parsed(void *parsed_result, 9146 __rte_unused struct cmdline *cl, 9147 __rte_unused void *data) 9148 { 9149 struct cmd_queue_rate_limit_result *res = parsed_result; 9150 int ret = 0; 9151 9152 if ((strcmp(res->set, "set") == 0) && (strcmp(res->port, "port") == 0) 9153 && (strcmp(res->queue, "queue") == 0) 9154 && (strcmp(res->rate, "rate") == 0)) 9155 ret = set_queue_rate_limit(res->port_num, res->queue_num, 9156 res->rate_num); 9157 if (ret < 0) 9158 printf("queue_rate_limit_cmd error: (%s)\n", strerror(-ret)); 9159 9160 } 9161 9162 cmdline_parse_token_string_t cmd_queue_rate_limit_set = 9163 TOKEN_STRING_INITIALIZER(struct cmd_queue_rate_limit_result, 9164 set, "set"); 9165 cmdline_parse_token_string_t cmd_queue_rate_limit_port = 9166 TOKEN_STRING_INITIALIZER(struct cmd_queue_rate_limit_result, 9167 port, "port"); 9168 cmdline_parse_token_num_t cmd_queue_rate_limit_portnum = 9169 TOKEN_NUM_INITIALIZER(struct cmd_queue_rate_limit_result, 9170 port_num, RTE_UINT16); 9171 cmdline_parse_token_string_t cmd_queue_rate_limit_queue = 9172 TOKEN_STRING_INITIALIZER(struct cmd_queue_rate_limit_result, 9173 queue, "queue"); 9174 cmdline_parse_token_num_t cmd_queue_rate_limit_queuenum = 9175 TOKEN_NUM_INITIALIZER(struct cmd_queue_rate_limit_result, 9176 queue_num, RTE_UINT8); 9177 cmdline_parse_token_string_t cmd_queue_rate_limit_rate = 9178 TOKEN_STRING_INITIALIZER(struct cmd_queue_rate_limit_result, 9179 rate, "rate"); 9180 cmdline_parse_token_num_t cmd_queue_rate_limit_ratenum = 9181 TOKEN_NUM_INITIALIZER(struct cmd_queue_rate_limit_result, 9182 rate_num, RTE_UINT16); 9183 9184 cmdline_parse_inst_t cmd_queue_rate_limit = { 9185 .f = cmd_queue_rate_limit_parsed, 9186 .data = (void *)0, 9187 .help_str = "set port <port_id> queue <queue_id> rate <rate_value>: " 9188 "Set rate limit for a queue on port_id", 9189 .tokens = { 9190 (void *)&cmd_queue_rate_limit_set, 9191 (void *)&cmd_queue_rate_limit_port, 9192 (void *)&cmd_queue_rate_limit_portnum, 9193 (void *)&cmd_queue_rate_limit_queue, 9194 (void *)&cmd_queue_rate_limit_queuenum, 9195 (void *)&cmd_queue_rate_limit_rate, 9196 (void *)&cmd_queue_rate_limit_ratenum, 9197 NULL, 9198 }, 9199 }; 9200 9201 /* *** SET RATE LIMIT FOR A VF OF A PORT *** */ 9202 struct cmd_vf_rate_limit_result { 9203 cmdline_fixed_string_t set; 9204 cmdline_fixed_string_t port; 9205 uint16_t port_num; 9206 cmdline_fixed_string_t vf; 9207 uint8_t vf_num; 9208 cmdline_fixed_string_t rate; 9209 uint16_t rate_num; 9210 cmdline_fixed_string_t q_msk; 9211 uint64_t q_msk_val; 9212 }; 9213 9214 static void cmd_vf_rate_limit_parsed(void *parsed_result, 9215 __rte_unused struct cmdline *cl, 9216 __rte_unused void *data) 9217 { 9218 struct cmd_vf_rate_limit_result *res = parsed_result; 9219 int ret = 0; 9220 9221 if ((strcmp(res->set, "set") == 0) && (strcmp(res->port, "port") == 0) 9222 && (strcmp(res->vf, "vf") == 0) 9223 && (strcmp(res->rate, "rate") == 0) 9224 && (strcmp(res->q_msk, "queue_mask") == 0)) 9225 ret = set_vf_rate_limit(res->port_num, res->vf_num, 9226 res->rate_num, res->q_msk_val); 9227 if (ret < 0) 9228 printf("vf_rate_limit_cmd error: (%s)\n", strerror(-ret)); 9229 9230 } 9231 9232 cmdline_parse_token_string_t cmd_vf_rate_limit_set = 9233 TOKEN_STRING_INITIALIZER(struct cmd_vf_rate_limit_result, 9234 set, "set"); 9235 cmdline_parse_token_string_t cmd_vf_rate_limit_port = 9236 TOKEN_STRING_INITIALIZER(struct cmd_vf_rate_limit_result, 9237 port, "port"); 9238 cmdline_parse_token_num_t cmd_vf_rate_limit_portnum = 9239 TOKEN_NUM_INITIALIZER(struct cmd_vf_rate_limit_result, 9240 port_num, RTE_UINT16); 9241 cmdline_parse_token_string_t cmd_vf_rate_limit_vf = 9242 TOKEN_STRING_INITIALIZER(struct cmd_vf_rate_limit_result, 9243 vf, "vf"); 9244 cmdline_parse_token_num_t cmd_vf_rate_limit_vfnum = 9245 TOKEN_NUM_INITIALIZER(struct cmd_vf_rate_limit_result, 9246 vf_num, RTE_UINT8); 9247 cmdline_parse_token_string_t cmd_vf_rate_limit_rate = 9248 TOKEN_STRING_INITIALIZER(struct cmd_vf_rate_limit_result, 9249 rate, "rate"); 9250 cmdline_parse_token_num_t cmd_vf_rate_limit_ratenum = 9251 TOKEN_NUM_INITIALIZER(struct cmd_vf_rate_limit_result, 9252 rate_num, RTE_UINT16); 9253 cmdline_parse_token_string_t cmd_vf_rate_limit_q_msk = 9254 TOKEN_STRING_INITIALIZER(struct cmd_vf_rate_limit_result, 9255 q_msk, "queue_mask"); 9256 cmdline_parse_token_num_t cmd_vf_rate_limit_q_msk_val = 9257 TOKEN_NUM_INITIALIZER(struct cmd_vf_rate_limit_result, 9258 q_msk_val, RTE_UINT64); 9259 9260 cmdline_parse_inst_t cmd_vf_rate_limit = { 9261 .f = cmd_vf_rate_limit_parsed, 9262 .data = (void *)0, 9263 .help_str = "set port <port_id> vf <vf_id> rate <rate_value> " 9264 "queue_mask <queue_mask_value>: " 9265 "Set rate limit for queues of VF on port_id", 9266 .tokens = { 9267 (void *)&cmd_vf_rate_limit_set, 9268 (void *)&cmd_vf_rate_limit_port, 9269 (void *)&cmd_vf_rate_limit_portnum, 9270 (void *)&cmd_vf_rate_limit_vf, 9271 (void *)&cmd_vf_rate_limit_vfnum, 9272 (void *)&cmd_vf_rate_limit_rate, 9273 (void *)&cmd_vf_rate_limit_ratenum, 9274 (void *)&cmd_vf_rate_limit_q_msk, 9275 (void *)&cmd_vf_rate_limit_q_msk_val, 9276 NULL, 9277 }, 9278 }; 9279 9280 /* *** CONFIGURE TUNNEL UDP PORT *** */ 9281 struct cmd_tunnel_udp_config { 9282 cmdline_fixed_string_t rx_vxlan_port; 9283 cmdline_fixed_string_t what; 9284 uint16_t udp_port; 9285 portid_t port_id; 9286 }; 9287 9288 static void 9289 cmd_tunnel_udp_config_parsed(void *parsed_result, 9290 __rte_unused struct cmdline *cl, 9291 __rte_unused void *data) 9292 { 9293 struct cmd_tunnel_udp_config *res = parsed_result; 9294 struct rte_eth_udp_tunnel tunnel_udp; 9295 int ret; 9296 9297 tunnel_udp.udp_port = res->udp_port; 9298 tunnel_udp.prot_type = RTE_TUNNEL_TYPE_VXLAN; 9299 9300 if (!strcmp(res->what, "add")) 9301 ret = rte_eth_dev_udp_tunnel_port_add(res->port_id, 9302 &tunnel_udp); 9303 else 9304 ret = rte_eth_dev_udp_tunnel_port_delete(res->port_id, 9305 &tunnel_udp); 9306 9307 if (ret < 0) 9308 printf("udp tunneling add error: (%s)\n", strerror(-ret)); 9309 } 9310 9311 cmdline_parse_token_string_t cmd_tunnel_udp_config_rx_vxlan_port = 9312 TOKEN_STRING_INITIALIZER(struct cmd_tunnel_udp_config, 9313 rx_vxlan_port, "rx_vxlan_port"); 9314 cmdline_parse_token_string_t cmd_tunnel_udp_config_what = 9315 TOKEN_STRING_INITIALIZER(struct cmd_tunnel_udp_config, 9316 what, "add#rm"); 9317 cmdline_parse_token_num_t cmd_tunnel_udp_config_udp_port = 9318 TOKEN_NUM_INITIALIZER(struct cmd_tunnel_udp_config, 9319 udp_port, RTE_UINT16); 9320 cmdline_parse_token_num_t cmd_tunnel_udp_config_port_id = 9321 TOKEN_NUM_INITIALIZER(struct cmd_tunnel_udp_config, 9322 port_id, RTE_UINT16); 9323 9324 cmdline_parse_inst_t cmd_tunnel_udp_config = { 9325 .f = cmd_tunnel_udp_config_parsed, 9326 .data = (void *)0, 9327 .help_str = "rx_vxlan_port add|rm <udp_port> <port_id>: " 9328 "Add/Remove a tunneling UDP port filter", 9329 .tokens = { 9330 (void *)&cmd_tunnel_udp_config_rx_vxlan_port, 9331 (void *)&cmd_tunnel_udp_config_what, 9332 (void *)&cmd_tunnel_udp_config_udp_port, 9333 (void *)&cmd_tunnel_udp_config_port_id, 9334 NULL, 9335 }, 9336 }; 9337 9338 struct cmd_config_tunnel_udp_port { 9339 cmdline_fixed_string_t port; 9340 cmdline_fixed_string_t config; 9341 portid_t port_id; 9342 cmdline_fixed_string_t udp_tunnel_port; 9343 cmdline_fixed_string_t action; 9344 cmdline_fixed_string_t tunnel_type; 9345 uint16_t udp_port; 9346 }; 9347 9348 static void 9349 cmd_cfg_tunnel_udp_port_parsed(void *parsed_result, 9350 __rte_unused struct cmdline *cl, 9351 __rte_unused void *data) 9352 { 9353 struct cmd_config_tunnel_udp_port *res = parsed_result; 9354 struct rte_eth_udp_tunnel tunnel_udp; 9355 int ret = 0; 9356 9357 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 9358 return; 9359 9360 tunnel_udp.udp_port = res->udp_port; 9361 9362 if (!strcmp(res->tunnel_type, "vxlan")) { 9363 tunnel_udp.prot_type = RTE_TUNNEL_TYPE_VXLAN; 9364 } else if (!strcmp(res->tunnel_type, "geneve")) { 9365 tunnel_udp.prot_type = RTE_TUNNEL_TYPE_GENEVE; 9366 } else if (!strcmp(res->tunnel_type, "vxlan-gpe")) { 9367 tunnel_udp.prot_type = RTE_TUNNEL_TYPE_VXLAN_GPE; 9368 } else if (!strcmp(res->tunnel_type, "ecpri")) { 9369 tunnel_udp.prot_type = RTE_TUNNEL_TYPE_ECPRI; 9370 } else { 9371 printf("Invalid tunnel type\n"); 9372 return; 9373 } 9374 9375 if (!strcmp(res->action, "add")) 9376 ret = rte_eth_dev_udp_tunnel_port_add(res->port_id, 9377 &tunnel_udp); 9378 else 9379 ret = rte_eth_dev_udp_tunnel_port_delete(res->port_id, 9380 &tunnel_udp); 9381 9382 if (ret < 0) 9383 printf("udp tunneling port add error: (%s)\n", strerror(-ret)); 9384 } 9385 9386 cmdline_parse_token_string_t cmd_config_tunnel_udp_port_port = 9387 TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, port, 9388 "port"); 9389 cmdline_parse_token_string_t cmd_config_tunnel_udp_port_config = 9390 TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, config, 9391 "config"); 9392 cmdline_parse_token_num_t cmd_config_tunnel_udp_port_port_id = 9393 TOKEN_NUM_INITIALIZER(struct cmd_config_tunnel_udp_port, port_id, 9394 RTE_UINT16); 9395 cmdline_parse_token_string_t cmd_config_tunnel_udp_port_tunnel_port = 9396 TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, 9397 udp_tunnel_port, 9398 "udp_tunnel_port"); 9399 cmdline_parse_token_string_t cmd_config_tunnel_udp_port_action = 9400 TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, action, 9401 "add#rm"); 9402 cmdline_parse_token_string_t cmd_config_tunnel_udp_port_tunnel_type = 9403 TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, tunnel_type, 9404 "vxlan#geneve#vxlan-gpe#ecpri"); 9405 cmdline_parse_token_num_t cmd_config_tunnel_udp_port_value = 9406 TOKEN_NUM_INITIALIZER(struct cmd_config_tunnel_udp_port, udp_port, 9407 RTE_UINT16); 9408 9409 cmdline_parse_inst_t cmd_cfg_tunnel_udp_port = { 9410 .f = cmd_cfg_tunnel_udp_port_parsed, 9411 .data = NULL, 9412 .help_str = "port config <port_id> udp_tunnel_port add|rm vxlan|" 9413 "geneve|vxlan-gpe|ecpri <udp_port>", 9414 .tokens = { 9415 (void *)&cmd_config_tunnel_udp_port_port, 9416 (void *)&cmd_config_tunnel_udp_port_config, 9417 (void *)&cmd_config_tunnel_udp_port_port_id, 9418 (void *)&cmd_config_tunnel_udp_port_tunnel_port, 9419 (void *)&cmd_config_tunnel_udp_port_action, 9420 (void *)&cmd_config_tunnel_udp_port_tunnel_type, 9421 (void *)&cmd_config_tunnel_udp_port_value, 9422 NULL, 9423 }, 9424 }; 9425 9426 /* *** CONFIGURE VM MIRROR VLAN/POOL RULE *** */ 9427 struct cmd_set_mirror_mask_result { 9428 cmdline_fixed_string_t set; 9429 cmdline_fixed_string_t port; 9430 portid_t port_id; 9431 cmdline_fixed_string_t mirror; 9432 uint8_t rule_id; 9433 cmdline_fixed_string_t what; 9434 cmdline_fixed_string_t value; 9435 cmdline_fixed_string_t dstpool; 9436 uint8_t dstpool_id; 9437 cmdline_fixed_string_t on; 9438 }; 9439 9440 cmdline_parse_token_string_t cmd_mirror_mask_set = 9441 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result, 9442 set, "set"); 9443 cmdline_parse_token_string_t cmd_mirror_mask_port = 9444 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result, 9445 port, "port"); 9446 cmdline_parse_token_num_t cmd_mirror_mask_portid = 9447 TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_mask_result, 9448 port_id, RTE_UINT16); 9449 cmdline_parse_token_string_t cmd_mirror_mask_mirror = 9450 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result, 9451 mirror, "mirror-rule"); 9452 cmdline_parse_token_num_t cmd_mirror_mask_ruleid = 9453 TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_mask_result, 9454 rule_id, RTE_UINT8); 9455 cmdline_parse_token_string_t cmd_mirror_mask_what = 9456 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result, 9457 what, "pool-mirror-up#pool-mirror-down" 9458 "#vlan-mirror"); 9459 cmdline_parse_token_string_t cmd_mirror_mask_value = 9460 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result, 9461 value, NULL); 9462 cmdline_parse_token_string_t cmd_mirror_mask_dstpool = 9463 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result, 9464 dstpool, "dst-pool"); 9465 cmdline_parse_token_num_t cmd_mirror_mask_poolid = 9466 TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_mask_result, 9467 dstpool_id, RTE_UINT8); 9468 cmdline_parse_token_string_t cmd_mirror_mask_on = 9469 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_mask_result, 9470 on, "on#off"); 9471 9472 static void 9473 cmd_set_mirror_mask_parsed(void *parsed_result, 9474 __rte_unused struct cmdline *cl, 9475 __rte_unused void *data) 9476 { 9477 int ret,nb_item,i; 9478 struct cmd_set_mirror_mask_result *res = parsed_result; 9479 struct rte_eth_mirror_conf mr_conf; 9480 9481 memset(&mr_conf, 0, sizeof(struct rte_eth_mirror_conf)); 9482 9483 unsigned int vlan_list[ETH_MIRROR_MAX_VLANS]; 9484 9485 mr_conf.dst_pool = res->dstpool_id; 9486 9487 if (!strcmp(res->what, "pool-mirror-up")) { 9488 mr_conf.pool_mask = strtoull(res->value, NULL, 16); 9489 mr_conf.rule_type = ETH_MIRROR_VIRTUAL_POOL_UP; 9490 } else if (!strcmp(res->what, "pool-mirror-down")) { 9491 mr_conf.pool_mask = strtoull(res->value, NULL, 16); 9492 mr_conf.rule_type = ETH_MIRROR_VIRTUAL_POOL_DOWN; 9493 } else if (!strcmp(res->what, "vlan-mirror")) { 9494 mr_conf.rule_type = ETH_MIRROR_VLAN; 9495 nb_item = parse_item_list(res->value, "vlan", 9496 ETH_MIRROR_MAX_VLANS, vlan_list, 1); 9497 if (nb_item <= 0) 9498 return; 9499 9500 for (i = 0; i < nb_item; i++) { 9501 if (vlan_list[i] > RTE_ETHER_MAX_VLAN_ID) { 9502 printf("Invalid vlan_id: must be < 4096\n"); 9503 return; 9504 } 9505 9506 mr_conf.vlan.vlan_id[i] = (uint16_t)vlan_list[i]; 9507 mr_conf.vlan.vlan_mask |= 1ULL << i; 9508 } 9509 } 9510 9511 if (!strcmp(res->on, "on")) 9512 ret = rte_eth_mirror_rule_set(res->port_id, &mr_conf, 9513 res->rule_id, 1); 9514 else 9515 ret = rte_eth_mirror_rule_set(res->port_id, &mr_conf, 9516 res->rule_id, 0); 9517 if (ret < 0) 9518 printf("mirror rule add error: (%s)\n", strerror(-ret)); 9519 } 9520 9521 cmdline_parse_inst_t cmd_set_mirror_mask = { 9522 .f = cmd_set_mirror_mask_parsed, 9523 .data = NULL, 9524 .help_str = "set port <port_id> mirror-rule <rule_id> " 9525 "pool-mirror-up|pool-mirror-down|vlan-mirror " 9526 "<pool_mask|vlan_id[,vlan_id]*> dst-pool <pool_id> on|off", 9527 .tokens = { 9528 (void *)&cmd_mirror_mask_set, 9529 (void *)&cmd_mirror_mask_port, 9530 (void *)&cmd_mirror_mask_portid, 9531 (void *)&cmd_mirror_mask_mirror, 9532 (void *)&cmd_mirror_mask_ruleid, 9533 (void *)&cmd_mirror_mask_what, 9534 (void *)&cmd_mirror_mask_value, 9535 (void *)&cmd_mirror_mask_dstpool, 9536 (void *)&cmd_mirror_mask_poolid, 9537 (void *)&cmd_mirror_mask_on, 9538 NULL, 9539 }, 9540 }; 9541 9542 /* *** CONFIGURE VM MIRROR UPLINK/DOWNLINK RULE *** */ 9543 struct cmd_set_mirror_link_result { 9544 cmdline_fixed_string_t set; 9545 cmdline_fixed_string_t port; 9546 portid_t port_id; 9547 cmdline_fixed_string_t mirror; 9548 uint8_t rule_id; 9549 cmdline_fixed_string_t what; 9550 cmdline_fixed_string_t dstpool; 9551 uint8_t dstpool_id; 9552 cmdline_fixed_string_t on; 9553 }; 9554 9555 cmdline_parse_token_string_t cmd_mirror_link_set = 9556 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result, 9557 set, "set"); 9558 cmdline_parse_token_string_t cmd_mirror_link_port = 9559 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result, 9560 port, "port"); 9561 cmdline_parse_token_num_t cmd_mirror_link_portid = 9562 TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_link_result, 9563 port_id, RTE_UINT16); 9564 cmdline_parse_token_string_t cmd_mirror_link_mirror = 9565 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result, 9566 mirror, "mirror-rule"); 9567 cmdline_parse_token_num_t cmd_mirror_link_ruleid = 9568 TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_link_result, 9569 rule_id, RTE_UINT8); 9570 cmdline_parse_token_string_t cmd_mirror_link_what = 9571 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result, 9572 what, "uplink-mirror#downlink-mirror"); 9573 cmdline_parse_token_string_t cmd_mirror_link_dstpool = 9574 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result, 9575 dstpool, "dst-pool"); 9576 cmdline_parse_token_num_t cmd_mirror_link_poolid = 9577 TOKEN_NUM_INITIALIZER(struct cmd_set_mirror_link_result, 9578 dstpool_id, RTE_UINT8); 9579 cmdline_parse_token_string_t cmd_mirror_link_on = 9580 TOKEN_STRING_INITIALIZER(struct cmd_set_mirror_link_result, 9581 on, "on#off"); 9582 9583 static void 9584 cmd_set_mirror_link_parsed(void *parsed_result, 9585 __rte_unused struct cmdline *cl, 9586 __rte_unused void *data) 9587 { 9588 int ret; 9589 struct cmd_set_mirror_link_result *res = parsed_result; 9590 struct rte_eth_mirror_conf mr_conf; 9591 9592 memset(&mr_conf, 0, sizeof(struct rte_eth_mirror_conf)); 9593 if (!strcmp(res->what, "uplink-mirror")) 9594 mr_conf.rule_type = ETH_MIRROR_UPLINK_PORT; 9595 else 9596 mr_conf.rule_type = ETH_MIRROR_DOWNLINK_PORT; 9597 9598 mr_conf.dst_pool = res->dstpool_id; 9599 9600 if (!strcmp(res->on, "on")) 9601 ret = rte_eth_mirror_rule_set(res->port_id, &mr_conf, 9602 res->rule_id, 1); 9603 else 9604 ret = rte_eth_mirror_rule_set(res->port_id, &mr_conf, 9605 res->rule_id, 0); 9606 9607 /* check the return value and print it if is < 0 */ 9608 if (ret < 0) 9609 printf("mirror rule add error: (%s)\n", strerror(-ret)); 9610 9611 } 9612 9613 cmdline_parse_inst_t cmd_set_mirror_link = { 9614 .f = cmd_set_mirror_link_parsed, 9615 .data = NULL, 9616 .help_str = "set port <port_id> mirror-rule <rule_id> " 9617 "uplink-mirror|downlink-mirror dst-pool <pool_id> on|off", 9618 .tokens = { 9619 (void *)&cmd_mirror_link_set, 9620 (void *)&cmd_mirror_link_port, 9621 (void *)&cmd_mirror_link_portid, 9622 (void *)&cmd_mirror_link_mirror, 9623 (void *)&cmd_mirror_link_ruleid, 9624 (void *)&cmd_mirror_link_what, 9625 (void *)&cmd_mirror_link_dstpool, 9626 (void *)&cmd_mirror_link_poolid, 9627 (void *)&cmd_mirror_link_on, 9628 NULL, 9629 }, 9630 }; 9631 9632 /* *** RESET VM MIRROR RULE *** */ 9633 struct cmd_rm_mirror_rule_result { 9634 cmdline_fixed_string_t reset; 9635 cmdline_fixed_string_t port; 9636 portid_t port_id; 9637 cmdline_fixed_string_t mirror; 9638 uint8_t rule_id; 9639 }; 9640 9641 cmdline_parse_token_string_t cmd_rm_mirror_rule_reset = 9642 TOKEN_STRING_INITIALIZER(struct cmd_rm_mirror_rule_result, 9643 reset, "reset"); 9644 cmdline_parse_token_string_t cmd_rm_mirror_rule_port = 9645 TOKEN_STRING_INITIALIZER(struct cmd_rm_mirror_rule_result, 9646 port, "port"); 9647 cmdline_parse_token_num_t cmd_rm_mirror_rule_portid = 9648 TOKEN_NUM_INITIALIZER(struct cmd_rm_mirror_rule_result, 9649 port_id, RTE_UINT16); 9650 cmdline_parse_token_string_t cmd_rm_mirror_rule_mirror = 9651 TOKEN_STRING_INITIALIZER(struct cmd_rm_mirror_rule_result, 9652 mirror, "mirror-rule"); 9653 cmdline_parse_token_num_t cmd_rm_mirror_rule_ruleid = 9654 TOKEN_NUM_INITIALIZER(struct cmd_rm_mirror_rule_result, 9655 rule_id, RTE_UINT8); 9656 9657 static void 9658 cmd_reset_mirror_rule_parsed(void *parsed_result, 9659 __rte_unused struct cmdline *cl, 9660 __rte_unused void *data) 9661 { 9662 int ret; 9663 struct cmd_set_mirror_link_result *res = parsed_result; 9664 /* check rule_id */ 9665 ret = rte_eth_mirror_rule_reset(res->port_id,res->rule_id); 9666 if(ret < 0) 9667 printf("mirror rule remove error: (%s)\n", strerror(-ret)); 9668 } 9669 9670 cmdline_parse_inst_t cmd_reset_mirror_rule = { 9671 .f = cmd_reset_mirror_rule_parsed, 9672 .data = NULL, 9673 .help_str = "reset port <port_id> mirror-rule <rule_id>", 9674 .tokens = { 9675 (void *)&cmd_rm_mirror_rule_reset, 9676 (void *)&cmd_rm_mirror_rule_port, 9677 (void *)&cmd_rm_mirror_rule_portid, 9678 (void *)&cmd_rm_mirror_rule_mirror, 9679 (void *)&cmd_rm_mirror_rule_ruleid, 9680 NULL, 9681 }, 9682 }; 9683 9684 /* ******************************************************************************** */ 9685 9686 struct cmd_dump_result { 9687 cmdline_fixed_string_t dump; 9688 }; 9689 9690 static void 9691 dump_struct_sizes(void) 9692 { 9693 #define DUMP_SIZE(t) printf("sizeof(" #t ") = %u\n", (unsigned)sizeof(t)); 9694 DUMP_SIZE(struct rte_mbuf); 9695 DUMP_SIZE(struct rte_mempool); 9696 DUMP_SIZE(struct rte_ring); 9697 #undef DUMP_SIZE 9698 } 9699 9700 9701 /* Dump the socket memory statistics on console */ 9702 static void 9703 dump_socket_mem(FILE *f) 9704 { 9705 struct rte_malloc_socket_stats socket_stats; 9706 unsigned int i; 9707 size_t total = 0; 9708 size_t alloc = 0; 9709 size_t free = 0; 9710 unsigned int n_alloc = 0; 9711 unsigned int n_free = 0; 9712 static size_t last_allocs; 9713 static size_t last_total; 9714 9715 9716 for (i = 0; i < RTE_MAX_NUMA_NODES; i++) { 9717 if (rte_malloc_get_socket_stats(i, &socket_stats) || 9718 !socket_stats.heap_totalsz_bytes) 9719 continue; 9720 total += socket_stats.heap_totalsz_bytes; 9721 alloc += socket_stats.heap_allocsz_bytes; 9722 free += socket_stats.heap_freesz_bytes; 9723 n_alloc += socket_stats.alloc_count; 9724 n_free += socket_stats.free_count; 9725 fprintf(f, 9726 "Socket %u: size(M) total: %.6lf alloc: %.6lf(%.3lf%%) free: %.6lf \tcount alloc: %-4u free: %u\n", 9727 i, 9728 (double)socket_stats.heap_totalsz_bytes / (1024 * 1024), 9729 (double)socket_stats.heap_allocsz_bytes / (1024 * 1024), 9730 (double)socket_stats.heap_allocsz_bytes * 100 / 9731 (double)socket_stats.heap_totalsz_bytes, 9732 (double)socket_stats.heap_freesz_bytes / (1024 * 1024), 9733 socket_stats.alloc_count, 9734 socket_stats.free_count); 9735 } 9736 fprintf(f, 9737 "Total : size(M) total: %.6lf alloc: %.6lf(%.3lf%%) free: %.6lf \tcount alloc: %-4u free: %u\n", 9738 (double)total / (1024 * 1024), (double)alloc / (1024 * 1024), 9739 total ? ((double)alloc * 100 / (double)total) : 0, 9740 (double)free / (1024 * 1024), 9741 n_alloc, n_free); 9742 if (last_allocs) 9743 fprintf(stdout, "Memory total change: %.6lf(M), allocation change: %.6lf(M)\n", 9744 ((double)total - (double)last_total) / (1024 * 1024), 9745 (double)(alloc - (double)last_allocs) / 1024 / 1024); 9746 last_allocs = alloc; 9747 last_total = total; 9748 } 9749 9750 static void cmd_dump_parsed(void *parsed_result, 9751 __rte_unused struct cmdline *cl, 9752 __rte_unused void *data) 9753 { 9754 struct cmd_dump_result *res = parsed_result; 9755 9756 if (!strcmp(res->dump, "dump_physmem")) 9757 rte_dump_physmem_layout(stdout); 9758 else if (!strcmp(res->dump, "dump_socket_mem")) 9759 dump_socket_mem(stdout); 9760 else if (!strcmp(res->dump, "dump_memzone")) 9761 rte_memzone_dump(stdout); 9762 else if (!strcmp(res->dump, "dump_struct_sizes")) 9763 dump_struct_sizes(); 9764 else if (!strcmp(res->dump, "dump_ring")) 9765 rte_ring_list_dump(stdout); 9766 else if (!strcmp(res->dump, "dump_mempool")) 9767 rte_mempool_list_dump(stdout); 9768 else if (!strcmp(res->dump, "dump_devargs")) 9769 rte_devargs_dump(stdout); 9770 else if (!strcmp(res->dump, "dump_log_types")) 9771 rte_log_dump(stdout); 9772 } 9773 9774 cmdline_parse_token_string_t cmd_dump_dump = 9775 TOKEN_STRING_INITIALIZER(struct cmd_dump_result, dump, 9776 "dump_physmem#" 9777 "dump_memzone#" 9778 "dump_socket_mem#" 9779 "dump_struct_sizes#" 9780 "dump_ring#" 9781 "dump_mempool#" 9782 "dump_devargs#" 9783 "dump_log_types"); 9784 9785 cmdline_parse_inst_t cmd_dump = { 9786 .f = cmd_dump_parsed, /* function to call */ 9787 .data = NULL, /* 2nd arg of func */ 9788 .help_str = "Dump status", 9789 .tokens = { /* token list, NULL terminated */ 9790 (void *)&cmd_dump_dump, 9791 NULL, 9792 }, 9793 }; 9794 9795 /* ******************************************************************************** */ 9796 9797 struct cmd_dump_one_result { 9798 cmdline_fixed_string_t dump; 9799 cmdline_fixed_string_t name; 9800 }; 9801 9802 static void cmd_dump_one_parsed(void *parsed_result, struct cmdline *cl, 9803 __rte_unused void *data) 9804 { 9805 struct cmd_dump_one_result *res = parsed_result; 9806 9807 if (!strcmp(res->dump, "dump_ring")) { 9808 struct rte_ring *r; 9809 r = rte_ring_lookup(res->name); 9810 if (r == NULL) { 9811 cmdline_printf(cl, "Cannot find ring\n"); 9812 return; 9813 } 9814 rte_ring_dump(stdout, r); 9815 } else if (!strcmp(res->dump, "dump_mempool")) { 9816 struct rte_mempool *mp; 9817 mp = rte_mempool_lookup(res->name); 9818 if (mp == NULL) { 9819 cmdline_printf(cl, "Cannot find mempool\n"); 9820 return; 9821 } 9822 rte_mempool_dump(stdout, mp); 9823 } 9824 } 9825 9826 cmdline_parse_token_string_t cmd_dump_one_dump = 9827 TOKEN_STRING_INITIALIZER(struct cmd_dump_one_result, dump, 9828 "dump_ring#dump_mempool"); 9829 9830 cmdline_parse_token_string_t cmd_dump_one_name = 9831 TOKEN_STRING_INITIALIZER(struct cmd_dump_one_result, name, NULL); 9832 9833 cmdline_parse_inst_t cmd_dump_one = { 9834 .f = cmd_dump_one_parsed, /* function to call */ 9835 .data = NULL, /* 2nd arg of func */ 9836 .help_str = "dump_ring|dump_mempool <name>: Dump one ring/mempool", 9837 .tokens = { /* token list, NULL terminated */ 9838 (void *)&cmd_dump_one_dump, 9839 (void *)&cmd_dump_one_name, 9840 NULL, 9841 }, 9842 }; 9843 9844 /* *** queue region set *** */ 9845 struct cmd_queue_region_result { 9846 cmdline_fixed_string_t set; 9847 cmdline_fixed_string_t port; 9848 portid_t port_id; 9849 cmdline_fixed_string_t cmd; 9850 cmdline_fixed_string_t region; 9851 uint8_t region_id; 9852 cmdline_fixed_string_t queue_start_index; 9853 uint8_t queue_id; 9854 cmdline_fixed_string_t queue_num; 9855 uint8_t queue_num_value; 9856 }; 9857 9858 static void 9859 cmd_queue_region_parsed(void *parsed_result, 9860 __rte_unused struct cmdline *cl, 9861 __rte_unused void *data) 9862 { 9863 struct cmd_queue_region_result *res = parsed_result; 9864 int ret = -ENOTSUP; 9865 #ifdef RTE_NET_I40E 9866 struct rte_pmd_i40e_queue_region_conf region_conf; 9867 enum rte_pmd_i40e_queue_region_op op_type; 9868 #endif 9869 9870 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 9871 return; 9872 9873 #ifdef RTE_NET_I40E 9874 memset(®ion_conf, 0, sizeof(region_conf)); 9875 op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_SET; 9876 region_conf.region_id = res->region_id; 9877 region_conf.queue_num = res->queue_num_value; 9878 region_conf.queue_start_index = res->queue_id; 9879 9880 ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id, 9881 op_type, ®ion_conf); 9882 #endif 9883 9884 switch (ret) { 9885 case 0: 9886 break; 9887 case -ENOTSUP: 9888 printf("function not implemented or supported\n"); 9889 break; 9890 default: 9891 printf("queue region config error: (%s)\n", strerror(-ret)); 9892 } 9893 } 9894 9895 cmdline_parse_token_string_t cmd_queue_region_set = 9896 TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result, 9897 set, "set"); 9898 cmdline_parse_token_string_t cmd_queue_region_port = 9899 TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result, port, "port"); 9900 cmdline_parse_token_num_t cmd_queue_region_port_id = 9901 TOKEN_NUM_INITIALIZER(struct cmd_queue_region_result, 9902 port_id, RTE_UINT16); 9903 cmdline_parse_token_string_t cmd_queue_region_cmd = 9904 TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result, 9905 cmd, "queue-region"); 9906 cmdline_parse_token_string_t cmd_queue_region_id = 9907 TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result, 9908 region, "region_id"); 9909 cmdline_parse_token_num_t cmd_queue_region_index = 9910 TOKEN_NUM_INITIALIZER(struct cmd_queue_region_result, 9911 region_id, RTE_UINT8); 9912 cmdline_parse_token_string_t cmd_queue_region_queue_start_index = 9913 TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result, 9914 queue_start_index, "queue_start_index"); 9915 cmdline_parse_token_num_t cmd_queue_region_queue_id = 9916 TOKEN_NUM_INITIALIZER(struct cmd_queue_region_result, 9917 queue_id, RTE_UINT8); 9918 cmdline_parse_token_string_t cmd_queue_region_queue_num = 9919 TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result, 9920 queue_num, "queue_num"); 9921 cmdline_parse_token_num_t cmd_queue_region_queue_num_value = 9922 TOKEN_NUM_INITIALIZER(struct cmd_queue_region_result, 9923 queue_num_value, RTE_UINT8); 9924 9925 cmdline_parse_inst_t cmd_queue_region = { 9926 .f = cmd_queue_region_parsed, 9927 .data = NULL, 9928 .help_str = "set port <port_id> queue-region region_id <value> " 9929 "queue_start_index <value> queue_num <value>: Set a queue region", 9930 .tokens = { 9931 (void *)&cmd_queue_region_set, 9932 (void *)&cmd_queue_region_port, 9933 (void *)&cmd_queue_region_port_id, 9934 (void *)&cmd_queue_region_cmd, 9935 (void *)&cmd_queue_region_id, 9936 (void *)&cmd_queue_region_index, 9937 (void *)&cmd_queue_region_queue_start_index, 9938 (void *)&cmd_queue_region_queue_id, 9939 (void *)&cmd_queue_region_queue_num, 9940 (void *)&cmd_queue_region_queue_num_value, 9941 NULL, 9942 }, 9943 }; 9944 9945 /* *** queue region and flowtype set *** */ 9946 struct cmd_region_flowtype_result { 9947 cmdline_fixed_string_t set; 9948 cmdline_fixed_string_t port; 9949 portid_t port_id; 9950 cmdline_fixed_string_t cmd; 9951 cmdline_fixed_string_t region; 9952 uint8_t region_id; 9953 cmdline_fixed_string_t flowtype; 9954 uint8_t flowtype_id; 9955 }; 9956 9957 static void 9958 cmd_region_flowtype_parsed(void *parsed_result, 9959 __rte_unused struct cmdline *cl, 9960 __rte_unused void *data) 9961 { 9962 struct cmd_region_flowtype_result *res = parsed_result; 9963 int ret = -ENOTSUP; 9964 #ifdef RTE_NET_I40E 9965 struct rte_pmd_i40e_queue_region_conf region_conf; 9966 enum rte_pmd_i40e_queue_region_op op_type; 9967 #endif 9968 9969 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 9970 return; 9971 9972 #ifdef RTE_NET_I40E 9973 memset(®ion_conf, 0, sizeof(region_conf)); 9974 9975 op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_FLOWTYPE_SET; 9976 region_conf.region_id = res->region_id; 9977 region_conf.hw_flowtype = res->flowtype_id; 9978 9979 ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id, 9980 op_type, ®ion_conf); 9981 #endif 9982 9983 switch (ret) { 9984 case 0: 9985 break; 9986 case -ENOTSUP: 9987 printf("function not implemented or supported\n"); 9988 break; 9989 default: 9990 printf("region flowtype config error: (%s)\n", strerror(-ret)); 9991 } 9992 } 9993 9994 cmdline_parse_token_string_t cmd_region_flowtype_set = 9995 TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result, 9996 set, "set"); 9997 cmdline_parse_token_string_t cmd_region_flowtype_port = 9998 TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result, 9999 port, "port"); 10000 cmdline_parse_token_num_t cmd_region_flowtype_port_index = 10001 TOKEN_NUM_INITIALIZER(struct cmd_region_flowtype_result, 10002 port_id, RTE_UINT16); 10003 cmdline_parse_token_string_t cmd_region_flowtype_cmd = 10004 TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result, 10005 cmd, "queue-region"); 10006 cmdline_parse_token_string_t cmd_region_flowtype_index = 10007 TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result, 10008 region, "region_id"); 10009 cmdline_parse_token_num_t cmd_region_flowtype_id = 10010 TOKEN_NUM_INITIALIZER(struct cmd_region_flowtype_result, 10011 region_id, RTE_UINT8); 10012 cmdline_parse_token_string_t cmd_region_flowtype_flow_index = 10013 TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result, 10014 flowtype, "flowtype"); 10015 cmdline_parse_token_num_t cmd_region_flowtype_flow_id = 10016 TOKEN_NUM_INITIALIZER(struct cmd_region_flowtype_result, 10017 flowtype_id, RTE_UINT8); 10018 cmdline_parse_inst_t cmd_region_flowtype = { 10019 .f = cmd_region_flowtype_parsed, 10020 .data = NULL, 10021 .help_str = "set port <port_id> queue-region region_id <value> " 10022 "flowtype <value>: Set a flowtype region index", 10023 .tokens = { 10024 (void *)&cmd_region_flowtype_set, 10025 (void *)&cmd_region_flowtype_port, 10026 (void *)&cmd_region_flowtype_port_index, 10027 (void *)&cmd_region_flowtype_cmd, 10028 (void *)&cmd_region_flowtype_index, 10029 (void *)&cmd_region_flowtype_id, 10030 (void *)&cmd_region_flowtype_flow_index, 10031 (void *)&cmd_region_flowtype_flow_id, 10032 NULL, 10033 }, 10034 }; 10035 10036 /* *** User Priority (UP) to queue region (region_id) set *** */ 10037 struct cmd_user_priority_region_result { 10038 cmdline_fixed_string_t set; 10039 cmdline_fixed_string_t port; 10040 portid_t port_id; 10041 cmdline_fixed_string_t cmd; 10042 cmdline_fixed_string_t user_priority; 10043 uint8_t user_priority_id; 10044 cmdline_fixed_string_t region; 10045 uint8_t region_id; 10046 }; 10047 10048 static void 10049 cmd_user_priority_region_parsed(void *parsed_result, 10050 __rte_unused struct cmdline *cl, 10051 __rte_unused void *data) 10052 { 10053 struct cmd_user_priority_region_result *res = parsed_result; 10054 int ret = -ENOTSUP; 10055 #ifdef RTE_NET_I40E 10056 struct rte_pmd_i40e_queue_region_conf region_conf; 10057 enum rte_pmd_i40e_queue_region_op op_type; 10058 #endif 10059 10060 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 10061 return; 10062 10063 #ifdef RTE_NET_I40E 10064 memset(®ion_conf, 0, sizeof(region_conf)); 10065 op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_USER_PRIORITY_SET; 10066 region_conf.user_priority = res->user_priority_id; 10067 region_conf.region_id = res->region_id; 10068 10069 ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id, 10070 op_type, ®ion_conf); 10071 #endif 10072 10073 switch (ret) { 10074 case 0: 10075 break; 10076 case -ENOTSUP: 10077 printf("function not implemented or supported\n"); 10078 break; 10079 default: 10080 printf("user_priority region config error: (%s)\n", 10081 strerror(-ret)); 10082 } 10083 } 10084 10085 cmdline_parse_token_string_t cmd_user_priority_region_set = 10086 TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result, 10087 set, "set"); 10088 cmdline_parse_token_string_t cmd_user_priority_region_port = 10089 TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result, 10090 port, "port"); 10091 cmdline_parse_token_num_t cmd_user_priority_region_port_index = 10092 TOKEN_NUM_INITIALIZER(struct cmd_user_priority_region_result, 10093 port_id, RTE_UINT16); 10094 cmdline_parse_token_string_t cmd_user_priority_region_cmd = 10095 TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result, 10096 cmd, "queue-region"); 10097 cmdline_parse_token_string_t cmd_user_priority_region_UP = 10098 TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result, 10099 user_priority, "UP"); 10100 cmdline_parse_token_num_t cmd_user_priority_region_UP_id = 10101 TOKEN_NUM_INITIALIZER(struct cmd_user_priority_region_result, 10102 user_priority_id, RTE_UINT8); 10103 cmdline_parse_token_string_t cmd_user_priority_region_region = 10104 TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result, 10105 region, "region_id"); 10106 cmdline_parse_token_num_t cmd_user_priority_region_region_id = 10107 TOKEN_NUM_INITIALIZER(struct cmd_user_priority_region_result, 10108 region_id, RTE_UINT8); 10109 10110 cmdline_parse_inst_t cmd_user_priority_region = { 10111 .f = cmd_user_priority_region_parsed, 10112 .data = NULL, 10113 .help_str = "set port <port_id> queue-region UP <value> " 10114 "region_id <value>: Set the mapping of User Priority (UP) " 10115 "to queue region (region_id) ", 10116 .tokens = { 10117 (void *)&cmd_user_priority_region_set, 10118 (void *)&cmd_user_priority_region_port, 10119 (void *)&cmd_user_priority_region_port_index, 10120 (void *)&cmd_user_priority_region_cmd, 10121 (void *)&cmd_user_priority_region_UP, 10122 (void *)&cmd_user_priority_region_UP_id, 10123 (void *)&cmd_user_priority_region_region, 10124 (void *)&cmd_user_priority_region_region_id, 10125 NULL, 10126 }, 10127 }; 10128 10129 /* *** flush all queue region related configuration *** */ 10130 struct cmd_flush_queue_region_result { 10131 cmdline_fixed_string_t set; 10132 cmdline_fixed_string_t port; 10133 portid_t port_id; 10134 cmdline_fixed_string_t cmd; 10135 cmdline_fixed_string_t flush; 10136 cmdline_fixed_string_t what; 10137 }; 10138 10139 static void 10140 cmd_flush_queue_region_parsed(void *parsed_result, 10141 __rte_unused struct cmdline *cl, 10142 __rte_unused void *data) 10143 { 10144 struct cmd_flush_queue_region_result *res = parsed_result; 10145 int ret = -ENOTSUP; 10146 #ifdef RTE_NET_I40E 10147 struct rte_pmd_i40e_queue_region_conf region_conf; 10148 enum rte_pmd_i40e_queue_region_op op_type; 10149 #endif 10150 10151 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 10152 return; 10153 10154 #ifdef RTE_NET_I40E 10155 memset(®ion_conf, 0, sizeof(region_conf)); 10156 10157 if (strcmp(res->what, "on") == 0) 10158 op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_ALL_FLUSH_ON; 10159 else 10160 op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_ALL_FLUSH_OFF; 10161 10162 ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id, 10163 op_type, ®ion_conf); 10164 #endif 10165 10166 switch (ret) { 10167 case 0: 10168 break; 10169 case -ENOTSUP: 10170 printf("function not implemented or supported\n"); 10171 break; 10172 default: 10173 printf("queue region config flush error: (%s)\n", 10174 strerror(-ret)); 10175 } 10176 } 10177 10178 cmdline_parse_token_string_t cmd_flush_queue_region_set = 10179 TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result, 10180 set, "set"); 10181 cmdline_parse_token_string_t cmd_flush_queue_region_port = 10182 TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result, 10183 port, "port"); 10184 cmdline_parse_token_num_t cmd_flush_queue_region_port_index = 10185 TOKEN_NUM_INITIALIZER(struct cmd_flush_queue_region_result, 10186 port_id, RTE_UINT16); 10187 cmdline_parse_token_string_t cmd_flush_queue_region_cmd = 10188 TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result, 10189 cmd, "queue-region"); 10190 cmdline_parse_token_string_t cmd_flush_queue_region_flush = 10191 TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result, 10192 flush, "flush"); 10193 cmdline_parse_token_string_t cmd_flush_queue_region_what = 10194 TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result, 10195 what, "on#off"); 10196 10197 cmdline_parse_inst_t cmd_flush_queue_region = { 10198 .f = cmd_flush_queue_region_parsed, 10199 .data = NULL, 10200 .help_str = "set port <port_id> queue-region flush on|off" 10201 ": flush all queue region related configuration", 10202 .tokens = { 10203 (void *)&cmd_flush_queue_region_set, 10204 (void *)&cmd_flush_queue_region_port, 10205 (void *)&cmd_flush_queue_region_port_index, 10206 (void *)&cmd_flush_queue_region_cmd, 10207 (void *)&cmd_flush_queue_region_flush, 10208 (void *)&cmd_flush_queue_region_what, 10209 NULL, 10210 }, 10211 }; 10212 10213 /* *** get all queue region related configuration info *** */ 10214 struct cmd_show_queue_region_info { 10215 cmdline_fixed_string_t show; 10216 cmdline_fixed_string_t port; 10217 portid_t port_id; 10218 cmdline_fixed_string_t cmd; 10219 }; 10220 10221 static void 10222 cmd_show_queue_region_info_parsed(void *parsed_result, 10223 __rte_unused struct cmdline *cl, 10224 __rte_unused void *data) 10225 { 10226 struct cmd_show_queue_region_info *res = parsed_result; 10227 int ret = -ENOTSUP; 10228 #ifdef RTE_NET_I40E 10229 struct rte_pmd_i40e_queue_regions rte_pmd_regions; 10230 enum rte_pmd_i40e_queue_region_op op_type; 10231 #endif 10232 10233 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 10234 return; 10235 10236 #ifdef RTE_NET_I40E 10237 memset(&rte_pmd_regions, 0, sizeof(rte_pmd_regions)); 10238 10239 op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_INFO_GET; 10240 10241 ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id, 10242 op_type, &rte_pmd_regions); 10243 10244 port_queue_region_info_display(res->port_id, &rte_pmd_regions); 10245 #endif 10246 10247 switch (ret) { 10248 case 0: 10249 break; 10250 case -ENOTSUP: 10251 printf("function not implemented or supported\n"); 10252 break; 10253 default: 10254 printf("queue region config info show error: (%s)\n", 10255 strerror(-ret)); 10256 } 10257 } 10258 10259 cmdline_parse_token_string_t cmd_show_queue_region_info_get = 10260 TOKEN_STRING_INITIALIZER(struct cmd_show_queue_region_info, 10261 show, "show"); 10262 cmdline_parse_token_string_t cmd_show_queue_region_info_port = 10263 TOKEN_STRING_INITIALIZER(struct cmd_show_queue_region_info, 10264 port, "port"); 10265 cmdline_parse_token_num_t cmd_show_queue_region_info_port_index = 10266 TOKEN_NUM_INITIALIZER(struct cmd_show_queue_region_info, 10267 port_id, RTE_UINT16); 10268 cmdline_parse_token_string_t cmd_show_queue_region_info_cmd = 10269 TOKEN_STRING_INITIALIZER(struct cmd_show_queue_region_info, 10270 cmd, "queue-region"); 10271 10272 cmdline_parse_inst_t cmd_show_queue_region_info_all = { 10273 .f = cmd_show_queue_region_info_parsed, 10274 .data = NULL, 10275 .help_str = "show port <port_id> queue-region" 10276 ": show all queue region related configuration info", 10277 .tokens = { 10278 (void *)&cmd_show_queue_region_info_get, 10279 (void *)&cmd_show_queue_region_info_port, 10280 (void *)&cmd_show_queue_region_info_port_index, 10281 (void *)&cmd_show_queue_region_info_cmd, 10282 NULL, 10283 }, 10284 }; 10285 10286 /* *** Filters Control *** */ 10287 10288 #define IPV4_ADDR_TO_UINT(ip_addr, ip) \ 10289 do { \ 10290 if ((ip_addr).family == AF_INET) \ 10291 (ip) = (ip_addr).addr.ipv4.s_addr; \ 10292 else { \ 10293 printf("invalid parameter.\n"); \ 10294 return; \ 10295 } \ 10296 } while (0) 10297 10298 #define IPV6_ADDR_TO_ARRAY(ip_addr, ip) \ 10299 do { \ 10300 if ((ip_addr).family == AF_INET6) \ 10301 rte_memcpy(&(ip), \ 10302 &((ip_addr).addr.ipv6), \ 10303 sizeof(struct in6_addr)); \ 10304 else { \ 10305 printf("invalid parameter.\n"); \ 10306 return; \ 10307 } \ 10308 } while (0) 10309 10310 #ifdef RTE_NET_I40E 10311 10312 static uint16_t 10313 str2flowtype(char *string) 10314 { 10315 uint8_t i = 0; 10316 static const struct { 10317 char str[32]; 10318 uint16_t type; 10319 } flowtype_str[] = { 10320 {"raw", RTE_ETH_FLOW_RAW}, 10321 {"ipv4", RTE_ETH_FLOW_IPV4}, 10322 {"ipv4-frag", RTE_ETH_FLOW_FRAG_IPV4}, 10323 {"ipv4-tcp", RTE_ETH_FLOW_NONFRAG_IPV4_TCP}, 10324 {"ipv4-udp", RTE_ETH_FLOW_NONFRAG_IPV4_UDP}, 10325 {"ipv4-sctp", RTE_ETH_FLOW_NONFRAG_IPV4_SCTP}, 10326 {"ipv4-other", RTE_ETH_FLOW_NONFRAG_IPV4_OTHER}, 10327 {"ipv6", RTE_ETH_FLOW_IPV6}, 10328 {"ipv6-frag", RTE_ETH_FLOW_FRAG_IPV6}, 10329 {"ipv6-tcp", RTE_ETH_FLOW_NONFRAG_IPV6_TCP}, 10330 {"ipv6-udp", RTE_ETH_FLOW_NONFRAG_IPV6_UDP}, 10331 {"ipv6-sctp", RTE_ETH_FLOW_NONFRAG_IPV6_SCTP}, 10332 {"ipv6-other", RTE_ETH_FLOW_NONFRAG_IPV6_OTHER}, 10333 {"l2_payload", RTE_ETH_FLOW_L2_PAYLOAD}, 10334 }; 10335 10336 for (i = 0; i < RTE_DIM(flowtype_str); i++) { 10337 if (!strcmp(flowtype_str[i].str, string)) 10338 return flowtype_str[i].type; 10339 } 10340 10341 if (isdigit(string[0]) && atoi(string) > 0 && atoi(string) < 64) 10342 return (uint16_t)atoi(string); 10343 10344 return RTE_ETH_FLOW_UNKNOWN; 10345 } 10346 10347 /* *** deal with flow director filter *** */ 10348 struct cmd_flow_director_result { 10349 cmdline_fixed_string_t flow_director_filter; 10350 portid_t port_id; 10351 cmdline_fixed_string_t mode; 10352 cmdline_fixed_string_t mode_value; 10353 cmdline_fixed_string_t ops; 10354 cmdline_fixed_string_t flow; 10355 cmdline_fixed_string_t flow_type; 10356 cmdline_fixed_string_t drop; 10357 cmdline_fixed_string_t queue; 10358 uint16_t queue_id; 10359 cmdline_fixed_string_t fd_id; 10360 uint32_t fd_id_value; 10361 cmdline_fixed_string_t packet; 10362 char filepath[]; 10363 }; 10364 10365 static void 10366 cmd_flow_director_filter_parsed(void *parsed_result, 10367 __rte_unused struct cmdline *cl, 10368 __rte_unused void *data) 10369 { 10370 struct cmd_flow_director_result *res = parsed_result; 10371 int ret = 0; 10372 struct rte_pmd_i40e_flow_type_mapping 10373 mapping[RTE_PMD_I40E_FLOW_TYPE_MAX]; 10374 struct rte_pmd_i40e_pkt_template_conf conf; 10375 uint16_t flow_type = str2flowtype(res->flow_type); 10376 uint16_t i, port = res->port_id; 10377 uint8_t add; 10378 10379 memset(&conf, 0, sizeof(conf)); 10380 10381 if (flow_type == RTE_ETH_FLOW_UNKNOWN) { 10382 printf("Invalid flow type specified.\n"); 10383 return; 10384 } 10385 ret = rte_pmd_i40e_flow_type_mapping_get(res->port_id, 10386 mapping); 10387 if (ret) 10388 return; 10389 if (mapping[flow_type].pctype == 0ULL) { 10390 printf("Invalid flow type specified.\n"); 10391 return; 10392 } 10393 for (i = 0; i < RTE_PMD_I40E_PCTYPE_MAX; i++) { 10394 if (mapping[flow_type].pctype & (1ULL << i)) { 10395 conf.input.pctype = i; 10396 break; 10397 } 10398 } 10399 10400 conf.input.packet = open_file(res->filepath, 10401 &conf.input.length); 10402 if (!conf.input.packet) 10403 return; 10404 if (!strcmp(res->drop, "drop")) 10405 conf.action.behavior = 10406 RTE_PMD_I40E_PKT_TEMPLATE_REJECT; 10407 else 10408 conf.action.behavior = 10409 RTE_PMD_I40E_PKT_TEMPLATE_ACCEPT; 10410 conf.action.report_status = 10411 RTE_PMD_I40E_PKT_TEMPLATE_REPORT_ID; 10412 conf.action.rx_queue = res->queue_id; 10413 conf.soft_id = res->fd_id_value; 10414 add = strcmp(res->ops, "del") ? 1 : 0; 10415 ret = rte_pmd_i40e_flow_add_del_packet_template(port, 10416 &conf, 10417 add); 10418 if (ret < 0) 10419 printf("flow director config error: (%s)\n", 10420 strerror(-ret)); 10421 close_file(conf.input.packet); 10422 } 10423 10424 cmdline_parse_token_string_t cmd_flow_director_filter = 10425 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 10426 flow_director_filter, "flow_director_filter"); 10427 cmdline_parse_token_num_t cmd_flow_director_port_id = 10428 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, 10429 port_id, RTE_UINT16); 10430 cmdline_parse_token_string_t cmd_flow_director_ops = 10431 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 10432 ops, "add#del#update"); 10433 cmdline_parse_token_string_t cmd_flow_director_flow = 10434 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 10435 flow, "flow"); 10436 cmdline_parse_token_string_t cmd_flow_director_flow_type = 10437 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 10438 flow_type, NULL); 10439 cmdline_parse_token_string_t cmd_flow_director_drop = 10440 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 10441 drop, "drop#fwd"); 10442 cmdline_parse_token_string_t cmd_flow_director_queue = 10443 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 10444 queue, "queue"); 10445 cmdline_parse_token_num_t cmd_flow_director_queue_id = 10446 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, 10447 queue_id, RTE_UINT16); 10448 cmdline_parse_token_string_t cmd_flow_director_fd_id = 10449 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 10450 fd_id, "fd_id"); 10451 cmdline_parse_token_num_t cmd_flow_director_fd_id_value = 10452 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, 10453 fd_id_value, RTE_UINT32); 10454 10455 cmdline_parse_token_string_t cmd_flow_director_mode = 10456 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 10457 mode, "mode"); 10458 cmdline_parse_token_string_t cmd_flow_director_mode_raw = 10459 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 10460 mode_value, "raw"); 10461 cmdline_parse_token_string_t cmd_flow_director_packet = 10462 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 10463 packet, "packet"); 10464 cmdline_parse_token_string_t cmd_flow_director_filepath = 10465 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, 10466 filepath, NULL); 10467 10468 cmdline_parse_inst_t cmd_add_del_raw_flow_director = { 10469 .f = cmd_flow_director_filter_parsed, 10470 .data = NULL, 10471 .help_str = "flow_director_filter ... : Add or delete a raw flow " 10472 "director entry on NIC", 10473 .tokens = { 10474 (void *)&cmd_flow_director_filter, 10475 (void *)&cmd_flow_director_port_id, 10476 (void *)&cmd_flow_director_mode, 10477 (void *)&cmd_flow_director_mode_raw, 10478 (void *)&cmd_flow_director_ops, 10479 (void *)&cmd_flow_director_flow, 10480 (void *)&cmd_flow_director_flow_type, 10481 (void *)&cmd_flow_director_drop, 10482 (void *)&cmd_flow_director_queue, 10483 (void *)&cmd_flow_director_queue_id, 10484 (void *)&cmd_flow_director_fd_id, 10485 (void *)&cmd_flow_director_fd_id_value, 10486 (void *)&cmd_flow_director_packet, 10487 (void *)&cmd_flow_director_filepath, 10488 NULL, 10489 }, 10490 }; 10491 10492 #endif /* RTE_NET_I40E */ 10493 10494 /* *** deal with flow director mask *** */ 10495 struct cmd_flow_director_mask_result { 10496 cmdline_fixed_string_t flow_director_mask; 10497 portid_t port_id; 10498 cmdline_fixed_string_t mode; 10499 cmdline_fixed_string_t mode_value; 10500 cmdline_fixed_string_t vlan; 10501 uint16_t vlan_mask; 10502 cmdline_fixed_string_t src_mask; 10503 cmdline_ipaddr_t ipv4_src; 10504 cmdline_ipaddr_t ipv6_src; 10505 uint16_t port_src; 10506 cmdline_fixed_string_t dst_mask; 10507 cmdline_ipaddr_t ipv4_dst; 10508 cmdline_ipaddr_t ipv6_dst; 10509 uint16_t port_dst; 10510 cmdline_fixed_string_t mac; 10511 uint8_t mac_addr_byte_mask; 10512 cmdline_fixed_string_t tunnel_id; 10513 uint32_t tunnel_id_mask; 10514 cmdline_fixed_string_t tunnel_type; 10515 uint8_t tunnel_type_mask; 10516 }; 10517 10518 static void 10519 cmd_flow_director_mask_parsed(void *parsed_result, 10520 __rte_unused struct cmdline *cl, 10521 __rte_unused void *data) 10522 { 10523 struct cmd_flow_director_mask_result *res = parsed_result; 10524 struct rte_eth_fdir_masks *mask; 10525 struct rte_port *port; 10526 10527 port = &ports[res->port_id]; 10528 /** Check if the port is not started **/ 10529 if (port->port_status != RTE_PORT_STOPPED) { 10530 printf("Please stop port %d first\n", res->port_id); 10531 return; 10532 } 10533 10534 mask = &port->dev_conf.fdir_conf.mask; 10535 10536 if (fdir_conf.mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN) { 10537 if (strcmp(res->mode_value, "MAC-VLAN")) { 10538 printf("Please set mode to MAC-VLAN.\n"); 10539 return; 10540 } 10541 10542 mask->vlan_tci_mask = rte_cpu_to_be_16(res->vlan_mask); 10543 } else if (fdir_conf.mode == RTE_FDIR_MODE_PERFECT_TUNNEL) { 10544 if (strcmp(res->mode_value, "Tunnel")) { 10545 printf("Please set mode to Tunnel.\n"); 10546 return; 10547 } 10548 10549 mask->vlan_tci_mask = rte_cpu_to_be_16(res->vlan_mask); 10550 mask->mac_addr_byte_mask = res->mac_addr_byte_mask; 10551 mask->tunnel_id_mask = rte_cpu_to_be_32(res->tunnel_id_mask); 10552 mask->tunnel_type_mask = res->tunnel_type_mask; 10553 } else { 10554 if (strcmp(res->mode_value, "IP")) { 10555 printf("Please set mode to IP.\n"); 10556 return; 10557 } 10558 10559 mask->vlan_tci_mask = rte_cpu_to_be_16(res->vlan_mask); 10560 IPV4_ADDR_TO_UINT(res->ipv4_src, mask->ipv4_mask.src_ip); 10561 IPV4_ADDR_TO_UINT(res->ipv4_dst, mask->ipv4_mask.dst_ip); 10562 IPV6_ADDR_TO_ARRAY(res->ipv6_src, mask->ipv6_mask.src_ip); 10563 IPV6_ADDR_TO_ARRAY(res->ipv6_dst, mask->ipv6_mask.dst_ip); 10564 mask->src_port_mask = rte_cpu_to_be_16(res->port_src); 10565 mask->dst_port_mask = rte_cpu_to_be_16(res->port_dst); 10566 } 10567 10568 cmd_reconfig_device_queue(res->port_id, 1, 1); 10569 } 10570 10571 cmdline_parse_token_string_t cmd_flow_director_mask = 10572 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 10573 flow_director_mask, "flow_director_mask"); 10574 cmdline_parse_token_num_t cmd_flow_director_mask_port_id = 10575 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result, 10576 port_id, RTE_UINT16); 10577 cmdline_parse_token_string_t cmd_flow_director_mask_vlan = 10578 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 10579 vlan, "vlan"); 10580 cmdline_parse_token_num_t cmd_flow_director_mask_vlan_value = 10581 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result, 10582 vlan_mask, RTE_UINT16); 10583 cmdline_parse_token_string_t cmd_flow_director_mask_src = 10584 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 10585 src_mask, "src_mask"); 10586 cmdline_parse_token_ipaddr_t cmd_flow_director_mask_ipv4_src = 10587 TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_mask_result, 10588 ipv4_src); 10589 cmdline_parse_token_ipaddr_t cmd_flow_director_mask_ipv6_src = 10590 TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_mask_result, 10591 ipv6_src); 10592 cmdline_parse_token_num_t cmd_flow_director_mask_port_src = 10593 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result, 10594 port_src, RTE_UINT16); 10595 cmdline_parse_token_string_t cmd_flow_director_mask_dst = 10596 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 10597 dst_mask, "dst_mask"); 10598 cmdline_parse_token_ipaddr_t cmd_flow_director_mask_ipv4_dst = 10599 TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_mask_result, 10600 ipv4_dst); 10601 cmdline_parse_token_ipaddr_t cmd_flow_director_mask_ipv6_dst = 10602 TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_mask_result, 10603 ipv6_dst); 10604 cmdline_parse_token_num_t cmd_flow_director_mask_port_dst = 10605 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result, 10606 port_dst, RTE_UINT16); 10607 10608 cmdline_parse_token_string_t cmd_flow_director_mask_mode = 10609 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 10610 mode, "mode"); 10611 cmdline_parse_token_string_t cmd_flow_director_mask_mode_ip = 10612 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 10613 mode_value, "IP"); 10614 cmdline_parse_token_string_t cmd_flow_director_mask_mode_mac_vlan = 10615 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 10616 mode_value, "MAC-VLAN"); 10617 cmdline_parse_token_string_t cmd_flow_director_mask_mode_tunnel = 10618 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 10619 mode_value, "Tunnel"); 10620 cmdline_parse_token_string_t cmd_flow_director_mask_mac = 10621 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 10622 mac, "mac"); 10623 cmdline_parse_token_num_t cmd_flow_director_mask_mac_value = 10624 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result, 10625 mac_addr_byte_mask, RTE_UINT8); 10626 cmdline_parse_token_string_t cmd_flow_director_mask_tunnel_type = 10627 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 10628 tunnel_type, "tunnel-type"); 10629 cmdline_parse_token_num_t cmd_flow_director_mask_tunnel_type_value = 10630 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result, 10631 tunnel_type_mask, RTE_UINT8); 10632 cmdline_parse_token_string_t cmd_flow_director_mask_tunnel_id = 10633 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_mask_result, 10634 tunnel_id, "tunnel-id"); 10635 cmdline_parse_token_num_t cmd_flow_director_mask_tunnel_id_value = 10636 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_mask_result, 10637 tunnel_id_mask, RTE_UINT32); 10638 10639 cmdline_parse_inst_t cmd_set_flow_director_ip_mask = { 10640 .f = cmd_flow_director_mask_parsed, 10641 .data = NULL, 10642 .help_str = "flow_director_mask ... : " 10643 "Set IP mode flow director's mask on NIC", 10644 .tokens = { 10645 (void *)&cmd_flow_director_mask, 10646 (void *)&cmd_flow_director_mask_port_id, 10647 (void *)&cmd_flow_director_mask_mode, 10648 (void *)&cmd_flow_director_mask_mode_ip, 10649 (void *)&cmd_flow_director_mask_vlan, 10650 (void *)&cmd_flow_director_mask_vlan_value, 10651 (void *)&cmd_flow_director_mask_src, 10652 (void *)&cmd_flow_director_mask_ipv4_src, 10653 (void *)&cmd_flow_director_mask_ipv6_src, 10654 (void *)&cmd_flow_director_mask_port_src, 10655 (void *)&cmd_flow_director_mask_dst, 10656 (void *)&cmd_flow_director_mask_ipv4_dst, 10657 (void *)&cmd_flow_director_mask_ipv6_dst, 10658 (void *)&cmd_flow_director_mask_port_dst, 10659 NULL, 10660 }, 10661 }; 10662 10663 cmdline_parse_inst_t cmd_set_flow_director_mac_vlan_mask = { 10664 .f = cmd_flow_director_mask_parsed, 10665 .data = NULL, 10666 .help_str = "flow_director_mask ... : Set MAC VLAN mode " 10667 "flow director's mask on NIC", 10668 .tokens = { 10669 (void *)&cmd_flow_director_mask, 10670 (void *)&cmd_flow_director_mask_port_id, 10671 (void *)&cmd_flow_director_mask_mode, 10672 (void *)&cmd_flow_director_mask_mode_mac_vlan, 10673 (void *)&cmd_flow_director_mask_vlan, 10674 (void *)&cmd_flow_director_mask_vlan_value, 10675 NULL, 10676 }, 10677 }; 10678 10679 cmdline_parse_inst_t cmd_set_flow_director_tunnel_mask = { 10680 .f = cmd_flow_director_mask_parsed, 10681 .data = NULL, 10682 .help_str = "flow_director_mask ... : Set tunnel mode " 10683 "flow director's mask on NIC", 10684 .tokens = { 10685 (void *)&cmd_flow_director_mask, 10686 (void *)&cmd_flow_director_mask_port_id, 10687 (void *)&cmd_flow_director_mask_mode, 10688 (void *)&cmd_flow_director_mask_mode_tunnel, 10689 (void *)&cmd_flow_director_mask_vlan, 10690 (void *)&cmd_flow_director_mask_vlan_value, 10691 (void *)&cmd_flow_director_mask_mac, 10692 (void *)&cmd_flow_director_mask_mac_value, 10693 (void *)&cmd_flow_director_mask_tunnel_type, 10694 (void *)&cmd_flow_director_mask_tunnel_type_value, 10695 (void *)&cmd_flow_director_mask_tunnel_id, 10696 (void *)&cmd_flow_director_mask_tunnel_id_value, 10697 NULL, 10698 }, 10699 }; 10700 10701 /* *** deal with flow director flexible payload configuration *** */ 10702 struct cmd_flow_director_flexpayload_result { 10703 cmdline_fixed_string_t flow_director_flexpayload; 10704 portid_t port_id; 10705 cmdline_fixed_string_t payload_layer; 10706 cmdline_fixed_string_t payload_cfg; 10707 }; 10708 10709 static inline int 10710 parse_offsets(const char *q_arg, uint16_t *offsets, uint16_t max_num) 10711 { 10712 char s[256]; 10713 const char *p, *p0 = q_arg; 10714 char *end; 10715 unsigned long int_fld; 10716 char *str_fld[max_num]; 10717 int i; 10718 unsigned size; 10719 int ret = -1; 10720 10721 p = strchr(p0, '('); 10722 if (p == NULL) 10723 return -1; 10724 ++p; 10725 p0 = strchr(p, ')'); 10726 if (p0 == NULL) 10727 return -1; 10728 10729 size = p0 - p; 10730 if (size >= sizeof(s)) 10731 return -1; 10732 10733 snprintf(s, sizeof(s), "%.*s", size, p); 10734 ret = rte_strsplit(s, sizeof(s), str_fld, max_num, ','); 10735 if (ret < 0 || ret > max_num) 10736 return -1; 10737 for (i = 0; i < ret; i++) { 10738 errno = 0; 10739 int_fld = strtoul(str_fld[i], &end, 0); 10740 if (errno != 0 || *end != '\0' || int_fld > UINT16_MAX) 10741 return -1; 10742 offsets[i] = (uint16_t)int_fld; 10743 } 10744 return ret; 10745 } 10746 10747 static void 10748 cmd_flow_director_flxpld_parsed(void *parsed_result, 10749 __rte_unused struct cmdline *cl, 10750 __rte_unused void *data) 10751 { 10752 struct cmd_flow_director_flexpayload_result *res = parsed_result; 10753 struct rte_eth_flex_payload_cfg flex_cfg; 10754 struct rte_port *port; 10755 int ret = 0; 10756 10757 port = &ports[res->port_id]; 10758 /** Check if the port is not started **/ 10759 if (port->port_status != RTE_PORT_STOPPED) { 10760 printf("Please stop port %d first\n", res->port_id); 10761 return; 10762 } 10763 10764 memset(&flex_cfg, 0, sizeof(struct rte_eth_flex_payload_cfg)); 10765 10766 if (!strcmp(res->payload_layer, "raw")) 10767 flex_cfg.type = RTE_ETH_RAW_PAYLOAD; 10768 else if (!strcmp(res->payload_layer, "l2")) 10769 flex_cfg.type = RTE_ETH_L2_PAYLOAD; 10770 else if (!strcmp(res->payload_layer, "l3")) 10771 flex_cfg.type = RTE_ETH_L3_PAYLOAD; 10772 else if (!strcmp(res->payload_layer, "l4")) 10773 flex_cfg.type = RTE_ETH_L4_PAYLOAD; 10774 10775 ret = parse_offsets(res->payload_cfg, flex_cfg.src_offset, 10776 RTE_ETH_FDIR_MAX_FLEXLEN); 10777 if (ret < 0) { 10778 printf("error: Cannot parse flex payload input.\n"); 10779 return; 10780 } 10781 10782 fdir_set_flex_payload(res->port_id, &flex_cfg); 10783 cmd_reconfig_device_queue(res->port_id, 1, 1); 10784 } 10785 10786 cmdline_parse_token_string_t cmd_flow_director_flexpayload = 10787 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flexpayload_result, 10788 flow_director_flexpayload, 10789 "flow_director_flex_payload"); 10790 cmdline_parse_token_num_t cmd_flow_director_flexpayload_port_id = 10791 TOKEN_NUM_INITIALIZER(struct cmd_flow_director_flexpayload_result, 10792 port_id, RTE_UINT16); 10793 cmdline_parse_token_string_t cmd_flow_director_flexpayload_payload_layer = 10794 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flexpayload_result, 10795 payload_layer, "raw#l2#l3#l4"); 10796 cmdline_parse_token_string_t cmd_flow_director_flexpayload_payload_cfg = 10797 TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flexpayload_result, 10798 payload_cfg, NULL); 10799 10800 cmdline_parse_inst_t cmd_set_flow_director_flex_payload = { 10801 .f = cmd_flow_director_flxpld_parsed, 10802 .data = NULL, 10803 .help_str = "flow_director_flexpayload ... : " 10804 "Set flow director's flex payload on NIC", 10805 .tokens = { 10806 (void *)&cmd_flow_director_flexpayload, 10807 (void *)&cmd_flow_director_flexpayload_port_id, 10808 (void *)&cmd_flow_director_flexpayload_payload_layer, 10809 (void *)&cmd_flow_director_flexpayload_payload_cfg, 10810 NULL, 10811 }, 10812 }; 10813 10814 /* Generic flow interface command. */ 10815 extern cmdline_parse_inst_t cmd_flow; 10816 10817 /* *** ADD/REMOVE A MULTICAST MAC ADDRESS TO/FROM A PORT *** */ 10818 struct cmd_mcast_addr_result { 10819 cmdline_fixed_string_t mcast_addr_cmd; 10820 cmdline_fixed_string_t what; 10821 uint16_t port_num; 10822 struct rte_ether_addr mc_addr; 10823 }; 10824 10825 static void cmd_mcast_addr_parsed(void *parsed_result, 10826 __rte_unused struct cmdline *cl, 10827 __rte_unused void *data) 10828 { 10829 struct cmd_mcast_addr_result *res = parsed_result; 10830 10831 if (!rte_is_multicast_ether_addr(&res->mc_addr)) { 10832 printf("Invalid multicast addr %02X:%02X:%02X:%02X:%02X:%02X\n", 10833 res->mc_addr.addr_bytes[0], res->mc_addr.addr_bytes[1], 10834 res->mc_addr.addr_bytes[2], res->mc_addr.addr_bytes[3], 10835 res->mc_addr.addr_bytes[4], res->mc_addr.addr_bytes[5]); 10836 return; 10837 } 10838 if (strcmp(res->what, "add") == 0) 10839 mcast_addr_add(res->port_num, &res->mc_addr); 10840 else 10841 mcast_addr_remove(res->port_num, &res->mc_addr); 10842 } 10843 10844 cmdline_parse_token_string_t cmd_mcast_addr_cmd = 10845 TOKEN_STRING_INITIALIZER(struct cmd_mcast_addr_result, 10846 mcast_addr_cmd, "mcast_addr"); 10847 cmdline_parse_token_string_t cmd_mcast_addr_what = 10848 TOKEN_STRING_INITIALIZER(struct cmd_mcast_addr_result, what, 10849 "add#remove"); 10850 cmdline_parse_token_num_t cmd_mcast_addr_portnum = 10851 TOKEN_NUM_INITIALIZER(struct cmd_mcast_addr_result, port_num, 10852 RTE_UINT16); 10853 cmdline_parse_token_etheraddr_t cmd_mcast_addr_addr = 10854 TOKEN_ETHERADDR_INITIALIZER(struct cmd_mac_addr_result, address); 10855 10856 cmdline_parse_inst_t cmd_mcast_addr = { 10857 .f = cmd_mcast_addr_parsed, 10858 .data = (void *)0, 10859 .help_str = "mcast_addr add|remove <port_id> <mcast_addr>: " 10860 "Add/Remove multicast MAC address on port_id", 10861 .tokens = { 10862 (void *)&cmd_mcast_addr_cmd, 10863 (void *)&cmd_mcast_addr_what, 10864 (void *)&cmd_mcast_addr_portnum, 10865 (void *)&cmd_mcast_addr_addr, 10866 NULL, 10867 }, 10868 }; 10869 10870 /* vf vlan anti spoof configuration */ 10871 10872 /* Common result structure for vf vlan anti spoof */ 10873 struct cmd_vf_vlan_anti_spoof_result { 10874 cmdline_fixed_string_t set; 10875 cmdline_fixed_string_t vf; 10876 cmdline_fixed_string_t vlan; 10877 cmdline_fixed_string_t antispoof; 10878 portid_t port_id; 10879 uint32_t vf_id; 10880 cmdline_fixed_string_t on_off; 10881 }; 10882 10883 /* Common CLI fields for vf vlan anti spoof enable disable */ 10884 cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_set = 10885 TOKEN_STRING_INITIALIZER 10886 (struct cmd_vf_vlan_anti_spoof_result, 10887 set, "set"); 10888 cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_vf = 10889 TOKEN_STRING_INITIALIZER 10890 (struct cmd_vf_vlan_anti_spoof_result, 10891 vf, "vf"); 10892 cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_vlan = 10893 TOKEN_STRING_INITIALIZER 10894 (struct cmd_vf_vlan_anti_spoof_result, 10895 vlan, "vlan"); 10896 cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_antispoof = 10897 TOKEN_STRING_INITIALIZER 10898 (struct cmd_vf_vlan_anti_spoof_result, 10899 antispoof, "antispoof"); 10900 cmdline_parse_token_num_t cmd_vf_vlan_anti_spoof_port_id = 10901 TOKEN_NUM_INITIALIZER 10902 (struct cmd_vf_vlan_anti_spoof_result, 10903 port_id, RTE_UINT16); 10904 cmdline_parse_token_num_t cmd_vf_vlan_anti_spoof_vf_id = 10905 TOKEN_NUM_INITIALIZER 10906 (struct cmd_vf_vlan_anti_spoof_result, 10907 vf_id, RTE_UINT32); 10908 cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_on_off = 10909 TOKEN_STRING_INITIALIZER 10910 (struct cmd_vf_vlan_anti_spoof_result, 10911 on_off, "on#off"); 10912 10913 static void 10914 cmd_set_vf_vlan_anti_spoof_parsed( 10915 void *parsed_result, 10916 __rte_unused struct cmdline *cl, 10917 __rte_unused void *data) 10918 { 10919 struct cmd_vf_vlan_anti_spoof_result *res = parsed_result; 10920 int ret = -ENOTSUP; 10921 10922 __rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 10923 10924 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 10925 return; 10926 10927 #ifdef RTE_NET_IXGBE 10928 if (ret == -ENOTSUP) 10929 ret = rte_pmd_ixgbe_set_vf_vlan_anti_spoof(res->port_id, 10930 res->vf_id, is_on); 10931 #endif 10932 #ifdef RTE_NET_I40E 10933 if (ret == -ENOTSUP) 10934 ret = rte_pmd_i40e_set_vf_vlan_anti_spoof(res->port_id, 10935 res->vf_id, is_on); 10936 #endif 10937 #ifdef RTE_NET_BNXT 10938 if (ret == -ENOTSUP) 10939 ret = rte_pmd_bnxt_set_vf_vlan_anti_spoof(res->port_id, 10940 res->vf_id, is_on); 10941 #endif 10942 10943 switch (ret) { 10944 case 0: 10945 break; 10946 case -EINVAL: 10947 printf("invalid vf_id %d\n", res->vf_id); 10948 break; 10949 case -ENODEV: 10950 printf("invalid port_id %d\n", res->port_id); 10951 break; 10952 case -ENOTSUP: 10953 printf("function not implemented\n"); 10954 break; 10955 default: 10956 printf("programming error: (%s)\n", strerror(-ret)); 10957 } 10958 } 10959 10960 cmdline_parse_inst_t cmd_set_vf_vlan_anti_spoof = { 10961 .f = cmd_set_vf_vlan_anti_spoof_parsed, 10962 .data = NULL, 10963 .help_str = "set vf vlan antispoof <port_id> <vf_id> on|off", 10964 .tokens = { 10965 (void *)&cmd_vf_vlan_anti_spoof_set, 10966 (void *)&cmd_vf_vlan_anti_spoof_vf, 10967 (void *)&cmd_vf_vlan_anti_spoof_vlan, 10968 (void *)&cmd_vf_vlan_anti_spoof_antispoof, 10969 (void *)&cmd_vf_vlan_anti_spoof_port_id, 10970 (void *)&cmd_vf_vlan_anti_spoof_vf_id, 10971 (void *)&cmd_vf_vlan_anti_spoof_on_off, 10972 NULL, 10973 }, 10974 }; 10975 10976 /* vf mac anti spoof configuration */ 10977 10978 /* Common result structure for vf mac anti spoof */ 10979 struct cmd_vf_mac_anti_spoof_result { 10980 cmdline_fixed_string_t set; 10981 cmdline_fixed_string_t vf; 10982 cmdline_fixed_string_t mac; 10983 cmdline_fixed_string_t antispoof; 10984 portid_t port_id; 10985 uint32_t vf_id; 10986 cmdline_fixed_string_t on_off; 10987 }; 10988 10989 /* Common CLI fields for vf mac anti spoof enable disable */ 10990 cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_set = 10991 TOKEN_STRING_INITIALIZER 10992 (struct cmd_vf_mac_anti_spoof_result, 10993 set, "set"); 10994 cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_vf = 10995 TOKEN_STRING_INITIALIZER 10996 (struct cmd_vf_mac_anti_spoof_result, 10997 vf, "vf"); 10998 cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_mac = 10999 TOKEN_STRING_INITIALIZER 11000 (struct cmd_vf_mac_anti_spoof_result, 11001 mac, "mac"); 11002 cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_antispoof = 11003 TOKEN_STRING_INITIALIZER 11004 (struct cmd_vf_mac_anti_spoof_result, 11005 antispoof, "antispoof"); 11006 cmdline_parse_token_num_t cmd_vf_mac_anti_spoof_port_id = 11007 TOKEN_NUM_INITIALIZER 11008 (struct cmd_vf_mac_anti_spoof_result, 11009 port_id, RTE_UINT16); 11010 cmdline_parse_token_num_t cmd_vf_mac_anti_spoof_vf_id = 11011 TOKEN_NUM_INITIALIZER 11012 (struct cmd_vf_mac_anti_spoof_result, 11013 vf_id, RTE_UINT32); 11014 cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_on_off = 11015 TOKEN_STRING_INITIALIZER 11016 (struct cmd_vf_mac_anti_spoof_result, 11017 on_off, "on#off"); 11018 11019 static void 11020 cmd_set_vf_mac_anti_spoof_parsed( 11021 void *parsed_result, 11022 __rte_unused struct cmdline *cl, 11023 __rte_unused void *data) 11024 { 11025 struct cmd_vf_mac_anti_spoof_result *res = parsed_result; 11026 int ret = -ENOTSUP; 11027 11028 __rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 11029 11030 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 11031 return; 11032 11033 #ifdef RTE_NET_IXGBE 11034 if (ret == -ENOTSUP) 11035 ret = rte_pmd_ixgbe_set_vf_mac_anti_spoof(res->port_id, 11036 res->vf_id, is_on); 11037 #endif 11038 #ifdef RTE_NET_I40E 11039 if (ret == -ENOTSUP) 11040 ret = rte_pmd_i40e_set_vf_mac_anti_spoof(res->port_id, 11041 res->vf_id, is_on); 11042 #endif 11043 #ifdef RTE_NET_BNXT 11044 if (ret == -ENOTSUP) 11045 ret = rte_pmd_bnxt_set_vf_mac_anti_spoof(res->port_id, 11046 res->vf_id, is_on); 11047 #endif 11048 11049 switch (ret) { 11050 case 0: 11051 break; 11052 case -EINVAL: 11053 printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on); 11054 break; 11055 case -ENODEV: 11056 printf("invalid port_id %d\n", res->port_id); 11057 break; 11058 case -ENOTSUP: 11059 printf("function not implemented\n"); 11060 break; 11061 default: 11062 printf("programming error: (%s)\n", strerror(-ret)); 11063 } 11064 } 11065 11066 cmdline_parse_inst_t cmd_set_vf_mac_anti_spoof = { 11067 .f = cmd_set_vf_mac_anti_spoof_parsed, 11068 .data = NULL, 11069 .help_str = "set vf mac antispoof <port_id> <vf_id> on|off", 11070 .tokens = { 11071 (void *)&cmd_vf_mac_anti_spoof_set, 11072 (void *)&cmd_vf_mac_anti_spoof_vf, 11073 (void *)&cmd_vf_mac_anti_spoof_mac, 11074 (void *)&cmd_vf_mac_anti_spoof_antispoof, 11075 (void *)&cmd_vf_mac_anti_spoof_port_id, 11076 (void *)&cmd_vf_mac_anti_spoof_vf_id, 11077 (void *)&cmd_vf_mac_anti_spoof_on_off, 11078 NULL, 11079 }, 11080 }; 11081 11082 /* vf vlan strip queue configuration */ 11083 11084 /* Common result structure for vf mac anti spoof */ 11085 struct cmd_vf_vlan_stripq_result { 11086 cmdline_fixed_string_t set; 11087 cmdline_fixed_string_t vf; 11088 cmdline_fixed_string_t vlan; 11089 cmdline_fixed_string_t stripq; 11090 portid_t port_id; 11091 uint16_t vf_id; 11092 cmdline_fixed_string_t on_off; 11093 }; 11094 11095 /* Common CLI fields for vf vlan strip enable disable */ 11096 cmdline_parse_token_string_t cmd_vf_vlan_stripq_set = 11097 TOKEN_STRING_INITIALIZER 11098 (struct cmd_vf_vlan_stripq_result, 11099 set, "set"); 11100 cmdline_parse_token_string_t cmd_vf_vlan_stripq_vf = 11101 TOKEN_STRING_INITIALIZER 11102 (struct cmd_vf_vlan_stripq_result, 11103 vf, "vf"); 11104 cmdline_parse_token_string_t cmd_vf_vlan_stripq_vlan = 11105 TOKEN_STRING_INITIALIZER 11106 (struct cmd_vf_vlan_stripq_result, 11107 vlan, "vlan"); 11108 cmdline_parse_token_string_t cmd_vf_vlan_stripq_stripq = 11109 TOKEN_STRING_INITIALIZER 11110 (struct cmd_vf_vlan_stripq_result, 11111 stripq, "stripq"); 11112 cmdline_parse_token_num_t cmd_vf_vlan_stripq_port_id = 11113 TOKEN_NUM_INITIALIZER 11114 (struct cmd_vf_vlan_stripq_result, 11115 port_id, RTE_UINT16); 11116 cmdline_parse_token_num_t cmd_vf_vlan_stripq_vf_id = 11117 TOKEN_NUM_INITIALIZER 11118 (struct cmd_vf_vlan_stripq_result, 11119 vf_id, RTE_UINT16); 11120 cmdline_parse_token_string_t cmd_vf_vlan_stripq_on_off = 11121 TOKEN_STRING_INITIALIZER 11122 (struct cmd_vf_vlan_stripq_result, 11123 on_off, "on#off"); 11124 11125 static void 11126 cmd_set_vf_vlan_stripq_parsed( 11127 void *parsed_result, 11128 __rte_unused struct cmdline *cl, 11129 __rte_unused void *data) 11130 { 11131 struct cmd_vf_vlan_stripq_result *res = parsed_result; 11132 int ret = -ENOTSUP; 11133 11134 __rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 11135 11136 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 11137 return; 11138 11139 #ifdef RTE_NET_IXGBE 11140 if (ret == -ENOTSUP) 11141 ret = rte_pmd_ixgbe_set_vf_vlan_stripq(res->port_id, 11142 res->vf_id, is_on); 11143 #endif 11144 #ifdef RTE_NET_I40E 11145 if (ret == -ENOTSUP) 11146 ret = rte_pmd_i40e_set_vf_vlan_stripq(res->port_id, 11147 res->vf_id, is_on); 11148 #endif 11149 #ifdef RTE_NET_BNXT 11150 if (ret == -ENOTSUP) 11151 ret = rte_pmd_bnxt_set_vf_vlan_stripq(res->port_id, 11152 res->vf_id, is_on); 11153 #endif 11154 11155 switch (ret) { 11156 case 0: 11157 break; 11158 case -EINVAL: 11159 printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on); 11160 break; 11161 case -ENODEV: 11162 printf("invalid port_id %d\n", res->port_id); 11163 break; 11164 case -ENOTSUP: 11165 printf("function not implemented\n"); 11166 break; 11167 default: 11168 printf("programming error: (%s)\n", strerror(-ret)); 11169 } 11170 } 11171 11172 cmdline_parse_inst_t cmd_set_vf_vlan_stripq = { 11173 .f = cmd_set_vf_vlan_stripq_parsed, 11174 .data = NULL, 11175 .help_str = "set vf vlan stripq <port_id> <vf_id> on|off", 11176 .tokens = { 11177 (void *)&cmd_vf_vlan_stripq_set, 11178 (void *)&cmd_vf_vlan_stripq_vf, 11179 (void *)&cmd_vf_vlan_stripq_vlan, 11180 (void *)&cmd_vf_vlan_stripq_stripq, 11181 (void *)&cmd_vf_vlan_stripq_port_id, 11182 (void *)&cmd_vf_vlan_stripq_vf_id, 11183 (void *)&cmd_vf_vlan_stripq_on_off, 11184 NULL, 11185 }, 11186 }; 11187 11188 /* vf vlan insert configuration */ 11189 11190 /* Common result structure for vf vlan insert */ 11191 struct cmd_vf_vlan_insert_result { 11192 cmdline_fixed_string_t set; 11193 cmdline_fixed_string_t vf; 11194 cmdline_fixed_string_t vlan; 11195 cmdline_fixed_string_t insert; 11196 portid_t port_id; 11197 uint16_t vf_id; 11198 uint16_t vlan_id; 11199 }; 11200 11201 /* Common CLI fields for vf vlan insert enable disable */ 11202 cmdline_parse_token_string_t cmd_vf_vlan_insert_set = 11203 TOKEN_STRING_INITIALIZER 11204 (struct cmd_vf_vlan_insert_result, 11205 set, "set"); 11206 cmdline_parse_token_string_t cmd_vf_vlan_insert_vf = 11207 TOKEN_STRING_INITIALIZER 11208 (struct cmd_vf_vlan_insert_result, 11209 vf, "vf"); 11210 cmdline_parse_token_string_t cmd_vf_vlan_insert_vlan = 11211 TOKEN_STRING_INITIALIZER 11212 (struct cmd_vf_vlan_insert_result, 11213 vlan, "vlan"); 11214 cmdline_parse_token_string_t cmd_vf_vlan_insert_insert = 11215 TOKEN_STRING_INITIALIZER 11216 (struct cmd_vf_vlan_insert_result, 11217 insert, "insert"); 11218 cmdline_parse_token_num_t cmd_vf_vlan_insert_port_id = 11219 TOKEN_NUM_INITIALIZER 11220 (struct cmd_vf_vlan_insert_result, 11221 port_id, RTE_UINT16); 11222 cmdline_parse_token_num_t cmd_vf_vlan_insert_vf_id = 11223 TOKEN_NUM_INITIALIZER 11224 (struct cmd_vf_vlan_insert_result, 11225 vf_id, RTE_UINT16); 11226 cmdline_parse_token_num_t cmd_vf_vlan_insert_vlan_id = 11227 TOKEN_NUM_INITIALIZER 11228 (struct cmd_vf_vlan_insert_result, 11229 vlan_id, RTE_UINT16); 11230 11231 static void 11232 cmd_set_vf_vlan_insert_parsed( 11233 void *parsed_result, 11234 __rte_unused struct cmdline *cl, 11235 __rte_unused void *data) 11236 { 11237 struct cmd_vf_vlan_insert_result *res = parsed_result; 11238 int ret = -ENOTSUP; 11239 11240 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 11241 return; 11242 11243 #ifdef RTE_NET_IXGBE 11244 if (ret == -ENOTSUP) 11245 ret = rte_pmd_ixgbe_set_vf_vlan_insert(res->port_id, res->vf_id, 11246 res->vlan_id); 11247 #endif 11248 #ifdef RTE_NET_I40E 11249 if (ret == -ENOTSUP) 11250 ret = rte_pmd_i40e_set_vf_vlan_insert(res->port_id, res->vf_id, 11251 res->vlan_id); 11252 #endif 11253 #ifdef RTE_NET_BNXT 11254 if (ret == -ENOTSUP) 11255 ret = rte_pmd_bnxt_set_vf_vlan_insert(res->port_id, res->vf_id, 11256 res->vlan_id); 11257 #endif 11258 11259 switch (ret) { 11260 case 0: 11261 break; 11262 case -EINVAL: 11263 printf("invalid vf_id %d or vlan_id %d\n", res->vf_id, res->vlan_id); 11264 break; 11265 case -ENODEV: 11266 printf("invalid port_id %d\n", res->port_id); 11267 break; 11268 case -ENOTSUP: 11269 printf("function not implemented\n"); 11270 break; 11271 default: 11272 printf("programming error: (%s)\n", strerror(-ret)); 11273 } 11274 } 11275 11276 cmdline_parse_inst_t cmd_set_vf_vlan_insert = { 11277 .f = cmd_set_vf_vlan_insert_parsed, 11278 .data = NULL, 11279 .help_str = "set vf vlan insert <port_id> <vf_id> <vlan_id>", 11280 .tokens = { 11281 (void *)&cmd_vf_vlan_insert_set, 11282 (void *)&cmd_vf_vlan_insert_vf, 11283 (void *)&cmd_vf_vlan_insert_vlan, 11284 (void *)&cmd_vf_vlan_insert_insert, 11285 (void *)&cmd_vf_vlan_insert_port_id, 11286 (void *)&cmd_vf_vlan_insert_vf_id, 11287 (void *)&cmd_vf_vlan_insert_vlan_id, 11288 NULL, 11289 }, 11290 }; 11291 11292 /* tx loopback configuration */ 11293 11294 /* Common result structure for tx loopback */ 11295 struct cmd_tx_loopback_result { 11296 cmdline_fixed_string_t set; 11297 cmdline_fixed_string_t tx; 11298 cmdline_fixed_string_t loopback; 11299 portid_t port_id; 11300 cmdline_fixed_string_t on_off; 11301 }; 11302 11303 /* Common CLI fields for tx loopback enable disable */ 11304 cmdline_parse_token_string_t cmd_tx_loopback_set = 11305 TOKEN_STRING_INITIALIZER 11306 (struct cmd_tx_loopback_result, 11307 set, "set"); 11308 cmdline_parse_token_string_t cmd_tx_loopback_tx = 11309 TOKEN_STRING_INITIALIZER 11310 (struct cmd_tx_loopback_result, 11311 tx, "tx"); 11312 cmdline_parse_token_string_t cmd_tx_loopback_loopback = 11313 TOKEN_STRING_INITIALIZER 11314 (struct cmd_tx_loopback_result, 11315 loopback, "loopback"); 11316 cmdline_parse_token_num_t cmd_tx_loopback_port_id = 11317 TOKEN_NUM_INITIALIZER 11318 (struct cmd_tx_loopback_result, 11319 port_id, RTE_UINT16); 11320 cmdline_parse_token_string_t cmd_tx_loopback_on_off = 11321 TOKEN_STRING_INITIALIZER 11322 (struct cmd_tx_loopback_result, 11323 on_off, "on#off"); 11324 11325 static void 11326 cmd_set_tx_loopback_parsed( 11327 void *parsed_result, 11328 __rte_unused struct cmdline *cl, 11329 __rte_unused void *data) 11330 { 11331 struct cmd_tx_loopback_result *res = parsed_result; 11332 int ret = -ENOTSUP; 11333 11334 __rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 11335 11336 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 11337 return; 11338 11339 #ifdef RTE_NET_IXGBE 11340 if (ret == -ENOTSUP) 11341 ret = rte_pmd_ixgbe_set_tx_loopback(res->port_id, is_on); 11342 #endif 11343 #ifdef RTE_NET_I40E 11344 if (ret == -ENOTSUP) 11345 ret = rte_pmd_i40e_set_tx_loopback(res->port_id, is_on); 11346 #endif 11347 #ifdef RTE_NET_BNXT 11348 if (ret == -ENOTSUP) 11349 ret = rte_pmd_bnxt_set_tx_loopback(res->port_id, is_on); 11350 #endif 11351 #if defined RTE_BUS_DPAA && defined RTE_NET_DPAA 11352 if (ret == -ENOTSUP) 11353 ret = rte_pmd_dpaa_set_tx_loopback(res->port_id, is_on); 11354 #endif 11355 11356 switch (ret) { 11357 case 0: 11358 break; 11359 case -EINVAL: 11360 printf("invalid is_on %d\n", is_on); 11361 break; 11362 case -ENODEV: 11363 printf("invalid port_id %d\n", res->port_id); 11364 break; 11365 case -ENOTSUP: 11366 printf("function not implemented\n"); 11367 break; 11368 default: 11369 printf("programming error: (%s)\n", strerror(-ret)); 11370 } 11371 } 11372 11373 cmdline_parse_inst_t cmd_set_tx_loopback = { 11374 .f = cmd_set_tx_loopback_parsed, 11375 .data = NULL, 11376 .help_str = "set tx loopback <port_id> on|off", 11377 .tokens = { 11378 (void *)&cmd_tx_loopback_set, 11379 (void *)&cmd_tx_loopback_tx, 11380 (void *)&cmd_tx_loopback_loopback, 11381 (void *)&cmd_tx_loopback_port_id, 11382 (void *)&cmd_tx_loopback_on_off, 11383 NULL, 11384 }, 11385 }; 11386 11387 /* all queues drop enable configuration */ 11388 11389 /* Common result structure for all queues drop enable */ 11390 struct cmd_all_queues_drop_en_result { 11391 cmdline_fixed_string_t set; 11392 cmdline_fixed_string_t all; 11393 cmdline_fixed_string_t queues; 11394 cmdline_fixed_string_t drop; 11395 portid_t port_id; 11396 cmdline_fixed_string_t on_off; 11397 }; 11398 11399 /* Common CLI fields for tx loopback enable disable */ 11400 cmdline_parse_token_string_t cmd_all_queues_drop_en_set = 11401 TOKEN_STRING_INITIALIZER 11402 (struct cmd_all_queues_drop_en_result, 11403 set, "set"); 11404 cmdline_parse_token_string_t cmd_all_queues_drop_en_all = 11405 TOKEN_STRING_INITIALIZER 11406 (struct cmd_all_queues_drop_en_result, 11407 all, "all"); 11408 cmdline_parse_token_string_t cmd_all_queues_drop_en_queues = 11409 TOKEN_STRING_INITIALIZER 11410 (struct cmd_all_queues_drop_en_result, 11411 queues, "queues"); 11412 cmdline_parse_token_string_t cmd_all_queues_drop_en_drop = 11413 TOKEN_STRING_INITIALIZER 11414 (struct cmd_all_queues_drop_en_result, 11415 drop, "drop"); 11416 cmdline_parse_token_num_t cmd_all_queues_drop_en_port_id = 11417 TOKEN_NUM_INITIALIZER 11418 (struct cmd_all_queues_drop_en_result, 11419 port_id, RTE_UINT16); 11420 cmdline_parse_token_string_t cmd_all_queues_drop_en_on_off = 11421 TOKEN_STRING_INITIALIZER 11422 (struct cmd_all_queues_drop_en_result, 11423 on_off, "on#off"); 11424 11425 static void 11426 cmd_set_all_queues_drop_en_parsed( 11427 void *parsed_result, 11428 __rte_unused struct cmdline *cl, 11429 __rte_unused void *data) 11430 { 11431 struct cmd_all_queues_drop_en_result *res = parsed_result; 11432 int ret = -ENOTSUP; 11433 int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 11434 11435 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 11436 return; 11437 11438 #ifdef RTE_NET_IXGBE 11439 if (ret == -ENOTSUP) 11440 ret = rte_pmd_ixgbe_set_all_queues_drop_en(res->port_id, is_on); 11441 #endif 11442 #ifdef RTE_NET_BNXT 11443 if (ret == -ENOTSUP) 11444 ret = rte_pmd_bnxt_set_all_queues_drop_en(res->port_id, is_on); 11445 #endif 11446 switch (ret) { 11447 case 0: 11448 break; 11449 case -EINVAL: 11450 printf("invalid is_on %d\n", is_on); 11451 break; 11452 case -ENODEV: 11453 printf("invalid port_id %d\n", res->port_id); 11454 break; 11455 case -ENOTSUP: 11456 printf("function not implemented\n"); 11457 break; 11458 default: 11459 printf("programming error: (%s)\n", strerror(-ret)); 11460 } 11461 } 11462 11463 cmdline_parse_inst_t cmd_set_all_queues_drop_en = { 11464 .f = cmd_set_all_queues_drop_en_parsed, 11465 .data = NULL, 11466 .help_str = "set all queues drop <port_id> on|off", 11467 .tokens = { 11468 (void *)&cmd_all_queues_drop_en_set, 11469 (void *)&cmd_all_queues_drop_en_all, 11470 (void *)&cmd_all_queues_drop_en_queues, 11471 (void *)&cmd_all_queues_drop_en_drop, 11472 (void *)&cmd_all_queues_drop_en_port_id, 11473 (void *)&cmd_all_queues_drop_en_on_off, 11474 NULL, 11475 }, 11476 }; 11477 11478 /* vf split drop enable configuration */ 11479 11480 /* Common result structure for vf split drop enable */ 11481 struct cmd_vf_split_drop_en_result { 11482 cmdline_fixed_string_t set; 11483 cmdline_fixed_string_t vf; 11484 cmdline_fixed_string_t split; 11485 cmdline_fixed_string_t drop; 11486 portid_t port_id; 11487 uint16_t vf_id; 11488 cmdline_fixed_string_t on_off; 11489 }; 11490 11491 /* Common CLI fields for vf split drop enable disable */ 11492 cmdline_parse_token_string_t cmd_vf_split_drop_en_set = 11493 TOKEN_STRING_INITIALIZER 11494 (struct cmd_vf_split_drop_en_result, 11495 set, "set"); 11496 cmdline_parse_token_string_t cmd_vf_split_drop_en_vf = 11497 TOKEN_STRING_INITIALIZER 11498 (struct cmd_vf_split_drop_en_result, 11499 vf, "vf"); 11500 cmdline_parse_token_string_t cmd_vf_split_drop_en_split = 11501 TOKEN_STRING_INITIALIZER 11502 (struct cmd_vf_split_drop_en_result, 11503 split, "split"); 11504 cmdline_parse_token_string_t cmd_vf_split_drop_en_drop = 11505 TOKEN_STRING_INITIALIZER 11506 (struct cmd_vf_split_drop_en_result, 11507 drop, "drop"); 11508 cmdline_parse_token_num_t cmd_vf_split_drop_en_port_id = 11509 TOKEN_NUM_INITIALIZER 11510 (struct cmd_vf_split_drop_en_result, 11511 port_id, RTE_UINT16); 11512 cmdline_parse_token_num_t cmd_vf_split_drop_en_vf_id = 11513 TOKEN_NUM_INITIALIZER 11514 (struct cmd_vf_split_drop_en_result, 11515 vf_id, RTE_UINT16); 11516 cmdline_parse_token_string_t cmd_vf_split_drop_en_on_off = 11517 TOKEN_STRING_INITIALIZER 11518 (struct cmd_vf_split_drop_en_result, 11519 on_off, "on#off"); 11520 11521 static void 11522 cmd_set_vf_split_drop_en_parsed( 11523 void *parsed_result, 11524 __rte_unused struct cmdline *cl, 11525 __rte_unused void *data) 11526 { 11527 struct cmd_vf_split_drop_en_result *res = parsed_result; 11528 int ret = -ENOTSUP; 11529 int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 11530 11531 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 11532 return; 11533 11534 #ifdef RTE_NET_IXGBE 11535 ret = rte_pmd_ixgbe_set_vf_split_drop_en(res->port_id, res->vf_id, 11536 is_on); 11537 #endif 11538 switch (ret) { 11539 case 0: 11540 break; 11541 case -EINVAL: 11542 printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on); 11543 break; 11544 case -ENODEV: 11545 printf("invalid port_id %d\n", res->port_id); 11546 break; 11547 case -ENOTSUP: 11548 printf("not supported on port %d\n", res->port_id); 11549 break; 11550 default: 11551 printf("programming error: (%s)\n", strerror(-ret)); 11552 } 11553 } 11554 11555 cmdline_parse_inst_t cmd_set_vf_split_drop_en = { 11556 .f = cmd_set_vf_split_drop_en_parsed, 11557 .data = NULL, 11558 .help_str = "set vf split drop <port_id> <vf_id> on|off", 11559 .tokens = { 11560 (void *)&cmd_vf_split_drop_en_set, 11561 (void *)&cmd_vf_split_drop_en_vf, 11562 (void *)&cmd_vf_split_drop_en_split, 11563 (void *)&cmd_vf_split_drop_en_drop, 11564 (void *)&cmd_vf_split_drop_en_port_id, 11565 (void *)&cmd_vf_split_drop_en_vf_id, 11566 (void *)&cmd_vf_split_drop_en_on_off, 11567 NULL, 11568 }, 11569 }; 11570 11571 /* vf mac address configuration */ 11572 11573 /* Common result structure for vf mac address */ 11574 struct cmd_set_vf_mac_addr_result { 11575 cmdline_fixed_string_t set; 11576 cmdline_fixed_string_t vf; 11577 cmdline_fixed_string_t mac; 11578 cmdline_fixed_string_t addr; 11579 portid_t port_id; 11580 uint16_t vf_id; 11581 struct rte_ether_addr mac_addr; 11582 11583 }; 11584 11585 /* Common CLI fields for vf split drop enable disable */ 11586 cmdline_parse_token_string_t cmd_set_vf_mac_addr_set = 11587 TOKEN_STRING_INITIALIZER 11588 (struct cmd_set_vf_mac_addr_result, 11589 set, "set"); 11590 cmdline_parse_token_string_t cmd_set_vf_mac_addr_vf = 11591 TOKEN_STRING_INITIALIZER 11592 (struct cmd_set_vf_mac_addr_result, 11593 vf, "vf"); 11594 cmdline_parse_token_string_t cmd_set_vf_mac_addr_mac = 11595 TOKEN_STRING_INITIALIZER 11596 (struct cmd_set_vf_mac_addr_result, 11597 mac, "mac"); 11598 cmdline_parse_token_string_t cmd_set_vf_mac_addr_addr = 11599 TOKEN_STRING_INITIALIZER 11600 (struct cmd_set_vf_mac_addr_result, 11601 addr, "addr"); 11602 cmdline_parse_token_num_t cmd_set_vf_mac_addr_port_id = 11603 TOKEN_NUM_INITIALIZER 11604 (struct cmd_set_vf_mac_addr_result, 11605 port_id, RTE_UINT16); 11606 cmdline_parse_token_num_t cmd_set_vf_mac_addr_vf_id = 11607 TOKEN_NUM_INITIALIZER 11608 (struct cmd_set_vf_mac_addr_result, 11609 vf_id, RTE_UINT16); 11610 cmdline_parse_token_etheraddr_t cmd_set_vf_mac_addr_mac_addr = 11611 TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_vf_mac_addr_result, 11612 mac_addr); 11613 11614 static void 11615 cmd_set_vf_mac_addr_parsed( 11616 void *parsed_result, 11617 __rte_unused struct cmdline *cl, 11618 __rte_unused void *data) 11619 { 11620 struct cmd_set_vf_mac_addr_result *res = parsed_result; 11621 int ret = -ENOTSUP; 11622 11623 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 11624 return; 11625 11626 #ifdef RTE_NET_IXGBE 11627 if (ret == -ENOTSUP) 11628 ret = rte_pmd_ixgbe_set_vf_mac_addr(res->port_id, res->vf_id, 11629 &res->mac_addr); 11630 #endif 11631 #ifdef RTE_NET_I40E 11632 if (ret == -ENOTSUP) 11633 ret = rte_pmd_i40e_set_vf_mac_addr(res->port_id, res->vf_id, 11634 &res->mac_addr); 11635 #endif 11636 #ifdef RTE_NET_BNXT 11637 if (ret == -ENOTSUP) 11638 ret = rte_pmd_bnxt_set_vf_mac_addr(res->port_id, res->vf_id, 11639 &res->mac_addr); 11640 #endif 11641 11642 switch (ret) { 11643 case 0: 11644 break; 11645 case -EINVAL: 11646 printf("invalid vf_id %d or mac_addr\n", res->vf_id); 11647 break; 11648 case -ENODEV: 11649 printf("invalid port_id %d\n", res->port_id); 11650 break; 11651 case -ENOTSUP: 11652 printf("function not implemented\n"); 11653 break; 11654 default: 11655 printf("programming error: (%s)\n", strerror(-ret)); 11656 } 11657 } 11658 11659 cmdline_parse_inst_t cmd_set_vf_mac_addr = { 11660 .f = cmd_set_vf_mac_addr_parsed, 11661 .data = NULL, 11662 .help_str = "set vf mac addr <port_id> <vf_id> <mac_addr>", 11663 .tokens = { 11664 (void *)&cmd_set_vf_mac_addr_set, 11665 (void *)&cmd_set_vf_mac_addr_vf, 11666 (void *)&cmd_set_vf_mac_addr_mac, 11667 (void *)&cmd_set_vf_mac_addr_addr, 11668 (void *)&cmd_set_vf_mac_addr_port_id, 11669 (void *)&cmd_set_vf_mac_addr_vf_id, 11670 (void *)&cmd_set_vf_mac_addr_mac_addr, 11671 NULL, 11672 }, 11673 }; 11674 11675 /* MACsec configuration */ 11676 11677 /* Common result structure for MACsec offload enable */ 11678 struct cmd_macsec_offload_on_result { 11679 cmdline_fixed_string_t set; 11680 cmdline_fixed_string_t macsec; 11681 cmdline_fixed_string_t offload; 11682 portid_t port_id; 11683 cmdline_fixed_string_t on; 11684 cmdline_fixed_string_t encrypt; 11685 cmdline_fixed_string_t en_on_off; 11686 cmdline_fixed_string_t replay_protect; 11687 cmdline_fixed_string_t rp_on_off; 11688 }; 11689 11690 /* Common CLI fields for MACsec offload disable */ 11691 cmdline_parse_token_string_t cmd_macsec_offload_on_set = 11692 TOKEN_STRING_INITIALIZER 11693 (struct cmd_macsec_offload_on_result, 11694 set, "set"); 11695 cmdline_parse_token_string_t cmd_macsec_offload_on_macsec = 11696 TOKEN_STRING_INITIALIZER 11697 (struct cmd_macsec_offload_on_result, 11698 macsec, "macsec"); 11699 cmdline_parse_token_string_t cmd_macsec_offload_on_offload = 11700 TOKEN_STRING_INITIALIZER 11701 (struct cmd_macsec_offload_on_result, 11702 offload, "offload"); 11703 cmdline_parse_token_num_t cmd_macsec_offload_on_port_id = 11704 TOKEN_NUM_INITIALIZER 11705 (struct cmd_macsec_offload_on_result, 11706 port_id, RTE_UINT16); 11707 cmdline_parse_token_string_t cmd_macsec_offload_on_on = 11708 TOKEN_STRING_INITIALIZER 11709 (struct cmd_macsec_offload_on_result, 11710 on, "on"); 11711 cmdline_parse_token_string_t cmd_macsec_offload_on_encrypt = 11712 TOKEN_STRING_INITIALIZER 11713 (struct cmd_macsec_offload_on_result, 11714 encrypt, "encrypt"); 11715 cmdline_parse_token_string_t cmd_macsec_offload_on_en_on_off = 11716 TOKEN_STRING_INITIALIZER 11717 (struct cmd_macsec_offload_on_result, 11718 en_on_off, "on#off"); 11719 cmdline_parse_token_string_t cmd_macsec_offload_on_replay_protect = 11720 TOKEN_STRING_INITIALIZER 11721 (struct cmd_macsec_offload_on_result, 11722 replay_protect, "replay-protect"); 11723 cmdline_parse_token_string_t cmd_macsec_offload_on_rp_on_off = 11724 TOKEN_STRING_INITIALIZER 11725 (struct cmd_macsec_offload_on_result, 11726 rp_on_off, "on#off"); 11727 11728 static void 11729 cmd_set_macsec_offload_on_parsed( 11730 void *parsed_result, 11731 __rte_unused struct cmdline *cl, 11732 __rte_unused void *data) 11733 { 11734 struct cmd_macsec_offload_on_result *res = parsed_result; 11735 int ret = -ENOTSUP; 11736 portid_t port_id = res->port_id; 11737 int en = (strcmp(res->en_on_off, "on") == 0) ? 1 : 0; 11738 int rp = (strcmp(res->rp_on_off, "on") == 0) ? 1 : 0; 11739 struct rte_eth_dev_info dev_info; 11740 11741 if (port_id_is_invalid(port_id, ENABLED_WARN)) 11742 return; 11743 if (!port_is_stopped(port_id)) { 11744 printf("Please stop port %d first\n", port_id); 11745 return; 11746 } 11747 11748 ret = eth_dev_info_get_print_err(port_id, &dev_info); 11749 if (ret != 0) 11750 return; 11751 11752 if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) { 11753 #ifdef RTE_NET_IXGBE 11754 ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp); 11755 #endif 11756 } 11757 RTE_SET_USED(en); 11758 RTE_SET_USED(rp); 11759 11760 switch (ret) { 11761 case 0: 11762 ports[port_id].dev_conf.txmode.offloads |= 11763 DEV_TX_OFFLOAD_MACSEC_INSERT; 11764 cmd_reconfig_device_queue(port_id, 1, 1); 11765 break; 11766 case -ENODEV: 11767 printf("invalid port_id %d\n", port_id); 11768 break; 11769 case -ENOTSUP: 11770 printf("not supported on port %d\n", port_id); 11771 break; 11772 default: 11773 printf("programming error: (%s)\n", strerror(-ret)); 11774 } 11775 } 11776 11777 cmdline_parse_inst_t cmd_set_macsec_offload_on = { 11778 .f = cmd_set_macsec_offload_on_parsed, 11779 .data = NULL, 11780 .help_str = "set macsec offload <port_id> on " 11781 "encrypt on|off replay-protect on|off", 11782 .tokens = { 11783 (void *)&cmd_macsec_offload_on_set, 11784 (void *)&cmd_macsec_offload_on_macsec, 11785 (void *)&cmd_macsec_offload_on_offload, 11786 (void *)&cmd_macsec_offload_on_port_id, 11787 (void *)&cmd_macsec_offload_on_on, 11788 (void *)&cmd_macsec_offload_on_encrypt, 11789 (void *)&cmd_macsec_offload_on_en_on_off, 11790 (void *)&cmd_macsec_offload_on_replay_protect, 11791 (void *)&cmd_macsec_offload_on_rp_on_off, 11792 NULL, 11793 }, 11794 }; 11795 11796 /* Common result structure for MACsec offload disable */ 11797 struct cmd_macsec_offload_off_result { 11798 cmdline_fixed_string_t set; 11799 cmdline_fixed_string_t macsec; 11800 cmdline_fixed_string_t offload; 11801 portid_t port_id; 11802 cmdline_fixed_string_t off; 11803 }; 11804 11805 /* Common CLI fields for MACsec offload disable */ 11806 cmdline_parse_token_string_t cmd_macsec_offload_off_set = 11807 TOKEN_STRING_INITIALIZER 11808 (struct cmd_macsec_offload_off_result, 11809 set, "set"); 11810 cmdline_parse_token_string_t cmd_macsec_offload_off_macsec = 11811 TOKEN_STRING_INITIALIZER 11812 (struct cmd_macsec_offload_off_result, 11813 macsec, "macsec"); 11814 cmdline_parse_token_string_t cmd_macsec_offload_off_offload = 11815 TOKEN_STRING_INITIALIZER 11816 (struct cmd_macsec_offload_off_result, 11817 offload, "offload"); 11818 cmdline_parse_token_num_t cmd_macsec_offload_off_port_id = 11819 TOKEN_NUM_INITIALIZER 11820 (struct cmd_macsec_offload_off_result, 11821 port_id, RTE_UINT16); 11822 cmdline_parse_token_string_t cmd_macsec_offload_off_off = 11823 TOKEN_STRING_INITIALIZER 11824 (struct cmd_macsec_offload_off_result, 11825 off, "off"); 11826 11827 static void 11828 cmd_set_macsec_offload_off_parsed( 11829 void *parsed_result, 11830 __rte_unused struct cmdline *cl, 11831 __rte_unused void *data) 11832 { 11833 struct cmd_macsec_offload_off_result *res = parsed_result; 11834 int ret = -ENOTSUP; 11835 struct rte_eth_dev_info dev_info; 11836 portid_t port_id = res->port_id; 11837 11838 if (port_id_is_invalid(port_id, ENABLED_WARN)) 11839 return; 11840 if (!port_is_stopped(port_id)) { 11841 printf("Please stop port %d first\n", port_id); 11842 return; 11843 } 11844 11845 ret = eth_dev_info_get_print_err(port_id, &dev_info); 11846 if (ret != 0) 11847 return; 11848 11849 if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) { 11850 #ifdef RTE_NET_IXGBE 11851 ret = rte_pmd_ixgbe_macsec_disable(port_id); 11852 #endif 11853 } 11854 switch (ret) { 11855 case 0: 11856 ports[port_id].dev_conf.txmode.offloads &= 11857 ~DEV_TX_OFFLOAD_MACSEC_INSERT; 11858 cmd_reconfig_device_queue(port_id, 1, 1); 11859 break; 11860 case -ENODEV: 11861 printf("invalid port_id %d\n", port_id); 11862 break; 11863 case -ENOTSUP: 11864 printf("not supported on port %d\n", port_id); 11865 break; 11866 default: 11867 printf("programming error: (%s)\n", strerror(-ret)); 11868 } 11869 } 11870 11871 cmdline_parse_inst_t cmd_set_macsec_offload_off = { 11872 .f = cmd_set_macsec_offload_off_parsed, 11873 .data = NULL, 11874 .help_str = "set macsec offload <port_id> off", 11875 .tokens = { 11876 (void *)&cmd_macsec_offload_off_set, 11877 (void *)&cmd_macsec_offload_off_macsec, 11878 (void *)&cmd_macsec_offload_off_offload, 11879 (void *)&cmd_macsec_offload_off_port_id, 11880 (void *)&cmd_macsec_offload_off_off, 11881 NULL, 11882 }, 11883 }; 11884 11885 /* Common result structure for MACsec secure connection configure */ 11886 struct cmd_macsec_sc_result { 11887 cmdline_fixed_string_t set; 11888 cmdline_fixed_string_t macsec; 11889 cmdline_fixed_string_t sc; 11890 cmdline_fixed_string_t tx_rx; 11891 portid_t port_id; 11892 struct rte_ether_addr mac; 11893 uint16_t pi; 11894 }; 11895 11896 /* Common CLI fields for MACsec secure connection configure */ 11897 cmdline_parse_token_string_t cmd_macsec_sc_set = 11898 TOKEN_STRING_INITIALIZER 11899 (struct cmd_macsec_sc_result, 11900 set, "set"); 11901 cmdline_parse_token_string_t cmd_macsec_sc_macsec = 11902 TOKEN_STRING_INITIALIZER 11903 (struct cmd_macsec_sc_result, 11904 macsec, "macsec"); 11905 cmdline_parse_token_string_t cmd_macsec_sc_sc = 11906 TOKEN_STRING_INITIALIZER 11907 (struct cmd_macsec_sc_result, 11908 sc, "sc"); 11909 cmdline_parse_token_string_t cmd_macsec_sc_tx_rx = 11910 TOKEN_STRING_INITIALIZER 11911 (struct cmd_macsec_sc_result, 11912 tx_rx, "tx#rx"); 11913 cmdline_parse_token_num_t cmd_macsec_sc_port_id = 11914 TOKEN_NUM_INITIALIZER 11915 (struct cmd_macsec_sc_result, 11916 port_id, RTE_UINT16); 11917 cmdline_parse_token_etheraddr_t cmd_macsec_sc_mac = 11918 TOKEN_ETHERADDR_INITIALIZER 11919 (struct cmd_macsec_sc_result, 11920 mac); 11921 cmdline_parse_token_num_t cmd_macsec_sc_pi = 11922 TOKEN_NUM_INITIALIZER 11923 (struct cmd_macsec_sc_result, 11924 pi, RTE_UINT16); 11925 11926 static void 11927 cmd_set_macsec_sc_parsed( 11928 void *parsed_result, 11929 __rte_unused struct cmdline *cl, 11930 __rte_unused void *data) 11931 { 11932 struct cmd_macsec_sc_result *res = parsed_result; 11933 int ret = -ENOTSUP; 11934 int is_tx = (strcmp(res->tx_rx, "tx") == 0) ? 1 : 0; 11935 11936 #ifdef RTE_NET_IXGBE 11937 ret = is_tx ? 11938 rte_pmd_ixgbe_macsec_config_txsc(res->port_id, 11939 res->mac.addr_bytes) : 11940 rte_pmd_ixgbe_macsec_config_rxsc(res->port_id, 11941 res->mac.addr_bytes, res->pi); 11942 #endif 11943 RTE_SET_USED(is_tx); 11944 11945 switch (ret) { 11946 case 0: 11947 break; 11948 case -ENODEV: 11949 printf("invalid port_id %d\n", res->port_id); 11950 break; 11951 case -ENOTSUP: 11952 printf("not supported on port %d\n", res->port_id); 11953 break; 11954 default: 11955 printf("programming error: (%s)\n", strerror(-ret)); 11956 } 11957 } 11958 11959 cmdline_parse_inst_t cmd_set_macsec_sc = { 11960 .f = cmd_set_macsec_sc_parsed, 11961 .data = NULL, 11962 .help_str = "set macsec sc tx|rx <port_id> <mac> <pi>", 11963 .tokens = { 11964 (void *)&cmd_macsec_sc_set, 11965 (void *)&cmd_macsec_sc_macsec, 11966 (void *)&cmd_macsec_sc_sc, 11967 (void *)&cmd_macsec_sc_tx_rx, 11968 (void *)&cmd_macsec_sc_port_id, 11969 (void *)&cmd_macsec_sc_mac, 11970 (void *)&cmd_macsec_sc_pi, 11971 NULL, 11972 }, 11973 }; 11974 11975 /* Common result structure for MACsec secure connection configure */ 11976 struct cmd_macsec_sa_result { 11977 cmdline_fixed_string_t set; 11978 cmdline_fixed_string_t macsec; 11979 cmdline_fixed_string_t sa; 11980 cmdline_fixed_string_t tx_rx; 11981 portid_t port_id; 11982 uint8_t idx; 11983 uint8_t an; 11984 uint32_t pn; 11985 cmdline_fixed_string_t key; 11986 }; 11987 11988 /* Common CLI fields for MACsec secure connection configure */ 11989 cmdline_parse_token_string_t cmd_macsec_sa_set = 11990 TOKEN_STRING_INITIALIZER 11991 (struct cmd_macsec_sa_result, 11992 set, "set"); 11993 cmdline_parse_token_string_t cmd_macsec_sa_macsec = 11994 TOKEN_STRING_INITIALIZER 11995 (struct cmd_macsec_sa_result, 11996 macsec, "macsec"); 11997 cmdline_parse_token_string_t cmd_macsec_sa_sa = 11998 TOKEN_STRING_INITIALIZER 11999 (struct cmd_macsec_sa_result, 12000 sa, "sa"); 12001 cmdline_parse_token_string_t cmd_macsec_sa_tx_rx = 12002 TOKEN_STRING_INITIALIZER 12003 (struct cmd_macsec_sa_result, 12004 tx_rx, "tx#rx"); 12005 cmdline_parse_token_num_t cmd_macsec_sa_port_id = 12006 TOKEN_NUM_INITIALIZER 12007 (struct cmd_macsec_sa_result, 12008 port_id, RTE_UINT16); 12009 cmdline_parse_token_num_t cmd_macsec_sa_idx = 12010 TOKEN_NUM_INITIALIZER 12011 (struct cmd_macsec_sa_result, 12012 idx, RTE_UINT8); 12013 cmdline_parse_token_num_t cmd_macsec_sa_an = 12014 TOKEN_NUM_INITIALIZER 12015 (struct cmd_macsec_sa_result, 12016 an, RTE_UINT8); 12017 cmdline_parse_token_num_t cmd_macsec_sa_pn = 12018 TOKEN_NUM_INITIALIZER 12019 (struct cmd_macsec_sa_result, 12020 pn, RTE_UINT32); 12021 cmdline_parse_token_string_t cmd_macsec_sa_key = 12022 TOKEN_STRING_INITIALIZER 12023 (struct cmd_macsec_sa_result, 12024 key, NULL); 12025 12026 static void 12027 cmd_set_macsec_sa_parsed( 12028 void *parsed_result, 12029 __rte_unused struct cmdline *cl, 12030 __rte_unused void *data) 12031 { 12032 struct cmd_macsec_sa_result *res = parsed_result; 12033 int ret = -ENOTSUP; 12034 int is_tx = (strcmp(res->tx_rx, "tx") == 0) ? 1 : 0; 12035 uint8_t key[16] = { 0 }; 12036 uint8_t xdgt0; 12037 uint8_t xdgt1; 12038 int key_len; 12039 int i; 12040 12041 key_len = strlen(res->key) / 2; 12042 if (key_len > 16) 12043 key_len = 16; 12044 12045 for (i = 0; i < key_len; i++) { 12046 xdgt0 = parse_and_check_key_hexa_digit(res->key, (i * 2)); 12047 if (xdgt0 == 0xFF) 12048 return; 12049 xdgt1 = parse_and_check_key_hexa_digit(res->key, (i * 2) + 1); 12050 if (xdgt1 == 0xFF) 12051 return; 12052 key[i] = (uint8_t) ((xdgt0 * 16) + xdgt1); 12053 } 12054 12055 #ifdef RTE_NET_IXGBE 12056 ret = is_tx ? 12057 rte_pmd_ixgbe_macsec_select_txsa(res->port_id, 12058 res->idx, res->an, res->pn, key) : 12059 rte_pmd_ixgbe_macsec_select_rxsa(res->port_id, 12060 res->idx, res->an, res->pn, key); 12061 #endif 12062 RTE_SET_USED(is_tx); 12063 RTE_SET_USED(key); 12064 12065 switch (ret) { 12066 case 0: 12067 break; 12068 case -EINVAL: 12069 printf("invalid idx %d or an %d\n", res->idx, res->an); 12070 break; 12071 case -ENODEV: 12072 printf("invalid port_id %d\n", res->port_id); 12073 break; 12074 case -ENOTSUP: 12075 printf("not supported on port %d\n", res->port_id); 12076 break; 12077 default: 12078 printf("programming error: (%s)\n", strerror(-ret)); 12079 } 12080 } 12081 12082 cmdline_parse_inst_t cmd_set_macsec_sa = { 12083 .f = cmd_set_macsec_sa_parsed, 12084 .data = NULL, 12085 .help_str = "set macsec sa tx|rx <port_id> <idx> <an> <pn> <key>", 12086 .tokens = { 12087 (void *)&cmd_macsec_sa_set, 12088 (void *)&cmd_macsec_sa_macsec, 12089 (void *)&cmd_macsec_sa_sa, 12090 (void *)&cmd_macsec_sa_tx_rx, 12091 (void *)&cmd_macsec_sa_port_id, 12092 (void *)&cmd_macsec_sa_idx, 12093 (void *)&cmd_macsec_sa_an, 12094 (void *)&cmd_macsec_sa_pn, 12095 (void *)&cmd_macsec_sa_key, 12096 NULL, 12097 }, 12098 }; 12099 12100 /* VF unicast promiscuous mode configuration */ 12101 12102 /* Common result structure for VF unicast promiscuous mode */ 12103 struct cmd_vf_promisc_result { 12104 cmdline_fixed_string_t set; 12105 cmdline_fixed_string_t vf; 12106 cmdline_fixed_string_t promisc; 12107 portid_t port_id; 12108 uint32_t vf_id; 12109 cmdline_fixed_string_t on_off; 12110 }; 12111 12112 /* Common CLI fields for VF unicast promiscuous mode enable disable */ 12113 cmdline_parse_token_string_t cmd_vf_promisc_set = 12114 TOKEN_STRING_INITIALIZER 12115 (struct cmd_vf_promisc_result, 12116 set, "set"); 12117 cmdline_parse_token_string_t cmd_vf_promisc_vf = 12118 TOKEN_STRING_INITIALIZER 12119 (struct cmd_vf_promisc_result, 12120 vf, "vf"); 12121 cmdline_parse_token_string_t cmd_vf_promisc_promisc = 12122 TOKEN_STRING_INITIALIZER 12123 (struct cmd_vf_promisc_result, 12124 promisc, "promisc"); 12125 cmdline_parse_token_num_t cmd_vf_promisc_port_id = 12126 TOKEN_NUM_INITIALIZER 12127 (struct cmd_vf_promisc_result, 12128 port_id, RTE_UINT16); 12129 cmdline_parse_token_num_t cmd_vf_promisc_vf_id = 12130 TOKEN_NUM_INITIALIZER 12131 (struct cmd_vf_promisc_result, 12132 vf_id, RTE_UINT32); 12133 cmdline_parse_token_string_t cmd_vf_promisc_on_off = 12134 TOKEN_STRING_INITIALIZER 12135 (struct cmd_vf_promisc_result, 12136 on_off, "on#off"); 12137 12138 static void 12139 cmd_set_vf_promisc_parsed( 12140 void *parsed_result, 12141 __rte_unused struct cmdline *cl, 12142 __rte_unused void *data) 12143 { 12144 struct cmd_vf_promisc_result *res = parsed_result; 12145 int ret = -ENOTSUP; 12146 12147 __rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 12148 12149 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 12150 return; 12151 12152 #ifdef RTE_NET_I40E 12153 ret = rte_pmd_i40e_set_vf_unicast_promisc(res->port_id, 12154 res->vf_id, is_on); 12155 #endif 12156 12157 switch (ret) { 12158 case 0: 12159 break; 12160 case -EINVAL: 12161 printf("invalid vf_id %d\n", res->vf_id); 12162 break; 12163 case -ENODEV: 12164 printf("invalid port_id %d\n", res->port_id); 12165 break; 12166 case -ENOTSUP: 12167 printf("function not implemented\n"); 12168 break; 12169 default: 12170 printf("programming error: (%s)\n", strerror(-ret)); 12171 } 12172 } 12173 12174 cmdline_parse_inst_t cmd_set_vf_promisc = { 12175 .f = cmd_set_vf_promisc_parsed, 12176 .data = NULL, 12177 .help_str = "set vf promisc <port_id> <vf_id> on|off: " 12178 "Set unicast promiscuous mode for a VF from the PF", 12179 .tokens = { 12180 (void *)&cmd_vf_promisc_set, 12181 (void *)&cmd_vf_promisc_vf, 12182 (void *)&cmd_vf_promisc_promisc, 12183 (void *)&cmd_vf_promisc_port_id, 12184 (void *)&cmd_vf_promisc_vf_id, 12185 (void *)&cmd_vf_promisc_on_off, 12186 NULL, 12187 }, 12188 }; 12189 12190 /* VF multicast promiscuous mode configuration */ 12191 12192 /* Common result structure for VF multicast promiscuous mode */ 12193 struct cmd_vf_allmulti_result { 12194 cmdline_fixed_string_t set; 12195 cmdline_fixed_string_t vf; 12196 cmdline_fixed_string_t allmulti; 12197 portid_t port_id; 12198 uint32_t vf_id; 12199 cmdline_fixed_string_t on_off; 12200 }; 12201 12202 /* Common CLI fields for VF multicast promiscuous mode enable disable */ 12203 cmdline_parse_token_string_t cmd_vf_allmulti_set = 12204 TOKEN_STRING_INITIALIZER 12205 (struct cmd_vf_allmulti_result, 12206 set, "set"); 12207 cmdline_parse_token_string_t cmd_vf_allmulti_vf = 12208 TOKEN_STRING_INITIALIZER 12209 (struct cmd_vf_allmulti_result, 12210 vf, "vf"); 12211 cmdline_parse_token_string_t cmd_vf_allmulti_allmulti = 12212 TOKEN_STRING_INITIALIZER 12213 (struct cmd_vf_allmulti_result, 12214 allmulti, "allmulti"); 12215 cmdline_parse_token_num_t cmd_vf_allmulti_port_id = 12216 TOKEN_NUM_INITIALIZER 12217 (struct cmd_vf_allmulti_result, 12218 port_id, RTE_UINT16); 12219 cmdline_parse_token_num_t cmd_vf_allmulti_vf_id = 12220 TOKEN_NUM_INITIALIZER 12221 (struct cmd_vf_allmulti_result, 12222 vf_id, RTE_UINT32); 12223 cmdline_parse_token_string_t cmd_vf_allmulti_on_off = 12224 TOKEN_STRING_INITIALIZER 12225 (struct cmd_vf_allmulti_result, 12226 on_off, "on#off"); 12227 12228 static void 12229 cmd_set_vf_allmulti_parsed( 12230 void *parsed_result, 12231 __rte_unused struct cmdline *cl, 12232 __rte_unused void *data) 12233 { 12234 struct cmd_vf_allmulti_result *res = parsed_result; 12235 int ret = -ENOTSUP; 12236 12237 __rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 12238 12239 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 12240 return; 12241 12242 #ifdef RTE_NET_I40E 12243 ret = rte_pmd_i40e_set_vf_multicast_promisc(res->port_id, 12244 res->vf_id, is_on); 12245 #endif 12246 12247 switch (ret) { 12248 case 0: 12249 break; 12250 case -EINVAL: 12251 printf("invalid vf_id %d\n", res->vf_id); 12252 break; 12253 case -ENODEV: 12254 printf("invalid port_id %d\n", res->port_id); 12255 break; 12256 case -ENOTSUP: 12257 printf("function not implemented\n"); 12258 break; 12259 default: 12260 printf("programming error: (%s)\n", strerror(-ret)); 12261 } 12262 } 12263 12264 cmdline_parse_inst_t cmd_set_vf_allmulti = { 12265 .f = cmd_set_vf_allmulti_parsed, 12266 .data = NULL, 12267 .help_str = "set vf allmulti <port_id> <vf_id> on|off: " 12268 "Set multicast promiscuous mode for a VF from the PF", 12269 .tokens = { 12270 (void *)&cmd_vf_allmulti_set, 12271 (void *)&cmd_vf_allmulti_vf, 12272 (void *)&cmd_vf_allmulti_allmulti, 12273 (void *)&cmd_vf_allmulti_port_id, 12274 (void *)&cmd_vf_allmulti_vf_id, 12275 (void *)&cmd_vf_allmulti_on_off, 12276 NULL, 12277 }, 12278 }; 12279 12280 /* vf broadcast mode configuration */ 12281 12282 /* Common result structure for vf broadcast */ 12283 struct cmd_set_vf_broadcast_result { 12284 cmdline_fixed_string_t set; 12285 cmdline_fixed_string_t vf; 12286 cmdline_fixed_string_t broadcast; 12287 portid_t port_id; 12288 uint16_t vf_id; 12289 cmdline_fixed_string_t on_off; 12290 }; 12291 12292 /* Common CLI fields for vf broadcast enable disable */ 12293 cmdline_parse_token_string_t cmd_set_vf_broadcast_set = 12294 TOKEN_STRING_INITIALIZER 12295 (struct cmd_set_vf_broadcast_result, 12296 set, "set"); 12297 cmdline_parse_token_string_t cmd_set_vf_broadcast_vf = 12298 TOKEN_STRING_INITIALIZER 12299 (struct cmd_set_vf_broadcast_result, 12300 vf, "vf"); 12301 cmdline_parse_token_string_t cmd_set_vf_broadcast_broadcast = 12302 TOKEN_STRING_INITIALIZER 12303 (struct cmd_set_vf_broadcast_result, 12304 broadcast, "broadcast"); 12305 cmdline_parse_token_num_t cmd_set_vf_broadcast_port_id = 12306 TOKEN_NUM_INITIALIZER 12307 (struct cmd_set_vf_broadcast_result, 12308 port_id, RTE_UINT16); 12309 cmdline_parse_token_num_t cmd_set_vf_broadcast_vf_id = 12310 TOKEN_NUM_INITIALIZER 12311 (struct cmd_set_vf_broadcast_result, 12312 vf_id, RTE_UINT16); 12313 cmdline_parse_token_string_t cmd_set_vf_broadcast_on_off = 12314 TOKEN_STRING_INITIALIZER 12315 (struct cmd_set_vf_broadcast_result, 12316 on_off, "on#off"); 12317 12318 static void 12319 cmd_set_vf_broadcast_parsed( 12320 void *parsed_result, 12321 __rte_unused struct cmdline *cl, 12322 __rte_unused void *data) 12323 { 12324 struct cmd_set_vf_broadcast_result *res = parsed_result; 12325 int ret = -ENOTSUP; 12326 12327 __rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 12328 12329 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 12330 return; 12331 12332 #ifdef RTE_NET_I40E 12333 ret = rte_pmd_i40e_set_vf_broadcast(res->port_id, 12334 res->vf_id, is_on); 12335 #endif 12336 12337 switch (ret) { 12338 case 0: 12339 break; 12340 case -EINVAL: 12341 printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on); 12342 break; 12343 case -ENODEV: 12344 printf("invalid port_id %d\n", res->port_id); 12345 break; 12346 case -ENOTSUP: 12347 printf("function not implemented\n"); 12348 break; 12349 default: 12350 printf("programming error: (%s)\n", strerror(-ret)); 12351 } 12352 } 12353 12354 cmdline_parse_inst_t cmd_set_vf_broadcast = { 12355 .f = cmd_set_vf_broadcast_parsed, 12356 .data = NULL, 12357 .help_str = "set vf broadcast <port_id> <vf_id> on|off", 12358 .tokens = { 12359 (void *)&cmd_set_vf_broadcast_set, 12360 (void *)&cmd_set_vf_broadcast_vf, 12361 (void *)&cmd_set_vf_broadcast_broadcast, 12362 (void *)&cmd_set_vf_broadcast_port_id, 12363 (void *)&cmd_set_vf_broadcast_vf_id, 12364 (void *)&cmd_set_vf_broadcast_on_off, 12365 NULL, 12366 }, 12367 }; 12368 12369 /* vf vlan tag configuration */ 12370 12371 /* Common result structure for vf vlan tag */ 12372 struct cmd_set_vf_vlan_tag_result { 12373 cmdline_fixed_string_t set; 12374 cmdline_fixed_string_t vf; 12375 cmdline_fixed_string_t vlan; 12376 cmdline_fixed_string_t tag; 12377 portid_t port_id; 12378 uint16_t vf_id; 12379 cmdline_fixed_string_t on_off; 12380 }; 12381 12382 /* Common CLI fields for vf vlan tag enable disable */ 12383 cmdline_parse_token_string_t cmd_set_vf_vlan_tag_set = 12384 TOKEN_STRING_INITIALIZER 12385 (struct cmd_set_vf_vlan_tag_result, 12386 set, "set"); 12387 cmdline_parse_token_string_t cmd_set_vf_vlan_tag_vf = 12388 TOKEN_STRING_INITIALIZER 12389 (struct cmd_set_vf_vlan_tag_result, 12390 vf, "vf"); 12391 cmdline_parse_token_string_t cmd_set_vf_vlan_tag_vlan = 12392 TOKEN_STRING_INITIALIZER 12393 (struct cmd_set_vf_vlan_tag_result, 12394 vlan, "vlan"); 12395 cmdline_parse_token_string_t cmd_set_vf_vlan_tag_tag = 12396 TOKEN_STRING_INITIALIZER 12397 (struct cmd_set_vf_vlan_tag_result, 12398 tag, "tag"); 12399 cmdline_parse_token_num_t cmd_set_vf_vlan_tag_port_id = 12400 TOKEN_NUM_INITIALIZER 12401 (struct cmd_set_vf_vlan_tag_result, 12402 port_id, RTE_UINT16); 12403 cmdline_parse_token_num_t cmd_set_vf_vlan_tag_vf_id = 12404 TOKEN_NUM_INITIALIZER 12405 (struct cmd_set_vf_vlan_tag_result, 12406 vf_id, RTE_UINT16); 12407 cmdline_parse_token_string_t cmd_set_vf_vlan_tag_on_off = 12408 TOKEN_STRING_INITIALIZER 12409 (struct cmd_set_vf_vlan_tag_result, 12410 on_off, "on#off"); 12411 12412 static void 12413 cmd_set_vf_vlan_tag_parsed( 12414 void *parsed_result, 12415 __rte_unused struct cmdline *cl, 12416 __rte_unused void *data) 12417 { 12418 struct cmd_set_vf_vlan_tag_result *res = parsed_result; 12419 int ret = -ENOTSUP; 12420 12421 __rte_unused int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0; 12422 12423 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 12424 return; 12425 12426 #ifdef RTE_NET_I40E 12427 ret = rte_pmd_i40e_set_vf_vlan_tag(res->port_id, 12428 res->vf_id, is_on); 12429 #endif 12430 12431 switch (ret) { 12432 case 0: 12433 break; 12434 case -EINVAL: 12435 printf("invalid vf_id %d or is_on %d\n", res->vf_id, is_on); 12436 break; 12437 case -ENODEV: 12438 printf("invalid port_id %d\n", res->port_id); 12439 break; 12440 case -ENOTSUP: 12441 printf("function not implemented\n"); 12442 break; 12443 default: 12444 printf("programming error: (%s)\n", strerror(-ret)); 12445 } 12446 } 12447 12448 cmdline_parse_inst_t cmd_set_vf_vlan_tag = { 12449 .f = cmd_set_vf_vlan_tag_parsed, 12450 .data = NULL, 12451 .help_str = "set vf vlan tag <port_id> <vf_id> on|off", 12452 .tokens = { 12453 (void *)&cmd_set_vf_vlan_tag_set, 12454 (void *)&cmd_set_vf_vlan_tag_vf, 12455 (void *)&cmd_set_vf_vlan_tag_vlan, 12456 (void *)&cmd_set_vf_vlan_tag_tag, 12457 (void *)&cmd_set_vf_vlan_tag_port_id, 12458 (void *)&cmd_set_vf_vlan_tag_vf_id, 12459 (void *)&cmd_set_vf_vlan_tag_on_off, 12460 NULL, 12461 }, 12462 }; 12463 12464 /* Common definition of VF and TC TX bandwidth configuration */ 12465 struct cmd_vf_tc_bw_result { 12466 cmdline_fixed_string_t set; 12467 cmdline_fixed_string_t vf; 12468 cmdline_fixed_string_t tc; 12469 cmdline_fixed_string_t tx; 12470 cmdline_fixed_string_t min_bw; 12471 cmdline_fixed_string_t max_bw; 12472 cmdline_fixed_string_t strict_link_prio; 12473 portid_t port_id; 12474 uint16_t vf_id; 12475 uint8_t tc_no; 12476 uint32_t bw; 12477 cmdline_fixed_string_t bw_list; 12478 uint8_t tc_map; 12479 }; 12480 12481 cmdline_parse_token_string_t cmd_vf_tc_bw_set = 12482 TOKEN_STRING_INITIALIZER 12483 (struct cmd_vf_tc_bw_result, 12484 set, "set"); 12485 cmdline_parse_token_string_t cmd_vf_tc_bw_vf = 12486 TOKEN_STRING_INITIALIZER 12487 (struct cmd_vf_tc_bw_result, 12488 vf, "vf"); 12489 cmdline_parse_token_string_t cmd_vf_tc_bw_tc = 12490 TOKEN_STRING_INITIALIZER 12491 (struct cmd_vf_tc_bw_result, 12492 tc, "tc"); 12493 cmdline_parse_token_string_t cmd_vf_tc_bw_tx = 12494 TOKEN_STRING_INITIALIZER 12495 (struct cmd_vf_tc_bw_result, 12496 tx, "tx"); 12497 cmdline_parse_token_string_t cmd_vf_tc_bw_strict_link_prio = 12498 TOKEN_STRING_INITIALIZER 12499 (struct cmd_vf_tc_bw_result, 12500 strict_link_prio, "strict-link-priority"); 12501 cmdline_parse_token_string_t cmd_vf_tc_bw_min_bw = 12502 TOKEN_STRING_INITIALIZER 12503 (struct cmd_vf_tc_bw_result, 12504 min_bw, "min-bandwidth"); 12505 cmdline_parse_token_string_t cmd_vf_tc_bw_max_bw = 12506 TOKEN_STRING_INITIALIZER 12507 (struct cmd_vf_tc_bw_result, 12508 max_bw, "max-bandwidth"); 12509 cmdline_parse_token_num_t cmd_vf_tc_bw_port_id = 12510 TOKEN_NUM_INITIALIZER 12511 (struct cmd_vf_tc_bw_result, 12512 port_id, RTE_UINT16); 12513 cmdline_parse_token_num_t cmd_vf_tc_bw_vf_id = 12514 TOKEN_NUM_INITIALIZER 12515 (struct cmd_vf_tc_bw_result, 12516 vf_id, RTE_UINT16); 12517 cmdline_parse_token_num_t cmd_vf_tc_bw_tc_no = 12518 TOKEN_NUM_INITIALIZER 12519 (struct cmd_vf_tc_bw_result, 12520 tc_no, RTE_UINT8); 12521 cmdline_parse_token_num_t cmd_vf_tc_bw_bw = 12522 TOKEN_NUM_INITIALIZER 12523 (struct cmd_vf_tc_bw_result, 12524 bw, RTE_UINT32); 12525 cmdline_parse_token_string_t cmd_vf_tc_bw_bw_list = 12526 TOKEN_STRING_INITIALIZER 12527 (struct cmd_vf_tc_bw_result, 12528 bw_list, NULL); 12529 cmdline_parse_token_num_t cmd_vf_tc_bw_tc_map = 12530 TOKEN_NUM_INITIALIZER 12531 (struct cmd_vf_tc_bw_result, 12532 tc_map, RTE_UINT8); 12533 12534 /* VF max bandwidth setting */ 12535 static void 12536 cmd_vf_max_bw_parsed( 12537 void *parsed_result, 12538 __rte_unused struct cmdline *cl, 12539 __rte_unused void *data) 12540 { 12541 struct cmd_vf_tc_bw_result *res = parsed_result; 12542 int ret = -ENOTSUP; 12543 12544 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 12545 return; 12546 12547 #ifdef RTE_NET_I40E 12548 ret = rte_pmd_i40e_set_vf_max_bw(res->port_id, 12549 res->vf_id, res->bw); 12550 #endif 12551 12552 switch (ret) { 12553 case 0: 12554 break; 12555 case -EINVAL: 12556 printf("invalid vf_id %d or bandwidth %d\n", 12557 res->vf_id, res->bw); 12558 break; 12559 case -ENODEV: 12560 printf("invalid port_id %d\n", res->port_id); 12561 break; 12562 case -ENOTSUP: 12563 printf("function not implemented\n"); 12564 break; 12565 default: 12566 printf("programming error: (%s)\n", strerror(-ret)); 12567 } 12568 } 12569 12570 cmdline_parse_inst_t cmd_vf_max_bw = { 12571 .f = cmd_vf_max_bw_parsed, 12572 .data = NULL, 12573 .help_str = "set vf tx max-bandwidth <port_id> <vf_id> <bandwidth>", 12574 .tokens = { 12575 (void *)&cmd_vf_tc_bw_set, 12576 (void *)&cmd_vf_tc_bw_vf, 12577 (void *)&cmd_vf_tc_bw_tx, 12578 (void *)&cmd_vf_tc_bw_max_bw, 12579 (void *)&cmd_vf_tc_bw_port_id, 12580 (void *)&cmd_vf_tc_bw_vf_id, 12581 (void *)&cmd_vf_tc_bw_bw, 12582 NULL, 12583 }, 12584 }; 12585 12586 static int 12587 vf_tc_min_bw_parse_bw_list(uint8_t *bw_list, 12588 uint8_t *tc_num, 12589 char *str) 12590 { 12591 uint32_t size; 12592 const char *p, *p0 = str; 12593 char s[256]; 12594 char *end; 12595 char *str_fld[16]; 12596 uint16_t i; 12597 int ret; 12598 12599 p = strchr(p0, '('); 12600 if (p == NULL) { 12601 printf("The bandwidth-list should be '(bw1, bw2, ...)'\n"); 12602 return -1; 12603 } 12604 p++; 12605 p0 = strchr(p, ')'); 12606 if (p0 == NULL) { 12607 printf("The bandwidth-list should be '(bw1, bw2, ...)'\n"); 12608 return -1; 12609 } 12610 size = p0 - p; 12611 if (size >= sizeof(s)) { 12612 printf("The string size exceeds the internal buffer size\n"); 12613 return -1; 12614 } 12615 snprintf(s, sizeof(s), "%.*s", size, p); 12616 ret = rte_strsplit(s, sizeof(s), str_fld, 16, ','); 12617 if (ret <= 0) { 12618 printf("Failed to get the bandwidth list. "); 12619 return -1; 12620 } 12621 *tc_num = ret; 12622 for (i = 0; i < ret; i++) 12623 bw_list[i] = (uint8_t)strtoul(str_fld[i], &end, 0); 12624 12625 return 0; 12626 } 12627 12628 /* TC min bandwidth setting */ 12629 static void 12630 cmd_vf_tc_min_bw_parsed( 12631 void *parsed_result, 12632 __rte_unused struct cmdline *cl, 12633 __rte_unused void *data) 12634 { 12635 struct cmd_vf_tc_bw_result *res = parsed_result; 12636 uint8_t tc_num; 12637 uint8_t bw[16]; 12638 int ret = -ENOTSUP; 12639 12640 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 12641 return; 12642 12643 ret = vf_tc_min_bw_parse_bw_list(bw, &tc_num, res->bw_list); 12644 if (ret) 12645 return; 12646 12647 #ifdef RTE_NET_I40E 12648 ret = rte_pmd_i40e_set_vf_tc_bw_alloc(res->port_id, res->vf_id, 12649 tc_num, bw); 12650 #endif 12651 12652 switch (ret) { 12653 case 0: 12654 break; 12655 case -EINVAL: 12656 printf("invalid vf_id %d or bandwidth\n", res->vf_id); 12657 break; 12658 case -ENODEV: 12659 printf("invalid port_id %d\n", res->port_id); 12660 break; 12661 case -ENOTSUP: 12662 printf("function not implemented\n"); 12663 break; 12664 default: 12665 printf("programming error: (%s)\n", strerror(-ret)); 12666 } 12667 } 12668 12669 cmdline_parse_inst_t cmd_vf_tc_min_bw = { 12670 .f = cmd_vf_tc_min_bw_parsed, 12671 .data = NULL, 12672 .help_str = "set vf tc tx min-bandwidth <port_id> <vf_id>" 12673 " <bw1, bw2, ...>", 12674 .tokens = { 12675 (void *)&cmd_vf_tc_bw_set, 12676 (void *)&cmd_vf_tc_bw_vf, 12677 (void *)&cmd_vf_tc_bw_tc, 12678 (void *)&cmd_vf_tc_bw_tx, 12679 (void *)&cmd_vf_tc_bw_min_bw, 12680 (void *)&cmd_vf_tc_bw_port_id, 12681 (void *)&cmd_vf_tc_bw_vf_id, 12682 (void *)&cmd_vf_tc_bw_bw_list, 12683 NULL, 12684 }, 12685 }; 12686 12687 static void 12688 cmd_tc_min_bw_parsed( 12689 void *parsed_result, 12690 __rte_unused struct cmdline *cl, 12691 __rte_unused void *data) 12692 { 12693 struct cmd_vf_tc_bw_result *res = parsed_result; 12694 struct rte_port *port; 12695 uint8_t tc_num; 12696 uint8_t bw[16]; 12697 int ret = -ENOTSUP; 12698 12699 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 12700 return; 12701 12702 port = &ports[res->port_id]; 12703 /** Check if the port is not started **/ 12704 if (port->port_status != RTE_PORT_STOPPED) { 12705 printf("Please stop port %d first\n", res->port_id); 12706 return; 12707 } 12708 12709 ret = vf_tc_min_bw_parse_bw_list(bw, &tc_num, res->bw_list); 12710 if (ret) 12711 return; 12712 12713 #ifdef RTE_NET_IXGBE 12714 ret = rte_pmd_ixgbe_set_tc_bw_alloc(res->port_id, tc_num, bw); 12715 #endif 12716 12717 switch (ret) { 12718 case 0: 12719 break; 12720 case -EINVAL: 12721 printf("invalid bandwidth\n"); 12722 break; 12723 case -ENODEV: 12724 printf("invalid port_id %d\n", res->port_id); 12725 break; 12726 case -ENOTSUP: 12727 printf("function not implemented\n"); 12728 break; 12729 default: 12730 printf("programming error: (%s)\n", strerror(-ret)); 12731 } 12732 } 12733 12734 cmdline_parse_inst_t cmd_tc_min_bw = { 12735 .f = cmd_tc_min_bw_parsed, 12736 .data = NULL, 12737 .help_str = "set tc tx min-bandwidth <port_id> <bw1, bw2, ...>", 12738 .tokens = { 12739 (void *)&cmd_vf_tc_bw_set, 12740 (void *)&cmd_vf_tc_bw_tc, 12741 (void *)&cmd_vf_tc_bw_tx, 12742 (void *)&cmd_vf_tc_bw_min_bw, 12743 (void *)&cmd_vf_tc_bw_port_id, 12744 (void *)&cmd_vf_tc_bw_bw_list, 12745 NULL, 12746 }, 12747 }; 12748 12749 /* TC max bandwidth setting */ 12750 static void 12751 cmd_vf_tc_max_bw_parsed( 12752 void *parsed_result, 12753 __rte_unused struct cmdline *cl, 12754 __rte_unused void *data) 12755 { 12756 struct cmd_vf_tc_bw_result *res = parsed_result; 12757 int ret = -ENOTSUP; 12758 12759 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 12760 return; 12761 12762 #ifdef RTE_NET_I40E 12763 ret = rte_pmd_i40e_set_vf_tc_max_bw(res->port_id, res->vf_id, 12764 res->tc_no, res->bw); 12765 #endif 12766 12767 switch (ret) { 12768 case 0: 12769 break; 12770 case -EINVAL: 12771 printf("invalid vf_id %d, tc_no %d or bandwidth %d\n", 12772 res->vf_id, res->tc_no, res->bw); 12773 break; 12774 case -ENODEV: 12775 printf("invalid port_id %d\n", res->port_id); 12776 break; 12777 case -ENOTSUP: 12778 printf("function not implemented\n"); 12779 break; 12780 default: 12781 printf("programming error: (%s)\n", strerror(-ret)); 12782 } 12783 } 12784 12785 cmdline_parse_inst_t cmd_vf_tc_max_bw = { 12786 .f = cmd_vf_tc_max_bw_parsed, 12787 .data = NULL, 12788 .help_str = "set vf tc tx max-bandwidth <port_id> <vf_id> <tc_no>" 12789 " <bandwidth>", 12790 .tokens = { 12791 (void *)&cmd_vf_tc_bw_set, 12792 (void *)&cmd_vf_tc_bw_vf, 12793 (void *)&cmd_vf_tc_bw_tc, 12794 (void *)&cmd_vf_tc_bw_tx, 12795 (void *)&cmd_vf_tc_bw_max_bw, 12796 (void *)&cmd_vf_tc_bw_port_id, 12797 (void *)&cmd_vf_tc_bw_vf_id, 12798 (void *)&cmd_vf_tc_bw_tc_no, 12799 (void *)&cmd_vf_tc_bw_bw, 12800 NULL, 12801 }, 12802 }; 12803 12804 /** Set VXLAN encapsulation details */ 12805 struct cmd_set_vxlan_result { 12806 cmdline_fixed_string_t set; 12807 cmdline_fixed_string_t vxlan; 12808 cmdline_fixed_string_t pos_token; 12809 cmdline_fixed_string_t ip_version; 12810 uint32_t vlan_present:1; 12811 uint32_t vni; 12812 uint16_t udp_src; 12813 uint16_t udp_dst; 12814 cmdline_ipaddr_t ip_src; 12815 cmdline_ipaddr_t ip_dst; 12816 uint16_t tci; 12817 uint8_t tos; 12818 uint8_t ttl; 12819 struct rte_ether_addr eth_src; 12820 struct rte_ether_addr eth_dst; 12821 }; 12822 12823 cmdline_parse_token_string_t cmd_set_vxlan_set = 12824 TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, set, "set"); 12825 cmdline_parse_token_string_t cmd_set_vxlan_vxlan = 12826 TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, vxlan, "vxlan"); 12827 cmdline_parse_token_string_t cmd_set_vxlan_vxlan_tos_ttl = 12828 TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, vxlan, 12829 "vxlan-tos-ttl"); 12830 cmdline_parse_token_string_t cmd_set_vxlan_vxlan_with_vlan = 12831 TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, vxlan, 12832 "vxlan-with-vlan"); 12833 cmdline_parse_token_string_t cmd_set_vxlan_ip_version = 12834 TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token, 12835 "ip-version"); 12836 cmdline_parse_token_string_t cmd_set_vxlan_ip_version_value = 12837 TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, ip_version, 12838 "ipv4#ipv6"); 12839 cmdline_parse_token_string_t cmd_set_vxlan_vni = 12840 TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token, 12841 "vni"); 12842 cmdline_parse_token_num_t cmd_set_vxlan_vni_value = 12843 TOKEN_NUM_INITIALIZER(struct cmd_set_vxlan_result, vni, RTE_UINT32); 12844 cmdline_parse_token_string_t cmd_set_vxlan_udp_src = 12845 TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token, 12846 "udp-src"); 12847 cmdline_parse_token_num_t cmd_set_vxlan_udp_src_value = 12848 TOKEN_NUM_INITIALIZER(struct cmd_set_vxlan_result, udp_src, RTE_UINT16); 12849 cmdline_parse_token_string_t cmd_set_vxlan_udp_dst = 12850 TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token, 12851 "udp-dst"); 12852 cmdline_parse_token_num_t cmd_set_vxlan_udp_dst_value = 12853 TOKEN_NUM_INITIALIZER(struct cmd_set_vxlan_result, udp_dst, RTE_UINT16); 12854 cmdline_parse_token_string_t cmd_set_vxlan_ip_tos = 12855 TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token, 12856 "ip-tos"); 12857 cmdline_parse_token_num_t cmd_set_vxlan_ip_tos_value = 12858 TOKEN_NUM_INITIALIZER(struct cmd_set_vxlan_result, tos, RTE_UINT8); 12859 cmdline_parse_token_string_t cmd_set_vxlan_ip_ttl = 12860 TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token, 12861 "ip-ttl"); 12862 cmdline_parse_token_num_t cmd_set_vxlan_ip_ttl_value = 12863 TOKEN_NUM_INITIALIZER(struct cmd_set_vxlan_result, ttl, RTE_UINT8); 12864 cmdline_parse_token_string_t cmd_set_vxlan_ip_src = 12865 TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token, 12866 "ip-src"); 12867 cmdline_parse_token_ipaddr_t cmd_set_vxlan_ip_src_value = 12868 TOKEN_IPADDR_INITIALIZER(struct cmd_set_vxlan_result, ip_src); 12869 cmdline_parse_token_string_t cmd_set_vxlan_ip_dst = 12870 TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token, 12871 "ip-dst"); 12872 cmdline_parse_token_ipaddr_t cmd_set_vxlan_ip_dst_value = 12873 TOKEN_IPADDR_INITIALIZER(struct cmd_set_vxlan_result, ip_dst); 12874 cmdline_parse_token_string_t cmd_set_vxlan_vlan = 12875 TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token, 12876 "vlan-tci"); 12877 cmdline_parse_token_num_t cmd_set_vxlan_vlan_value = 12878 TOKEN_NUM_INITIALIZER(struct cmd_set_vxlan_result, tci, RTE_UINT16); 12879 cmdline_parse_token_string_t cmd_set_vxlan_eth_src = 12880 TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token, 12881 "eth-src"); 12882 cmdline_parse_token_etheraddr_t cmd_set_vxlan_eth_src_value = 12883 TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_vxlan_result, eth_src); 12884 cmdline_parse_token_string_t cmd_set_vxlan_eth_dst = 12885 TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token, 12886 "eth-dst"); 12887 cmdline_parse_token_etheraddr_t cmd_set_vxlan_eth_dst_value = 12888 TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_vxlan_result, eth_dst); 12889 12890 static void cmd_set_vxlan_parsed(void *parsed_result, 12891 __rte_unused struct cmdline *cl, 12892 __rte_unused void *data) 12893 { 12894 struct cmd_set_vxlan_result *res = parsed_result; 12895 union { 12896 uint32_t vxlan_id; 12897 uint8_t vni[4]; 12898 } id = { 12899 .vxlan_id = rte_cpu_to_be_32(res->vni) & RTE_BE32(0x00ffffff), 12900 }; 12901 12902 vxlan_encap_conf.select_tos_ttl = 0; 12903 if (strcmp(res->vxlan, "vxlan") == 0) 12904 vxlan_encap_conf.select_vlan = 0; 12905 else if (strcmp(res->vxlan, "vxlan-with-vlan") == 0) 12906 vxlan_encap_conf.select_vlan = 1; 12907 else if (strcmp(res->vxlan, "vxlan-tos-ttl") == 0) { 12908 vxlan_encap_conf.select_vlan = 0; 12909 vxlan_encap_conf.select_tos_ttl = 1; 12910 } 12911 if (strcmp(res->ip_version, "ipv4") == 0) 12912 vxlan_encap_conf.select_ipv4 = 1; 12913 else if (strcmp(res->ip_version, "ipv6") == 0) 12914 vxlan_encap_conf.select_ipv4 = 0; 12915 else 12916 return; 12917 rte_memcpy(vxlan_encap_conf.vni, &id.vni[1], 3); 12918 vxlan_encap_conf.udp_src = rte_cpu_to_be_16(res->udp_src); 12919 vxlan_encap_conf.udp_dst = rte_cpu_to_be_16(res->udp_dst); 12920 vxlan_encap_conf.ip_tos = res->tos; 12921 vxlan_encap_conf.ip_ttl = res->ttl; 12922 if (vxlan_encap_conf.select_ipv4) { 12923 IPV4_ADDR_TO_UINT(res->ip_src, vxlan_encap_conf.ipv4_src); 12924 IPV4_ADDR_TO_UINT(res->ip_dst, vxlan_encap_conf.ipv4_dst); 12925 } else { 12926 IPV6_ADDR_TO_ARRAY(res->ip_src, vxlan_encap_conf.ipv6_src); 12927 IPV6_ADDR_TO_ARRAY(res->ip_dst, vxlan_encap_conf.ipv6_dst); 12928 } 12929 if (vxlan_encap_conf.select_vlan) 12930 vxlan_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci); 12931 rte_memcpy(vxlan_encap_conf.eth_src, res->eth_src.addr_bytes, 12932 RTE_ETHER_ADDR_LEN); 12933 rte_memcpy(vxlan_encap_conf.eth_dst, res->eth_dst.addr_bytes, 12934 RTE_ETHER_ADDR_LEN); 12935 } 12936 12937 cmdline_parse_inst_t cmd_set_vxlan = { 12938 .f = cmd_set_vxlan_parsed, 12939 .data = NULL, 12940 .help_str = "set vxlan ip-version ipv4|ipv6 vni <vni> udp-src" 12941 " <udp-src> udp-dst <udp-dst> ip-src <ip-src> ip-dst <ip-dst>" 12942 " eth-src <eth-src> eth-dst <eth-dst>", 12943 .tokens = { 12944 (void *)&cmd_set_vxlan_set, 12945 (void *)&cmd_set_vxlan_vxlan, 12946 (void *)&cmd_set_vxlan_ip_version, 12947 (void *)&cmd_set_vxlan_ip_version_value, 12948 (void *)&cmd_set_vxlan_vni, 12949 (void *)&cmd_set_vxlan_vni_value, 12950 (void *)&cmd_set_vxlan_udp_src, 12951 (void *)&cmd_set_vxlan_udp_src_value, 12952 (void *)&cmd_set_vxlan_udp_dst, 12953 (void *)&cmd_set_vxlan_udp_dst_value, 12954 (void *)&cmd_set_vxlan_ip_src, 12955 (void *)&cmd_set_vxlan_ip_src_value, 12956 (void *)&cmd_set_vxlan_ip_dst, 12957 (void *)&cmd_set_vxlan_ip_dst_value, 12958 (void *)&cmd_set_vxlan_eth_src, 12959 (void *)&cmd_set_vxlan_eth_src_value, 12960 (void *)&cmd_set_vxlan_eth_dst, 12961 (void *)&cmd_set_vxlan_eth_dst_value, 12962 NULL, 12963 }, 12964 }; 12965 12966 cmdline_parse_inst_t cmd_set_vxlan_tos_ttl = { 12967 .f = cmd_set_vxlan_parsed, 12968 .data = NULL, 12969 .help_str = "set vxlan-tos-ttl ip-version ipv4|ipv6 vni <vni> udp-src" 12970 " <udp-src> udp-dst <udp-dst> ip-tos <ip-tos> ip-ttl <ip-ttl>" 12971 " ip-src <ip-src> ip-dst <ip-dst> eth-src <eth-src>" 12972 " eth-dst <eth-dst>", 12973 .tokens = { 12974 (void *)&cmd_set_vxlan_set, 12975 (void *)&cmd_set_vxlan_vxlan_tos_ttl, 12976 (void *)&cmd_set_vxlan_ip_version, 12977 (void *)&cmd_set_vxlan_ip_version_value, 12978 (void *)&cmd_set_vxlan_vni, 12979 (void *)&cmd_set_vxlan_vni_value, 12980 (void *)&cmd_set_vxlan_udp_src, 12981 (void *)&cmd_set_vxlan_udp_src_value, 12982 (void *)&cmd_set_vxlan_udp_dst, 12983 (void *)&cmd_set_vxlan_udp_dst_value, 12984 (void *)&cmd_set_vxlan_ip_tos, 12985 (void *)&cmd_set_vxlan_ip_tos_value, 12986 (void *)&cmd_set_vxlan_ip_ttl, 12987 (void *)&cmd_set_vxlan_ip_ttl_value, 12988 (void *)&cmd_set_vxlan_ip_src, 12989 (void *)&cmd_set_vxlan_ip_src_value, 12990 (void *)&cmd_set_vxlan_ip_dst, 12991 (void *)&cmd_set_vxlan_ip_dst_value, 12992 (void *)&cmd_set_vxlan_eth_src, 12993 (void *)&cmd_set_vxlan_eth_src_value, 12994 (void *)&cmd_set_vxlan_eth_dst, 12995 (void *)&cmd_set_vxlan_eth_dst_value, 12996 NULL, 12997 }, 12998 }; 12999 13000 cmdline_parse_inst_t cmd_set_vxlan_with_vlan = { 13001 .f = cmd_set_vxlan_parsed, 13002 .data = NULL, 13003 .help_str = "set vxlan-with-vlan ip-version ipv4|ipv6 vni <vni>" 13004 " udp-src <udp-src> udp-dst <udp-dst> ip-src <ip-src> ip-dst" 13005 " <ip-dst> vlan-tci <vlan-tci> eth-src <eth-src> eth-dst" 13006 " <eth-dst>", 13007 .tokens = { 13008 (void *)&cmd_set_vxlan_set, 13009 (void *)&cmd_set_vxlan_vxlan_with_vlan, 13010 (void *)&cmd_set_vxlan_ip_version, 13011 (void *)&cmd_set_vxlan_ip_version_value, 13012 (void *)&cmd_set_vxlan_vni, 13013 (void *)&cmd_set_vxlan_vni_value, 13014 (void *)&cmd_set_vxlan_udp_src, 13015 (void *)&cmd_set_vxlan_udp_src_value, 13016 (void *)&cmd_set_vxlan_udp_dst, 13017 (void *)&cmd_set_vxlan_udp_dst_value, 13018 (void *)&cmd_set_vxlan_ip_src, 13019 (void *)&cmd_set_vxlan_ip_src_value, 13020 (void *)&cmd_set_vxlan_ip_dst, 13021 (void *)&cmd_set_vxlan_ip_dst_value, 13022 (void *)&cmd_set_vxlan_vlan, 13023 (void *)&cmd_set_vxlan_vlan_value, 13024 (void *)&cmd_set_vxlan_eth_src, 13025 (void *)&cmd_set_vxlan_eth_src_value, 13026 (void *)&cmd_set_vxlan_eth_dst, 13027 (void *)&cmd_set_vxlan_eth_dst_value, 13028 NULL, 13029 }, 13030 }; 13031 13032 /** Set NVGRE encapsulation details */ 13033 struct cmd_set_nvgre_result { 13034 cmdline_fixed_string_t set; 13035 cmdline_fixed_string_t nvgre; 13036 cmdline_fixed_string_t pos_token; 13037 cmdline_fixed_string_t ip_version; 13038 uint32_t tni; 13039 cmdline_ipaddr_t ip_src; 13040 cmdline_ipaddr_t ip_dst; 13041 uint16_t tci; 13042 struct rte_ether_addr eth_src; 13043 struct rte_ether_addr eth_dst; 13044 }; 13045 13046 cmdline_parse_token_string_t cmd_set_nvgre_set = 13047 TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, set, "set"); 13048 cmdline_parse_token_string_t cmd_set_nvgre_nvgre = 13049 TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, nvgre, "nvgre"); 13050 cmdline_parse_token_string_t cmd_set_nvgre_nvgre_with_vlan = 13051 TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, nvgre, 13052 "nvgre-with-vlan"); 13053 cmdline_parse_token_string_t cmd_set_nvgre_ip_version = 13054 TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token, 13055 "ip-version"); 13056 cmdline_parse_token_string_t cmd_set_nvgre_ip_version_value = 13057 TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, ip_version, 13058 "ipv4#ipv6"); 13059 cmdline_parse_token_string_t cmd_set_nvgre_tni = 13060 TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token, 13061 "tni"); 13062 cmdline_parse_token_num_t cmd_set_nvgre_tni_value = 13063 TOKEN_NUM_INITIALIZER(struct cmd_set_nvgre_result, tni, RTE_UINT32); 13064 cmdline_parse_token_string_t cmd_set_nvgre_ip_src = 13065 TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token, 13066 "ip-src"); 13067 cmdline_parse_token_num_t cmd_set_nvgre_ip_src_value = 13068 TOKEN_IPADDR_INITIALIZER(struct cmd_set_nvgre_result, ip_src); 13069 cmdline_parse_token_string_t cmd_set_nvgre_ip_dst = 13070 TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token, 13071 "ip-dst"); 13072 cmdline_parse_token_ipaddr_t cmd_set_nvgre_ip_dst_value = 13073 TOKEN_IPADDR_INITIALIZER(struct cmd_set_nvgre_result, ip_dst); 13074 cmdline_parse_token_string_t cmd_set_nvgre_vlan = 13075 TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token, 13076 "vlan-tci"); 13077 cmdline_parse_token_num_t cmd_set_nvgre_vlan_value = 13078 TOKEN_NUM_INITIALIZER(struct cmd_set_nvgre_result, tci, RTE_UINT16); 13079 cmdline_parse_token_string_t cmd_set_nvgre_eth_src = 13080 TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token, 13081 "eth-src"); 13082 cmdline_parse_token_etheraddr_t cmd_set_nvgre_eth_src_value = 13083 TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_nvgre_result, eth_src); 13084 cmdline_parse_token_string_t cmd_set_nvgre_eth_dst = 13085 TOKEN_STRING_INITIALIZER(struct cmd_set_nvgre_result, pos_token, 13086 "eth-dst"); 13087 cmdline_parse_token_etheraddr_t cmd_set_nvgre_eth_dst_value = 13088 TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_nvgre_result, eth_dst); 13089 13090 static void cmd_set_nvgre_parsed(void *parsed_result, 13091 __rte_unused struct cmdline *cl, 13092 __rte_unused void *data) 13093 { 13094 struct cmd_set_nvgre_result *res = parsed_result; 13095 union { 13096 uint32_t nvgre_tni; 13097 uint8_t tni[4]; 13098 } id = { 13099 .nvgre_tni = rte_cpu_to_be_32(res->tni) & RTE_BE32(0x00ffffff), 13100 }; 13101 13102 if (strcmp(res->nvgre, "nvgre") == 0) 13103 nvgre_encap_conf.select_vlan = 0; 13104 else if (strcmp(res->nvgre, "nvgre-with-vlan") == 0) 13105 nvgre_encap_conf.select_vlan = 1; 13106 if (strcmp(res->ip_version, "ipv4") == 0) 13107 nvgre_encap_conf.select_ipv4 = 1; 13108 else if (strcmp(res->ip_version, "ipv6") == 0) 13109 nvgre_encap_conf.select_ipv4 = 0; 13110 else 13111 return; 13112 rte_memcpy(nvgre_encap_conf.tni, &id.tni[1], 3); 13113 if (nvgre_encap_conf.select_ipv4) { 13114 IPV4_ADDR_TO_UINT(res->ip_src, nvgre_encap_conf.ipv4_src); 13115 IPV4_ADDR_TO_UINT(res->ip_dst, nvgre_encap_conf.ipv4_dst); 13116 } else { 13117 IPV6_ADDR_TO_ARRAY(res->ip_src, nvgre_encap_conf.ipv6_src); 13118 IPV6_ADDR_TO_ARRAY(res->ip_dst, nvgre_encap_conf.ipv6_dst); 13119 } 13120 if (nvgre_encap_conf.select_vlan) 13121 nvgre_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci); 13122 rte_memcpy(nvgre_encap_conf.eth_src, res->eth_src.addr_bytes, 13123 RTE_ETHER_ADDR_LEN); 13124 rte_memcpy(nvgre_encap_conf.eth_dst, res->eth_dst.addr_bytes, 13125 RTE_ETHER_ADDR_LEN); 13126 } 13127 13128 cmdline_parse_inst_t cmd_set_nvgre = { 13129 .f = cmd_set_nvgre_parsed, 13130 .data = NULL, 13131 .help_str = "set nvgre ip-version <ipv4|ipv6> tni <tni> ip-src" 13132 " <ip-src> ip-dst <ip-dst> eth-src <eth-src>" 13133 " eth-dst <eth-dst>", 13134 .tokens = { 13135 (void *)&cmd_set_nvgre_set, 13136 (void *)&cmd_set_nvgre_nvgre, 13137 (void *)&cmd_set_nvgre_ip_version, 13138 (void *)&cmd_set_nvgre_ip_version_value, 13139 (void *)&cmd_set_nvgre_tni, 13140 (void *)&cmd_set_nvgre_tni_value, 13141 (void *)&cmd_set_nvgre_ip_src, 13142 (void *)&cmd_set_nvgre_ip_src_value, 13143 (void *)&cmd_set_nvgre_ip_dst, 13144 (void *)&cmd_set_nvgre_ip_dst_value, 13145 (void *)&cmd_set_nvgre_eth_src, 13146 (void *)&cmd_set_nvgre_eth_src_value, 13147 (void *)&cmd_set_nvgre_eth_dst, 13148 (void *)&cmd_set_nvgre_eth_dst_value, 13149 NULL, 13150 }, 13151 }; 13152 13153 cmdline_parse_inst_t cmd_set_nvgre_with_vlan = { 13154 .f = cmd_set_nvgre_parsed, 13155 .data = NULL, 13156 .help_str = "set nvgre-with-vlan ip-version <ipv4|ipv6> tni <tni>" 13157 " ip-src <ip-src> ip-dst <ip-dst> vlan-tci <vlan-tci>" 13158 " eth-src <eth-src> eth-dst <eth-dst>", 13159 .tokens = { 13160 (void *)&cmd_set_nvgre_set, 13161 (void *)&cmd_set_nvgre_nvgre_with_vlan, 13162 (void *)&cmd_set_nvgre_ip_version, 13163 (void *)&cmd_set_nvgre_ip_version_value, 13164 (void *)&cmd_set_nvgre_tni, 13165 (void *)&cmd_set_nvgre_tni_value, 13166 (void *)&cmd_set_nvgre_ip_src, 13167 (void *)&cmd_set_nvgre_ip_src_value, 13168 (void *)&cmd_set_nvgre_ip_dst, 13169 (void *)&cmd_set_nvgre_ip_dst_value, 13170 (void *)&cmd_set_nvgre_vlan, 13171 (void *)&cmd_set_nvgre_vlan_value, 13172 (void *)&cmd_set_nvgre_eth_src, 13173 (void *)&cmd_set_nvgre_eth_src_value, 13174 (void *)&cmd_set_nvgre_eth_dst, 13175 (void *)&cmd_set_nvgre_eth_dst_value, 13176 NULL, 13177 }, 13178 }; 13179 13180 /** Set L2 encapsulation details */ 13181 struct cmd_set_l2_encap_result { 13182 cmdline_fixed_string_t set; 13183 cmdline_fixed_string_t l2_encap; 13184 cmdline_fixed_string_t pos_token; 13185 cmdline_fixed_string_t ip_version; 13186 uint32_t vlan_present:1; 13187 uint16_t tci; 13188 struct rte_ether_addr eth_src; 13189 struct rte_ether_addr eth_dst; 13190 }; 13191 13192 cmdline_parse_token_string_t cmd_set_l2_encap_set = 13193 TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, set, "set"); 13194 cmdline_parse_token_string_t cmd_set_l2_encap_l2_encap = 13195 TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, l2_encap, "l2_encap"); 13196 cmdline_parse_token_string_t cmd_set_l2_encap_l2_encap_with_vlan = 13197 TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, l2_encap, 13198 "l2_encap-with-vlan"); 13199 cmdline_parse_token_string_t cmd_set_l2_encap_ip_version = 13200 TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, pos_token, 13201 "ip-version"); 13202 cmdline_parse_token_string_t cmd_set_l2_encap_ip_version_value = 13203 TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, ip_version, 13204 "ipv4#ipv6"); 13205 cmdline_parse_token_string_t cmd_set_l2_encap_vlan = 13206 TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, pos_token, 13207 "vlan-tci"); 13208 cmdline_parse_token_num_t cmd_set_l2_encap_vlan_value = 13209 TOKEN_NUM_INITIALIZER(struct cmd_set_l2_encap_result, tci, RTE_UINT16); 13210 cmdline_parse_token_string_t cmd_set_l2_encap_eth_src = 13211 TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, pos_token, 13212 "eth-src"); 13213 cmdline_parse_token_etheraddr_t cmd_set_l2_encap_eth_src_value = 13214 TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_l2_encap_result, eth_src); 13215 cmdline_parse_token_string_t cmd_set_l2_encap_eth_dst = 13216 TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, pos_token, 13217 "eth-dst"); 13218 cmdline_parse_token_etheraddr_t cmd_set_l2_encap_eth_dst_value = 13219 TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_l2_encap_result, eth_dst); 13220 13221 static void cmd_set_l2_encap_parsed(void *parsed_result, 13222 __rte_unused struct cmdline *cl, 13223 __rte_unused void *data) 13224 { 13225 struct cmd_set_l2_encap_result *res = parsed_result; 13226 13227 if (strcmp(res->l2_encap, "l2_encap") == 0) 13228 l2_encap_conf.select_vlan = 0; 13229 else if (strcmp(res->l2_encap, "l2_encap-with-vlan") == 0) 13230 l2_encap_conf.select_vlan = 1; 13231 if (strcmp(res->ip_version, "ipv4") == 0) 13232 l2_encap_conf.select_ipv4 = 1; 13233 else if (strcmp(res->ip_version, "ipv6") == 0) 13234 l2_encap_conf.select_ipv4 = 0; 13235 else 13236 return; 13237 if (l2_encap_conf.select_vlan) 13238 l2_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci); 13239 rte_memcpy(l2_encap_conf.eth_src, res->eth_src.addr_bytes, 13240 RTE_ETHER_ADDR_LEN); 13241 rte_memcpy(l2_encap_conf.eth_dst, res->eth_dst.addr_bytes, 13242 RTE_ETHER_ADDR_LEN); 13243 } 13244 13245 cmdline_parse_inst_t cmd_set_l2_encap = { 13246 .f = cmd_set_l2_encap_parsed, 13247 .data = NULL, 13248 .help_str = "set l2_encap ip-version ipv4|ipv6" 13249 " eth-src <eth-src> eth-dst <eth-dst>", 13250 .tokens = { 13251 (void *)&cmd_set_l2_encap_set, 13252 (void *)&cmd_set_l2_encap_l2_encap, 13253 (void *)&cmd_set_l2_encap_ip_version, 13254 (void *)&cmd_set_l2_encap_ip_version_value, 13255 (void *)&cmd_set_l2_encap_eth_src, 13256 (void *)&cmd_set_l2_encap_eth_src_value, 13257 (void *)&cmd_set_l2_encap_eth_dst, 13258 (void *)&cmd_set_l2_encap_eth_dst_value, 13259 NULL, 13260 }, 13261 }; 13262 13263 cmdline_parse_inst_t cmd_set_l2_encap_with_vlan = { 13264 .f = cmd_set_l2_encap_parsed, 13265 .data = NULL, 13266 .help_str = "set l2_encap-with-vlan ip-version ipv4|ipv6" 13267 " vlan-tci <vlan-tci> eth-src <eth-src> eth-dst <eth-dst>", 13268 .tokens = { 13269 (void *)&cmd_set_l2_encap_set, 13270 (void *)&cmd_set_l2_encap_l2_encap_with_vlan, 13271 (void *)&cmd_set_l2_encap_ip_version, 13272 (void *)&cmd_set_l2_encap_ip_version_value, 13273 (void *)&cmd_set_l2_encap_vlan, 13274 (void *)&cmd_set_l2_encap_vlan_value, 13275 (void *)&cmd_set_l2_encap_eth_src, 13276 (void *)&cmd_set_l2_encap_eth_src_value, 13277 (void *)&cmd_set_l2_encap_eth_dst, 13278 (void *)&cmd_set_l2_encap_eth_dst_value, 13279 NULL, 13280 }, 13281 }; 13282 13283 /** Set L2 decapsulation details */ 13284 struct cmd_set_l2_decap_result { 13285 cmdline_fixed_string_t set; 13286 cmdline_fixed_string_t l2_decap; 13287 cmdline_fixed_string_t pos_token; 13288 uint32_t vlan_present:1; 13289 }; 13290 13291 cmdline_parse_token_string_t cmd_set_l2_decap_set = 13292 TOKEN_STRING_INITIALIZER(struct cmd_set_l2_decap_result, set, "set"); 13293 cmdline_parse_token_string_t cmd_set_l2_decap_l2_decap = 13294 TOKEN_STRING_INITIALIZER(struct cmd_set_l2_decap_result, l2_decap, 13295 "l2_decap"); 13296 cmdline_parse_token_string_t cmd_set_l2_decap_l2_decap_with_vlan = 13297 TOKEN_STRING_INITIALIZER(struct cmd_set_l2_decap_result, l2_decap, 13298 "l2_decap-with-vlan"); 13299 13300 static void cmd_set_l2_decap_parsed(void *parsed_result, 13301 __rte_unused struct cmdline *cl, 13302 __rte_unused void *data) 13303 { 13304 struct cmd_set_l2_decap_result *res = parsed_result; 13305 13306 if (strcmp(res->l2_decap, "l2_decap") == 0) 13307 l2_decap_conf.select_vlan = 0; 13308 else if (strcmp(res->l2_decap, "l2_decap-with-vlan") == 0) 13309 l2_decap_conf.select_vlan = 1; 13310 } 13311 13312 cmdline_parse_inst_t cmd_set_l2_decap = { 13313 .f = cmd_set_l2_decap_parsed, 13314 .data = NULL, 13315 .help_str = "set l2_decap", 13316 .tokens = { 13317 (void *)&cmd_set_l2_decap_set, 13318 (void *)&cmd_set_l2_decap_l2_decap, 13319 NULL, 13320 }, 13321 }; 13322 13323 cmdline_parse_inst_t cmd_set_l2_decap_with_vlan = { 13324 .f = cmd_set_l2_decap_parsed, 13325 .data = NULL, 13326 .help_str = "set l2_decap-with-vlan", 13327 .tokens = { 13328 (void *)&cmd_set_l2_decap_set, 13329 (void *)&cmd_set_l2_decap_l2_decap_with_vlan, 13330 NULL, 13331 }, 13332 }; 13333 13334 /** Set MPLSoGRE encapsulation details */ 13335 struct cmd_set_mplsogre_encap_result { 13336 cmdline_fixed_string_t set; 13337 cmdline_fixed_string_t mplsogre; 13338 cmdline_fixed_string_t pos_token; 13339 cmdline_fixed_string_t ip_version; 13340 uint32_t vlan_present:1; 13341 uint32_t label; 13342 cmdline_ipaddr_t ip_src; 13343 cmdline_ipaddr_t ip_dst; 13344 uint16_t tci; 13345 struct rte_ether_addr eth_src; 13346 struct rte_ether_addr eth_dst; 13347 }; 13348 13349 cmdline_parse_token_string_t cmd_set_mplsogre_encap_set = 13350 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result, set, 13351 "set"); 13352 cmdline_parse_token_string_t cmd_set_mplsogre_encap_mplsogre_encap = 13353 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result, mplsogre, 13354 "mplsogre_encap"); 13355 cmdline_parse_token_string_t cmd_set_mplsogre_encap_mplsogre_encap_with_vlan = 13356 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result, 13357 mplsogre, "mplsogre_encap-with-vlan"); 13358 cmdline_parse_token_string_t cmd_set_mplsogre_encap_ip_version = 13359 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result, 13360 pos_token, "ip-version"); 13361 cmdline_parse_token_string_t cmd_set_mplsogre_encap_ip_version_value = 13362 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result, 13363 ip_version, "ipv4#ipv6"); 13364 cmdline_parse_token_string_t cmd_set_mplsogre_encap_label = 13365 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result, 13366 pos_token, "label"); 13367 cmdline_parse_token_num_t cmd_set_mplsogre_encap_label_value = 13368 TOKEN_NUM_INITIALIZER(struct cmd_set_mplsogre_encap_result, label, 13369 RTE_UINT32); 13370 cmdline_parse_token_string_t cmd_set_mplsogre_encap_ip_src = 13371 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result, 13372 pos_token, "ip-src"); 13373 cmdline_parse_token_ipaddr_t cmd_set_mplsogre_encap_ip_src_value = 13374 TOKEN_IPADDR_INITIALIZER(struct cmd_set_mplsogre_encap_result, ip_src); 13375 cmdline_parse_token_string_t cmd_set_mplsogre_encap_ip_dst = 13376 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result, 13377 pos_token, "ip-dst"); 13378 cmdline_parse_token_ipaddr_t cmd_set_mplsogre_encap_ip_dst_value = 13379 TOKEN_IPADDR_INITIALIZER(struct cmd_set_mplsogre_encap_result, ip_dst); 13380 cmdline_parse_token_string_t cmd_set_mplsogre_encap_vlan = 13381 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result, 13382 pos_token, "vlan-tci"); 13383 cmdline_parse_token_num_t cmd_set_mplsogre_encap_vlan_value = 13384 TOKEN_NUM_INITIALIZER(struct cmd_set_mplsogre_encap_result, tci, 13385 RTE_UINT16); 13386 cmdline_parse_token_string_t cmd_set_mplsogre_encap_eth_src = 13387 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result, 13388 pos_token, "eth-src"); 13389 cmdline_parse_token_etheraddr_t cmd_set_mplsogre_encap_eth_src_value = 13390 TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_mplsogre_encap_result, 13391 eth_src); 13392 cmdline_parse_token_string_t cmd_set_mplsogre_encap_eth_dst = 13393 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_encap_result, 13394 pos_token, "eth-dst"); 13395 cmdline_parse_token_etheraddr_t cmd_set_mplsogre_encap_eth_dst_value = 13396 TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_mplsogre_encap_result, 13397 eth_dst); 13398 13399 static void cmd_set_mplsogre_encap_parsed(void *parsed_result, 13400 __rte_unused struct cmdline *cl, 13401 __rte_unused void *data) 13402 { 13403 struct cmd_set_mplsogre_encap_result *res = parsed_result; 13404 union { 13405 uint32_t mplsogre_label; 13406 uint8_t label[4]; 13407 } id = { 13408 .mplsogre_label = rte_cpu_to_be_32(res->label<<12), 13409 }; 13410 13411 if (strcmp(res->mplsogre, "mplsogre_encap") == 0) 13412 mplsogre_encap_conf.select_vlan = 0; 13413 else if (strcmp(res->mplsogre, "mplsogre_encap-with-vlan") == 0) 13414 mplsogre_encap_conf.select_vlan = 1; 13415 if (strcmp(res->ip_version, "ipv4") == 0) 13416 mplsogre_encap_conf.select_ipv4 = 1; 13417 else if (strcmp(res->ip_version, "ipv6") == 0) 13418 mplsogre_encap_conf.select_ipv4 = 0; 13419 else 13420 return; 13421 rte_memcpy(mplsogre_encap_conf.label, &id.label, 3); 13422 if (mplsogre_encap_conf.select_ipv4) { 13423 IPV4_ADDR_TO_UINT(res->ip_src, mplsogre_encap_conf.ipv4_src); 13424 IPV4_ADDR_TO_UINT(res->ip_dst, mplsogre_encap_conf.ipv4_dst); 13425 } else { 13426 IPV6_ADDR_TO_ARRAY(res->ip_src, mplsogre_encap_conf.ipv6_src); 13427 IPV6_ADDR_TO_ARRAY(res->ip_dst, mplsogre_encap_conf.ipv6_dst); 13428 } 13429 if (mplsogre_encap_conf.select_vlan) 13430 mplsogre_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci); 13431 rte_memcpy(mplsogre_encap_conf.eth_src, res->eth_src.addr_bytes, 13432 RTE_ETHER_ADDR_LEN); 13433 rte_memcpy(mplsogre_encap_conf.eth_dst, res->eth_dst.addr_bytes, 13434 RTE_ETHER_ADDR_LEN); 13435 } 13436 13437 cmdline_parse_inst_t cmd_set_mplsogre_encap = { 13438 .f = cmd_set_mplsogre_encap_parsed, 13439 .data = NULL, 13440 .help_str = "set mplsogre_encap ip-version ipv4|ipv6 label <label>" 13441 " ip-src <ip-src> ip-dst <ip-dst> eth-src <eth-src>" 13442 " eth-dst <eth-dst>", 13443 .tokens = { 13444 (void *)&cmd_set_mplsogre_encap_set, 13445 (void *)&cmd_set_mplsogre_encap_mplsogre_encap, 13446 (void *)&cmd_set_mplsogre_encap_ip_version, 13447 (void *)&cmd_set_mplsogre_encap_ip_version_value, 13448 (void *)&cmd_set_mplsogre_encap_label, 13449 (void *)&cmd_set_mplsogre_encap_label_value, 13450 (void *)&cmd_set_mplsogre_encap_ip_src, 13451 (void *)&cmd_set_mplsogre_encap_ip_src_value, 13452 (void *)&cmd_set_mplsogre_encap_ip_dst, 13453 (void *)&cmd_set_mplsogre_encap_ip_dst_value, 13454 (void *)&cmd_set_mplsogre_encap_eth_src, 13455 (void *)&cmd_set_mplsogre_encap_eth_src_value, 13456 (void *)&cmd_set_mplsogre_encap_eth_dst, 13457 (void *)&cmd_set_mplsogre_encap_eth_dst_value, 13458 NULL, 13459 }, 13460 }; 13461 13462 cmdline_parse_inst_t cmd_set_mplsogre_encap_with_vlan = { 13463 .f = cmd_set_mplsogre_encap_parsed, 13464 .data = NULL, 13465 .help_str = "set mplsogre_encap-with-vlan ip-version ipv4|ipv6" 13466 " label <label> ip-src <ip-src> ip-dst <ip-dst>" 13467 " vlan-tci <vlan-tci> eth-src <eth-src> eth-dst <eth-dst>", 13468 .tokens = { 13469 (void *)&cmd_set_mplsogre_encap_set, 13470 (void *)&cmd_set_mplsogre_encap_mplsogre_encap_with_vlan, 13471 (void *)&cmd_set_mplsogre_encap_ip_version, 13472 (void *)&cmd_set_mplsogre_encap_ip_version_value, 13473 (void *)&cmd_set_mplsogre_encap_label, 13474 (void *)&cmd_set_mplsogre_encap_label_value, 13475 (void *)&cmd_set_mplsogre_encap_ip_src, 13476 (void *)&cmd_set_mplsogre_encap_ip_src_value, 13477 (void *)&cmd_set_mplsogre_encap_ip_dst, 13478 (void *)&cmd_set_mplsogre_encap_ip_dst_value, 13479 (void *)&cmd_set_mplsogre_encap_vlan, 13480 (void *)&cmd_set_mplsogre_encap_vlan_value, 13481 (void *)&cmd_set_mplsogre_encap_eth_src, 13482 (void *)&cmd_set_mplsogre_encap_eth_src_value, 13483 (void *)&cmd_set_mplsogre_encap_eth_dst, 13484 (void *)&cmd_set_mplsogre_encap_eth_dst_value, 13485 NULL, 13486 }, 13487 }; 13488 13489 /** Set MPLSoGRE decapsulation details */ 13490 struct cmd_set_mplsogre_decap_result { 13491 cmdline_fixed_string_t set; 13492 cmdline_fixed_string_t mplsogre; 13493 cmdline_fixed_string_t pos_token; 13494 cmdline_fixed_string_t ip_version; 13495 uint32_t vlan_present:1; 13496 }; 13497 13498 cmdline_parse_token_string_t cmd_set_mplsogre_decap_set = 13499 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_decap_result, set, 13500 "set"); 13501 cmdline_parse_token_string_t cmd_set_mplsogre_decap_mplsogre_decap = 13502 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_decap_result, mplsogre, 13503 "mplsogre_decap"); 13504 cmdline_parse_token_string_t cmd_set_mplsogre_decap_mplsogre_decap_with_vlan = 13505 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_decap_result, 13506 mplsogre, "mplsogre_decap-with-vlan"); 13507 cmdline_parse_token_string_t cmd_set_mplsogre_decap_ip_version = 13508 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_decap_result, 13509 pos_token, "ip-version"); 13510 cmdline_parse_token_string_t cmd_set_mplsogre_decap_ip_version_value = 13511 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsogre_decap_result, 13512 ip_version, "ipv4#ipv6"); 13513 13514 static void cmd_set_mplsogre_decap_parsed(void *parsed_result, 13515 __rte_unused struct cmdline *cl, 13516 __rte_unused void *data) 13517 { 13518 struct cmd_set_mplsogre_decap_result *res = parsed_result; 13519 13520 if (strcmp(res->mplsogre, "mplsogre_decap") == 0) 13521 mplsogre_decap_conf.select_vlan = 0; 13522 else if (strcmp(res->mplsogre, "mplsogre_decap-with-vlan") == 0) 13523 mplsogre_decap_conf.select_vlan = 1; 13524 if (strcmp(res->ip_version, "ipv4") == 0) 13525 mplsogre_decap_conf.select_ipv4 = 1; 13526 else if (strcmp(res->ip_version, "ipv6") == 0) 13527 mplsogre_decap_conf.select_ipv4 = 0; 13528 } 13529 13530 cmdline_parse_inst_t cmd_set_mplsogre_decap = { 13531 .f = cmd_set_mplsogre_decap_parsed, 13532 .data = NULL, 13533 .help_str = "set mplsogre_decap ip-version ipv4|ipv6", 13534 .tokens = { 13535 (void *)&cmd_set_mplsogre_decap_set, 13536 (void *)&cmd_set_mplsogre_decap_mplsogre_decap, 13537 (void *)&cmd_set_mplsogre_decap_ip_version, 13538 (void *)&cmd_set_mplsogre_decap_ip_version_value, 13539 NULL, 13540 }, 13541 }; 13542 13543 cmdline_parse_inst_t cmd_set_mplsogre_decap_with_vlan = { 13544 .f = cmd_set_mplsogre_decap_parsed, 13545 .data = NULL, 13546 .help_str = "set mplsogre_decap-with-vlan ip-version ipv4|ipv6", 13547 .tokens = { 13548 (void *)&cmd_set_mplsogre_decap_set, 13549 (void *)&cmd_set_mplsogre_decap_mplsogre_decap_with_vlan, 13550 (void *)&cmd_set_mplsogre_decap_ip_version, 13551 (void *)&cmd_set_mplsogre_decap_ip_version_value, 13552 NULL, 13553 }, 13554 }; 13555 13556 /** Set MPLSoUDP encapsulation details */ 13557 struct cmd_set_mplsoudp_encap_result { 13558 cmdline_fixed_string_t set; 13559 cmdline_fixed_string_t mplsoudp; 13560 cmdline_fixed_string_t pos_token; 13561 cmdline_fixed_string_t ip_version; 13562 uint32_t vlan_present:1; 13563 uint32_t label; 13564 uint16_t udp_src; 13565 uint16_t udp_dst; 13566 cmdline_ipaddr_t ip_src; 13567 cmdline_ipaddr_t ip_dst; 13568 uint16_t tci; 13569 struct rte_ether_addr eth_src; 13570 struct rte_ether_addr eth_dst; 13571 }; 13572 13573 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_set = 13574 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, set, 13575 "set"); 13576 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_mplsoudp_encap = 13577 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, mplsoudp, 13578 "mplsoudp_encap"); 13579 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_mplsoudp_encap_with_vlan = 13580 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, 13581 mplsoudp, "mplsoudp_encap-with-vlan"); 13582 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_ip_version = 13583 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, 13584 pos_token, "ip-version"); 13585 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_ip_version_value = 13586 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, 13587 ip_version, "ipv4#ipv6"); 13588 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_label = 13589 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, 13590 pos_token, "label"); 13591 cmdline_parse_token_num_t cmd_set_mplsoudp_encap_label_value = 13592 TOKEN_NUM_INITIALIZER(struct cmd_set_mplsoudp_encap_result, label, 13593 RTE_UINT32); 13594 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_udp_src = 13595 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, 13596 pos_token, "udp-src"); 13597 cmdline_parse_token_num_t cmd_set_mplsoudp_encap_udp_src_value = 13598 TOKEN_NUM_INITIALIZER(struct cmd_set_mplsoudp_encap_result, udp_src, 13599 RTE_UINT16); 13600 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_udp_dst = 13601 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, 13602 pos_token, "udp-dst"); 13603 cmdline_parse_token_num_t cmd_set_mplsoudp_encap_udp_dst_value = 13604 TOKEN_NUM_INITIALIZER(struct cmd_set_mplsoudp_encap_result, udp_dst, 13605 RTE_UINT16); 13606 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_ip_src = 13607 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, 13608 pos_token, "ip-src"); 13609 cmdline_parse_token_ipaddr_t cmd_set_mplsoudp_encap_ip_src_value = 13610 TOKEN_IPADDR_INITIALIZER(struct cmd_set_mplsoudp_encap_result, ip_src); 13611 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_ip_dst = 13612 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, 13613 pos_token, "ip-dst"); 13614 cmdline_parse_token_ipaddr_t cmd_set_mplsoudp_encap_ip_dst_value = 13615 TOKEN_IPADDR_INITIALIZER(struct cmd_set_mplsoudp_encap_result, ip_dst); 13616 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_vlan = 13617 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, 13618 pos_token, "vlan-tci"); 13619 cmdline_parse_token_num_t cmd_set_mplsoudp_encap_vlan_value = 13620 TOKEN_NUM_INITIALIZER(struct cmd_set_mplsoudp_encap_result, tci, 13621 RTE_UINT16); 13622 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_eth_src = 13623 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, 13624 pos_token, "eth-src"); 13625 cmdline_parse_token_etheraddr_t cmd_set_mplsoudp_encap_eth_src_value = 13626 TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_mplsoudp_encap_result, 13627 eth_src); 13628 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_eth_dst = 13629 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, 13630 pos_token, "eth-dst"); 13631 cmdline_parse_token_etheraddr_t cmd_set_mplsoudp_encap_eth_dst_value = 13632 TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_mplsoudp_encap_result, 13633 eth_dst); 13634 13635 static void cmd_set_mplsoudp_encap_parsed(void *parsed_result, 13636 __rte_unused struct cmdline *cl, 13637 __rte_unused void *data) 13638 { 13639 struct cmd_set_mplsoudp_encap_result *res = parsed_result; 13640 union { 13641 uint32_t mplsoudp_label; 13642 uint8_t label[4]; 13643 } id = { 13644 .mplsoudp_label = rte_cpu_to_be_32(res->label<<12), 13645 }; 13646 13647 if (strcmp(res->mplsoudp, "mplsoudp_encap") == 0) 13648 mplsoudp_encap_conf.select_vlan = 0; 13649 else if (strcmp(res->mplsoudp, "mplsoudp_encap-with-vlan") == 0) 13650 mplsoudp_encap_conf.select_vlan = 1; 13651 if (strcmp(res->ip_version, "ipv4") == 0) 13652 mplsoudp_encap_conf.select_ipv4 = 1; 13653 else if (strcmp(res->ip_version, "ipv6") == 0) 13654 mplsoudp_encap_conf.select_ipv4 = 0; 13655 else 13656 return; 13657 rte_memcpy(mplsoudp_encap_conf.label, &id.label, 3); 13658 mplsoudp_encap_conf.udp_src = rte_cpu_to_be_16(res->udp_src); 13659 mplsoudp_encap_conf.udp_dst = rte_cpu_to_be_16(res->udp_dst); 13660 if (mplsoudp_encap_conf.select_ipv4) { 13661 IPV4_ADDR_TO_UINT(res->ip_src, mplsoudp_encap_conf.ipv4_src); 13662 IPV4_ADDR_TO_UINT(res->ip_dst, mplsoudp_encap_conf.ipv4_dst); 13663 } else { 13664 IPV6_ADDR_TO_ARRAY(res->ip_src, mplsoudp_encap_conf.ipv6_src); 13665 IPV6_ADDR_TO_ARRAY(res->ip_dst, mplsoudp_encap_conf.ipv6_dst); 13666 } 13667 if (mplsoudp_encap_conf.select_vlan) 13668 mplsoudp_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci); 13669 rte_memcpy(mplsoudp_encap_conf.eth_src, res->eth_src.addr_bytes, 13670 RTE_ETHER_ADDR_LEN); 13671 rte_memcpy(mplsoudp_encap_conf.eth_dst, res->eth_dst.addr_bytes, 13672 RTE_ETHER_ADDR_LEN); 13673 } 13674 13675 cmdline_parse_inst_t cmd_set_mplsoudp_encap = { 13676 .f = cmd_set_mplsoudp_encap_parsed, 13677 .data = NULL, 13678 .help_str = "set mplsoudp_encap ip-version ipv4|ipv6 label <label>" 13679 " udp-src <udp-src> udp-dst <udp-dst> ip-src <ip-src>" 13680 " ip-dst <ip-dst> eth-src <eth-src> eth-dst <eth-dst>", 13681 .tokens = { 13682 (void *)&cmd_set_mplsoudp_encap_set, 13683 (void *)&cmd_set_mplsoudp_encap_mplsoudp_encap, 13684 (void *)&cmd_set_mplsoudp_encap_ip_version, 13685 (void *)&cmd_set_mplsoudp_encap_ip_version_value, 13686 (void *)&cmd_set_mplsoudp_encap_label, 13687 (void *)&cmd_set_mplsoudp_encap_label_value, 13688 (void *)&cmd_set_mplsoudp_encap_udp_src, 13689 (void *)&cmd_set_mplsoudp_encap_udp_src_value, 13690 (void *)&cmd_set_mplsoudp_encap_udp_dst, 13691 (void *)&cmd_set_mplsoudp_encap_udp_dst_value, 13692 (void *)&cmd_set_mplsoudp_encap_ip_src, 13693 (void *)&cmd_set_mplsoudp_encap_ip_src_value, 13694 (void *)&cmd_set_mplsoudp_encap_ip_dst, 13695 (void *)&cmd_set_mplsoudp_encap_ip_dst_value, 13696 (void *)&cmd_set_mplsoudp_encap_eth_src, 13697 (void *)&cmd_set_mplsoudp_encap_eth_src_value, 13698 (void *)&cmd_set_mplsoudp_encap_eth_dst, 13699 (void *)&cmd_set_mplsoudp_encap_eth_dst_value, 13700 NULL, 13701 }, 13702 }; 13703 13704 cmdline_parse_inst_t cmd_set_mplsoudp_encap_with_vlan = { 13705 .f = cmd_set_mplsoudp_encap_parsed, 13706 .data = NULL, 13707 .help_str = "set mplsoudp_encap-with-vlan ip-version ipv4|ipv6" 13708 " label <label> udp-src <udp-src> udp-dst <udp-dst>" 13709 " ip-src <ip-src> ip-dst <ip-dst> vlan-tci <vlan-tci>" 13710 " eth-src <eth-src> eth-dst <eth-dst>", 13711 .tokens = { 13712 (void *)&cmd_set_mplsoudp_encap_set, 13713 (void *)&cmd_set_mplsoudp_encap_mplsoudp_encap_with_vlan, 13714 (void *)&cmd_set_mplsoudp_encap_ip_version, 13715 (void *)&cmd_set_mplsoudp_encap_ip_version_value, 13716 (void *)&cmd_set_mplsoudp_encap_label, 13717 (void *)&cmd_set_mplsoudp_encap_label_value, 13718 (void *)&cmd_set_mplsoudp_encap_udp_src, 13719 (void *)&cmd_set_mplsoudp_encap_udp_src_value, 13720 (void *)&cmd_set_mplsoudp_encap_udp_dst, 13721 (void *)&cmd_set_mplsoudp_encap_udp_dst_value, 13722 (void *)&cmd_set_mplsoudp_encap_ip_src, 13723 (void *)&cmd_set_mplsoudp_encap_ip_src_value, 13724 (void *)&cmd_set_mplsoudp_encap_ip_dst, 13725 (void *)&cmd_set_mplsoudp_encap_ip_dst_value, 13726 (void *)&cmd_set_mplsoudp_encap_vlan, 13727 (void *)&cmd_set_mplsoudp_encap_vlan_value, 13728 (void *)&cmd_set_mplsoudp_encap_eth_src, 13729 (void *)&cmd_set_mplsoudp_encap_eth_src_value, 13730 (void *)&cmd_set_mplsoudp_encap_eth_dst, 13731 (void *)&cmd_set_mplsoudp_encap_eth_dst_value, 13732 NULL, 13733 }, 13734 }; 13735 13736 /** Set MPLSoUDP decapsulation details */ 13737 struct cmd_set_mplsoudp_decap_result { 13738 cmdline_fixed_string_t set; 13739 cmdline_fixed_string_t mplsoudp; 13740 cmdline_fixed_string_t pos_token; 13741 cmdline_fixed_string_t ip_version; 13742 uint32_t vlan_present:1; 13743 }; 13744 13745 cmdline_parse_token_string_t cmd_set_mplsoudp_decap_set = 13746 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_decap_result, set, 13747 "set"); 13748 cmdline_parse_token_string_t cmd_set_mplsoudp_decap_mplsoudp_decap = 13749 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_decap_result, mplsoudp, 13750 "mplsoudp_decap"); 13751 cmdline_parse_token_string_t cmd_set_mplsoudp_decap_mplsoudp_decap_with_vlan = 13752 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_decap_result, 13753 mplsoudp, "mplsoudp_decap-with-vlan"); 13754 cmdline_parse_token_string_t cmd_set_mplsoudp_decap_ip_version = 13755 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_decap_result, 13756 pos_token, "ip-version"); 13757 cmdline_parse_token_string_t cmd_set_mplsoudp_decap_ip_version_value = 13758 TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_decap_result, 13759 ip_version, "ipv4#ipv6"); 13760 13761 static void cmd_set_mplsoudp_decap_parsed(void *parsed_result, 13762 __rte_unused struct cmdline *cl, 13763 __rte_unused void *data) 13764 { 13765 struct cmd_set_mplsoudp_decap_result *res = parsed_result; 13766 13767 if (strcmp(res->mplsoudp, "mplsoudp_decap") == 0) 13768 mplsoudp_decap_conf.select_vlan = 0; 13769 else if (strcmp(res->mplsoudp, "mplsoudp_decap-with-vlan") == 0) 13770 mplsoudp_decap_conf.select_vlan = 1; 13771 if (strcmp(res->ip_version, "ipv4") == 0) 13772 mplsoudp_decap_conf.select_ipv4 = 1; 13773 else if (strcmp(res->ip_version, "ipv6") == 0) 13774 mplsoudp_decap_conf.select_ipv4 = 0; 13775 } 13776 13777 cmdline_parse_inst_t cmd_set_mplsoudp_decap = { 13778 .f = cmd_set_mplsoudp_decap_parsed, 13779 .data = NULL, 13780 .help_str = "set mplsoudp_decap ip-version ipv4|ipv6", 13781 .tokens = { 13782 (void *)&cmd_set_mplsoudp_decap_set, 13783 (void *)&cmd_set_mplsoudp_decap_mplsoudp_decap, 13784 (void *)&cmd_set_mplsoudp_decap_ip_version, 13785 (void *)&cmd_set_mplsoudp_decap_ip_version_value, 13786 NULL, 13787 }, 13788 }; 13789 13790 cmdline_parse_inst_t cmd_set_mplsoudp_decap_with_vlan = { 13791 .f = cmd_set_mplsoudp_decap_parsed, 13792 .data = NULL, 13793 .help_str = "set mplsoudp_decap-with-vlan ip-version ipv4|ipv6", 13794 .tokens = { 13795 (void *)&cmd_set_mplsoudp_decap_set, 13796 (void *)&cmd_set_mplsoudp_decap_mplsoudp_decap_with_vlan, 13797 (void *)&cmd_set_mplsoudp_decap_ip_version, 13798 (void *)&cmd_set_mplsoudp_decap_ip_version_value, 13799 NULL, 13800 }, 13801 }; 13802 13803 /** Set connection tracking object common details */ 13804 struct cmd_set_conntrack_common_result { 13805 cmdline_fixed_string_t set; 13806 cmdline_fixed_string_t conntrack; 13807 cmdline_fixed_string_t common; 13808 cmdline_fixed_string_t peer; 13809 cmdline_fixed_string_t is_orig; 13810 cmdline_fixed_string_t enable; 13811 cmdline_fixed_string_t live; 13812 cmdline_fixed_string_t sack; 13813 cmdline_fixed_string_t cack; 13814 cmdline_fixed_string_t last_dir; 13815 cmdline_fixed_string_t liberal; 13816 cmdline_fixed_string_t state; 13817 cmdline_fixed_string_t max_ack_win; 13818 cmdline_fixed_string_t retrans; 13819 cmdline_fixed_string_t last_win; 13820 cmdline_fixed_string_t last_seq; 13821 cmdline_fixed_string_t last_ack; 13822 cmdline_fixed_string_t last_end; 13823 cmdline_fixed_string_t last_index; 13824 uint8_t stat; 13825 uint8_t factor; 13826 uint16_t peer_port; 13827 uint32_t is_original; 13828 uint32_t en; 13829 uint32_t is_live; 13830 uint32_t s_ack; 13831 uint32_t c_ack; 13832 uint32_t ld; 13833 uint32_t lb; 13834 uint8_t re_num; 13835 uint8_t li; 13836 uint16_t lw; 13837 uint32_t ls; 13838 uint32_t la; 13839 uint32_t le; 13840 }; 13841 13842 cmdline_parse_token_string_t cmd_set_conntrack_set = 13843 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13844 set, "set"); 13845 cmdline_parse_token_string_t cmd_set_conntrack_conntrack = 13846 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13847 conntrack, "conntrack"); 13848 cmdline_parse_token_string_t cmd_set_conntrack_common_com = 13849 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13850 common, "com"); 13851 cmdline_parse_token_string_t cmd_set_conntrack_common_peer = 13852 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13853 peer, "peer"); 13854 cmdline_parse_token_num_t cmd_set_conntrack_common_peer_value = 13855 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_common_result, 13856 peer_port, RTE_UINT16); 13857 cmdline_parse_token_string_t cmd_set_conntrack_common_is_orig = 13858 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13859 is_orig, "is_orig"); 13860 cmdline_parse_token_num_t cmd_set_conntrack_common_is_orig_value = 13861 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_common_result, 13862 is_original, RTE_UINT32); 13863 cmdline_parse_token_string_t cmd_set_conntrack_common_enable = 13864 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13865 enable, "enable"); 13866 cmdline_parse_token_num_t cmd_set_conntrack_common_enable_value = 13867 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_common_result, 13868 en, RTE_UINT32); 13869 cmdline_parse_token_string_t cmd_set_conntrack_common_live = 13870 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13871 live, "live"); 13872 cmdline_parse_token_num_t cmd_set_conntrack_common_live_value = 13873 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_common_result, 13874 is_live, RTE_UINT32); 13875 cmdline_parse_token_string_t cmd_set_conntrack_common_sack = 13876 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13877 sack, "sack"); 13878 cmdline_parse_token_num_t cmd_set_conntrack_common_sack_value = 13879 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_common_result, 13880 s_ack, RTE_UINT32); 13881 cmdline_parse_token_string_t cmd_set_conntrack_common_cack = 13882 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13883 cack, "cack"); 13884 cmdline_parse_token_num_t cmd_set_conntrack_common_cack_value = 13885 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_common_result, 13886 c_ack, RTE_UINT32); 13887 cmdline_parse_token_string_t cmd_set_conntrack_common_last_dir = 13888 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13889 last_dir, "last_dir"); 13890 cmdline_parse_token_num_t cmd_set_conntrack_common_last_dir_value = 13891 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_common_result, 13892 ld, RTE_UINT32); 13893 cmdline_parse_token_string_t cmd_set_conntrack_common_liberal = 13894 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13895 liberal, "liberal"); 13896 cmdline_parse_token_num_t cmd_set_conntrack_common_liberal_value = 13897 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_common_result, 13898 lb, RTE_UINT32); 13899 cmdline_parse_token_string_t cmd_set_conntrack_common_state = 13900 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13901 state, "state"); 13902 cmdline_parse_token_num_t cmd_set_conntrack_common_state_value = 13903 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_common_result, 13904 stat, RTE_UINT8); 13905 cmdline_parse_token_string_t cmd_set_conntrack_common_max_ackwin = 13906 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13907 max_ack_win, "max_ack_win"); 13908 cmdline_parse_token_num_t cmd_set_conntrack_common_max_ackwin_value = 13909 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_common_result, 13910 factor, RTE_UINT8); 13911 cmdline_parse_token_string_t cmd_set_conntrack_common_retrans = 13912 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13913 retrans, "r_lim"); 13914 cmdline_parse_token_num_t cmd_set_conntrack_common_retrans_value = 13915 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_common_result, 13916 re_num, RTE_UINT8); 13917 cmdline_parse_token_string_t cmd_set_conntrack_common_last_win = 13918 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13919 last_win, "last_win"); 13920 cmdline_parse_token_num_t cmd_set_conntrack_common_last_win_value = 13921 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_common_result, 13922 lw, RTE_UINT16); 13923 cmdline_parse_token_string_t cmd_set_conntrack_common_last_seq = 13924 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13925 last_seq, "last_seq"); 13926 cmdline_parse_token_num_t cmd_set_conntrack_common_last_seq_value = 13927 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_common_result, 13928 ls, RTE_UINT32); 13929 cmdline_parse_token_string_t cmd_set_conntrack_common_last_ack = 13930 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13931 last_ack, "last_ack"); 13932 cmdline_parse_token_num_t cmd_set_conntrack_common_last_ack_value = 13933 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_common_result, 13934 la, RTE_UINT32); 13935 cmdline_parse_token_string_t cmd_set_conntrack_common_last_end = 13936 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13937 last_end, "last_end"); 13938 cmdline_parse_token_num_t cmd_set_conntrack_common_last_end_value = 13939 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_common_result, 13940 le, RTE_UINT32); 13941 cmdline_parse_token_string_t cmd_set_conntrack_common_last_index = 13942 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_common_result, 13943 last_index, "last_index"); 13944 cmdline_parse_token_num_t cmd_set_conntrack_common_last_index_value = 13945 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_common_result, 13946 li, RTE_UINT8); 13947 13948 static void cmd_set_conntrack_common_parsed(void *parsed_result, 13949 __rte_unused struct cmdline *cl, 13950 __rte_unused void *data) 13951 { 13952 struct cmd_set_conntrack_common_result *res = parsed_result; 13953 13954 /* No need to swap to big endian. */ 13955 conntrack_context.peer_port = res->peer_port; 13956 conntrack_context.is_original_dir = res->is_original; 13957 conntrack_context.enable = res->en; 13958 conntrack_context.live_connection = res->is_live; 13959 conntrack_context.selective_ack = res->s_ack; 13960 conntrack_context.challenge_ack_passed = res->c_ack; 13961 conntrack_context.last_direction = res->ld; 13962 conntrack_context.liberal_mode = res->lb; 13963 conntrack_context.state = (enum rte_flow_conntrack_state)res->stat; 13964 conntrack_context.max_ack_window = res->factor; 13965 conntrack_context.retransmission_limit = res->re_num; 13966 conntrack_context.last_window = res->lw; 13967 conntrack_context.last_index = 13968 (enum rte_flow_conntrack_tcp_last_index)res->li; 13969 conntrack_context.last_seq = res->ls; 13970 conntrack_context.last_ack = res->la; 13971 conntrack_context.last_end = res->le; 13972 } 13973 13974 cmdline_parse_inst_t cmd_set_conntrack_common = { 13975 .f = cmd_set_conntrack_common_parsed, 13976 .data = NULL, 13977 .help_str = "set conntrack com peer <port_id> is_orig <dir> enable <en>" 13978 " live <ack_seen> sack <en> cack <passed> last_dir <dir>" 13979 " liberal <en> state <s> max_ack_win <factor> r_lim <num>" 13980 " last_win <win> last_seq <seq> last_ack <ack> last_end <end>" 13981 " last_index <flag>", 13982 .tokens = { 13983 (void *)&cmd_set_conntrack_set, 13984 (void *)&cmd_set_conntrack_conntrack, 13985 (void *)&cmd_set_conntrack_common_com, 13986 (void *)&cmd_set_conntrack_common_peer, 13987 (void *)&cmd_set_conntrack_common_peer_value, 13988 (void *)&cmd_set_conntrack_common_is_orig, 13989 (void *)&cmd_set_conntrack_common_is_orig_value, 13990 (void *)&cmd_set_conntrack_common_enable, 13991 (void *)&cmd_set_conntrack_common_enable_value, 13992 (void *)&cmd_set_conntrack_common_live, 13993 (void *)&cmd_set_conntrack_common_live_value, 13994 (void *)&cmd_set_conntrack_common_sack, 13995 (void *)&cmd_set_conntrack_common_sack_value, 13996 (void *)&cmd_set_conntrack_common_cack, 13997 (void *)&cmd_set_conntrack_common_cack_value, 13998 (void *)&cmd_set_conntrack_common_last_dir, 13999 (void *)&cmd_set_conntrack_common_last_dir_value, 14000 (void *)&cmd_set_conntrack_common_liberal, 14001 (void *)&cmd_set_conntrack_common_liberal_value, 14002 (void *)&cmd_set_conntrack_common_state, 14003 (void *)&cmd_set_conntrack_common_state_value, 14004 (void *)&cmd_set_conntrack_common_max_ackwin, 14005 (void *)&cmd_set_conntrack_common_max_ackwin_value, 14006 (void *)&cmd_set_conntrack_common_retrans, 14007 (void *)&cmd_set_conntrack_common_retrans_value, 14008 (void *)&cmd_set_conntrack_common_last_win, 14009 (void *)&cmd_set_conntrack_common_last_win_value, 14010 (void *)&cmd_set_conntrack_common_last_seq, 14011 (void *)&cmd_set_conntrack_common_last_seq_value, 14012 (void *)&cmd_set_conntrack_common_last_ack, 14013 (void *)&cmd_set_conntrack_common_last_ack_value, 14014 (void *)&cmd_set_conntrack_common_last_end, 14015 (void *)&cmd_set_conntrack_common_last_end_value, 14016 (void *)&cmd_set_conntrack_common_last_index, 14017 (void *)&cmd_set_conntrack_common_last_index_value, 14018 NULL, 14019 }, 14020 }; 14021 14022 /** Set connection tracking object both directions' details */ 14023 struct cmd_set_conntrack_dir_result { 14024 cmdline_fixed_string_t set; 14025 cmdline_fixed_string_t conntrack; 14026 cmdline_fixed_string_t dir; 14027 cmdline_fixed_string_t scale; 14028 cmdline_fixed_string_t fin; 14029 cmdline_fixed_string_t ack_seen; 14030 cmdline_fixed_string_t unack; 14031 cmdline_fixed_string_t sent_end; 14032 cmdline_fixed_string_t reply_end; 14033 cmdline_fixed_string_t max_win; 14034 cmdline_fixed_string_t max_ack; 14035 uint32_t factor; 14036 uint32_t f; 14037 uint32_t as; 14038 uint32_t un; 14039 uint32_t se; 14040 uint32_t re; 14041 uint32_t mw; 14042 uint32_t ma; 14043 }; 14044 14045 cmdline_parse_token_string_t cmd_set_conntrack_dir_set = 14046 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_dir_result, 14047 set, "set"); 14048 cmdline_parse_token_string_t cmd_set_conntrack_dir_conntrack = 14049 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_dir_result, 14050 conntrack, "conntrack"); 14051 cmdline_parse_token_string_t cmd_set_conntrack_dir_dir = 14052 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_dir_result, 14053 dir, "orig#rply"); 14054 cmdline_parse_token_string_t cmd_set_conntrack_dir_scale = 14055 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_dir_result, 14056 scale, "scale"); 14057 cmdline_parse_token_num_t cmd_set_conntrack_dir_scale_value = 14058 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_dir_result, 14059 factor, RTE_UINT32); 14060 cmdline_parse_token_string_t cmd_set_conntrack_dir_fin = 14061 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_dir_result, 14062 fin, "fin"); 14063 cmdline_parse_token_num_t cmd_set_conntrack_dir_fin_value = 14064 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_dir_result, 14065 f, RTE_UINT32); 14066 cmdline_parse_token_string_t cmd_set_conntrack_dir_ack = 14067 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_dir_result, 14068 ack_seen, "acked"); 14069 cmdline_parse_token_num_t cmd_set_conntrack_dir_ack_value = 14070 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_dir_result, 14071 as, RTE_UINT32); 14072 cmdline_parse_token_string_t cmd_set_conntrack_dir_unack_data = 14073 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_dir_result, 14074 unack, "unack_data"); 14075 cmdline_parse_token_num_t cmd_set_conntrack_dir_unack_data_value = 14076 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_dir_result, 14077 un, RTE_UINT32); 14078 cmdline_parse_token_string_t cmd_set_conntrack_dir_sent_end = 14079 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_dir_result, 14080 sent_end, "sent_end"); 14081 cmdline_parse_token_num_t cmd_set_conntrack_dir_sent_end_value = 14082 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_dir_result, 14083 se, RTE_UINT32); 14084 cmdline_parse_token_string_t cmd_set_conntrack_dir_reply_end = 14085 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_dir_result, 14086 reply_end, "reply_end"); 14087 cmdline_parse_token_num_t cmd_set_conntrack_dir_reply_end_value = 14088 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_dir_result, 14089 re, RTE_UINT32); 14090 cmdline_parse_token_string_t cmd_set_conntrack_dir_max_win = 14091 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_dir_result, 14092 max_win, "max_win"); 14093 cmdline_parse_token_num_t cmd_set_conntrack_dir_max_win_value = 14094 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_dir_result, 14095 mw, RTE_UINT32); 14096 cmdline_parse_token_string_t cmd_set_conntrack_dir_max_ack = 14097 TOKEN_STRING_INITIALIZER(struct cmd_set_conntrack_dir_result, 14098 max_ack, "max_ack"); 14099 cmdline_parse_token_num_t cmd_set_conntrack_dir_max_ack_value = 14100 TOKEN_NUM_INITIALIZER(struct cmd_set_conntrack_dir_result, 14101 ma, RTE_UINT32); 14102 14103 static void cmd_set_conntrack_dir_parsed(void *parsed_result, 14104 __rte_unused struct cmdline *cl, 14105 __rte_unused void *data) 14106 { 14107 struct cmd_set_conntrack_dir_result *res = parsed_result; 14108 struct rte_flow_tcp_dir_param *dir = NULL; 14109 14110 if (strcmp(res->dir, "orig") == 0) 14111 dir = &conntrack_context.original_dir; 14112 else if (strcmp(res->dir, "rply") == 0) 14113 dir = &conntrack_context.reply_dir; 14114 else 14115 return; 14116 dir->scale = res->factor; 14117 dir->close_initiated = res->f; 14118 dir->last_ack_seen = res->as; 14119 dir->data_unacked = res->un; 14120 dir->sent_end = res->se; 14121 dir->reply_end = res->re; 14122 dir->max_ack = res->ma; 14123 dir->max_win = res->mw; 14124 } 14125 14126 cmdline_parse_inst_t cmd_set_conntrack_dir = { 14127 .f = cmd_set_conntrack_dir_parsed, 14128 .data = NULL, 14129 .help_str = "set conntrack orig|rply scale <factor> fin <sent>" 14130 " acked <seen> unack_data <unack> sent_end <sent>" 14131 " reply_end <reply> max_win <win> max_ack <ack>", 14132 .tokens = { 14133 (void *)&cmd_set_conntrack_set, 14134 (void *)&cmd_set_conntrack_conntrack, 14135 (void *)&cmd_set_conntrack_dir_dir, 14136 (void *)&cmd_set_conntrack_dir_scale, 14137 (void *)&cmd_set_conntrack_dir_scale_value, 14138 (void *)&cmd_set_conntrack_dir_fin, 14139 (void *)&cmd_set_conntrack_dir_fin_value, 14140 (void *)&cmd_set_conntrack_dir_ack, 14141 (void *)&cmd_set_conntrack_dir_ack_value, 14142 (void *)&cmd_set_conntrack_dir_unack_data, 14143 (void *)&cmd_set_conntrack_dir_unack_data_value, 14144 (void *)&cmd_set_conntrack_dir_sent_end, 14145 (void *)&cmd_set_conntrack_dir_sent_end_value, 14146 (void *)&cmd_set_conntrack_dir_reply_end, 14147 (void *)&cmd_set_conntrack_dir_reply_end_value, 14148 (void *)&cmd_set_conntrack_dir_max_win, 14149 (void *)&cmd_set_conntrack_dir_max_win_value, 14150 (void *)&cmd_set_conntrack_dir_max_ack, 14151 (void *)&cmd_set_conntrack_dir_max_ack_value, 14152 NULL, 14153 }, 14154 }; 14155 14156 /* Strict link priority scheduling mode setting */ 14157 static void 14158 cmd_strict_link_prio_parsed( 14159 void *parsed_result, 14160 __rte_unused struct cmdline *cl, 14161 __rte_unused void *data) 14162 { 14163 struct cmd_vf_tc_bw_result *res = parsed_result; 14164 int ret = -ENOTSUP; 14165 14166 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 14167 return; 14168 14169 #ifdef RTE_NET_I40E 14170 ret = rte_pmd_i40e_set_tc_strict_prio(res->port_id, res->tc_map); 14171 #endif 14172 14173 switch (ret) { 14174 case 0: 14175 break; 14176 case -EINVAL: 14177 printf("invalid tc_bitmap 0x%x\n", res->tc_map); 14178 break; 14179 case -ENODEV: 14180 printf("invalid port_id %d\n", res->port_id); 14181 break; 14182 case -ENOTSUP: 14183 printf("function not implemented\n"); 14184 break; 14185 default: 14186 printf("programming error: (%s)\n", strerror(-ret)); 14187 } 14188 } 14189 14190 cmdline_parse_inst_t cmd_strict_link_prio = { 14191 .f = cmd_strict_link_prio_parsed, 14192 .data = NULL, 14193 .help_str = "set tx strict-link-priority <port_id> <tc_bitmap>", 14194 .tokens = { 14195 (void *)&cmd_vf_tc_bw_set, 14196 (void *)&cmd_vf_tc_bw_tx, 14197 (void *)&cmd_vf_tc_bw_strict_link_prio, 14198 (void *)&cmd_vf_tc_bw_port_id, 14199 (void *)&cmd_vf_tc_bw_tc_map, 14200 NULL, 14201 }, 14202 }; 14203 14204 /* Load dynamic device personalization*/ 14205 struct cmd_ddp_add_result { 14206 cmdline_fixed_string_t ddp; 14207 cmdline_fixed_string_t add; 14208 portid_t port_id; 14209 char filepath[]; 14210 }; 14211 14212 cmdline_parse_token_string_t cmd_ddp_add_ddp = 14213 TOKEN_STRING_INITIALIZER(struct cmd_ddp_add_result, ddp, "ddp"); 14214 cmdline_parse_token_string_t cmd_ddp_add_add = 14215 TOKEN_STRING_INITIALIZER(struct cmd_ddp_add_result, add, "add"); 14216 cmdline_parse_token_num_t cmd_ddp_add_port_id = 14217 TOKEN_NUM_INITIALIZER(struct cmd_ddp_add_result, port_id, 14218 RTE_UINT16); 14219 cmdline_parse_token_string_t cmd_ddp_add_filepath = 14220 TOKEN_STRING_INITIALIZER(struct cmd_ddp_add_result, filepath, NULL); 14221 14222 static void 14223 cmd_ddp_add_parsed( 14224 void *parsed_result, 14225 __rte_unused struct cmdline *cl, 14226 __rte_unused void *data) 14227 { 14228 struct cmd_ddp_add_result *res = parsed_result; 14229 uint8_t *buff; 14230 uint32_t size; 14231 char *filepath; 14232 char *file_fld[2]; 14233 int file_num; 14234 int ret = -ENOTSUP; 14235 14236 if (!all_ports_stopped()) { 14237 printf("Please stop all ports first\n"); 14238 return; 14239 } 14240 14241 filepath = strdup(res->filepath); 14242 if (filepath == NULL) { 14243 printf("Failed to allocate memory\n"); 14244 return; 14245 } 14246 file_num = rte_strsplit(filepath, strlen(filepath), file_fld, 2, ','); 14247 14248 buff = open_file(file_fld[0], &size); 14249 if (!buff) { 14250 free((void *)filepath); 14251 return; 14252 } 14253 14254 #ifdef RTE_NET_I40E 14255 if (ret == -ENOTSUP) 14256 ret = rte_pmd_i40e_process_ddp_package(res->port_id, 14257 buff, size, 14258 RTE_PMD_I40E_PKG_OP_WR_ADD); 14259 #endif 14260 14261 if (ret == -EEXIST) 14262 printf("Profile has already existed.\n"); 14263 else if (ret < 0) 14264 printf("Failed to load profile.\n"); 14265 else if (file_num == 2) 14266 save_file(file_fld[1], buff, size); 14267 14268 close_file(buff); 14269 free((void *)filepath); 14270 } 14271 14272 cmdline_parse_inst_t cmd_ddp_add = { 14273 .f = cmd_ddp_add_parsed, 14274 .data = NULL, 14275 .help_str = "ddp add <port_id> <profile_path[,backup_profile_path]>", 14276 .tokens = { 14277 (void *)&cmd_ddp_add_ddp, 14278 (void *)&cmd_ddp_add_add, 14279 (void *)&cmd_ddp_add_port_id, 14280 (void *)&cmd_ddp_add_filepath, 14281 NULL, 14282 }, 14283 }; 14284 14285 /* Delete dynamic device personalization*/ 14286 struct cmd_ddp_del_result { 14287 cmdline_fixed_string_t ddp; 14288 cmdline_fixed_string_t del; 14289 portid_t port_id; 14290 char filepath[]; 14291 }; 14292 14293 cmdline_parse_token_string_t cmd_ddp_del_ddp = 14294 TOKEN_STRING_INITIALIZER(struct cmd_ddp_del_result, ddp, "ddp"); 14295 cmdline_parse_token_string_t cmd_ddp_del_del = 14296 TOKEN_STRING_INITIALIZER(struct cmd_ddp_del_result, del, "del"); 14297 cmdline_parse_token_num_t cmd_ddp_del_port_id = 14298 TOKEN_NUM_INITIALIZER(struct cmd_ddp_del_result, port_id, RTE_UINT16); 14299 cmdline_parse_token_string_t cmd_ddp_del_filepath = 14300 TOKEN_STRING_INITIALIZER(struct cmd_ddp_del_result, filepath, NULL); 14301 14302 static void 14303 cmd_ddp_del_parsed( 14304 void *parsed_result, 14305 __rte_unused struct cmdline *cl, 14306 __rte_unused void *data) 14307 { 14308 struct cmd_ddp_del_result *res = parsed_result; 14309 uint8_t *buff; 14310 uint32_t size; 14311 int ret = -ENOTSUP; 14312 14313 if (!all_ports_stopped()) { 14314 printf("Please stop all ports first\n"); 14315 return; 14316 } 14317 14318 buff = open_file(res->filepath, &size); 14319 if (!buff) 14320 return; 14321 14322 #ifdef RTE_NET_I40E 14323 if (ret == -ENOTSUP) 14324 ret = rte_pmd_i40e_process_ddp_package(res->port_id, 14325 buff, size, 14326 RTE_PMD_I40E_PKG_OP_WR_DEL); 14327 #endif 14328 14329 if (ret == -EACCES) 14330 printf("Profile does not exist.\n"); 14331 else if (ret < 0) 14332 printf("Failed to delete profile.\n"); 14333 14334 close_file(buff); 14335 } 14336 14337 cmdline_parse_inst_t cmd_ddp_del = { 14338 .f = cmd_ddp_del_parsed, 14339 .data = NULL, 14340 .help_str = "ddp del <port_id> <backup_profile_path>", 14341 .tokens = { 14342 (void *)&cmd_ddp_del_ddp, 14343 (void *)&cmd_ddp_del_del, 14344 (void *)&cmd_ddp_del_port_id, 14345 (void *)&cmd_ddp_del_filepath, 14346 NULL, 14347 }, 14348 }; 14349 14350 /* Get dynamic device personalization profile info */ 14351 struct cmd_ddp_info_result { 14352 cmdline_fixed_string_t ddp; 14353 cmdline_fixed_string_t get; 14354 cmdline_fixed_string_t info; 14355 char filepath[]; 14356 }; 14357 14358 cmdline_parse_token_string_t cmd_ddp_info_ddp = 14359 TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, ddp, "ddp"); 14360 cmdline_parse_token_string_t cmd_ddp_info_get = 14361 TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, get, "get"); 14362 cmdline_parse_token_string_t cmd_ddp_info_info = 14363 TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, info, "info"); 14364 cmdline_parse_token_string_t cmd_ddp_info_filepath = 14365 TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, filepath, NULL); 14366 14367 static void 14368 cmd_ddp_info_parsed( 14369 void *parsed_result, 14370 __rte_unused struct cmdline *cl, 14371 __rte_unused void *data) 14372 { 14373 struct cmd_ddp_info_result *res = parsed_result; 14374 uint8_t *pkg; 14375 uint32_t pkg_size; 14376 int ret = -ENOTSUP; 14377 #ifdef RTE_NET_I40E 14378 uint32_t i, j, n; 14379 uint8_t *buff; 14380 uint32_t buff_size = 0; 14381 struct rte_pmd_i40e_profile_info info; 14382 uint32_t dev_num = 0; 14383 struct rte_pmd_i40e_ddp_device_id *devs; 14384 uint32_t proto_num = 0; 14385 struct rte_pmd_i40e_proto_info *proto = NULL; 14386 uint32_t pctype_num = 0; 14387 struct rte_pmd_i40e_ptype_info *pctype; 14388 uint32_t ptype_num = 0; 14389 struct rte_pmd_i40e_ptype_info *ptype; 14390 uint8_t proto_id; 14391 14392 #endif 14393 14394 pkg = open_file(res->filepath, &pkg_size); 14395 if (!pkg) 14396 return; 14397 14398 #ifdef RTE_NET_I40E 14399 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, 14400 (uint8_t *)&info, sizeof(info), 14401 RTE_PMD_I40E_PKG_INFO_GLOBAL_HEADER); 14402 if (!ret) { 14403 printf("Global Track id: 0x%x\n", info.track_id); 14404 printf("Global Version: %d.%d.%d.%d\n", 14405 info.version.major, 14406 info.version.minor, 14407 info.version.update, 14408 info.version.draft); 14409 printf("Global Package name: %s\n\n", info.name); 14410 } 14411 14412 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, 14413 (uint8_t *)&info, sizeof(info), 14414 RTE_PMD_I40E_PKG_INFO_HEADER); 14415 if (!ret) { 14416 printf("i40e Profile Track id: 0x%x\n", info.track_id); 14417 printf("i40e Profile Version: %d.%d.%d.%d\n", 14418 info.version.major, 14419 info.version.minor, 14420 info.version.update, 14421 info.version.draft); 14422 printf("i40e Profile name: %s\n\n", info.name); 14423 } 14424 14425 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, 14426 (uint8_t *)&buff_size, sizeof(buff_size), 14427 RTE_PMD_I40E_PKG_INFO_GLOBAL_NOTES_SIZE); 14428 if (!ret && buff_size) { 14429 buff = (uint8_t *)malloc(buff_size); 14430 if (buff) { 14431 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, 14432 buff, buff_size, 14433 RTE_PMD_I40E_PKG_INFO_GLOBAL_NOTES); 14434 if (!ret) 14435 printf("Package Notes:\n%s\n\n", buff); 14436 free(buff); 14437 } 14438 } 14439 14440 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, 14441 (uint8_t *)&dev_num, sizeof(dev_num), 14442 RTE_PMD_I40E_PKG_INFO_DEVID_NUM); 14443 if (!ret && dev_num) { 14444 buff_size = dev_num * sizeof(struct rte_pmd_i40e_ddp_device_id); 14445 devs = (struct rte_pmd_i40e_ddp_device_id *)malloc(buff_size); 14446 if (devs) { 14447 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, 14448 (uint8_t *)devs, buff_size, 14449 RTE_PMD_I40E_PKG_INFO_DEVID_LIST); 14450 if (!ret) { 14451 printf("List of supported devices:\n"); 14452 for (i = 0; i < dev_num; i++) { 14453 printf(" %04X:%04X %04X:%04X\n", 14454 devs[i].vendor_dev_id >> 16, 14455 devs[i].vendor_dev_id & 0xFFFF, 14456 devs[i].sub_vendor_dev_id >> 16, 14457 devs[i].sub_vendor_dev_id & 0xFFFF); 14458 } 14459 printf("\n"); 14460 } 14461 free(devs); 14462 } 14463 } 14464 14465 /* get information about protocols and packet types */ 14466 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, 14467 (uint8_t *)&proto_num, sizeof(proto_num), 14468 RTE_PMD_I40E_PKG_INFO_PROTOCOL_NUM); 14469 if (ret || !proto_num) 14470 goto no_print_return; 14471 14472 buff_size = proto_num * sizeof(struct rte_pmd_i40e_proto_info); 14473 proto = (struct rte_pmd_i40e_proto_info *)malloc(buff_size); 14474 if (!proto) 14475 goto no_print_return; 14476 14477 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, (uint8_t *)proto, 14478 buff_size, 14479 RTE_PMD_I40E_PKG_INFO_PROTOCOL_LIST); 14480 if (!ret) { 14481 printf("List of used protocols:\n"); 14482 for (i = 0; i < proto_num; i++) 14483 printf(" %2u: %s\n", proto[i].proto_id, 14484 proto[i].name); 14485 printf("\n"); 14486 } 14487 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, 14488 (uint8_t *)&pctype_num, sizeof(pctype_num), 14489 RTE_PMD_I40E_PKG_INFO_PCTYPE_NUM); 14490 if (ret || !pctype_num) 14491 goto no_print_pctypes; 14492 14493 buff_size = pctype_num * sizeof(struct rte_pmd_i40e_ptype_info); 14494 pctype = (struct rte_pmd_i40e_ptype_info *)malloc(buff_size); 14495 if (!pctype) 14496 goto no_print_pctypes; 14497 14498 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, (uint8_t *)pctype, 14499 buff_size, 14500 RTE_PMD_I40E_PKG_INFO_PCTYPE_LIST); 14501 if (ret) { 14502 free(pctype); 14503 goto no_print_pctypes; 14504 } 14505 14506 printf("List of defined packet classification types:\n"); 14507 for (i = 0; i < pctype_num; i++) { 14508 printf(" %2u:", pctype[i].ptype_id); 14509 for (j = 0; j < RTE_PMD_I40E_PROTO_NUM; j++) { 14510 proto_id = pctype[i].protocols[j]; 14511 if (proto_id != RTE_PMD_I40E_PROTO_UNUSED) { 14512 for (n = 0; n < proto_num; n++) { 14513 if (proto[n].proto_id == proto_id) { 14514 printf(" %s", proto[n].name); 14515 break; 14516 } 14517 } 14518 } 14519 } 14520 printf("\n"); 14521 } 14522 printf("\n"); 14523 free(pctype); 14524 14525 no_print_pctypes: 14526 14527 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, (uint8_t *)&ptype_num, 14528 sizeof(ptype_num), 14529 RTE_PMD_I40E_PKG_INFO_PTYPE_NUM); 14530 if (ret || !ptype_num) 14531 goto no_print_return; 14532 14533 buff_size = ptype_num * sizeof(struct rte_pmd_i40e_ptype_info); 14534 ptype = (struct rte_pmd_i40e_ptype_info *)malloc(buff_size); 14535 if (!ptype) 14536 goto no_print_return; 14537 14538 ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size, (uint8_t *)ptype, 14539 buff_size, 14540 RTE_PMD_I40E_PKG_INFO_PTYPE_LIST); 14541 if (ret) { 14542 free(ptype); 14543 goto no_print_return; 14544 } 14545 printf("List of defined packet types:\n"); 14546 for (i = 0; i < ptype_num; i++) { 14547 printf(" %2u:", ptype[i].ptype_id); 14548 for (j = 0; j < RTE_PMD_I40E_PROTO_NUM; j++) { 14549 proto_id = ptype[i].protocols[j]; 14550 if (proto_id != RTE_PMD_I40E_PROTO_UNUSED) { 14551 for (n = 0; n < proto_num; n++) { 14552 if (proto[n].proto_id == proto_id) { 14553 printf(" %s", proto[n].name); 14554 break; 14555 } 14556 } 14557 } 14558 } 14559 printf("\n"); 14560 } 14561 free(ptype); 14562 printf("\n"); 14563 14564 ret = 0; 14565 no_print_return: 14566 if (proto) 14567 free(proto); 14568 #endif 14569 if (ret == -ENOTSUP) 14570 printf("Function not supported in PMD driver\n"); 14571 close_file(pkg); 14572 } 14573 14574 cmdline_parse_inst_t cmd_ddp_get_info = { 14575 .f = cmd_ddp_info_parsed, 14576 .data = NULL, 14577 .help_str = "ddp get info <profile_path>", 14578 .tokens = { 14579 (void *)&cmd_ddp_info_ddp, 14580 (void *)&cmd_ddp_info_get, 14581 (void *)&cmd_ddp_info_info, 14582 (void *)&cmd_ddp_info_filepath, 14583 NULL, 14584 }, 14585 }; 14586 14587 /* Get dynamic device personalization profile info list*/ 14588 #define PROFILE_INFO_SIZE 48 14589 #define MAX_PROFILE_NUM 16 14590 14591 struct cmd_ddp_get_list_result { 14592 cmdline_fixed_string_t ddp; 14593 cmdline_fixed_string_t get; 14594 cmdline_fixed_string_t list; 14595 portid_t port_id; 14596 }; 14597 14598 cmdline_parse_token_string_t cmd_ddp_get_list_ddp = 14599 TOKEN_STRING_INITIALIZER(struct cmd_ddp_get_list_result, ddp, "ddp"); 14600 cmdline_parse_token_string_t cmd_ddp_get_list_get = 14601 TOKEN_STRING_INITIALIZER(struct cmd_ddp_get_list_result, get, "get"); 14602 cmdline_parse_token_string_t cmd_ddp_get_list_list = 14603 TOKEN_STRING_INITIALIZER(struct cmd_ddp_get_list_result, list, "list"); 14604 cmdline_parse_token_num_t cmd_ddp_get_list_port_id = 14605 TOKEN_NUM_INITIALIZER(struct cmd_ddp_get_list_result, port_id, 14606 RTE_UINT16); 14607 14608 static void 14609 cmd_ddp_get_list_parsed( 14610 __rte_unused void *parsed_result, 14611 __rte_unused struct cmdline *cl, 14612 __rte_unused void *data) 14613 { 14614 #ifdef RTE_NET_I40E 14615 struct cmd_ddp_get_list_result *res = parsed_result; 14616 struct rte_pmd_i40e_profile_list *p_list; 14617 struct rte_pmd_i40e_profile_info *p_info; 14618 uint32_t p_num; 14619 uint32_t size; 14620 uint32_t i; 14621 #endif 14622 int ret = -ENOTSUP; 14623 14624 #ifdef RTE_NET_I40E 14625 size = PROFILE_INFO_SIZE * MAX_PROFILE_NUM + 4; 14626 p_list = (struct rte_pmd_i40e_profile_list *)malloc(size); 14627 if (!p_list) { 14628 printf("%s: Failed to malloc buffer\n", __func__); 14629 return; 14630 } 14631 14632 if (ret == -ENOTSUP) 14633 ret = rte_pmd_i40e_get_ddp_list(res->port_id, 14634 (uint8_t *)p_list, size); 14635 14636 if (!ret) { 14637 p_num = p_list->p_count; 14638 printf("Profile number is: %d\n\n", p_num); 14639 14640 for (i = 0; i < p_num; i++) { 14641 p_info = &p_list->p_info[i]; 14642 printf("Profile %d:\n", i); 14643 printf("Track id: 0x%x\n", p_info->track_id); 14644 printf("Version: %d.%d.%d.%d\n", 14645 p_info->version.major, 14646 p_info->version.minor, 14647 p_info->version.update, 14648 p_info->version.draft); 14649 printf("Profile name: %s\n\n", p_info->name); 14650 } 14651 } 14652 14653 free(p_list); 14654 #endif 14655 14656 if (ret < 0) 14657 printf("Failed to get ddp list\n"); 14658 } 14659 14660 cmdline_parse_inst_t cmd_ddp_get_list = { 14661 .f = cmd_ddp_get_list_parsed, 14662 .data = NULL, 14663 .help_str = "ddp get list <port_id>", 14664 .tokens = { 14665 (void *)&cmd_ddp_get_list_ddp, 14666 (void *)&cmd_ddp_get_list_get, 14667 (void *)&cmd_ddp_get_list_list, 14668 (void *)&cmd_ddp_get_list_port_id, 14669 NULL, 14670 }, 14671 }; 14672 14673 /* Configure input set */ 14674 struct cmd_cfg_input_set_result { 14675 cmdline_fixed_string_t port; 14676 cmdline_fixed_string_t cfg; 14677 portid_t port_id; 14678 cmdline_fixed_string_t pctype; 14679 uint8_t pctype_id; 14680 cmdline_fixed_string_t inset_type; 14681 cmdline_fixed_string_t opt; 14682 cmdline_fixed_string_t field; 14683 uint8_t field_idx; 14684 }; 14685 14686 static void 14687 cmd_cfg_input_set_parsed( 14688 __rte_unused void *parsed_result, 14689 __rte_unused struct cmdline *cl, 14690 __rte_unused void *data) 14691 { 14692 #ifdef RTE_NET_I40E 14693 struct cmd_cfg_input_set_result *res = parsed_result; 14694 enum rte_pmd_i40e_inset_type inset_type = INSET_NONE; 14695 struct rte_pmd_i40e_inset inset; 14696 #endif 14697 int ret = -ENOTSUP; 14698 14699 if (!all_ports_stopped()) { 14700 printf("Please stop all ports first\n"); 14701 return; 14702 } 14703 14704 #ifdef RTE_NET_I40E 14705 if (!strcmp(res->inset_type, "hash_inset")) 14706 inset_type = INSET_HASH; 14707 else if (!strcmp(res->inset_type, "fdir_inset")) 14708 inset_type = INSET_FDIR; 14709 else if (!strcmp(res->inset_type, "fdir_flx_inset")) 14710 inset_type = INSET_FDIR_FLX; 14711 ret = rte_pmd_i40e_inset_get(res->port_id, res->pctype_id, 14712 &inset, inset_type); 14713 if (ret) { 14714 printf("Failed to get input set.\n"); 14715 return; 14716 } 14717 14718 if (!strcmp(res->opt, "get")) { 14719 ret = rte_pmd_i40e_inset_field_get(inset.inset, 14720 res->field_idx); 14721 if (ret) 14722 printf("Field index %d is enabled.\n", res->field_idx); 14723 else 14724 printf("Field index %d is disabled.\n", res->field_idx); 14725 return; 14726 } else if (!strcmp(res->opt, "set")) 14727 ret = rte_pmd_i40e_inset_field_set(&inset.inset, 14728 res->field_idx); 14729 else if (!strcmp(res->opt, "clear")) 14730 ret = rte_pmd_i40e_inset_field_clear(&inset.inset, 14731 res->field_idx); 14732 if (ret) { 14733 printf("Failed to configure input set field.\n"); 14734 return; 14735 } 14736 14737 ret = rte_pmd_i40e_inset_set(res->port_id, res->pctype_id, 14738 &inset, inset_type); 14739 if (ret) { 14740 printf("Failed to set input set.\n"); 14741 return; 14742 } 14743 #endif 14744 14745 if (ret == -ENOTSUP) 14746 printf("Function not supported\n"); 14747 } 14748 14749 cmdline_parse_token_string_t cmd_cfg_input_set_port = 14750 TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result, 14751 port, "port"); 14752 cmdline_parse_token_string_t cmd_cfg_input_set_cfg = 14753 TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result, 14754 cfg, "config"); 14755 cmdline_parse_token_num_t cmd_cfg_input_set_port_id = 14756 TOKEN_NUM_INITIALIZER(struct cmd_cfg_input_set_result, 14757 port_id, RTE_UINT16); 14758 cmdline_parse_token_string_t cmd_cfg_input_set_pctype = 14759 TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result, 14760 pctype, "pctype"); 14761 cmdline_parse_token_num_t cmd_cfg_input_set_pctype_id = 14762 TOKEN_NUM_INITIALIZER(struct cmd_cfg_input_set_result, 14763 pctype_id, RTE_UINT8); 14764 cmdline_parse_token_string_t cmd_cfg_input_set_inset_type = 14765 TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result, 14766 inset_type, 14767 "hash_inset#fdir_inset#fdir_flx_inset"); 14768 cmdline_parse_token_string_t cmd_cfg_input_set_opt = 14769 TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result, 14770 opt, "get#set#clear"); 14771 cmdline_parse_token_string_t cmd_cfg_input_set_field = 14772 TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result, 14773 field, "field"); 14774 cmdline_parse_token_num_t cmd_cfg_input_set_field_idx = 14775 TOKEN_NUM_INITIALIZER(struct cmd_cfg_input_set_result, 14776 field_idx, RTE_UINT8); 14777 14778 cmdline_parse_inst_t cmd_cfg_input_set = { 14779 .f = cmd_cfg_input_set_parsed, 14780 .data = NULL, 14781 .help_str = "port config <port_id> pctype <pctype_id> hash_inset|" 14782 "fdir_inset|fdir_flx_inset get|set|clear field <field_idx>", 14783 .tokens = { 14784 (void *)&cmd_cfg_input_set_port, 14785 (void *)&cmd_cfg_input_set_cfg, 14786 (void *)&cmd_cfg_input_set_port_id, 14787 (void *)&cmd_cfg_input_set_pctype, 14788 (void *)&cmd_cfg_input_set_pctype_id, 14789 (void *)&cmd_cfg_input_set_inset_type, 14790 (void *)&cmd_cfg_input_set_opt, 14791 (void *)&cmd_cfg_input_set_field, 14792 (void *)&cmd_cfg_input_set_field_idx, 14793 NULL, 14794 }, 14795 }; 14796 14797 /* Clear input set */ 14798 struct cmd_clear_input_set_result { 14799 cmdline_fixed_string_t port; 14800 cmdline_fixed_string_t cfg; 14801 portid_t port_id; 14802 cmdline_fixed_string_t pctype; 14803 uint8_t pctype_id; 14804 cmdline_fixed_string_t inset_type; 14805 cmdline_fixed_string_t clear; 14806 cmdline_fixed_string_t all; 14807 }; 14808 14809 static void 14810 cmd_clear_input_set_parsed( 14811 __rte_unused void *parsed_result, 14812 __rte_unused struct cmdline *cl, 14813 __rte_unused void *data) 14814 { 14815 #ifdef RTE_NET_I40E 14816 struct cmd_clear_input_set_result *res = parsed_result; 14817 enum rte_pmd_i40e_inset_type inset_type = INSET_NONE; 14818 struct rte_pmd_i40e_inset inset; 14819 #endif 14820 int ret = -ENOTSUP; 14821 14822 if (!all_ports_stopped()) { 14823 printf("Please stop all ports first\n"); 14824 return; 14825 } 14826 14827 #ifdef RTE_NET_I40E 14828 if (!strcmp(res->inset_type, "hash_inset")) 14829 inset_type = INSET_HASH; 14830 else if (!strcmp(res->inset_type, "fdir_inset")) 14831 inset_type = INSET_FDIR; 14832 else if (!strcmp(res->inset_type, "fdir_flx_inset")) 14833 inset_type = INSET_FDIR_FLX; 14834 14835 memset(&inset, 0, sizeof(inset)); 14836 14837 ret = rte_pmd_i40e_inset_set(res->port_id, res->pctype_id, 14838 &inset, inset_type); 14839 if (ret) { 14840 printf("Failed to clear input set.\n"); 14841 return; 14842 } 14843 14844 #endif 14845 14846 if (ret == -ENOTSUP) 14847 printf("Function not supported\n"); 14848 } 14849 14850 cmdline_parse_token_string_t cmd_clear_input_set_port = 14851 TOKEN_STRING_INITIALIZER(struct cmd_clear_input_set_result, 14852 port, "port"); 14853 cmdline_parse_token_string_t cmd_clear_input_set_cfg = 14854 TOKEN_STRING_INITIALIZER(struct cmd_clear_input_set_result, 14855 cfg, "config"); 14856 cmdline_parse_token_num_t cmd_clear_input_set_port_id = 14857 TOKEN_NUM_INITIALIZER(struct cmd_clear_input_set_result, 14858 port_id, RTE_UINT16); 14859 cmdline_parse_token_string_t cmd_clear_input_set_pctype = 14860 TOKEN_STRING_INITIALIZER(struct cmd_clear_input_set_result, 14861 pctype, "pctype"); 14862 cmdline_parse_token_num_t cmd_clear_input_set_pctype_id = 14863 TOKEN_NUM_INITIALIZER(struct cmd_clear_input_set_result, 14864 pctype_id, RTE_UINT8); 14865 cmdline_parse_token_string_t cmd_clear_input_set_inset_type = 14866 TOKEN_STRING_INITIALIZER(struct cmd_clear_input_set_result, 14867 inset_type, 14868 "hash_inset#fdir_inset#fdir_flx_inset"); 14869 cmdline_parse_token_string_t cmd_clear_input_set_clear = 14870 TOKEN_STRING_INITIALIZER(struct cmd_clear_input_set_result, 14871 clear, "clear"); 14872 cmdline_parse_token_string_t cmd_clear_input_set_all = 14873 TOKEN_STRING_INITIALIZER(struct cmd_clear_input_set_result, 14874 all, "all"); 14875 14876 cmdline_parse_inst_t cmd_clear_input_set = { 14877 .f = cmd_clear_input_set_parsed, 14878 .data = NULL, 14879 .help_str = "port config <port_id> pctype <pctype_id> hash_inset|" 14880 "fdir_inset|fdir_flx_inset clear all", 14881 .tokens = { 14882 (void *)&cmd_clear_input_set_port, 14883 (void *)&cmd_clear_input_set_cfg, 14884 (void *)&cmd_clear_input_set_port_id, 14885 (void *)&cmd_clear_input_set_pctype, 14886 (void *)&cmd_clear_input_set_pctype_id, 14887 (void *)&cmd_clear_input_set_inset_type, 14888 (void *)&cmd_clear_input_set_clear, 14889 (void *)&cmd_clear_input_set_all, 14890 NULL, 14891 }, 14892 }; 14893 14894 /* show vf stats */ 14895 14896 /* Common result structure for show vf stats */ 14897 struct cmd_show_vf_stats_result { 14898 cmdline_fixed_string_t show; 14899 cmdline_fixed_string_t vf; 14900 cmdline_fixed_string_t stats; 14901 portid_t port_id; 14902 uint16_t vf_id; 14903 }; 14904 14905 /* Common CLI fields show vf stats*/ 14906 cmdline_parse_token_string_t cmd_show_vf_stats_show = 14907 TOKEN_STRING_INITIALIZER 14908 (struct cmd_show_vf_stats_result, 14909 show, "show"); 14910 cmdline_parse_token_string_t cmd_show_vf_stats_vf = 14911 TOKEN_STRING_INITIALIZER 14912 (struct cmd_show_vf_stats_result, 14913 vf, "vf"); 14914 cmdline_parse_token_string_t cmd_show_vf_stats_stats = 14915 TOKEN_STRING_INITIALIZER 14916 (struct cmd_show_vf_stats_result, 14917 stats, "stats"); 14918 cmdline_parse_token_num_t cmd_show_vf_stats_port_id = 14919 TOKEN_NUM_INITIALIZER 14920 (struct cmd_show_vf_stats_result, 14921 port_id, RTE_UINT16); 14922 cmdline_parse_token_num_t cmd_show_vf_stats_vf_id = 14923 TOKEN_NUM_INITIALIZER 14924 (struct cmd_show_vf_stats_result, 14925 vf_id, RTE_UINT16); 14926 14927 static void 14928 cmd_show_vf_stats_parsed( 14929 void *parsed_result, 14930 __rte_unused struct cmdline *cl, 14931 __rte_unused void *data) 14932 { 14933 struct cmd_show_vf_stats_result *res = parsed_result; 14934 struct rte_eth_stats stats; 14935 int ret = -ENOTSUP; 14936 static const char *nic_stats_border = "########################"; 14937 14938 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 14939 return; 14940 14941 memset(&stats, 0, sizeof(stats)); 14942 14943 #ifdef RTE_NET_I40E 14944 if (ret == -ENOTSUP) 14945 ret = rte_pmd_i40e_get_vf_stats(res->port_id, 14946 res->vf_id, 14947 &stats); 14948 #endif 14949 #ifdef RTE_NET_BNXT 14950 if (ret == -ENOTSUP) 14951 ret = rte_pmd_bnxt_get_vf_stats(res->port_id, 14952 res->vf_id, 14953 &stats); 14954 #endif 14955 14956 switch (ret) { 14957 case 0: 14958 break; 14959 case -EINVAL: 14960 printf("invalid vf_id %d\n", res->vf_id); 14961 break; 14962 case -ENODEV: 14963 printf("invalid port_id %d\n", res->port_id); 14964 break; 14965 case -ENOTSUP: 14966 printf("function not implemented\n"); 14967 break; 14968 default: 14969 printf("programming error: (%s)\n", strerror(-ret)); 14970 } 14971 14972 printf("\n %s NIC statistics for port %-2d vf %-2d %s\n", 14973 nic_stats_border, res->port_id, res->vf_id, nic_stats_border); 14974 14975 printf(" RX-packets: %-10"PRIu64" RX-missed: %-10"PRIu64" RX-bytes: " 14976 "%-"PRIu64"\n", 14977 stats.ipackets, stats.imissed, stats.ibytes); 14978 printf(" RX-errors: %-"PRIu64"\n", stats.ierrors); 14979 printf(" RX-nombuf: %-10"PRIu64"\n", 14980 stats.rx_nombuf); 14981 printf(" TX-packets: %-10"PRIu64" TX-errors: %-10"PRIu64" TX-bytes: " 14982 "%-"PRIu64"\n", 14983 stats.opackets, stats.oerrors, stats.obytes); 14984 14985 printf(" %s############################%s\n", 14986 nic_stats_border, nic_stats_border); 14987 } 14988 14989 cmdline_parse_inst_t cmd_show_vf_stats = { 14990 .f = cmd_show_vf_stats_parsed, 14991 .data = NULL, 14992 .help_str = "show vf stats <port_id> <vf_id>", 14993 .tokens = { 14994 (void *)&cmd_show_vf_stats_show, 14995 (void *)&cmd_show_vf_stats_vf, 14996 (void *)&cmd_show_vf_stats_stats, 14997 (void *)&cmd_show_vf_stats_port_id, 14998 (void *)&cmd_show_vf_stats_vf_id, 14999 NULL, 15000 }, 15001 }; 15002 15003 /* clear vf stats */ 15004 15005 /* Common result structure for clear vf stats */ 15006 struct cmd_clear_vf_stats_result { 15007 cmdline_fixed_string_t clear; 15008 cmdline_fixed_string_t vf; 15009 cmdline_fixed_string_t stats; 15010 portid_t port_id; 15011 uint16_t vf_id; 15012 }; 15013 15014 /* Common CLI fields clear vf stats*/ 15015 cmdline_parse_token_string_t cmd_clear_vf_stats_clear = 15016 TOKEN_STRING_INITIALIZER 15017 (struct cmd_clear_vf_stats_result, 15018 clear, "clear"); 15019 cmdline_parse_token_string_t cmd_clear_vf_stats_vf = 15020 TOKEN_STRING_INITIALIZER 15021 (struct cmd_clear_vf_stats_result, 15022 vf, "vf"); 15023 cmdline_parse_token_string_t cmd_clear_vf_stats_stats = 15024 TOKEN_STRING_INITIALIZER 15025 (struct cmd_clear_vf_stats_result, 15026 stats, "stats"); 15027 cmdline_parse_token_num_t cmd_clear_vf_stats_port_id = 15028 TOKEN_NUM_INITIALIZER 15029 (struct cmd_clear_vf_stats_result, 15030 port_id, RTE_UINT16); 15031 cmdline_parse_token_num_t cmd_clear_vf_stats_vf_id = 15032 TOKEN_NUM_INITIALIZER 15033 (struct cmd_clear_vf_stats_result, 15034 vf_id, RTE_UINT16); 15035 15036 static void 15037 cmd_clear_vf_stats_parsed( 15038 void *parsed_result, 15039 __rte_unused struct cmdline *cl, 15040 __rte_unused void *data) 15041 { 15042 struct cmd_clear_vf_stats_result *res = parsed_result; 15043 int ret = -ENOTSUP; 15044 15045 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 15046 return; 15047 15048 #ifdef RTE_NET_I40E 15049 if (ret == -ENOTSUP) 15050 ret = rte_pmd_i40e_reset_vf_stats(res->port_id, 15051 res->vf_id); 15052 #endif 15053 #ifdef RTE_NET_BNXT 15054 if (ret == -ENOTSUP) 15055 ret = rte_pmd_bnxt_reset_vf_stats(res->port_id, 15056 res->vf_id); 15057 #endif 15058 15059 switch (ret) { 15060 case 0: 15061 break; 15062 case -EINVAL: 15063 printf("invalid vf_id %d\n", res->vf_id); 15064 break; 15065 case -ENODEV: 15066 printf("invalid port_id %d\n", res->port_id); 15067 break; 15068 case -ENOTSUP: 15069 printf("function not implemented\n"); 15070 break; 15071 default: 15072 printf("programming error: (%s)\n", strerror(-ret)); 15073 } 15074 } 15075 15076 cmdline_parse_inst_t cmd_clear_vf_stats = { 15077 .f = cmd_clear_vf_stats_parsed, 15078 .data = NULL, 15079 .help_str = "clear vf stats <port_id> <vf_id>", 15080 .tokens = { 15081 (void *)&cmd_clear_vf_stats_clear, 15082 (void *)&cmd_clear_vf_stats_vf, 15083 (void *)&cmd_clear_vf_stats_stats, 15084 (void *)&cmd_clear_vf_stats_port_id, 15085 (void *)&cmd_clear_vf_stats_vf_id, 15086 NULL, 15087 }, 15088 }; 15089 15090 /* port config pctype mapping reset */ 15091 15092 /* Common result structure for port config pctype mapping reset */ 15093 struct cmd_pctype_mapping_reset_result { 15094 cmdline_fixed_string_t port; 15095 cmdline_fixed_string_t config; 15096 portid_t port_id; 15097 cmdline_fixed_string_t pctype; 15098 cmdline_fixed_string_t mapping; 15099 cmdline_fixed_string_t reset; 15100 }; 15101 15102 /* Common CLI fields for port config pctype mapping reset*/ 15103 cmdline_parse_token_string_t cmd_pctype_mapping_reset_port = 15104 TOKEN_STRING_INITIALIZER 15105 (struct cmd_pctype_mapping_reset_result, 15106 port, "port"); 15107 cmdline_parse_token_string_t cmd_pctype_mapping_reset_config = 15108 TOKEN_STRING_INITIALIZER 15109 (struct cmd_pctype_mapping_reset_result, 15110 config, "config"); 15111 cmdline_parse_token_num_t cmd_pctype_mapping_reset_port_id = 15112 TOKEN_NUM_INITIALIZER 15113 (struct cmd_pctype_mapping_reset_result, 15114 port_id, RTE_UINT16); 15115 cmdline_parse_token_string_t cmd_pctype_mapping_reset_pctype = 15116 TOKEN_STRING_INITIALIZER 15117 (struct cmd_pctype_mapping_reset_result, 15118 pctype, "pctype"); 15119 cmdline_parse_token_string_t cmd_pctype_mapping_reset_mapping = 15120 TOKEN_STRING_INITIALIZER 15121 (struct cmd_pctype_mapping_reset_result, 15122 mapping, "mapping"); 15123 cmdline_parse_token_string_t cmd_pctype_mapping_reset_reset = 15124 TOKEN_STRING_INITIALIZER 15125 (struct cmd_pctype_mapping_reset_result, 15126 reset, "reset"); 15127 15128 static void 15129 cmd_pctype_mapping_reset_parsed( 15130 void *parsed_result, 15131 __rte_unused struct cmdline *cl, 15132 __rte_unused void *data) 15133 { 15134 struct cmd_pctype_mapping_reset_result *res = parsed_result; 15135 int ret = -ENOTSUP; 15136 15137 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 15138 return; 15139 15140 #ifdef RTE_NET_I40E 15141 ret = rte_pmd_i40e_flow_type_mapping_reset(res->port_id); 15142 #endif 15143 15144 switch (ret) { 15145 case 0: 15146 break; 15147 case -ENODEV: 15148 printf("invalid port_id %d\n", res->port_id); 15149 break; 15150 case -ENOTSUP: 15151 printf("function not implemented\n"); 15152 break; 15153 default: 15154 printf("programming error: (%s)\n", strerror(-ret)); 15155 } 15156 } 15157 15158 cmdline_parse_inst_t cmd_pctype_mapping_reset = { 15159 .f = cmd_pctype_mapping_reset_parsed, 15160 .data = NULL, 15161 .help_str = "port config <port_id> pctype mapping reset", 15162 .tokens = { 15163 (void *)&cmd_pctype_mapping_reset_port, 15164 (void *)&cmd_pctype_mapping_reset_config, 15165 (void *)&cmd_pctype_mapping_reset_port_id, 15166 (void *)&cmd_pctype_mapping_reset_pctype, 15167 (void *)&cmd_pctype_mapping_reset_mapping, 15168 (void *)&cmd_pctype_mapping_reset_reset, 15169 NULL, 15170 }, 15171 }; 15172 15173 /* show port pctype mapping */ 15174 15175 /* Common result structure for show port pctype mapping */ 15176 struct cmd_pctype_mapping_get_result { 15177 cmdline_fixed_string_t show; 15178 cmdline_fixed_string_t port; 15179 portid_t port_id; 15180 cmdline_fixed_string_t pctype; 15181 cmdline_fixed_string_t mapping; 15182 }; 15183 15184 /* Common CLI fields for pctype mapping get */ 15185 cmdline_parse_token_string_t cmd_pctype_mapping_get_show = 15186 TOKEN_STRING_INITIALIZER 15187 (struct cmd_pctype_mapping_get_result, 15188 show, "show"); 15189 cmdline_parse_token_string_t cmd_pctype_mapping_get_port = 15190 TOKEN_STRING_INITIALIZER 15191 (struct cmd_pctype_mapping_get_result, 15192 port, "port"); 15193 cmdline_parse_token_num_t cmd_pctype_mapping_get_port_id = 15194 TOKEN_NUM_INITIALIZER 15195 (struct cmd_pctype_mapping_get_result, 15196 port_id, RTE_UINT16); 15197 cmdline_parse_token_string_t cmd_pctype_mapping_get_pctype = 15198 TOKEN_STRING_INITIALIZER 15199 (struct cmd_pctype_mapping_get_result, 15200 pctype, "pctype"); 15201 cmdline_parse_token_string_t cmd_pctype_mapping_get_mapping = 15202 TOKEN_STRING_INITIALIZER 15203 (struct cmd_pctype_mapping_get_result, 15204 mapping, "mapping"); 15205 15206 static void 15207 cmd_pctype_mapping_get_parsed( 15208 void *parsed_result, 15209 __rte_unused struct cmdline *cl, 15210 __rte_unused void *data) 15211 { 15212 struct cmd_pctype_mapping_get_result *res = parsed_result; 15213 int ret = -ENOTSUP; 15214 #ifdef RTE_NET_I40E 15215 struct rte_pmd_i40e_flow_type_mapping 15216 mapping[RTE_PMD_I40E_FLOW_TYPE_MAX]; 15217 int i, j, first_pctype; 15218 #endif 15219 15220 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 15221 return; 15222 15223 #ifdef RTE_NET_I40E 15224 ret = rte_pmd_i40e_flow_type_mapping_get(res->port_id, mapping); 15225 #endif 15226 15227 switch (ret) { 15228 case 0: 15229 break; 15230 case -ENODEV: 15231 printf("invalid port_id %d\n", res->port_id); 15232 return; 15233 case -ENOTSUP: 15234 printf("function not implemented\n"); 15235 return; 15236 default: 15237 printf("programming error: (%s)\n", strerror(-ret)); 15238 return; 15239 } 15240 15241 #ifdef RTE_NET_I40E 15242 for (i = 0; i < RTE_PMD_I40E_FLOW_TYPE_MAX; i++) { 15243 if (mapping[i].pctype != 0ULL) { 15244 first_pctype = 1; 15245 15246 printf("pctype: "); 15247 for (j = 0; j < RTE_PMD_I40E_PCTYPE_MAX; j++) { 15248 if (mapping[i].pctype & (1ULL << j)) { 15249 printf(first_pctype ? 15250 "%02d" : ",%02d", j); 15251 first_pctype = 0; 15252 } 15253 } 15254 printf(" -> flowtype: %02d\n", mapping[i].flow_type); 15255 } 15256 } 15257 #endif 15258 } 15259 15260 cmdline_parse_inst_t cmd_pctype_mapping_get = { 15261 .f = cmd_pctype_mapping_get_parsed, 15262 .data = NULL, 15263 .help_str = "show port <port_id> pctype mapping", 15264 .tokens = { 15265 (void *)&cmd_pctype_mapping_get_show, 15266 (void *)&cmd_pctype_mapping_get_port, 15267 (void *)&cmd_pctype_mapping_get_port_id, 15268 (void *)&cmd_pctype_mapping_get_pctype, 15269 (void *)&cmd_pctype_mapping_get_mapping, 15270 NULL, 15271 }, 15272 }; 15273 15274 /* port config pctype mapping update */ 15275 15276 /* Common result structure for port config pctype mapping update */ 15277 struct cmd_pctype_mapping_update_result { 15278 cmdline_fixed_string_t port; 15279 cmdline_fixed_string_t config; 15280 portid_t port_id; 15281 cmdline_fixed_string_t pctype; 15282 cmdline_fixed_string_t mapping; 15283 cmdline_fixed_string_t update; 15284 cmdline_fixed_string_t pctype_list; 15285 uint16_t flow_type; 15286 }; 15287 15288 /* Common CLI fields for pctype mapping update*/ 15289 cmdline_parse_token_string_t cmd_pctype_mapping_update_port = 15290 TOKEN_STRING_INITIALIZER 15291 (struct cmd_pctype_mapping_update_result, 15292 port, "port"); 15293 cmdline_parse_token_string_t cmd_pctype_mapping_update_config = 15294 TOKEN_STRING_INITIALIZER 15295 (struct cmd_pctype_mapping_update_result, 15296 config, "config"); 15297 cmdline_parse_token_num_t cmd_pctype_mapping_update_port_id = 15298 TOKEN_NUM_INITIALIZER 15299 (struct cmd_pctype_mapping_update_result, 15300 port_id, RTE_UINT16); 15301 cmdline_parse_token_string_t cmd_pctype_mapping_update_pctype = 15302 TOKEN_STRING_INITIALIZER 15303 (struct cmd_pctype_mapping_update_result, 15304 pctype, "pctype"); 15305 cmdline_parse_token_string_t cmd_pctype_mapping_update_mapping = 15306 TOKEN_STRING_INITIALIZER 15307 (struct cmd_pctype_mapping_update_result, 15308 mapping, "mapping"); 15309 cmdline_parse_token_string_t cmd_pctype_mapping_update_update = 15310 TOKEN_STRING_INITIALIZER 15311 (struct cmd_pctype_mapping_update_result, 15312 update, "update"); 15313 cmdline_parse_token_string_t cmd_pctype_mapping_update_pc_type = 15314 TOKEN_STRING_INITIALIZER 15315 (struct cmd_pctype_mapping_update_result, 15316 pctype_list, NULL); 15317 cmdline_parse_token_num_t cmd_pctype_mapping_update_flow_type = 15318 TOKEN_NUM_INITIALIZER 15319 (struct cmd_pctype_mapping_update_result, 15320 flow_type, RTE_UINT16); 15321 15322 static void 15323 cmd_pctype_mapping_update_parsed( 15324 void *parsed_result, 15325 __rte_unused struct cmdline *cl, 15326 __rte_unused void *data) 15327 { 15328 struct cmd_pctype_mapping_update_result *res = parsed_result; 15329 int ret = -ENOTSUP; 15330 #ifdef RTE_NET_I40E 15331 struct rte_pmd_i40e_flow_type_mapping mapping; 15332 unsigned int i; 15333 unsigned int nb_item; 15334 unsigned int pctype_list[RTE_PMD_I40E_PCTYPE_MAX]; 15335 #endif 15336 15337 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 15338 return; 15339 15340 #ifdef RTE_NET_I40E 15341 nb_item = parse_item_list(res->pctype_list, "pctypes", 15342 RTE_PMD_I40E_PCTYPE_MAX, pctype_list, 1); 15343 mapping.flow_type = res->flow_type; 15344 for (i = 0, mapping.pctype = 0ULL; i < nb_item; i++) 15345 mapping.pctype |= (1ULL << pctype_list[i]); 15346 ret = rte_pmd_i40e_flow_type_mapping_update(res->port_id, 15347 &mapping, 15348 1, 15349 0); 15350 #endif 15351 15352 switch (ret) { 15353 case 0: 15354 break; 15355 case -EINVAL: 15356 printf("invalid pctype or flow type\n"); 15357 break; 15358 case -ENODEV: 15359 printf("invalid port_id %d\n", res->port_id); 15360 break; 15361 case -ENOTSUP: 15362 printf("function not implemented\n"); 15363 break; 15364 default: 15365 printf("programming error: (%s)\n", strerror(-ret)); 15366 } 15367 } 15368 15369 cmdline_parse_inst_t cmd_pctype_mapping_update = { 15370 .f = cmd_pctype_mapping_update_parsed, 15371 .data = NULL, 15372 .help_str = "port config <port_id> pctype mapping update" 15373 " <pctype_id_0,[pctype_id_1]*> <flowtype_id>", 15374 .tokens = { 15375 (void *)&cmd_pctype_mapping_update_port, 15376 (void *)&cmd_pctype_mapping_update_config, 15377 (void *)&cmd_pctype_mapping_update_port_id, 15378 (void *)&cmd_pctype_mapping_update_pctype, 15379 (void *)&cmd_pctype_mapping_update_mapping, 15380 (void *)&cmd_pctype_mapping_update_update, 15381 (void *)&cmd_pctype_mapping_update_pc_type, 15382 (void *)&cmd_pctype_mapping_update_flow_type, 15383 NULL, 15384 }, 15385 }; 15386 15387 /* ptype mapping get */ 15388 15389 /* Common result structure for ptype mapping get */ 15390 struct cmd_ptype_mapping_get_result { 15391 cmdline_fixed_string_t ptype; 15392 cmdline_fixed_string_t mapping; 15393 cmdline_fixed_string_t get; 15394 portid_t port_id; 15395 uint8_t valid_only; 15396 }; 15397 15398 /* Common CLI fields for ptype mapping get */ 15399 cmdline_parse_token_string_t cmd_ptype_mapping_get_ptype = 15400 TOKEN_STRING_INITIALIZER 15401 (struct cmd_ptype_mapping_get_result, 15402 ptype, "ptype"); 15403 cmdline_parse_token_string_t cmd_ptype_mapping_get_mapping = 15404 TOKEN_STRING_INITIALIZER 15405 (struct cmd_ptype_mapping_get_result, 15406 mapping, "mapping"); 15407 cmdline_parse_token_string_t cmd_ptype_mapping_get_get = 15408 TOKEN_STRING_INITIALIZER 15409 (struct cmd_ptype_mapping_get_result, 15410 get, "get"); 15411 cmdline_parse_token_num_t cmd_ptype_mapping_get_port_id = 15412 TOKEN_NUM_INITIALIZER 15413 (struct cmd_ptype_mapping_get_result, 15414 port_id, RTE_UINT16); 15415 cmdline_parse_token_num_t cmd_ptype_mapping_get_valid_only = 15416 TOKEN_NUM_INITIALIZER 15417 (struct cmd_ptype_mapping_get_result, 15418 valid_only, RTE_UINT8); 15419 15420 static void 15421 cmd_ptype_mapping_get_parsed( 15422 void *parsed_result, 15423 __rte_unused struct cmdline *cl, 15424 __rte_unused void *data) 15425 { 15426 struct cmd_ptype_mapping_get_result *res = parsed_result; 15427 int ret = -ENOTSUP; 15428 #ifdef RTE_NET_I40E 15429 int max_ptype_num = 256; 15430 struct rte_pmd_i40e_ptype_mapping mapping[max_ptype_num]; 15431 uint16_t count; 15432 int i; 15433 #endif 15434 15435 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 15436 return; 15437 15438 #ifdef RTE_NET_I40E 15439 ret = rte_pmd_i40e_ptype_mapping_get(res->port_id, 15440 mapping, 15441 max_ptype_num, 15442 &count, 15443 res->valid_only); 15444 #endif 15445 15446 switch (ret) { 15447 case 0: 15448 break; 15449 case -ENODEV: 15450 printf("invalid port_id %d\n", res->port_id); 15451 break; 15452 case -ENOTSUP: 15453 printf("function not implemented\n"); 15454 break; 15455 default: 15456 printf("programming error: (%s)\n", strerror(-ret)); 15457 } 15458 15459 #ifdef RTE_NET_I40E 15460 if (!ret) { 15461 for (i = 0; i < count; i++) 15462 printf("%3d\t0x%08x\n", 15463 mapping[i].hw_ptype, mapping[i].sw_ptype); 15464 } 15465 #endif 15466 } 15467 15468 cmdline_parse_inst_t cmd_ptype_mapping_get = { 15469 .f = cmd_ptype_mapping_get_parsed, 15470 .data = NULL, 15471 .help_str = "ptype mapping get <port_id> <valid_only>", 15472 .tokens = { 15473 (void *)&cmd_ptype_mapping_get_ptype, 15474 (void *)&cmd_ptype_mapping_get_mapping, 15475 (void *)&cmd_ptype_mapping_get_get, 15476 (void *)&cmd_ptype_mapping_get_port_id, 15477 (void *)&cmd_ptype_mapping_get_valid_only, 15478 NULL, 15479 }, 15480 }; 15481 15482 /* ptype mapping replace */ 15483 15484 /* Common result structure for ptype mapping replace */ 15485 struct cmd_ptype_mapping_replace_result { 15486 cmdline_fixed_string_t ptype; 15487 cmdline_fixed_string_t mapping; 15488 cmdline_fixed_string_t replace; 15489 portid_t port_id; 15490 uint32_t target; 15491 uint8_t mask; 15492 uint32_t pkt_type; 15493 }; 15494 15495 /* Common CLI fields for ptype mapping replace */ 15496 cmdline_parse_token_string_t cmd_ptype_mapping_replace_ptype = 15497 TOKEN_STRING_INITIALIZER 15498 (struct cmd_ptype_mapping_replace_result, 15499 ptype, "ptype"); 15500 cmdline_parse_token_string_t cmd_ptype_mapping_replace_mapping = 15501 TOKEN_STRING_INITIALIZER 15502 (struct cmd_ptype_mapping_replace_result, 15503 mapping, "mapping"); 15504 cmdline_parse_token_string_t cmd_ptype_mapping_replace_replace = 15505 TOKEN_STRING_INITIALIZER 15506 (struct cmd_ptype_mapping_replace_result, 15507 replace, "replace"); 15508 cmdline_parse_token_num_t cmd_ptype_mapping_replace_port_id = 15509 TOKEN_NUM_INITIALIZER 15510 (struct cmd_ptype_mapping_replace_result, 15511 port_id, RTE_UINT16); 15512 cmdline_parse_token_num_t cmd_ptype_mapping_replace_target = 15513 TOKEN_NUM_INITIALIZER 15514 (struct cmd_ptype_mapping_replace_result, 15515 target, RTE_UINT32); 15516 cmdline_parse_token_num_t cmd_ptype_mapping_replace_mask = 15517 TOKEN_NUM_INITIALIZER 15518 (struct cmd_ptype_mapping_replace_result, 15519 mask, RTE_UINT8); 15520 cmdline_parse_token_num_t cmd_ptype_mapping_replace_pkt_type = 15521 TOKEN_NUM_INITIALIZER 15522 (struct cmd_ptype_mapping_replace_result, 15523 pkt_type, RTE_UINT32); 15524 15525 static void 15526 cmd_ptype_mapping_replace_parsed( 15527 void *parsed_result, 15528 __rte_unused struct cmdline *cl, 15529 __rte_unused void *data) 15530 { 15531 struct cmd_ptype_mapping_replace_result *res = parsed_result; 15532 int ret = -ENOTSUP; 15533 15534 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 15535 return; 15536 15537 #ifdef RTE_NET_I40E 15538 ret = rte_pmd_i40e_ptype_mapping_replace(res->port_id, 15539 res->target, 15540 res->mask, 15541 res->pkt_type); 15542 #endif 15543 15544 switch (ret) { 15545 case 0: 15546 break; 15547 case -EINVAL: 15548 printf("invalid ptype 0x%8x or 0x%8x\n", 15549 res->target, res->pkt_type); 15550 break; 15551 case -ENODEV: 15552 printf("invalid port_id %d\n", res->port_id); 15553 break; 15554 case -ENOTSUP: 15555 printf("function not implemented\n"); 15556 break; 15557 default: 15558 printf("programming error: (%s)\n", strerror(-ret)); 15559 } 15560 } 15561 15562 cmdline_parse_inst_t cmd_ptype_mapping_replace = { 15563 .f = cmd_ptype_mapping_replace_parsed, 15564 .data = NULL, 15565 .help_str = 15566 "ptype mapping replace <port_id> <target> <mask> <pkt_type>", 15567 .tokens = { 15568 (void *)&cmd_ptype_mapping_replace_ptype, 15569 (void *)&cmd_ptype_mapping_replace_mapping, 15570 (void *)&cmd_ptype_mapping_replace_replace, 15571 (void *)&cmd_ptype_mapping_replace_port_id, 15572 (void *)&cmd_ptype_mapping_replace_target, 15573 (void *)&cmd_ptype_mapping_replace_mask, 15574 (void *)&cmd_ptype_mapping_replace_pkt_type, 15575 NULL, 15576 }, 15577 }; 15578 15579 /* ptype mapping reset */ 15580 15581 /* Common result structure for ptype mapping reset */ 15582 struct cmd_ptype_mapping_reset_result { 15583 cmdline_fixed_string_t ptype; 15584 cmdline_fixed_string_t mapping; 15585 cmdline_fixed_string_t reset; 15586 portid_t port_id; 15587 }; 15588 15589 /* Common CLI fields for ptype mapping reset*/ 15590 cmdline_parse_token_string_t cmd_ptype_mapping_reset_ptype = 15591 TOKEN_STRING_INITIALIZER 15592 (struct cmd_ptype_mapping_reset_result, 15593 ptype, "ptype"); 15594 cmdline_parse_token_string_t cmd_ptype_mapping_reset_mapping = 15595 TOKEN_STRING_INITIALIZER 15596 (struct cmd_ptype_mapping_reset_result, 15597 mapping, "mapping"); 15598 cmdline_parse_token_string_t cmd_ptype_mapping_reset_reset = 15599 TOKEN_STRING_INITIALIZER 15600 (struct cmd_ptype_mapping_reset_result, 15601 reset, "reset"); 15602 cmdline_parse_token_num_t cmd_ptype_mapping_reset_port_id = 15603 TOKEN_NUM_INITIALIZER 15604 (struct cmd_ptype_mapping_reset_result, 15605 port_id, RTE_UINT16); 15606 15607 static void 15608 cmd_ptype_mapping_reset_parsed( 15609 void *parsed_result, 15610 __rte_unused struct cmdline *cl, 15611 __rte_unused void *data) 15612 { 15613 struct cmd_ptype_mapping_reset_result *res = parsed_result; 15614 int ret = -ENOTSUP; 15615 15616 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 15617 return; 15618 15619 #ifdef RTE_NET_I40E 15620 ret = rte_pmd_i40e_ptype_mapping_reset(res->port_id); 15621 #endif 15622 15623 switch (ret) { 15624 case 0: 15625 break; 15626 case -ENODEV: 15627 printf("invalid port_id %d\n", res->port_id); 15628 break; 15629 case -ENOTSUP: 15630 printf("function not implemented\n"); 15631 break; 15632 default: 15633 printf("programming error: (%s)\n", strerror(-ret)); 15634 } 15635 } 15636 15637 cmdline_parse_inst_t cmd_ptype_mapping_reset = { 15638 .f = cmd_ptype_mapping_reset_parsed, 15639 .data = NULL, 15640 .help_str = "ptype mapping reset <port_id>", 15641 .tokens = { 15642 (void *)&cmd_ptype_mapping_reset_ptype, 15643 (void *)&cmd_ptype_mapping_reset_mapping, 15644 (void *)&cmd_ptype_mapping_reset_reset, 15645 (void *)&cmd_ptype_mapping_reset_port_id, 15646 NULL, 15647 }, 15648 }; 15649 15650 /* ptype mapping update */ 15651 15652 /* Common result structure for ptype mapping update */ 15653 struct cmd_ptype_mapping_update_result { 15654 cmdline_fixed_string_t ptype; 15655 cmdline_fixed_string_t mapping; 15656 cmdline_fixed_string_t reset; 15657 portid_t port_id; 15658 uint8_t hw_ptype; 15659 uint32_t sw_ptype; 15660 }; 15661 15662 /* Common CLI fields for ptype mapping update*/ 15663 cmdline_parse_token_string_t cmd_ptype_mapping_update_ptype = 15664 TOKEN_STRING_INITIALIZER 15665 (struct cmd_ptype_mapping_update_result, 15666 ptype, "ptype"); 15667 cmdline_parse_token_string_t cmd_ptype_mapping_update_mapping = 15668 TOKEN_STRING_INITIALIZER 15669 (struct cmd_ptype_mapping_update_result, 15670 mapping, "mapping"); 15671 cmdline_parse_token_string_t cmd_ptype_mapping_update_update = 15672 TOKEN_STRING_INITIALIZER 15673 (struct cmd_ptype_mapping_update_result, 15674 reset, "update"); 15675 cmdline_parse_token_num_t cmd_ptype_mapping_update_port_id = 15676 TOKEN_NUM_INITIALIZER 15677 (struct cmd_ptype_mapping_update_result, 15678 port_id, RTE_UINT16); 15679 cmdline_parse_token_num_t cmd_ptype_mapping_update_hw_ptype = 15680 TOKEN_NUM_INITIALIZER 15681 (struct cmd_ptype_mapping_update_result, 15682 hw_ptype, RTE_UINT8); 15683 cmdline_parse_token_num_t cmd_ptype_mapping_update_sw_ptype = 15684 TOKEN_NUM_INITIALIZER 15685 (struct cmd_ptype_mapping_update_result, 15686 sw_ptype, RTE_UINT32); 15687 15688 static void 15689 cmd_ptype_mapping_update_parsed( 15690 void *parsed_result, 15691 __rte_unused struct cmdline *cl, 15692 __rte_unused void *data) 15693 { 15694 struct cmd_ptype_mapping_update_result *res = parsed_result; 15695 int ret = -ENOTSUP; 15696 #ifdef RTE_NET_I40E 15697 struct rte_pmd_i40e_ptype_mapping mapping; 15698 #endif 15699 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 15700 return; 15701 15702 #ifdef RTE_NET_I40E 15703 mapping.hw_ptype = res->hw_ptype; 15704 mapping.sw_ptype = res->sw_ptype; 15705 ret = rte_pmd_i40e_ptype_mapping_update(res->port_id, 15706 &mapping, 15707 1, 15708 0); 15709 #endif 15710 15711 switch (ret) { 15712 case 0: 15713 break; 15714 case -EINVAL: 15715 printf("invalid ptype 0x%8x\n", res->sw_ptype); 15716 break; 15717 case -ENODEV: 15718 printf("invalid port_id %d\n", res->port_id); 15719 break; 15720 case -ENOTSUP: 15721 printf("function not implemented\n"); 15722 break; 15723 default: 15724 printf("programming error: (%s)\n", strerror(-ret)); 15725 } 15726 } 15727 15728 cmdline_parse_inst_t cmd_ptype_mapping_update = { 15729 .f = cmd_ptype_mapping_update_parsed, 15730 .data = NULL, 15731 .help_str = "ptype mapping update <port_id> <hw_ptype> <sw_ptype>", 15732 .tokens = { 15733 (void *)&cmd_ptype_mapping_update_ptype, 15734 (void *)&cmd_ptype_mapping_update_mapping, 15735 (void *)&cmd_ptype_mapping_update_update, 15736 (void *)&cmd_ptype_mapping_update_port_id, 15737 (void *)&cmd_ptype_mapping_update_hw_ptype, 15738 (void *)&cmd_ptype_mapping_update_sw_ptype, 15739 NULL, 15740 }, 15741 }; 15742 15743 /* Common result structure for file commands */ 15744 struct cmd_cmdfile_result { 15745 cmdline_fixed_string_t load; 15746 cmdline_fixed_string_t filename; 15747 }; 15748 15749 /* Common CLI fields for file commands */ 15750 cmdline_parse_token_string_t cmd_load_cmdfile = 15751 TOKEN_STRING_INITIALIZER(struct cmd_cmdfile_result, load, "load"); 15752 cmdline_parse_token_string_t cmd_load_cmdfile_filename = 15753 TOKEN_STRING_INITIALIZER(struct cmd_cmdfile_result, filename, NULL); 15754 15755 static void 15756 cmd_load_from_file_parsed( 15757 void *parsed_result, 15758 __rte_unused struct cmdline *cl, 15759 __rte_unused void *data) 15760 { 15761 struct cmd_cmdfile_result *res = parsed_result; 15762 15763 cmdline_read_from_file(res->filename); 15764 } 15765 15766 cmdline_parse_inst_t cmd_load_from_file = { 15767 .f = cmd_load_from_file_parsed, 15768 .data = NULL, 15769 .help_str = "load <filename>", 15770 .tokens = { 15771 (void *)&cmd_load_cmdfile, 15772 (void *)&cmd_load_cmdfile_filename, 15773 NULL, 15774 }, 15775 }; 15776 15777 /* Get Rx offloads capabilities */ 15778 struct cmd_rx_offload_get_capa_result { 15779 cmdline_fixed_string_t show; 15780 cmdline_fixed_string_t port; 15781 portid_t port_id; 15782 cmdline_fixed_string_t rx_offload; 15783 cmdline_fixed_string_t capabilities; 15784 }; 15785 15786 cmdline_parse_token_string_t cmd_rx_offload_get_capa_show = 15787 TOKEN_STRING_INITIALIZER 15788 (struct cmd_rx_offload_get_capa_result, 15789 show, "show"); 15790 cmdline_parse_token_string_t cmd_rx_offload_get_capa_port = 15791 TOKEN_STRING_INITIALIZER 15792 (struct cmd_rx_offload_get_capa_result, 15793 port, "port"); 15794 cmdline_parse_token_num_t cmd_rx_offload_get_capa_port_id = 15795 TOKEN_NUM_INITIALIZER 15796 (struct cmd_rx_offload_get_capa_result, 15797 port_id, RTE_UINT16); 15798 cmdline_parse_token_string_t cmd_rx_offload_get_capa_rx_offload = 15799 TOKEN_STRING_INITIALIZER 15800 (struct cmd_rx_offload_get_capa_result, 15801 rx_offload, "rx_offload"); 15802 cmdline_parse_token_string_t cmd_rx_offload_get_capa_capabilities = 15803 TOKEN_STRING_INITIALIZER 15804 (struct cmd_rx_offload_get_capa_result, 15805 capabilities, "capabilities"); 15806 15807 static void 15808 print_rx_offloads(uint64_t offloads) 15809 { 15810 uint64_t single_offload; 15811 int begin; 15812 int end; 15813 int bit; 15814 15815 if (offloads == 0) 15816 return; 15817 15818 begin = __builtin_ctzll(offloads); 15819 end = sizeof(offloads) * CHAR_BIT - __builtin_clzll(offloads); 15820 15821 single_offload = 1ULL << begin; 15822 for (bit = begin; bit < end; bit++) { 15823 if (offloads & single_offload) 15824 printf(" %s", 15825 rte_eth_dev_rx_offload_name(single_offload)); 15826 single_offload <<= 1; 15827 } 15828 } 15829 15830 static void 15831 cmd_rx_offload_get_capa_parsed( 15832 void *parsed_result, 15833 __rte_unused struct cmdline *cl, 15834 __rte_unused void *data) 15835 { 15836 struct cmd_rx_offload_get_capa_result *res = parsed_result; 15837 struct rte_eth_dev_info dev_info; 15838 portid_t port_id = res->port_id; 15839 uint64_t queue_offloads; 15840 uint64_t port_offloads; 15841 int ret; 15842 15843 ret = eth_dev_info_get_print_err(port_id, &dev_info); 15844 if (ret != 0) 15845 return; 15846 15847 queue_offloads = dev_info.rx_queue_offload_capa; 15848 port_offloads = dev_info.rx_offload_capa ^ queue_offloads; 15849 15850 printf("Rx Offloading Capabilities of port %d :\n", port_id); 15851 printf(" Per Queue :"); 15852 print_rx_offloads(queue_offloads); 15853 15854 printf("\n"); 15855 printf(" Per Port :"); 15856 print_rx_offloads(port_offloads); 15857 printf("\n\n"); 15858 } 15859 15860 cmdline_parse_inst_t cmd_rx_offload_get_capa = { 15861 .f = cmd_rx_offload_get_capa_parsed, 15862 .data = NULL, 15863 .help_str = "show port <port_id> rx_offload capabilities", 15864 .tokens = { 15865 (void *)&cmd_rx_offload_get_capa_show, 15866 (void *)&cmd_rx_offload_get_capa_port, 15867 (void *)&cmd_rx_offload_get_capa_port_id, 15868 (void *)&cmd_rx_offload_get_capa_rx_offload, 15869 (void *)&cmd_rx_offload_get_capa_capabilities, 15870 NULL, 15871 } 15872 }; 15873 15874 /* Get Rx offloads configuration */ 15875 struct cmd_rx_offload_get_configuration_result { 15876 cmdline_fixed_string_t show; 15877 cmdline_fixed_string_t port; 15878 portid_t port_id; 15879 cmdline_fixed_string_t rx_offload; 15880 cmdline_fixed_string_t configuration; 15881 }; 15882 15883 cmdline_parse_token_string_t cmd_rx_offload_get_configuration_show = 15884 TOKEN_STRING_INITIALIZER 15885 (struct cmd_rx_offload_get_configuration_result, 15886 show, "show"); 15887 cmdline_parse_token_string_t cmd_rx_offload_get_configuration_port = 15888 TOKEN_STRING_INITIALIZER 15889 (struct cmd_rx_offload_get_configuration_result, 15890 port, "port"); 15891 cmdline_parse_token_num_t cmd_rx_offload_get_configuration_port_id = 15892 TOKEN_NUM_INITIALIZER 15893 (struct cmd_rx_offload_get_configuration_result, 15894 port_id, RTE_UINT16); 15895 cmdline_parse_token_string_t cmd_rx_offload_get_configuration_rx_offload = 15896 TOKEN_STRING_INITIALIZER 15897 (struct cmd_rx_offload_get_configuration_result, 15898 rx_offload, "rx_offload"); 15899 cmdline_parse_token_string_t cmd_rx_offload_get_configuration_configuration = 15900 TOKEN_STRING_INITIALIZER 15901 (struct cmd_rx_offload_get_configuration_result, 15902 configuration, "configuration"); 15903 15904 static void 15905 cmd_rx_offload_get_configuration_parsed( 15906 void *parsed_result, 15907 __rte_unused struct cmdline *cl, 15908 __rte_unused void *data) 15909 { 15910 struct cmd_rx_offload_get_configuration_result *res = parsed_result; 15911 struct rte_eth_dev_info dev_info; 15912 portid_t port_id = res->port_id; 15913 struct rte_port *port = &ports[port_id]; 15914 uint64_t port_offloads; 15915 uint64_t queue_offloads; 15916 uint16_t nb_rx_queues; 15917 int q; 15918 int ret; 15919 15920 printf("Rx Offloading Configuration of port %d :\n", port_id); 15921 15922 port_offloads = port->dev_conf.rxmode.offloads; 15923 printf(" Port :"); 15924 print_rx_offloads(port_offloads); 15925 printf("\n"); 15926 15927 ret = eth_dev_info_get_print_err(port_id, &dev_info); 15928 if (ret != 0) 15929 return; 15930 15931 nb_rx_queues = dev_info.nb_rx_queues; 15932 for (q = 0; q < nb_rx_queues; q++) { 15933 queue_offloads = port->rx_conf[q].offloads; 15934 printf(" Queue[%2d] :", q); 15935 print_rx_offloads(queue_offloads); 15936 printf("\n"); 15937 } 15938 printf("\n"); 15939 } 15940 15941 cmdline_parse_inst_t cmd_rx_offload_get_configuration = { 15942 .f = cmd_rx_offload_get_configuration_parsed, 15943 .data = NULL, 15944 .help_str = "show port <port_id> rx_offload configuration", 15945 .tokens = { 15946 (void *)&cmd_rx_offload_get_configuration_show, 15947 (void *)&cmd_rx_offload_get_configuration_port, 15948 (void *)&cmd_rx_offload_get_configuration_port_id, 15949 (void *)&cmd_rx_offload_get_configuration_rx_offload, 15950 (void *)&cmd_rx_offload_get_configuration_configuration, 15951 NULL, 15952 } 15953 }; 15954 15955 /* Enable/Disable a per port offloading */ 15956 struct cmd_config_per_port_rx_offload_result { 15957 cmdline_fixed_string_t port; 15958 cmdline_fixed_string_t config; 15959 portid_t port_id; 15960 cmdline_fixed_string_t rx_offload; 15961 cmdline_fixed_string_t offload; 15962 cmdline_fixed_string_t on_off; 15963 }; 15964 15965 cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_port = 15966 TOKEN_STRING_INITIALIZER 15967 (struct cmd_config_per_port_rx_offload_result, 15968 port, "port"); 15969 cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_config = 15970 TOKEN_STRING_INITIALIZER 15971 (struct cmd_config_per_port_rx_offload_result, 15972 config, "config"); 15973 cmdline_parse_token_num_t cmd_config_per_port_rx_offload_result_port_id = 15974 TOKEN_NUM_INITIALIZER 15975 (struct cmd_config_per_port_rx_offload_result, 15976 port_id, RTE_UINT16); 15977 cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_rx_offload = 15978 TOKEN_STRING_INITIALIZER 15979 (struct cmd_config_per_port_rx_offload_result, 15980 rx_offload, "rx_offload"); 15981 cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_offload = 15982 TOKEN_STRING_INITIALIZER 15983 (struct cmd_config_per_port_rx_offload_result, 15984 offload, "vlan_strip#ipv4_cksum#udp_cksum#tcp_cksum#tcp_lro#" 15985 "qinq_strip#outer_ipv4_cksum#macsec_strip#" 15986 "header_split#vlan_filter#vlan_extend#jumbo_frame#" 15987 "scatter#buffer_split#timestamp#security#" 15988 "keep_crc#rss_hash"); 15989 cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_on_off = 15990 TOKEN_STRING_INITIALIZER 15991 (struct cmd_config_per_port_rx_offload_result, 15992 on_off, "on#off"); 15993 15994 static uint64_t 15995 search_rx_offload(const char *name) 15996 { 15997 uint64_t single_offload; 15998 const char *single_name; 15999 int found = 0; 16000 unsigned int bit; 16001 16002 single_offload = 1; 16003 for (bit = 0; bit < sizeof(single_offload) * CHAR_BIT; bit++) { 16004 single_name = rte_eth_dev_rx_offload_name(single_offload); 16005 if (!strcasecmp(single_name, name)) { 16006 found = 1; 16007 break; 16008 } 16009 single_offload <<= 1; 16010 } 16011 16012 if (found) 16013 return single_offload; 16014 16015 return 0; 16016 } 16017 16018 static void 16019 cmd_config_per_port_rx_offload_parsed(void *parsed_result, 16020 __rte_unused struct cmdline *cl, 16021 __rte_unused void *data) 16022 { 16023 struct cmd_config_per_port_rx_offload_result *res = parsed_result; 16024 portid_t port_id = res->port_id; 16025 struct rte_eth_dev_info dev_info; 16026 struct rte_port *port = &ports[port_id]; 16027 uint64_t single_offload; 16028 uint16_t nb_rx_queues; 16029 int q; 16030 int ret; 16031 16032 if (port->port_status != RTE_PORT_STOPPED) { 16033 printf("Error: Can't config offload when Port %d " 16034 "is not stopped\n", port_id); 16035 return; 16036 } 16037 16038 single_offload = search_rx_offload(res->offload); 16039 if (single_offload == 0) { 16040 printf("Unknown offload name: %s\n", res->offload); 16041 return; 16042 } 16043 16044 ret = eth_dev_info_get_print_err(port_id, &dev_info); 16045 if (ret != 0) 16046 return; 16047 16048 nb_rx_queues = dev_info.nb_rx_queues; 16049 if (!strcmp(res->on_off, "on")) { 16050 port->dev_conf.rxmode.offloads |= single_offload; 16051 for (q = 0; q < nb_rx_queues; q++) 16052 port->rx_conf[q].offloads |= single_offload; 16053 } else { 16054 port->dev_conf.rxmode.offloads &= ~single_offload; 16055 for (q = 0; q < nb_rx_queues; q++) 16056 port->rx_conf[q].offloads &= ~single_offload; 16057 } 16058 16059 cmd_reconfig_device_queue(port_id, 1, 1); 16060 } 16061 16062 cmdline_parse_inst_t cmd_config_per_port_rx_offload = { 16063 .f = cmd_config_per_port_rx_offload_parsed, 16064 .data = NULL, 16065 .help_str = "port config <port_id> rx_offload vlan_strip|ipv4_cksum|" 16066 "udp_cksum|tcp_cksum|tcp_lro|qinq_strip|outer_ipv4_cksum|" 16067 "macsec_strip|header_split|vlan_filter|vlan_extend|" 16068 "jumbo_frame|scatter|buffer_split|timestamp|security|" 16069 "keep_crc|rss_hash on|off", 16070 .tokens = { 16071 (void *)&cmd_config_per_port_rx_offload_result_port, 16072 (void *)&cmd_config_per_port_rx_offload_result_config, 16073 (void *)&cmd_config_per_port_rx_offload_result_port_id, 16074 (void *)&cmd_config_per_port_rx_offload_result_rx_offload, 16075 (void *)&cmd_config_per_port_rx_offload_result_offload, 16076 (void *)&cmd_config_per_port_rx_offload_result_on_off, 16077 NULL, 16078 } 16079 }; 16080 16081 /* Enable/Disable a per queue offloading */ 16082 struct cmd_config_per_queue_rx_offload_result { 16083 cmdline_fixed_string_t port; 16084 portid_t port_id; 16085 cmdline_fixed_string_t rxq; 16086 uint16_t queue_id; 16087 cmdline_fixed_string_t rx_offload; 16088 cmdline_fixed_string_t offload; 16089 cmdline_fixed_string_t on_off; 16090 }; 16091 16092 cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_port = 16093 TOKEN_STRING_INITIALIZER 16094 (struct cmd_config_per_queue_rx_offload_result, 16095 port, "port"); 16096 cmdline_parse_token_num_t cmd_config_per_queue_rx_offload_result_port_id = 16097 TOKEN_NUM_INITIALIZER 16098 (struct cmd_config_per_queue_rx_offload_result, 16099 port_id, RTE_UINT16); 16100 cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_rxq = 16101 TOKEN_STRING_INITIALIZER 16102 (struct cmd_config_per_queue_rx_offload_result, 16103 rxq, "rxq"); 16104 cmdline_parse_token_num_t cmd_config_per_queue_rx_offload_result_queue_id = 16105 TOKEN_NUM_INITIALIZER 16106 (struct cmd_config_per_queue_rx_offload_result, 16107 queue_id, RTE_UINT16); 16108 cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_rxoffload = 16109 TOKEN_STRING_INITIALIZER 16110 (struct cmd_config_per_queue_rx_offload_result, 16111 rx_offload, "rx_offload"); 16112 cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_offload = 16113 TOKEN_STRING_INITIALIZER 16114 (struct cmd_config_per_queue_rx_offload_result, 16115 offload, "vlan_strip#ipv4_cksum#udp_cksum#tcp_cksum#tcp_lro#" 16116 "qinq_strip#outer_ipv4_cksum#macsec_strip#" 16117 "header_split#vlan_filter#vlan_extend#jumbo_frame#" 16118 "scatter#buffer_split#timestamp#security#keep_crc"); 16119 cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_on_off = 16120 TOKEN_STRING_INITIALIZER 16121 (struct cmd_config_per_queue_rx_offload_result, 16122 on_off, "on#off"); 16123 16124 static void 16125 cmd_config_per_queue_rx_offload_parsed(void *parsed_result, 16126 __rte_unused struct cmdline *cl, 16127 __rte_unused void *data) 16128 { 16129 struct cmd_config_per_queue_rx_offload_result *res = parsed_result; 16130 struct rte_eth_dev_info dev_info; 16131 portid_t port_id = res->port_id; 16132 uint16_t queue_id = res->queue_id; 16133 struct rte_port *port = &ports[port_id]; 16134 uint64_t single_offload; 16135 int ret; 16136 16137 if (port->port_status != RTE_PORT_STOPPED) { 16138 printf("Error: Can't config offload when Port %d " 16139 "is not stopped\n", port_id); 16140 return; 16141 } 16142 16143 ret = eth_dev_info_get_print_err(port_id, &dev_info); 16144 if (ret != 0) 16145 return; 16146 16147 if (queue_id >= dev_info.nb_rx_queues) { 16148 printf("Error: input queue_id should be 0 ... " 16149 "%d\n", dev_info.nb_rx_queues - 1); 16150 return; 16151 } 16152 16153 single_offload = search_rx_offload(res->offload); 16154 if (single_offload == 0) { 16155 printf("Unknown offload name: %s\n", res->offload); 16156 return; 16157 } 16158 16159 if (!strcmp(res->on_off, "on")) 16160 port->rx_conf[queue_id].offloads |= single_offload; 16161 else 16162 port->rx_conf[queue_id].offloads &= ~single_offload; 16163 16164 cmd_reconfig_device_queue(port_id, 1, 1); 16165 } 16166 16167 cmdline_parse_inst_t cmd_config_per_queue_rx_offload = { 16168 .f = cmd_config_per_queue_rx_offload_parsed, 16169 .data = NULL, 16170 .help_str = "port <port_id> rxq <queue_id> rx_offload " 16171 "vlan_strip|ipv4_cksum|" 16172 "udp_cksum|tcp_cksum|tcp_lro|qinq_strip|outer_ipv4_cksum|" 16173 "macsec_strip|header_split|vlan_filter|vlan_extend|" 16174 "jumbo_frame|scatter|buffer_split|timestamp|security|" 16175 "keep_crc on|off", 16176 .tokens = { 16177 (void *)&cmd_config_per_queue_rx_offload_result_port, 16178 (void *)&cmd_config_per_queue_rx_offload_result_port_id, 16179 (void *)&cmd_config_per_queue_rx_offload_result_rxq, 16180 (void *)&cmd_config_per_queue_rx_offload_result_queue_id, 16181 (void *)&cmd_config_per_queue_rx_offload_result_rxoffload, 16182 (void *)&cmd_config_per_queue_rx_offload_result_offload, 16183 (void *)&cmd_config_per_queue_rx_offload_result_on_off, 16184 NULL, 16185 } 16186 }; 16187 16188 /* Get Tx offloads capabilities */ 16189 struct cmd_tx_offload_get_capa_result { 16190 cmdline_fixed_string_t show; 16191 cmdline_fixed_string_t port; 16192 portid_t port_id; 16193 cmdline_fixed_string_t tx_offload; 16194 cmdline_fixed_string_t capabilities; 16195 }; 16196 16197 cmdline_parse_token_string_t cmd_tx_offload_get_capa_show = 16198 TOKEN_STRING_INITIALIZER 16199 (struct cmd_tx_offload_get_capa_result, 16200 show, "show"); 16201 cmdline_parse_token_string_t cmd_tx_offload_get_capa_port = 16202 TOKEN_STRING_INITIALIZER 16203 (struct cmd_tx_offload_get_capa_result, 16204 port, "port"); 16205 cmdline_parse_token_num_t cmd_tx_offload_get_capa_port_id = 16206 TOKEN_NUM_INITIALIZER 16207 (struct cmd_tx_offload_get_capa_result, 16208 port_id, RTE_UINT16); 16209 cmdline_parse_token_string_t cmd_tx_offload_get_capa_tx_offload = 16210 TOKEN_STRING_INITIALIZER 16211 (struct cmd_tx_offload_get_capa_result, 16212 tx_offload, "tx_offload"); 16213 cmdline_parse_token_string_t cmd_tx_offload_get_capa_capabilities = 16214 TOKEN_STRING_INITIALIZER 16215 (struct cmd_tx_offload_get_capa_result, 16216 capabilities, "capabilities"); 16217 16218 static void 16219 print_tx_offloads(uint64_t offloads) 16220 { 16221 uint64_t single_offload; 16222 int begin; 16223 int end; 16224 int bit; 16225 16226 if (offloads == 0) 16227 return; 16228 16229 begin = __builtin_ctzll(offloads); 16230 end = sizeof(offloads) * CHAR_BIT - __builtin_clzll(offloads); 16231 16232 single_offload = 1ULL << begin; 16233 for (bit = begin; bit < end; bit++) { 16234 if (offloads & single_offload) 16235 printf(" %s", 16236 rte_eth_dev_tx_offload_name(single_offload)); 16237 single_offload <<= 1; 16238 } 16239 } 16240 16241 static void 16242 cmd_tx_offload_get_capa_parsed( 16243 void *parsed_result, 16244 __rte_unused struct cmdline *cl, 16245 __rte_unused void *data) 16246 { 16247 struct cmd_tx_offload_get_capa_result *res = parsed_result; 16248 struct rte_eth_dev_info dev_info; 16249 portid_t port_id = res->port_id; 16250 uint64_t queue_offloads; 16251 uint64_t port_offloads; 16252 int ret; 16253 16254 ret = eth_dev_info_get_print_err(port_id, &dev_info); 16255 if (ret != 0) 16256 return; 16257 16258 queue_offloads = dev_info.tx_queue_offload_capa; 16259 port_offloads = dev_info.tx_offload_capa ^ queue_offloads; 16260 16261 printf("Tx Offloading Capabilities of port %d :\n", port_id); 16262 printf(" Per Queue :"); 16263 print_tx_offloads(queue_offloads); 16264 16265 printf("\n"); 16266 printf(" Per Port :"); 16267 print_tx_offloads(port_offloads); 16268 printf("\n\n"); 16269 } 16270 16271 cmdline_parse_inst_t cmd_tx_offload_get_capa = { 16272 .f = cmd_tx_offload_get_capa_parsed, 16273 .data = NULL, 16274 .help_str = "show port <port_id> tx_offload capabilities", 16275 .tokens = { 16276 (void *)&cmd_tx_offload_get_capa_show, 16277 (void *)&cmd_tx_offload_get_capa_port, 16278 (void *)&cmd_tx_offload_get_capa_port_id, 16279 (void *)&cmd_tx_offload_get_capa_tx_offload, 16280 (void *)&cmd_tx_offload_get_capa_capabilities, 16281 NULL, 16282 } 16283 }; 16284 16285 /* Get Tx offloads configuration */ 16286 struct cmd_tx_offload_get_configuration_result { 16287 cmdline_fixed_string_t show; 16288 cmdline_fixed_string_t port; 16289 portid_t port_id; 16290 cmdline_fixed_string_t tx_offload; 16291 cmdline_fixed_string_t configuration; 16292 }; 16293 16294 cmdline_parse_token_string_t cmd_tx_offload_get_configuration_show = 16295 TOKEN_STRING_INITIALIZER 16296 (struct cmd_tx_offload_get_configuration_result, 16297 show, "show"); 16298 cmdline_parse_token_string_t cmd_tx_offload_get_configuration_port = 16299 TOKEN_STRING_INITIALIZER 16300 (struct cmd_tx_offload_get_configuration_result, 16301 port, "port"); 16302 cmdline_parse_token_num_t cmd_tx_offload_get_configuration_port_id = 16303 TOKEN_NUM_INITIALIZER 16304 (struct cmd_tx_offload_get_configuration_result, 16305 port_id, RTE_UINT16); 16306 cmdline_parse_token_string_t cmd_tx_offload_get_configuration_tx_offload = 16307 TOKEN_STRING_INITIALIZER 16308 (struct cmd_tx_offload_get_configuration_result, 16309 tx_offload, "tx_offload"); 16310 cmdline_parse_token_string_t cmd_tx_offload_get_configuration_configuration = 16311 TOKEN_STRING_INITIALIZER 16312 (struct cmd_tx_offload_get_configuration_result, 16313 configuration, "configuration"); 16314 16315 static void 16316 cmd_tx_offload_get_configuration_parsed( 16317 void *parsed_result, 16318 __rte_unused struct cmdline *cl, 16319 __rte_unused void *data) 16320 { 16321 struct cmd_tx_offload_get_configuration_result *res = parsed_result; 16322 struct rte_eth_dev_info dev_info; 16323 portid_t port_id = res->port_id; 16324 struct rte_port *port = &ports[port_id]; 16325 uint64_t port_offloads; 16326 uint64_t queue_offloads; 16327 uint16_t nb_tx_queues; 16328 int q; 16329 int ret; 16330 16331 printf("Tx Offloading Configuration of port %d :\n", port_id); 16332 16333 port_offloads = port->dev_conf.txmode.offloads; 16334 printf(" Port :"); 16335 print_tx_offloads(port_offloads); 16336 printf("\n"); 16337 16338 ret = eth_dev_info_get_print_err(port_id, &dev_info); 16339 if (ret != 0) 16340 return; 16341 16342 nb_tx_queues = dev_info.nb_tx_queues; 16343 for (q = 0; q < nb_tx_queues; q++) { 16344 queue_offloads = port->tx_conf[q].offloads; 16345 printf(" Queue[%2d] :", q); 16346 print_tx_offloads(queue_offloads); 16347 printf("\n"); 16348 } 16349 printf("\n"); 16350 } 16351 16352 cmdline_parse_inst_t cmd_tx_offload_get_configuration = { 16353 .f = cmd_tx_offload_get_configuration_parsed, 16354 .data = NULL, 16355 .help_str = "show port <port_id> tx_offload configuration", 16356 .tokens = { 16357 (void *)&cmd_tx_offload_get_configuration_show, 16358 (void *)&cmd_tx_offload_get_configuration_port, 16359 (void *)&cmd_tx_offload_get_configuration_port_id, 16360 (void *)&cmd_tx_offload_get_configuration_tx_offload, 16361 (void *)&cmd_tx_offload_get_configuration_configuration, 16362 NULL, 16363 } 16364 }; 16365 16366 /* Enable/Disable a per port offloading */ 16367 struct cmd_config_per_port_tx_offload_result { 16368 cmdline_fixed_string_t port; 16369 cmdline_fixed_string_t config; 16370 portid_t port_id; 16371 cmdline_fixed_string_t tx_offload; 16372 cmdline_fixed_string_t offload; 16373 cmdline_fixed_string_t on_off; 16374 }; 16375 16376 cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_port = 16377 TOKEN_STRING_INITIALIZER 16378 (struct cmd_config_per_port_tx_offload_result, 16379 port, "port"); 16380 cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_config = 16381 TOKEN_STRING_INITIALIZER 16382 (struct cmd_config_per_port_tx_offload_result, 16383 config, "config"); 16384 cmdline_parse_token_num_t cmd_config_per_port_tx_offload_result_port_id = 16385 TOKEN_NUM_INITIALIZER 16386 (struct cmd_config_per_port_tx_offload_result, 16387 port_id, RTE_UINT16); 16388 cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_tx_offload = 16389 TOKEN_STRING_INITIALIZER 16390 (struct cmd_config_per_port_tx_offload_result, 16391 tx_offload, "tx_offload"); 16392 cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_offload = 16393 TOKEN_STRING_INITIALIZER 16394 (struct cmd_config_per_port_tx_offload_result, 16395 offload, "vlan_insert#ipv4_cksum#udp_cksum#tcp_cksum#" 16396 "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#" 16397 "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#" 16398 "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#" 16399 "mt_lockfree#multi_segs#mbuf_fast_free#security#" 16400 "send_on_timestamp"); 16401 cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_on_off = 16402 TOKEN_STRING_INITIALIZER 16403 (struct cmd_config_per_port_tx_offload_result, 16404 on_off, "on#off"); 16405 16406 static uint64_t 16407 search_tx_offload(const char *name) 16408 { 16409 uint64_t single_offload; 16410 const char *single_name; 16411 int found = 0; 16412 unsigned int bit; 16413 16414 single_offload = 1; 16415 for (bit = 0; bit < sizeof(single_offload) * CHAR_BIT; bit++) { 16416 single_name = rte_eth_dev_tx_offload_name(single_offload); 16417 if (single_name == NULL) 16418 break; 16419 if (!strcasecmp(single_name, name)) { 16420 found = 1; 16421 break; 16422 } else if (!strcasecmp(single_name, "UNKNOWN")) 16423 break; 16424 single_offload <<= 1; 16425 } 16426 16427 if (found) 16428 return single_offload; 16429 16430 return 0; 16431 } 16432 16433 static void 16434 cmd_config_per_port_tx_offload_parsed(void *parsed_result, 16435 __rte_unused struct cmdline *cl, 16436 __rte_unused void *data) 16437 { 16438 struct cmd_config_per_port_tx_offload_result *res = parsed_result; 16439 portid_t port_id = res->port_id; 16440 struct rte_eth_dev_info dev_info; 16441 struct rte_port *port = &ports[port_id]; 16442 uint64_t single_offload; 16443 uint16_t nb_tx_queues; 16444 int q; 16445 int ret; 16446 16447 if (port->port_status != RTE_PORT_STOPPED) { 16448 printf("Error: Can't config offload when Port %d " 16449 "is not stopped\n", port_id); 16450 return; 16451 } 16452 16453 single_offload = search_tx_offload(res->offload); 16454 if (single_offload == 0) { 16455 printf("Unknown offload name: %s\n", res->offload); 16456 return; 16457 } 16458 16459 ret = eth_dev_info_get_print_err(port_id, &dev_info); 16460 if (ret != 0) 16461 return; 16462 16463 nb_tx_queues = dev_info.nb_tx_queues; 16464 if (!strcmp(res->on_off, "on")) { 16465 port->dev_conf.txmode.offloads |= single_offload; 16466 for (q = 0; q < nb_tx_queues; q++) 16467 port->tx_conf[q].offloads |= single_offload; 16468 } else { 16469 port->dev_conf.txmode.offloads &= ~single_offload; 16470 for (q = 0; q < nb_tx_queues; q++) 16471 port->tx_conf[q].offloads &= ~single_offload; 16472 } 16473 16474 cmd_reconfig_device_queue(port_id, 1, 1); 16475 } 16476 16477 cmdline_parse_inst_t cmd_config_per_port_tx_offload = { 16478 .f = cmd_config_per_port_tx_offload_parsed, 16479 .data = NULL, 16480 .help_str = "port config <port_id> tx_offload " 16481 "vlan_insert|ipv4_cksum|udp_cksum|tcp_cksum|" 16482 "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|" 16483 "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|" 16484 "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|" 16485 "mt_lockfree|multi_segs|mbuf_fast_free|security|" 16486 "send_on_timestamp on|off", 16487 .tokens = { 16488 (void *)&cmd_config_per_port_tx_offload_result_port, 16489 (void *)&cmd_config_per_port_tx_offload_result_config, 16490 (void *)&cmd_config_per_port_tx_offload_result_port_id, 16491 (void *)&cmd_config_per_port_tx_offload_result_tx_offload, 16492 (void *)&cmd_config_per_port_tx_offload_result_offload, 16493 (void *)&cmd_config_per_port_tx_offload_result_on_off, 16494 NULL, 16495 } 16496 }; 16497 16498 /* Enable/Disable a per queue offloading */ 16499 struct cmd_config_per_queue_tx_offload_result { 16500 cmdline_fixed_string_t port; 16501 portid_t port_id; 16502 cmdline_fixed_string_t txq; 16503 uint16_t queue_id; 16504 cmdline_fixed_string_t tx_offload; 16505 cmdline_fixed_string_t offload; 16506 cmdline_fixed_string_t on_off; 16507 }; 16508 16509 cmdline_parse_token_string_t cmd_config_per_queue_tx_offload_result_port = 16510 TOKEN_STRING_INITIALIZER 16511 (struct cmd_config_per_queue_tx_offload_result, 16512 port, "port"); 16513 cmdline_parse_token_num_t cmd_config_per_queue_tx_offload_result_port_id = 16514 TOKEN_NUM_INITIALIZER 16515 (struct cmd_config_per_queue_tx_offload_result, 16516 port_id, RTE_UINT16); 16517 cmdline_parse_token_string_t cmd_config_per_queue_tx_offload_result_txq = 16518 TOKEN_STRING_INITIALIZER 16519 (struct cmd_config_per_queue_tx_offload_result, 16520 txq, "txq"); 16521 cmdline_parse_token_num_t cmd_config_per_queue_tx_offload_result_queue_id = 16522 TOKEN_NUM_INITIALIZER 16523 (struct cmd_config_per_queue_tx_offload_result, 16524 queue_id, RTE_UINT16); 16525 cmdline_parse_token_string_t cmd_config_per_queue_tx_offload_result_txoffload = 16526 TOKEN_STRING_INITIALIZER 16527 (struct cmd_config_per_queue_tx_offload_result, 16528 tx_offload, "tx_offload"); 16529 cmdline_parse_token_string_t cmd_config_per_queue_tx_offload_result_offload = 16530 TOKEN_STRING_INITIALIZER 16531 (struct cmd_config_per_queue_tx_offload_result, 16532 offload, "vlan_insert#ipv4_cksum#udp_cksum#tcp_cksum#" 16533 "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#" 16534 "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#" 16535 "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#" 16536 "mt_lockfree#multi_segs#mbuf_fast_free#security"); 16537 cmdline_parse_token_string_t cmd_config_per_queue_tx_offload_result_on_off = 16538 TOKEN_STRING_INITIALIZER 16539 (struct cmd_config_per_queue_tx_offload_result, 16540 on_off, "on#off"); 16541 16542 static void 16543 cmd_config_per_queue_tx_offload_parsed(void *parsed_result, 16544 __rte_unused struct cmdline *cl, 16545 __rte_unused void *data) 16546 { 16547 struct cmd_config_per_queue_tx_offload_result *res = parsed_result; 16548 struct rte_eth_dev_info dev_info; 16549 portid_t port_id = res->port_id; 16550 uint16_t queue_id = res->queue_id; 16551 struct rte_port *port = &ports[port_id]; 16552 uint64_t single_offload; 16553 int ret; 16554 16555 if (port->port_status != RTE_PORT_STOPPED) { 16556 printf("Error: Can't config offload when Port %d " 16557 "is not stopped\n", port_id); 16558 return; 16559 } 16560 16561 ret = eth_dev_info_get_print_err(port_id, &dev_info); 16562 if (ret != 0) 16563 return; 16564 16565 if (queue_id >= dev_info.nb_tx_queues) { 16566 printf("Error: input queue_id should be 0 ... " 16567 "%d\n", dev_info.nb_tx_queues - 1); 16568 return; 16569 } 16570 16571 single_offload = search_tx_offload(res->offload); 16572 if (single_offload == 0) { 16573 printf("Unknown offload name: %s\n", res->offload); 16574 return; 16575 } 16576 16577 if (!strcmp(res->on_off, "on")) 16578 port->tx_conf[queue_id].offloads |= single_offload; 16579 else 16580 port->tx_conf[queue_id].offloads &= ~single_offload; 16581 16582 cmd_reconfig_device_queue(port_id, 1, 1); 16583 } 16584 16585 cmdline_parse_inst_t cmd_config_per_queue_tx_offload = { 16586 .f = cmd_config_per_queue_tx_offload_parsed, 16587 .data = NULL, 16588 .help_str = "port <port_id> txq <queue_id> tx_offload " 16589 "vlan_insert|ipv4_cksum|udp_cksum|tcp_cksum|" 16590 "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|" 16591 "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|" 16592 "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|" 16593 "mt_lockfree|multi_segs|mbuf_fast_free|security " 16594 "on|off", 16595 .tokens = { 16596 (void *)&cmd_config_per_queue_tx_offload_result_port, 16597 (void *)&cmd_config_per_queue_tx_offload_result_port_id, 16598 (void *)&cmd_config_per_queue_tx_offload_result_txq, 16599 (void *)&cmd_config_per_queue_tx_offload_result_queue_id, 16600 (void *)&cmd_config_per_queue_tx_offload_result_txoffload, 16601 (void *)&cmd_config_per_queue_tx_offload_result_offload, 16602 (void *)&cmd_config_per_queue_tx_offload_result_on_off, 16603 NULL, 16604 } 16605 }; 16606 16607 /* *** configure tx_metadata for specific port *** */ 16608 struct cmd_config_tx_metadata_specific_result { 16609 cmdline_fixed_string_t port; 16610 cmdline_fixed_string_t keyword; 16611 uint16_t port_id; 16612 cmdline_fixed_string_t item; 16613 uint32_t value; 16614 }; 16615 16616 static void 16617 cmd_config_tx_metadata_specific_parsed(void *parsed_result, 16618 __rte_unused struct cmdline *cl, 16619 __rte_unused void *data) 16620 { 16621 struct cmd_config_tx_metadata_specific_result *res = parsed_result; 16622 16623 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 16624 return; 16625 ports[res->port_id].tx_metadata = res->value; 16626 /* Add/remove callback to insert valid metadata in every Tx packet. */ 16627 if (ports[res->port_id].tx_metadata) 16628 add_tx_md_callback(res->port_id); 16629 else 16630 remove_tx_md_callback(res->port_id); 16631 rte_flow_dynf_metadata_register(); 16632 } 16633 16634 cmdline_parse_token_string_t cmd_config_tx_metadata_specific_port = 16635 TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result, 16636 port, "port"); 16637 cmdline_parse_token_string_t cmd_config_tx_metadata_specific_keyword = 16638 TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result, 16639 keyword, "config"); 16640 cmdline_parse_token_num_t cmd_config_tx_metadata_specific_id = 16641 TOKEN_NUM_INITIALIZER(struct cmd_config_tx_metadata_specific_result, 16642 port_id, RTE_UINT16); 16643 cmdline_parse_token_string_t cmd_config_tx_metadata_specific_item = 16644 TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result, 16645 item, "tx_metadata"); 16646 cmdline_parse_token_num_t cmd_config_tx_metadata_specific_value = 16647 TOKEN_NUM_INITIALIZER(struct cmd_config_tx_metadata_specific_result, 16648 value, RTE_UINT32); 16649 16650 cmdline_parse_inst_t cmd_config_tx_metadata_specific = { 16651 .f = cmd_config_tx_metadata_specific_parsed, 16652 .data = NULL, 16653 .help_str = "port config <port_id> tx_metadata <value>", 16654 .tokens = { 16655 (void *)&cmd_config_tx_metadata_specific_port, 16656 (void *)&cmd_config_tx_metadata_specific_keyword, 16657 (void *)&cmd_config_tx_metadata_specific_id, 16658 (void *)&cmd_config_tx_metadata_specific_item, 16659 (void *)&cmd_config_tx_metadata_specific_value, 16660 NULL, 16661 }, 16662 }; 16663 16664 /* *** set dynf *** */ 16665 struct cmd_config_tx_dynf_specific_result { 16666 cmdline_fixed_string_t port; 16667 cmdline_fixed_string_t keyword; 16668 uint16_t port_id; 16669 cmdline_fixed_string_t item; 16670 cmdline_fixed_string_t name; 16671 cmdline_fixed_string_t value; 16672 }; 16673 16674 static void 16675 cmd_config_dynf_specific_parsed(void *parsed_result, 16676 __rte_unused struct cmdline *cl, 16677 __rte_unused void *data) 16678 { 16679 struct cmd_config_tx_dynf_specific_result *res = parsed_result; 16680 struct rte_mbuf_dynflag desc_flag; 16681 int flag; 16682 uint64_t old_port_flags; 16683 16684 if (port_id_is_invalid(res->port_id, ENABLED_WARN)) 16685 return; 16686 flag = rte_mbuf_dynflag_lookup(res->name, NULL); 16687 if (flag <= 0) { 16688 if (strlcpy(desc_flag.name, res->name, 16689 RTE_MBUF_DYN_NAMESIZE) >= RTE_MBUF_DYN_NAMESIZE) { 16690 printf("Flag name too long\n"); 16691 return; 16692 } 16693 desc_flag.flags = 0; 16694 flag = rte_mbuf_dynflag_register(&desc_flag); 16695 if (flag < 0) { 16696 printf("Can't register flag\n"); 16697 return; 16698 } 16699 strcpy(dynf_names[flag], desc_flag.name); 16700 } 16701 old_port_flags = ports[res->port_id].mbuf_dynf; 16702 if (!strcmp(res->value, "set")) { 16703 ports[res->port_id].mbuf_dynf |= 1UL << flag; 16704 if (old_port_flags == 0) 16705 add_tx_dynf_callback(res->port_id); 16706 } else { 16707 ports[res->port_id].mbuf_dynf &= ~(1UL << flag); 16708 if (ports[res->port_id].mbuf_dynf == 0) 16709 remove_tx_dynf_callback(res->port_id); 16710 } 16711 } 16712 16713 cmdline_parse_token_string_t cmd_config_tx_dynf_specific_port = 16714 TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result, 16715 keyword, "port"); 16716 cmdline_parse_token_string_t cmd_config_tx_dynf_specific_keyword = 16717 TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result, 16718 keyword, "config"); 16719 cmdline_parse_token_num_t cmd_config_tx_dynf_specific_port_id = 16720 TOKEN_NUM_INITIALIZER(struct cmd_config_tx_dynf_specific_result, 16721 port_id, RTE_UINT16); 16722 cmdline_parse_token_string_t cmd_config_tx_dynf_specific_item = 16723 TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result, 16724 item, "dynf"); 16725 cmdline_parse_token_string_t cmd_config_tx_dynf_specific_name = 16726 TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result, 16727 name, NULL); 16728 cmdline_parse_token_string_t cmd_config_tx_dynf_specific_value = 16729 TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result, 16730 value, "set#clear"); 16731 16732 cmdline_parse_inst_t cmd_config_tx_dynf_specific = { 16733 .f = cmd_config_dynf_specific_parsed, 16734 .data = NULL, 16735 .help_str = "port config <port id> dynf <name> set|clear", 16736 .tokens = { 16737 (void *)&cmd_config_tx_dynf_specific_port, 16738 (void *)&cmd_config_tx_dynf_specific_keyword, 16739 (void *)&cmd_config_tx_dynf_specific_port_id, 16740 (void *)&cmd_config_tx_dynf_specific_item, 16741 (void *)&cmd_config_tx_dynf_specific_name, 16742 (void *)&cmd_config_tx_dynf_specific_value, 16743 NULL, 16744 }, 16745 }; 16746 16747 /* *** display tx_metadata per port configuration *** */ 16748 struct cmd_show_tx_metadata_result { 16749 cmdline_fixed_string_t cmd_show; 16750 cmdline_fixed_string_t cmd_port; 16751 cmdline_fixed_string_t cmd_keyword; 16752 portid_t cmd_pid; 16753 }; 16754 16755 static void 16756 cmd_show_tx_metadata_parsed(void *parsed_result, 16757 __rte_unused struct cmdline *cl, 16758 __rte_unused void *data) 16759 { 16760 struct cmd_show_tx_metadata_result *res = parsed_result; 16761 16762 if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { 16763 printf("invalid port id %u\n", res->cmd_pid); 16764 return; 16765 } 16766 if (!strcmp(res->cmd_keyword, "tx_metadata")) { 16767 printf("Port %u tx_metadata: %u\n", res->cmd_pid, 16768 ports[res->cmd_pid].tx_metadata); 16769 } 16770 } 16771 16772 cmdline_parse_token_string_t cmd_show_tx_metadata_show = 16773 TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result, 16774 cmd_show, "show"); 16775 cmdline_parse_token_string_t cmd_show_tx_metadata_port = 16776 TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result, 16777 cmd_port, "port"); 16778 cmdline_parse_token_num_t cmd_show_tx_metadata_pid = 16779 TOKEN_NUM_INITIALIZER(struct cmd_show_tx_metadata_result, 16780 cmd_pid, RTE_UINT16); 16781 cmdline_parse_token_string_t cmd_show_tx_metadata_keyword = 16782 TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result, 16783 cmd_keyword, "tx_metadata"); 16784 16785 cmdline_parse_inst_t cmd_show_tx_metadata = { 16786 .f = cmd_show_tx_metadata_parsed, 16787 .data = NULL, 16788 .help_str = "show port <port_id> tx_metadata", 16789 .tokens = { 16790 (void *)&cmd_show_tx_metadata_show, 16791 (void *)&cmd_show_tx_metadata_port, 16792 (void *)&cmd_show_tx_metadata_pid, 16793 (void *)&cmd_show_tx_metadata_keyword, 16794 NULL, 16795 }, 16796 }; 16797 16798 /* *** show fec capability per port configuration *** */ 16799 struct cmd_show_fec_capability_result { 16800 cmdline_fixed_string_t cmd_show; 16801 cmdline_fixed_string_t cmd_port; 16802 cmdline_fixed_string_t cmd_fec; 16803 cmdline_fixed_string_t cmd_keyword; 16804 portid_t cmd_pid; 16805 }; 16806 16807 static void 16808 cmd_show_fec_capability_parsed(void *parsed_result, 16809 __rte_unused struct cmdline *cl, 16810 __rte_unused void *data) 16811 { 16812 struct cmd_show_fec_capability_result *res = parsed_result; 16813 struct rte_eth_fec_capa *speed_fec_capa; 16814 unsigned int num; 16815 int ret; 16816 16817 if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { 16818 printf("Invalid port id %u\n", res->cmd_pid); 16819 return; 16820 } 16821 16822 ret = rte_eth_fec_get_capability(res->cmd_pid, NULL, 0); 16823 if (ret == -ENOTSUP) { 16824 printf("Function not implemented\n"); 16825 return; 16826 } else if (ret < 0) { 16827 printf("Get FEC capability failed: %d\n", ret); 16828 return; 16829 } 16830 16831 num = (unsigned int)ret; 16832 speed_fec_capa = calloc(num, sizeof(*speed_fec_capa)); 16833 if (speed_fec_capa == NULL) { 16834 printf("Failed to alloc FEC capability buffer\n"); 16835 return; 16836 } 16837 16838 ret = rte_eth_fec_get_capability(res->cmd_pid, speed_fec_capa, num); 16839 if (ret < 0) { 16840 printf("Error getting FEC capability: %d\n", ret); 16841 goto out; 16842 } 16843 16844 show_fec_capability(num, speed_fec_capa); 16845 out: 16846 free(speed_fec_capa); 16847 } 16848 16849 cmdline_parse_token_string_t cmd_show_fec_capability_show = 16850 TOKEN_STRING_INITIALIZER(struct cmd_show_fec_capability_result, 16851 cmd_show, "show"); 16852 cmdline_parse_token_string_t cmd_show_fec_capability_port = 16853 TOKEN_STRING_INITIALIZER(struct cmd_show_fec_capability_result, 16854 cmd_port, "port"); 16855 cmdline_parse_token_num_t cmd_show_fec_capability_pid = 16856 TOKEN_NUM_INITIALIZER(struct cmd_show_fec_capability_result, 16857 cmd_pid, RTE_UINT16); 16858 cmdline_parse_token_string_t cmd_show_fec_capability_fec = 16859 TOKEN_STRING_INITIALIZER(struct cmd_show_fec_capability_result, 16860 cmd_fec, "fec"); 16861 cmdline_parse_token_string_t cmd_show_fec_capability_keyword = 16862 TOKEN_STRING_INITIALIZER(struct cmd_show_fec_capability_result, 16863 cmd_keyword, "capabilities"); 16864 16865 cmdline_parse_inst_t cmd_show_capability = { 16866 .f = cmd_show_fec_capability_parsed, 16867 .data = NULL, 16868 .help_str = "show port <port_id> fec capabilities", 16869 .tokens = { 16870 (void *)&cmd_show_fec_capability_show, 16871 (void *)&cmd_show_fec_capability_port, 16872 (void *)&cmd_show_fec_capability_pid, 16873 (void *)&cmd_show_fec_capability_fec, 16874 (void *)&cmd_show_fec_capability_keyword, 16875 NULL, 16876 }, 16877 }; 16878 16879 /* *** show fec mode per port configuration *** */ 16880 struct cmd_show_fec_metadata_result { 16881 cmdline_fixed_string_t cmd_show; 16882 cmdline_fixed_string_t cmd_port; 16883 cmdline_fixed_string_t cmd_keyword; 16884 portid_t cmd_pid; 16885 }; 16886 16887 static void 16888 cmd_show_fec_mode_parsed(void *parsed_result, 16889 __rte_unused struct cmdline *cl, 16890 __rte_unused void *data) 16891 { 16892 #define FEC_NAME_SIZE 16 16893 struct cmd_show_fec_metadata_result *res = parsed_result; 16894 uint32_t mode; 16895 char buf[FEC_NAME_SIZE]; 16896 int ret; 16897 16898 if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { 16899 printf("Invalid port id %u\n", res->cmd_pid); 16900 return; 16901 } 16902 ret = rte_eth_fec_get(res->cmd_pid, &mode); 16903 if (ret == -ENOTSUP) { 16904 printf("Function not implemented\n"); 16905 return; 16906 } else if (ret < 0) { 16907 printf("Get FEC mode failed\n"); 16908 return; 16909 } 16910 16911 switch (mode) { 16912 case RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC): 16913 strlcpy(buf, "off", sizeof(buf)); 16914 break; 16915 case RTE_ETH_FEC_MODE_CAPA_MASK(AUTO): 16916 strlcpy(buf, "auto", sizeof(buf)); 16917 break; 16918 case RTE_ETH_FEC_MODE_CAPA_MASK(BASER): 16919 strlcpy(buf, "baser", sizeof(buf)); 16920 break; 16921 case RTE_ETH_FEC_MODE_CAPA_MASK(RS): 16922 strlcpy(buf, "rs", sizeof(buf)); 16923 break; 16924 default: 16925 return; 16926 } 16927 16928 printf("%s\n", buf); 16929 } 16930 16931 cmdline_parse_token_string_t cmd_show_fec_mode_show = 16932 TOKEN_STRING_INITIALIZER(struct cmd_show_fec_metadata_result, 16933 cmd_show, "show"); 16934 cmdline_parse_token_string_t cmd_show_fec_mode_port = 16935 TOKEN_STRING_INITIALIZER(struct cmd_show_fec_metadata_result, 16936 cmd_port, "port"); 16937 cmdline_parse_token_num_t cmd_show_fec_mode_pid = 16938 TOKEN_NUM_INITIALIZER(struct cmd_show_fec_metadata_result, 16939 cmd_pid, RTE_UINT16); 16940 cmdline_parse_token_string_t cmd_show_fec_mode_keyword = 16941 TOKEN_STRING_INITIALIZER(struct cmd_show_fec_metadata_result, 16942 cmd_keyword, "fec_mode"); 16943 16944 cmdline_parse_inst_t cmd_show_fec_mode = { 16945 .f = cmd_show_fec_mode_parsed, 16946 .data = NULL, 16947 .help_str = "show port <port_id> fec_mode", 16948 .tokens = { 16949 (void *)&cmd_show_fec_mode_show, 16950 (void *)&cmd_show_fec_mode_port, 16951 (void *)&cmd_show_fec_mode_pid, 16952 (void *)&cmd_show_fec_mode_keyword, 16953 NULL, 16954 }, 16955 }; 16956 16957 /* *** set fec mode per port configuration *** */ 16958 struct cmd_set_port_fec_mode { 16959 cmdline_fixed_string_t set; 16960 cmdline_fixed_string_t port; 16961 portid_t port_id; 16962 cmdline_fixed_string_t fec_mode; 16963 cmdline_fixed_string_t fec_value; 16964 }; 16965 16966 /* Common CLI fields for set fec mode */ 16967 cmdline_parse_token_string_t cmd_set_port_fec_mode_set = 16968 TOKEN_STRING_INITIALIZER 16969 (struct cmd_set_port_fec_mode, 16970 set, "set"); 16971 cmdline_parse_token_string_t cmd_set_port_fec_mode_port = 16972 TOKEN_STRING_INITIALIZER 16973 (struct cmd_set_port_fec_mode, 16974 port, "port"); 16975 cmdline_parse_token_num_t cmd_set_port_fec_mode_port_id = 16976 TOKEN_NUM_INITIALIZER 16977 (struct cmd_set_port_fec_mode, 16978 port_id, RTE_UINT16); 16979 cmdline_parse_token_string_t cmd_set_port_fec_mode_str = 16980 TOKEN_STRING_INITIALIZER 16981 (struct cmd_set_port_fec_mode, 16982 fec_mode, "fec_mode"); 16983 cmdline_parse_token_string_t cmd_set_port_fec_mode_value = 16984 TOKEN_STRING_INITIALIZER 16985 (struct cmd_set_port_fec_mode, 16986 fec_value, NULL); 16987 16988 static void 16989 cmd_set_port_fec_mode_parsed( 16990 void *parsed_result, 16991 __rte_unused struct cmdline *cl, 16992 __rte_unused void *data) 16993 { 16994 struct cmd_set_port_fec_mode *res = parsed_result; 16995 uint16_t port_id = res->port_id; 16996 uint32_t fec_capa; 16997 int ret; 16998 16999 ret = parse_fec_mode(res->fec_value, &fec_capa); 17000 if (ret < 0) { 17001 printf("Unknown fec mode: %s for Port %d\n", res->fec_value, 17002 port_id); 17003 return; 17004 } 17005 17006 ret = rte_eth_fec_set(port_id, fec_capa); 17007 if (ret == -ENOTSUP) { 17008 printf("Function not implemented\n"); 17009 return; 17010 } else if (ret < 0) { 17011 printf("Set FEC mode failed\n"); 17012 return; 17013 } 17014 } 17015 17016 cmdline_parse_inst_t cmd_set_fec_mode = { 17017 .f = cmd_set_port_fec_mode_parsed, 17018 .data = NULL, 17019 .help_str = "set port <port_id> fec_mode auto|off|rs|baser", 17020 .tokens = { 17021 (void *)&cmd_set_port_fec_mode_set, 17022 (void *)&cmd_set_port_fec_mode_port, 17023 (void *)&cmd_set_port_fec_mode_port_id, 17024 (void *)&cmd_set_port_fec_mode_str, 17025 (void *)&cmd_set_port_fec_mode_value, 17026 NULL, 17027 }, 17028 }; 17029 17030 /* show port supported ptypes */ 17031 17032 /* Common result structure for show port ptypes */ 17033 struct cmd_show_port_supported_ptypes_result { 17034 cmdline_fixed_string_t show; 17035 cmdline_fixed_string_t port; 17036 portid_t port_id; 17037 cmdline_fixed_string_t ptypes; 17038 }; 17039 17040 /* Common CLI fields for show port ptypes */ 17041 cmdline_parse_token_string_t cmd_show_port_supported_ptypes_show = 17042 TOKEN_STRING_INITIALIZER 17043 (struct cmd_show_port_supported_ptypes_result, 17044 show, "show"); 17045 cmdline_parse_token_string_t cmd_show_port_supported_ptypes_port = 17046 TOKEN_STRING_INITIALIZER 17047 (struct cmd_show_port_supported_ptypes_result, 17048 port, "port"); 17049 cmdline_parse_token_num_t cmd_show_port_supported_ptypes_port_id = 17050 TOKEN_NUM_INITIALIZER 17051 (struct cmd_show_port_supported_ptypes_result, 17052 port_id, RTE_UINT16); 17053 cmdline_parse_token_string_t cmd_show_port_supported_ptypes_ptypes = 17054 TOKEN_STRING_INITIALIZER 17055 (struct cmd_show_port_supported_ptypes_result, 17056 ptypes, "ptypes"); 17057 17058 static void 17059 cmd_show_port_supported_ptypes_parsed( 17060 void *parsed_result, 17061 __rte_unused struct cmdline *cl, 17062 __rte_unused void *data) 17063 { 17064 #define RSVD_PTYPE_MASK 0xf0000000 17065 #define MAX_PTYPES_PER_LAYER 16 17066 #define LTYPE_NAMESIZE 32 17067 #define PTYPE_NAMESIZE 256 17068 struct cmd_show_port_supported_ptypes_result *res = parsed_result; 17069 char buf[PTYPE_NAMESIZE], ltype[LTYPE_NAMESIZE]; 17070 uint32_t ptype_mask = RTE_PTYPE_L2_MASK; 17071 uint32_t ptypes[MAX_PTYPES_PER_LAYER]; 17072 uint16_t port_id = res->port_id; 17073 int ret, i; 17074 17075 ret = rte_eth_dev_get_supported_ptypes(port_id, ptype_mask, NULL, 0); 17076 if (ret < 0) 17077 return; 17078 17079 while (ptype_mask != RSVD_PTYPE_MASK) { 17080 17081 switch (ptype_mask) { 17082 case RTE_PTYPE_L2_MASK: 17083 strlcpy(ltype, "L2", sizeof(ltype)); 17084 break; 17085 case RTE_PTYPE_L3_MASK: 17086 strlcpy(ltype, "L3", sizeof(ltype)); 17087 break; 17088 case RTE_PTYPE_L4_MASK: 17089 strlcpy(ltype, "L4", sizeof(ltype)); 17090 break; 17091 case RTE_PTYPE_TUNNEL_MASK: 17092 strlcpy(ltype, "Tunnel", sizeof(ltype)); 17093 break; 17094 case RTE_PTYPE_INNER_L2_MASK: 17095 strlcpy(ltype, "Inner L2", sizeof(ltype)); 17096 break; 17097 case RTE_PTYPE_INNER_L3_MASK: 17098 strlcpy(ltype, "Inner L3", sizeof(ltype)); 17099 break; 17100 case RTE_PTYPE_INNER_L4_MASK: 17101 strlcpy(ltype, "Inner L4", sizeof(ltype)); 17102 break; 17103 default: 17104 return; 17105 } 17106 17107 ret = rte_eth_dev_get_supported_ptypes(res->port_id, 17108 ptype_mask, ptypes, 17109 MAX_PTYPES_PER_LAYER); 17110 17111 if (ret > 0) 17112 printf("Supported %s ptypes:\n", ltype); 17113 else 17114 printf("%s ptypes unsupported\n", ltype); 17115 17116 for (i = 0; i < ret; ++i) { 17117 rte_get_ptype_name(ptypes[i], buf, sizeof(buf)); 17118 printf("%s\n", buf); 17119 } 17120 17121 ptype_mask <<= 4; 17122 } 17123 } 17124 17125 cmdline_parse_inst_t cmd_show_port_supported_ptypes = { 17126 .f = cmd_show_port_supported_ptypes_parsed, 17127 .data = NULL, 17128 .help_str = "show port <port_id> ptypes", 17129 .tokens = { 17130 (void *)&cmd_show_port_supported_ptypes_show, 17131 (void *)&cmd_show_port_supported_ptypes_port, 17132 (void *)&cmd_show_port_supported_ptypes_port_id, 17133 (void *)&cmd_show_port_supported_ptypes_ptypes, 17134 NULL, 17135 }, 17136 }; 17137 17138 /* *** display rx/tx descriptor status *** */ 17139 struct cmd_show_rx_tx_desc_status_result { 17140 cmdline_fixed_string_t cmd_show; 17141 cmdline_fixed_string_t cmd_port; 17142 cmdline_fixed_string_t cmd_keyword; 17143 cmdline_fixed_string_t cmd_desc; 17144 cmdline_fixed_string_t cmd_status; 17145 portid_t cmd_pid; 17146 portid_t cmd_qid; 17147 portid_t cmd_did; 17148 }; 17149 17150 static void 17151 cmd_show_rx_tx_desc_status_parsed(void *parsed_result, 17152 __rte_unused struct cmdline *cl, 17153 __rte_unused void *data) 17154 { 17155 struct cmd_show_rx_tx_desc_status_result *res = parsed_result; 17156 int rc; 17157 17158 if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { 17159 printf("invalid port id %u\n", res->cmd_pid); 17160 return; 17161 } 17162 17163 if (!strcmp(res->cmd_keyword, "rxq")) { 17164 rc = rte_eth_rx_descriptor_status(res->cmd_pid, res->cmd_qid, 17165 res->cmd_did); 17166 if (rc < 0) { 17167 printf("Invalid input: queue id = %d, desc id = %d\n", 17168 res->cmd_qid, res->cmd_did); 17169 return; 17170 } 17171 if (rc == RTE_ETH_RX_DESC_AVAIL) 17172 printf("Desc status = AVAILABLE\n"); 17173 else if (rc == RTE_ETH_RX_DESC_DONE) 17174 printf("Desc status = DONE\n"); 17175 else 17176 printf("Desc status = UNAVAILABLE\n"); 17177 } else if (!strcmp(res->cmd_keyword, "txq")) { 17178 rc = rte_eth_tx_descriptor_status(res->cmd_pid, res->cmd_qid, 17179 res->cmd_did); 17180 if (rc < 0) { 17181 printf("Invalid input: queue id = %d, desc id = %d\n", 17182 res->cmd_qid, res->cmd_did); 17183 return; 17184 } 17185 if (rc == RTE_ETH_TX_DESC_FULL) 17186 printf("Desc status = FULL\n"); 17187 else if (rc == RTE_ETH_TX_DESC_DONE) 17188 printf("Desc status = DONE\n"); 17189 else 17190 printf("Desc status = UNAVAILABLE\n"); 17191 } 17192 } 17193 17194 cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_show = 17195 TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, 17196 cmd_show, "show"); 17197 cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_port = 17198 TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, 17199 cmd_port, "port"); 17200 cmdline_parse_token_num_t cmd_show_rx_tx_desc_status_pid = 17201 TOKEN_NUM_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, 17202 cmd_pid, RTE_UINT16); 17203 cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_keyword = 17204 TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, 17205 cmd_keyword, "rxq#txq"); 17206 cmdline_parse_token_num_t cmd_show_rx_tx_desc_status_qid = 17207 TOKEN_NUM_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, 17208 cmd_qid, RTE_UINT16); 17209 cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_desc = 17210 TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, 17211 cmd_desc, "desc"); 17212 cmdline_parse_token_num_t cmd_show_rx_tx_desc_status_did = 17213 TOKEN_NUM_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, 17214 cmd_did, RTE_UINT16); 17215 cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_status = 17216 TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, 17217 cmd_status, "status"); 17218 cmdline_parse_inst_t cmd_show_rx_tx_desc_status = { 17219 .f = cmd_show_rx_tx_desc_status_parsed, 17220 .data = NULL, 17221 .help_str = "show port <port_id> rxq|txq <queue_id> desc <desc_id> " 17222 "status", 17223 .tokens = { 17224 (void *)&cmd_show_rx_tx_desc_status_show, 17225 (void *)&cmd_show_rx_tx_desc_status_port, 17226 (void *)&cmd_show_rx_tx_desc_status_pid, 17227 (void *)&cmd_show_rx_tx_desc_status_keyword, 17228 (void *)&cmd_show_rx_tx_desc_status_qid, 17229 (void *)&cmd_show_rx_tx_desc_status_desc, 17230 (void *)&cmd_show_rx_tx_desc_status_did, 17231 (void *)&cmd_show_rx_tx_desc_status_status, 17232 NULL, 17233 }, 17234 }; 17235 17236 /* *** display rx queue desc used count *** */ 17237 struct cmd_show_rx_queue_desc_used_count_result { 17238 cmdline_fixed_string_t cmd_show; 17239 cmdline_fixed_string_t cmd_port; 17240 cmdline_fixed_string_t cmd_rxq; 17241 cmdline_fixed_string_t cmd_desc; 17242 cmdline_fixed_string_t cmd_used; 17243 cmdline_fixed_string_t cmd_count; 17244 portid_t cmd_pid; 17245 portid_t cmd_qid; 17246 }; 17247 17248 static void 17249 cmd_show_rx_queue_desc_used_count_parsed(void *parsed_result, 17250 __rte_unused struct cmdline *cl, 17251 __rte_unused void *data) 17252 { 17253 struct cmd_show_rx_queue_desc_used_count_result *res = parsed_result; 17254 int rc; 17255 17256 if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { 17257 printf("invalid port id %u\n", res->cmd_pid); 17258 return; 17259 } 17260 17261 rc = rte_eth_rx_queue_count(res->cmd_pid, res->cmd_qid); 17262 if (rc < 0) { 17263 printf("Invalid queueid = %d\n", res->cmd_qid); 17264 return; 17265 } 17266 printf("Used desc count = %d\n", rc); 17267 } 17268 17269 cmdline_parse_token_string_t cmd_show_rx_queue_desc_used_count_show = 17270 TOKEN_STRING_INITIALIZER 17271 (struct cmd_show_rx_queue_desc_used_count_result, 17272 cmd_show, "show"); 17273 cmdline_parse_token_string_t cmd_show_rx_queue_desc_used_count_port = 17274 TOKEN_STRING_INITIALIZER 17275 (struct cmd_show_rx_queue_desc_used_count_result, 17276 cmd_port, "port"); 17277 cmdline_parse_token_num_t cmd_show_rx_queue_desc_used_count_pid = 17278 TOKEN_NUM_INITIALIZER 17279 (struct cmd_show_rx_queue_desc_used_count_result, 17280 cmd_pid, RTE_UINT16); 17281 cmdline_parse_token_string_t cmd_show_rx_queue_desc_used_count_rxq = 17282 TOKEN_STRING_INITIALIZER 17283 (struct cmd_show_rx_queue_desc_used_count_result, 17284 cmd_rxq, "rxq"); 17285 cmdline_parse_token_num_t cmd_show_rx_queue_desc_used_count_qid = 17286 TOKEN_NUM_INITIALIZER 17287 (struct cmd_show_rx_queue_desc_used_count_result, 17288 cmd_qid, RTE_UINT16); 17289 cmdline_parse_token_string_t cmd_show_rx_queue_desc_used_count_desc = 17290 TOKEN_STRING_INITIALIZER 17291 (struct cmd_show_rx_queue_desc_used_count_result, 17292 cmd_count, "desc"); 17293 cmdline_parse_token_string_t cmd_show_rx_queue_desc_used_count_used = 17294 TOKEN_STRING_INITIALIZER 17295 (struct cmd_show_rx_queue_desc_used_count_result, 17296 cmd_count, "used"); 17297 cmdline_parse_token_string_t cmd_show_rx_queue_desc_used_count_count = 17298 TOKEN_STRING_INITIALIZER 17299 (struct cmd_show_rx_queue_desc_used_count_result, 17300 cmd_count, "count"); 17301 cmdline_parse_inst_t cmd_show_rx_queue_desc_used_count = { 17302 .f = cmd_show_rx_queue_desc_used_count_parsed, 17303 .data = NULL, 17304 .help_str = "show port <port_id> rxq <queue_id> desc used count", 17305 .tokens = { 17306 (void *)&cmd_show_rx_queue_desc_used_count_show, 17307 (void *)&cmd_show_rx_queue_desc_used_count_port, 17308 (void *)&cmd_show_rx_queue_desc_used_count_pid, 17309 (void *)&cmd_show_rx_queue_desc_used_count_rxq, 17310 (void *)&cmd_show_rx_queue_desc_used_count_qid, 17311 (void *)&cmd_show_rx_queue_desc_used_count_desc, 17312 (void *)&cmd_show_rx_queue_desc_used_count_used, 17313 (void *)&cmd_show_rx_queue_desc_used_count_count, 17314 NULL, 17315 }, 17316 }; 17317 17318 /* Common result structure for set port ptypes */ 17319 struct cmd_set_port_ptypes_result { 17320 cmdline_fixed_string_t set; 17321 cmdline_fixed_string_t port; 17322 portid_t port_id; 17323 cmdline_fixed_string_t ptype_mask; 17324 uint32_t mask; 17325 }; 17326 17327 /* Common CLI fields for set port ptypes */ 17328 cmdline_parse_token_string_t cmd_set_port_ptypes_set = 17329 TOKEN_STRING_INITIALIZER 17330 (struct cmd_set_port_ptypes_result, 17331 set, "set"); 17332 cmdline_parse_token_string_t cmd_set_port_ptypes_port = 17333 TOKEN_STRING_INITIALIZER 17334 (struct cmd_set_port_ptypes_result, 17335 port, "port"); 17336 cmdline_parse_token_num_t cmd_set_port_ptypes_port_id = 17337 TOKEN_NUM_INITIALIZER 17338 (struct cmd_set_port_ptypes_result, 17339 port_id, RTE_UINT16); 17340 cmdline_parse_token_string_t cmd_set_port_ptypes_mask_str = 17341 TOKEN_STRING_INITIALIZER 17342 (struct cmd_set_port_ptypes_result, 17343 ptype_mask, "ptype_mask"); 17344 cmdline_parse_token_num_t cmd_set_port_ptypes_mask_u32 = 17345 TOKEN_NUM_INITIALIZER 17346 (struct cmd_set_port_ptypes_result, 17347 mask, RTE_UINT32); 17348 17349 static void 17350 cmd_set_port_ptypes_parsed( 17351 void *parsed_result, 17352 __rte_unused struct cmdline *cl, 17353 __rte_unused void *data) 17354 { 17355 struct cmd_set_port_ptypes_result *res = parsed_result; 17356 #define PTYPE_NAMESIZE 256 17357 char ptype_name[PTYPE_NAMESIZE]; 17358 uint16_t port_id = res->port_id; 17359 uint32_t ptype_mask = res->mask; 17360 int ret, i; 17361 17362 ret = rte_eth_dev_get_supported_ptypes(port_id, RTE_PTYPE_ALL_MASK, 17363 NULL, 0); 17364 if (ret <= 0) { 17365 printf("Port %d doesn't support any ptypes.\n", port_id); 17366 return; 17367 } 17368 17369 uint32_t ptypes[ret]; 17370 17371 ret = rte_eth_dev_set_ptypes(port_id, ptype_mask, ptypes, ret); 17372 if (ret < 0) { 17373 printf("Unable to set requested ptypes for Port %d\n", port_id); 17374 return; 17375 } 17376 17377 printf("Successfully set following ptypes for Port %d\n", port_id); 17378 for (i = 0; i < ret && ptypes[i] != RTE_PTYPE_UNKNOWN; i++) { 17379 rte_get_ptype_name(ptypes[i], ptype_name, sizeof(ptype_name)); 17380 printf("%s\n", ptype_name); 17381 } 17382 17383 clear_ptypes = false; 17384 } 17385 17386 cmdline_parse_inst_t cmd_set_port_ptypes = { 17387 .f = cmd_set_port_ptypes_parsed, 17388 .data = NULL, 17389 .help_str = "set port <port_id> ptype_mask <mask>", 17390 .tokens = { 17391 (void *)&cmd_set_port_ptypes_set, 17392 (void *)&cmd_set_port_ptypes_port, 17393 (void *)&cmd_set_port_ptypes_port_id, 17394 (void *)&cmd_set_port_ptypes_mask_str, 17395 (void *)&cmd_set_port_ptypes_mask_u32, 17396 NULL, 17397 }, 17398 }; 17399 17400 /* *** display mac addresses added to a port *** */ 17401 struct cmd_showport_macs_result { 17402 cmdline_fixed_string_t cmd_show; 17403 cmdline_fixed_string_t cmd_port; 17404 cmdline_fixed_string_t cmd_keyword; 17405 portid_t cmd_pid; 17406 }; 17407 17408 static void 17409 cmd_showport_macs_parsed(void *parsed_result, 17410 __rte_unused struct cmdline *cl, 17411 __rte_unused void *data) 17412 { 17413 struct cmd_showport_macs_result *res = parsed_result; 17414 17415 if (port_id_is_invalid(res->cmd_pid, ENABLED_WARN)) 17416 return; 17417 17418 if (!strcmp(res->cmd_keyword, "macs")) 17419 show_macs(res->cmd_pid); 17420 else if (!strcmp(res->cmd_keyword, "mcast_macs")) 17421 show_mcast_macs(res->cmd_pid); 17422 } 17423 17424 cmdline_parse_token_string_t cmd_showport_macs_show = 17425 TOKEN_STRING_INITIALIZER(struct cmd_showport_macs_result, 17426 cmd_show, "show"); 17427 cmdline_parse_token_string_t cmd_showport_macs_port = 17428 TOKEN_STRING_INITIALIZER(struct cmd_showport_macs_result, 17429 cmd_port, "port"); 17430 cmdline_parse_token_num_t cmd_showport_macs_pid = 17431 TOKEN_NUM_INITIALIZER(struct cmd_showport_macs_result, 17432 cmd_pid, RTE_UINT16); 17433 cmdline_parse_token_string_t cmd_showport_macs_keyword = 17434 TOKEN_STRING_INITIALIZER(struct cmd_showport_macs_result, 17435 cmd_keyword, "macs#mcast_macs"); 17436 17437 cmdline_parse_inst_t cmd_showport_macs = { 17438 .f = cmd_showport_macs_parsed, 17439 .data = NULL, 17440 .help_str = "show port <port_id> macs|mcast_macs", 17441 .tokens = { 17442 (void *)&cmd_showport_macs_show, 17443 (void *)&cmd_showport_macs_port, 17444 (void *)&cmd_showport_macs_pid, 17445 (void *)&cmd_showport_macs_keyword, 17446 NULL, 17447 }, 17448 }; 17449 17450 /* ******************************************************************************** */ 17451 17452 /* list of instructions */ 17453 cmdline_parse_ctx_t main_ctx[] = { 17454 (cmdline_parse_inst_t *)&cmd_help_brief, 17455 (cmdline_parse_inst_t *)&cmd_help_long, 17456 (cmdline_parse_inst_t *)&cmd_quit, 17457 (cmdline_parse_inst_t *)&cmd_load_from_file, 17458 (cmdline_parse_inst_t *)&cmd_showport, 17459 (cmdline_parse_inst_t *)&cmd_showqueue, 17460 (cmdline_parse_inst_t *)&cmd_showeeprom, 17461 (cmdline_parse_inst_t *)&cmd_showportall, 17462 (cmdline_parse_inst_t *)&cmd_showdevice, 17463 (cmdline_parse_inst_t *)&cmd_showcfg, 17464 (cmdline_parse_inst_t *)&cmd_showfwdall, 17465 (cmdline_parse_inst_t *)&cmd_start, 17466 (cmdline_parse_inst_t *)&cmd_start_tx_first, 17467 (cmdline_parse_inst_t *)&cmd_start_tx_first_n, 17468 (cmdline_parse_inst_t *)&cmd_set_link_up, 17469 (cmdline_parse_inst_t *)&cmd_set_link_down, 17470 (cmdline_parse_inst_t *)&cmd_reset, 17471 (cmdline_parse_inst_t *)&cmd_set_numbers, 17472 (cmdline_parse_inst_t *)&cmd_set_log, 17473 (cmdline_parse_inst_t *)&cmd_set_rxoffs, 17474 (cmdline_parse_inst_t *)&cmd_set_rxpkts, 17475 (cmdline_parse_inst_t *)&cmd_set_txpkts, 17476 (cmdline_parse_inst_t *)&cmd_set_txsplit, 17477 (cmdline_parse_inst_t *)&cmd_set_txtimes, 17478 (cmdline_parse_inst_t *)&cmd_set_fwd_list, 17479 (cmdline_parse_inst_t *)&cmd_set_fwd_mask, 17480 (cmdline_parse_inst_t *)&cmd_set_fwd_mode, 17481 (cmdline_parse_inst_t *)&cmd_set_fwd_retry_mode, 17482 (cmdline_parse_inst_t *)&cmd_set_burst_tx_retry, 17483 (cmdline_parse_inst_t *)&cmd_set_promisc_mode_one, 17484 (cmdline_parse_inst_t *)&cmd_set_promisc_mode_all, 17485 (cmdline_parse_inst_t *)&cmd_set_allmulti_mode_one, 17486 (cmdline_parse_inst_t *)&cmd_set_allmulti_mode_all, 17487 (cmdline_parse_inst_t *)&cmd_set_flush_rx, 17488 (cmdline_parse_inst_t *)&cmd_set_link_check, 17489 (cmdline_parse_inst_t *)&cmd_set_bypass_mode, 17490 (cmdline_parse_inst_t *)&cmd_set_bypass_event, 17491 (cmdline_parse_inst_t *)&cmd_set_bypass_timeout, 17492 (cmdline_parse_inst_t *)&cmd_show_bypass_config, 17493 #ifdef RTE_NET_BOND 17494 (cmdline_parse_inst_t *) &cmd_set_bonding_mode, 17495 (cmdline_parse_inst_t *) &cmd_show_bonding_config, 17496 (cmdline_parse_inst_t *) &cmd_set_bonding_primary, 17497 (cmdline_parse_inst_t *) &cmd_add_bonding_slave, 17498 (cmdline_parse_inst_t *) &cmd_remove_bonding_slave, 17499 (cmdline_parse_inst_t *) &cmd_create_bonded_device, 17500 (cmdline_parse_inst_t *) &cmd_set_bond_mac_addr, 17501 (cmdline_parse_inst_t *) &cmd_set_balance_xmit_policy, 17502 (cmdline_parse_inst_t *) &cmd_set_bond_mon_period, 17503 (cmdline_parse_inst_t *) &cmd_set_lacp_dedicated_queues, 17504 (cmdline_parse_inst_t *) &cmd_set_bonding_agg_mode_policy, 17505 #endif 17506 (cmdline_parse_inst_t *)&cmd_vlan_offload, 17507 (cmdline_parse_inst_t *)&cmd_vlan_tpid, 17508 (cmdline_parse_inst_t *)&cmd_rx_vlan_filter_all, 17509 (cmdline_parse_inst_t *)&cmd_rx_vlan_filter, 17510 (cmdline_parse_inst_t *)&cmd_tx_vlan_set, 17511 (cmdline_parse_inst_t *)&cmd_tx_vlan_set_qinq, 17512 (cmdline_parse_inst_t *)&cmd_tx_vlan_reset, 17513 (cmdline_parse_inst_t *)&cmd_tx_vlan_set_pvid, 17514 (cmdline_parse_inst_t *)&cmd_csum_set, 17515 (cmdline_parse_inst_t *)&cmd_csum_show, 17516 (cmdline_parse_inst_t *)&cmd_csum_tunnel, 17517 (cmdline_parse_inst_t *)&cmd_tso_set, 17518 (cmdline_parse_inst_t *)&cmd_tso_show, 17519 (cmdline_parse_inst_t *)&cmd_tunnel_tso_set, 17520 (cmdline_parse_inst_t *)&cmd_tunnel_tso_show, 17521 (cmdline_parse_inst_t *)&cmd_gro_enable, 17522 (cmdline_parse_inst_t *)&cmd_gro_flush, 17523 (cmdline_parse_inst_t *)&cmd_gro_show, 17524 (cmdline_parse_inst_t *)&cmd_gso_enable, 17525 (cmdline_parse_inst_t *)&cmd_gso_size, 17526 (cmdline_parse_inst_t *)&cmd_gso_show, 17527 (cmdline_parse_inst_t *)&cmd_link_flow_control_set, 17528 (cmdline_parse_inst_t *)&cmd_link_flow_control_set_rx, 17529 (cmdline_parse_inst_t *)&cmd_link_flow_control_set_tx, 17530 (cmdline_parse_inst_t *)&cmd_link_flow_control_set_hw, 17531 (cmdline_parse_inst_t *)&cmd_link_flow_control_set_lw, 17532 (cmdline_parse_inst_t *)&cmd_link_flow_control_set_pt, 17533 (cmdline_parse_inst_t *)&cmd_link_flow_control_set_xon, 17534 (cmdline_parse_inst_t *)&cmd_link_flow_control_set_macfwd, 17535 (cmdline_parse_inst_t *)&cmd_link_flow_control_set_autoneg, 17536 (cmdline_parse_inst_t *)&cmd_link_flow_control_show, 17537 (cmdline_parse_inst_t *)&cmd_priority_flow_control_set, 17538 (cmdline_parse_inst_t *)&cmd_config_dcb, 17539 (cmdline_parse_inst_t *)&cmd_read_reg, 17540 (cmdline_parse_inst_t *)&cmd_read_reg_bit_field, 17541 (cmdline_parse_inst_t *)&cmd_read_reg_bit, 17542 (cmdline_parse_inst_t *)&cmd_write_reg, 17543 (cmdline_parse_inst_t *)&cmd_write_reg_bit_field, 17544 (cmdline_parse_inst_t *)&cmd_write_reg_bit, 17545 (cmdline_parse_inst_t *)&cmd_read_rxd_txd, 17546 (cmdline_parse_inst_t *)&cmd_stop, 17547 (cmdline_parse_inst_t *)&cmd_mac_addr, 17548 (cmdline_parse_inst_t *)&cmd_set_fwd_eth_peer, 17549 (cmdline_parse_inst_t *)&cmd_set_qmap, 17550 (cmdline_parse_inst_t *)&cmd_set_xstats_hide_zero, 17551 (cmdline_parse_inst_t *)&cmd_set_record_core_cycles, 17552 (cmdline_parse_inst_t *)&cmd_set_record_burst_stats, 17553 (cmdline_parse_inst_t *)&cmd_operate_port, 17554 (cmdline_parse_inst_t *)&cmd_operate_specific_port, 17555 (cmdline_parse_inst_t *)&cmd_operate_attach_port, 17556 (cmdline_parse_inst_t *)&cmd_operate_detach_port, 17557 (cmdline_parse_inst_t *)&cmd_operate_detach_device, 17558 (cmdline_parse_inst_t *)&cmd_set_port_setup_on, 17559 (cmdline_parse_inst_t *)&cmd_config_speed_all, 17560 (cmdline_parse_inst_t *)&cmd_config_speed_specific, 17561 (cmdline_parse_inst_t *)&cmd_config_loopback_all, 17562 (cmdline_parse_inst_t *)&cmd_config_loopback_specific, 17563 (cmdline_parse_inst_t *)&cmd_config_rx_tx, 17564 (cmdline_parse_inst_t *)&cmd_config_mtu, 17565 (cmdline_parse_inst_t *)&cmd_config_max_pkt_len, 17566 (cmdline_parse_inst_t *)&cmd_config_max_lro_pkt_size, 17567 (cmdline_parse_inst_t *)&cmd_config_rx_mode_flag, 17568 (cmdline_parse_inst_t *)&cmd_config_rss, 17569 (cmdline_parse_inst_t *)&cmd_config_rxtx_ring_size, 17570 (cmdline_parse_inst_t *)&cmd_config_rxtx_queue, 17571 (cmdline_parse_inst_t *)&cmd_config_deferred_start_rxtx_queue, 17572 (cmdline_parse_inst_t *)&cmd_setup_rxtx_queue, 17573 (cmdline_parse_inst_t *)&cmd_config_rss_reta, 17574 (cmdline_parse_inst_t *)&cmd_showport_reta, 17575 (cmdline_parse_inst_t *)&cmd_showport_macs, 17576 (cmdline_parse_inst_t *)&cmd_config_burst, 17577 (cmdline_parse_inst_t *)&cmd_config_thresh, 17578 (cmdline_parse_inst_t *)&cmd_config_threshold, 17579 (cmdline_parse_inst_t *)&cmd_set_uc_hash_filter, 17580 (cmdline_parse_inst_t *)&cmd_set_uc_all_hash_filter, 17581 (cmdline_parse_inst_t *)&cmd_vf_mac_addr_filter, 17582 (cmdline_parse_inst_t *)&cmd_queue_rate_limit, 17583 (cmdline_parse_inst_t *)&cmd_tunnel_udp_config, 17584 (cmdline_parse_inst_t *)&cmd_set_mirror_mask, 17585 (cmdline_parse_inst_t *)&cmd_set_mirror_link, 17586 (cmdline_parse_inst_t *)&cmd_reset_mirror_rule, 17587 (cmdline_parse_inst_t *)&cmd_showport_rss_hash, 17588 (cmdline_parse_inst_t *)&cmd_showport_rss_hash_key, 17589 (cmdline_parse_inst_t *)&cmd_config_rss_hash_key, 17590 (cmdline_parse_inst_t *)&cmd_cleanup_txq_mbufs, 17591 (cmdline_parse_inst_t *)&cmd_dump, 17592 (cmdline_parse_inst_t *)&cmd_dump_one, 17593 #ifdef RTE_NET_I40E 17594 (cmdline_parse_inst_t *)&cmd_add_del_raw_flow_director, 17595 #endif 17596 (cmdline_parse_inst_t *)&cmd_set_flow_director_ip_mask, 17597 (cmdline_parse_inst_t *)&cmd_set_flow_director_mac_vlan_mask, 17598 (cmdline_parse_inst_t *)&cmd_set_flow_director_tunnel_mask, 17599 (cmdline_parse_inst_t *)&cmd_set_flow_director_flex_payload, 17600 (cmdline_parse_inst_t *)&cmd_flow, 17601 (cmdline_parse_inst_t *)&cmd_show_port_meter_cap, 17602 (cmdline_parse_inst_t *)&cmd_add_port_meter_profile_srtcm, 17603 (cmdline_parse_inst_t *)&cmd_add_port_meter_profile_trtcm, 17604 (cmdline_parse_inst_t *)&cmd_del_port_meter_profile, 17605 (cmdline_parse_inst_t *)&cmd_create_port_meter, 17606 (cmdline_parse_inst_t *)&cmd_enable_port_meter, 17607 (cmdline_parse_inst_t *)&cmd_disable_port_meter, 17608 (cmdline_parse_inst_t *)&cmd_del_port_meter, 17609 (cmdline_parse_inst_t *)&cmd_del_port_meter_policy, 17610 (cmdline_parse_inst_t *)&cmd_set_port_meter_profile, 17611 (cmdline_parse_inst_t *)&cmd_set_port_meter_dscp_table, 17612 (cmdline_parse_inst_t *)&cmd_set_port_meter_stats_mask, 17613 (cmdline_parse_inst_t *)&cmd_show_port_meter_stats, 17614 (cmdline_parse_inst_t *)&cmd_mcast_addr, 17615 (cmdline_parse_inst_t *)&cmd_set_vf_vlan_anti_spoof, 17616 (cmdline_parse_inst_t *)&cmd_set_vf_mac_anti_spoof, 17617 (cmdline_parse_inst_t *)&cmd_set_vf_vlan_stripq, 17618 (cmdline_parse_inst_t *)&cmd_set_vf_vlan_insert, 17619 (cmdline_parse_inst_t *)&cmd_set_tx_loopback, 17620 (cmdline_parse_inst_t *)&cmd_set_all_queues_drop_en, 17621 (cmdline_parse_inst_t *)&cmd_set_vf_split_drop_en, 17622 (cmdline_parse_inst_t *)&cmd_set_macsec_offload_on, 17623 (cmdline_parse_inst_t *)&cmd_set_macsec_offload_off, 17624 (cmdline_parse_inst_t *)&cmd_set_macsec_sc, 17625 (cmdline_parse_inst_t *)&cmd_set_macsec_sa, 17626 (cmdline_parse_inst_t *)&cmd_set_vf_traffic, 17627 (cmdline_parse_inst_t *)&cmd_set_vf_rxmode, 17628 (cmdline_parse_inst_t *)&cmd_vf_rate_limit, 17629 (cmdline_parse_inst_t *)&cmd_vf_rxvlan_filter, 17630 (cmdline_parse_inst_t *)&cmd_set_vf_mac_addr, 17631 (cmdline_parse_inst_t *)&cmd_set_vf_promisc, 17632 (cmdline_parse_inst_t *)&cmd_set_vf_allmulti, 17633 (cmdline_parse_inst_t *)&cmd_set_vf_broadcast, 17634 (cmdline_parse_inst_t *)&cmd_set_vf_vlan_tag, 17635 (cmdline_parse_inst_t *)&cmd_vf_max_bw, 17636 (cmdline_parse_inst_t *)&cmd_vf_tc_min_bw, 17637 (cmdline_parse_inst_t *)&cmd_vf_tc_max_bw, 17638 (cmdline_parse_inst_t *)&cmd_strict_link_prio, 17639 (cmdline_parse_inst_t *)&cmd_tc_min_bw, 17640 (cmdline_parse_inst_t *)&cmd_set_vxlan, 17641 (cmdline_parse_inst_t *)&cmd_set_vxlan_tos_ttl, 17642 (cmdline_parse_inst_t *)&cmd_set_vxlan_with_vlan, 17643 (cmdline_parse_inst_t *)&cmd_set_nvgre, 17644 (cmdline_parse_inst_t *)&cmd_set_nvgre_with_vlan, 17645 (cmdline_parse_inst_t *)&cmd_set_l2_encap, 17646 (cmdline_parse_inst_t *)&cmd_set_l2_encap_with_vlan, 17647 (cmdline_parse_inst_t *)&cmd_set_l2_decap, 17648 (cmdline_parse_inst_t *)&cmd_set_l2_decap_with_vlan, 17649 (cmdline_parse_inst_t *)&cmd_set_mplsogre_encap, 17650 (cmdline_parse_inst_t *)&cmd_set_mplsogre_encap_with_vlan, 17651 (cmdline_parse_inst_t *)&cmd_set_mplsogre_decap, 17652 (cmdline_parse_inst_t *)&cmd_set_mplsogre_decap_with_vlan, 17653 (cmdline_parse_inst_t *)&cmd_set_mplsoudp_encap, 17654 (cmdline_parse_inst_t *)&cmd_set_mplsoudp_encap_with_vlan, 17655 (cmdline_parse_inst_t *)&cmd_set_mplsoudp_decap, 17656 (cmdline_parse_inst_t *)&cmd_set_mplsoudp_decap_with_vlan, 17657 (cmdline_parse_inst_t *)&cmd_set_conntrack_common, 17658 (cmdline_parse_inst_t *)&cmd_set_conntrack_dir, 17659 (cmdline_parse_inst_t *)&cmd_ddp_add, 17660 (cmdline_parse_inst_t *)&cmd_ddp_del, 17661 (cmdline_parse_inst_t *)&cmd_ddp_get_list, 17662 (cmdline_parse_inst_t *)&cmd_ddp_get_info, 17663 (cmdline_parse_inst_t *)&cmd_cfg_input_set, 17664 (cmdline_parse_inst_t *)&cmd_clear_input_set, 17665 (cmdline_parse_inst_t *)&cmd_show_vf_stats, 17666 (cmdline_parse_inst_t *)&cmd_clear_vf_stats, 17667 (cmdline_parse_inst_t *)&cmd_show_port_supported_ptypes, 17668 (cmdline_parse_inst_t *)&cmd_set_port_ptypes, 17669 (cmdline_parse_inst_t *)&cmd_ptype_mapping_get, 17670 (cmdline_parse_inst_t *)&cmd_ptype_mapping_replace, 17671 (cmdline_parse_inst_t *)&cmd_ptype_mapping_reset, 17672 (cmdline_parse_inst_t *)&cmd_ptype_mapping_update, 17673 17674 (cmdline_parse_inst_t *)&cmd_pctype_mapping_get, 17675 (cmdline_parse_inst_t *)&cmd_pctype_mapping_reset, 17676 (cmdline_parse_inst_t *)&cmd_pctype_mapping_update, 17677 (cmdline_parse_inst_t *)&cmd_queue_region, 17678 (cmdline_parse_inst_t *)&cmd_region_flowtype, 17679 (cmdline_parse_inst_t *)&cmd_user_priority_region, 17680 (cmdline_parse_inst_t *)&cmd_flush_queue_region, 17681 (cmdline_parse_inst_t *)&cmd_show_queue_region_info_all, 17682 (cmdline_parse_inst_t *)&cmd_show_port_tm_cap, 17683 (cmdline_parse_inst_t *)&cmd_show_port_tm_level_cap, 17684 (cmdline_parse_inst_t *)&cmd_show_port_tm_node_cap, 17685 (cmdline_parse_inst_t *)&cmd_show_port_tm_node_type, 17686 (cmdline_parse_inst_t *)&cmd_show_port_tm_node_stats, 17687 (cmdline_parse_inst_t *)&cmd_add_port_tm_node_shaper_profile, 17688 (cmdline_parse_inst_t *)&cmd_del_port_tm_node_shaper_profile, 17689 (cmdline_parse_inst_t *)&cmd_add_port_tm_node_shared_shaper, 17690 (cmdline_parse_inst_t *)&cmd_del_port_tm_node_shared_shaper, 17691 (cmdline_parse_inst_t *)&cmd_add_port_tm_node_wred_profile, 17692 (cmdline_parse_inst_t *)&cmd_del_port_tm_node_wred_profile, 17693 (cmdline_parse_inst_t *)&cmd_set_port_tm_node_shaper_profile, 17694 (cmdline_parse_inst_t *)&cmd_add_port_tm_nonleaf_node, 17695 (cmdline_parse_inst_t *)&cmd_add_port_tm_nonleaf_node_pmode, 17696 (cmdline_parse_inst_t *)&cmd_add_port_tm_leaf_node, 17697 (cmdline_parse_inst_t *)&cmd_del_port_tm_node, 17698 (cmdline_parse_inst_t *)&cmd_set_port_tm_node_parent, 17699 (cmdline_parse_inst_t *)&cmd_suspend_port_tm_node, 17700 (cmdline_parse_inst_t *)&cmd_resume_port_tm_node, 17701 (cmdline_parse_inst_t *)&cmd_port_tm_hierarchy_commit, 17702 (cmdline_parse_inst_t *)&cmd_port_tm_mark_ip_ecn, 17703 (cmdline_parse_inst_t *)&cmd_port_tm_mark_ip_dscp, 17704 (cmdline_parse_inst_t *)&cmd_port_tm_mark_vlan_dei, 17705 (cmdline_parse_inst_t *)&cmd_cfg_tunnel_udp_port, 17706 (cmdline_parse_inst_t *)&cmd_rx_offload_get_capa, 17707 (cmdline_parse_inst_t *)&cmd_rx_offload_get_configuration, 17708 (cmdline_parse_inst_t *)&cmd_config_per_port_rx_offload, 17709 (cmdline_parse_inst_t *)&cmd_config_per_queue_rx_offload, 17710 (cmdline_parse_inst_t *)&cmd_tx_offload_get_capa, 17711 (cmdline_parse_inst_t *)&cmd_tx_offload_get_configuration, 17712 (cmdline_parse_inst_t *)&cmd_config_per_port_tx_offload, 17713 (cmdline_parse_inst_t *)&cmd_config_per_queue_tx_offload, 17714 #ifdef RTE_LIB_BPF 17715 (cmdline_parse_inst_t *)&cmd_operate_bpf_ld_parse, 17716 (cmdline_parse_inst_t *)&cmd_operate_bpf_unld_parse, 17717 #endif 17718 (cmdline_parse_inst_t *)&cmd_config_tx_metadata_specific, 17719 (cmdline_parse_inst_t *)&cmd_show_tx_metadata, 17720 (cmdline_parse_inst_t *)&cmd_show_rx_tx_desc_status, 17721 (cmdline_parse_inst_t *)&cmd_show_rx_queue_desc_used_count, 17722 (cmdline_parse_inst_t *)&cmd_set_raw, 17723 (cmdline_parse_inst_t *)&cmd_show_set_raw, 17724 (cmdline_parse_inst_t *)&cmd_show_set_raw_all, 17725 (cmdline_parse_inst_t *)&cmd_config_tx_dynf_specific, 17726 (cmdline_parse_inst_t *)&cmd_show_fec_mode, 17727 (cmdline_parse_inst_t *)&cmd_set_fec_mode, 17728 (cmdline_parse_inst_t *)&cmd_show_capability, 17729 NULL, 17730 }; 17731 17732 /* read cmdline commands from file */ 17733 void 17734 cmdline_read_from_file(const char *filename) 17735 { 17736 struct cmdline *cl; 17737 17738 cl = cmdline_file_new(main_ctx, "testpmd> ", filename); 17739 if (cl == NULL) { 17740 printf("Failed to create file based cmdline context: %s\n", 17741 filename); 17742 return; 17743 } 17744 17745 cmdline_interact(cl); 17746 cmdline_quit(cl); 17747 17748 cmdline_free(cl); 17749 17750 printf("Read CLI commands from %s\n", filename); 17751 } 17752 17753 /* prompt function, called from main on MAIN lcore */ 17754 void 17755 prompt(void) 17756 { 17757 int ret; 17758 /* initialize non-constant commands */ 17759 cmd_set_fwd_mode_init(); 17760 cmd_set_fwd_retry_mode_init(); 17761 17762 testpmd_cl = cmdline_stdin_new(main_ctx, "testpmd> "); 17763 if (testpmd_cl == NULL) 17764 return; 17765 17766 ret = atexit(prompt_exit); 17767 if (ret != 0) 17768 printf("Cannot set exit function for cmdline\n"); 17769 17770 cmdline_interact(testpmd_cl); 17771 if (ret != 0) 17772 cmdline_stdin_exit(testpmd_cl); 17773 } 17774 17775 void 17776 prompt_exit(void) 17777 { 17778 if (testpmd_cl != NULL) { 17779 cmdline_quit(testpmd_cl); 17780 cmdline_stdin_exit(testpmd_cl); 17781 } 17782 } 17783 17784 static void 17785 cmd_reconfig_device_queue(portid_t id, uint8_t dev, uint8_t queue) 17786 { 17787 if (id == (portid_t)RTE_PORT_ALL) { 17788 portid_t pid; 17789 17790 RTE_ETH_FOREACH_DEV(pid) { 17791 /* check if need_reconfig has been set to 1 */ 17792 if (ports[pid].need_reconfig == 0) 17793 ports[pid].need_reconfig = dev; 17794 /* check if need_reconfig_queues has been set to 1 */ 17795 if (ports[pid].need_reconfig_queues == 0) 17796 ports[pid].need_reconfig_queues = queue; 17797 } 17798 } else if (!port_id_is_invalid(id, DISABLED_WARN)) { 17799 /* check if need_reconfig has been set to 1 */ 17800 if (ports[id].need_reconfig == 0) 17801 ports[id].need_reconfig = dev; 17802 /* check if need_reconfig_queues has been set to 1 */ 17803 if (ports[id].need_reconfig_queues == 0) 17804 ports[id].need_reconfig_queues = queue; 17805 } 17806 } 17807