X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Ftest-pmd%2Fcmdline.c;h=07ee4e4e1374568053aaaa214b2693516d96abad;hb=2befc67ff6798a38c9f52f1f09b3f87bdd4afb4a;hp=6b9444f42d92a83de771a4a42dbc6dabf4c0ecf2;hpb=34fc1051066a2cef9775ddba6139c3aae3dd6c2f;p=dpdk.git diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 6b9444f42d..07ee4e4e13 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -11,13 +11,7 @@ #include #include #include -#ifndef __linux__ -#ifndef __FreeBSD__ -#include -#else #include -#endif -#endif #include #include @@ -46,6 +40,7 @@ #include #include #include +#include #include #include @@ -85,9 +80,9 @@ struct cmd_help_brief_result { cmdline_fixed_string_t help; }; -static void cmd_help_brief_parsed(__attribute__((unused)) void *parsed_result, +static void cmd_help_brief_parsed(__rte_unused void *parsed_result, struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused void *data) { cmdline_printf( cl, @@ -100,7 +95,7 @@ static void cmd_help_brief_parsed(__attribute__((unused)) void *parsed_result, " help ports : Configuring ports.\n" " help registers : Reading and setting port registers.\n" " help filters : Filters configuration help.\n" - " help traffic_management : Traffic Management commmands.\n" + " help traffic_management : Traffic Management commands.\n" " help devices : Device related cmds.\n" " help all : All of the above sections.\n\n" ); @@ -128,7 +123,7 @@ struct cmd_help_long_result { static void cmd_help_long_parsed(void *parsed_result, struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused void *data) { int show_all = 0; struct cmd_help_long_result *res = parsed_result; @@ -171,6 +166,9 @@ static void cmd_help_long_parsed(void *parsed_result, "show port (info|stats|summary|xstats|fdir|stat_qmap|dcb_tc|cap) (port_id|all)\n" " Display information for port_id, or all.\n\n" + "show port port_id (module_eeprom|eeprom)\n" + " Display the module EEPROM or EEPROM information for port_id.\n\n" + "show port X rss reta (size) (mask0,mask1,...)\n" " Display the rss redirection table entry indicated" " by masks on port X. size is used to indicate the" @@ -185,7 +183,7 @@ static void cmd_help_long_parsed(void *parsed_result, "show (rxq|txq) info (port_id) (queue_id)\n" " Display information for configured RX/TX queue.\n\n" - "show config (rxtx|cores|fwd|txpkts)\n" + "show config (rxtx|cores|fwd|rxoffs|rxpkts|txpkts)\n" " Display the given configuration.\n\n" "read rxd (port_id) (queue_id) (rxd_id)\n" @@ -238,8 +236,24 @@ static void cmd_help_long_parsed(void *parsed_result, " Show Tx metadata value set" " for a specific port\n\n" + "show port (port_id) ptypes\n" + " Show port supported ptypes" + " for a specific port\n\n" + "show device info (|all)" " Show general information about devices probed.\n\n" + + "show port (port_id) rxq|txq (queue_id) desc (desc_id) status" + " Show status of rx|tx descriptor.\n\n" + + "show port (port_id) macs|mcast_macs" + " Display list of mac addresses added to port.\n\n" + + "show port (port_id) fec capabilities" + " Show fec capabilities of a port.\n\n" + + "show port (port_id) fec_mode" + " Show fec mode of a port.\n\n" ); } @@ -280,6 +294,18 @@ static void cmd_help_long_parsed(void *parsed_result, " Set the transmit delay time and number of retries," " effective when retry is enabled.\n\n" + "set rxoffs (x[,y]*)\n" + " Set the offset of each packet segment on" + " receiving if split feature is engaged." + " Affects only the queues configured with split" + " offloads.\n\n" + + "set rxpkts (x[,y]*)\n" + " Set the length of each segment to scatter" + " packets on receiving if split feature is engaged." + " Affects only the queues configured with split" + " offloads.\n\n" + "set txpkts (x[,y]*)\n" " Set the length of each segment of TXONLY" " and optionally CSUM packets.\n\n" @@ -289,6 +315,10 @@ static void cmd_help_long_parsed(void *parsed_result, " Right now only applicable for CSUM and TXONLY" " modes\n\n" + "set txtimes (x, y)\n" + " Set the scheduling on timestamps" + " timings for the TXONLY mode\n\n" + "set corelist (x[,y]*)\n" " Set the list of forwarding cores.\n\n" @@ -325,9 +355,6 @@ static void cmd_help_long_parsed(void *parsed_result, "set vf broadcast (port_id) (vf_id) (on|off)\n" " Set VF broadcast for a VF from the PF.\n\n" - "vlan set strip (on|off) (port_id)\n" - " Set the VLAN strip on a port.\n\n" - "vlan set stripq (on|off) (port_id,queue_id)\n" " Set the VLAN strip for a queue on a port.\n\n" @@ -358,12 +385,8 @@ static void cmd_help_long_parsed(void *parsed_result, "set tc tx min-bandwidth (port_id) (bw1, bw2, ...)\n" " Set all TCs' min bandwidth(%%) for all PF and VFs.\n\n" - "vlan set filter (on|off) (port_id)\n" - " Set the VLAN filter on a port.\n\n" - - "vlan set qinq (on|off) (port_id)\n" - " Set the VLAN QinQ (extended queue in queue)" - " on a port.\n\n" + "vlan set (strip|filter|qinq_strip|extend) (on|off) (port_id)\n" + " Set the VLAN strip or filter or qinq strip or extend\n\n" "vlan set (inner|outer) tpid (value) (port_id)\n" " Set the VLAN TPID for Packet Filtering on" @@ -527,6 +550,12 @@ static void cmd_help_long_parsed(void *parsed_result, " Set the option to hide the zero values" " for xstats display.\n" + "set record-core-cycles on|off\n" + " Set the option to enable measurement of CPU cycles.\n" + + "set record-burst-stats on|off\n" + " Set the option to enable display of RX and TX bursts.\n" + "set port (port_id) vf (vf_id) rx|tx on|off\n" " Enable/Disable a VF receive/tranmit from a port\n\n" @@ -675,6 +704,9 @@ static void cmd_help_long_parsed(void *parsed_result, "ptype mapping update (port_id) (hw_ptype) (sw_ptype)\n" " Update a ptype mapping item on a port\n\n" + "set port (port_id) ptype_mask (ptype_mask)\n" + " set packet types classification for a specific port\n\n" + "set port (port_id) queue-region region_id (value) " "queue_start_index (value) queue_num (value)\n" " Set a queue region on a port\n\n" @@ -737,6 +769,9 @@ static void cmd_help_long_parsed(void *parsed_result, "show port (port_id) queue-region\n" " show all queue region related configuration info\n\n" + "set port (port_id) fec_mode auto|off|rs|baser\n" + " set fec mode for a specific port\n\n" + , list_pkt_forwarding_modes() ); } @@ -758,6 +793,9 @@ static void cmd_help_long_parsed(void *parsed_result, "port close (port_id|all)\n" " Close all ports or port_id.\n\n" + "port reset (port_id|all)\n" + " Reset all ports or port_id.\n\n" + "port attach (ident)\n" " Attach physical or virtual dev by pci address or virtual device name\n\n" @@ -765,7 +803,7 @@ static void cmd_help_long_parsed(void *parsed_result, " Detach physical or virtual dev by port_id\n\n" "port config (port_id|all)" - " speed (10|100|1000|10000|25000|40000|50000|100000|auto)" + " speed (10|100|1000|10000|25000|40000|50000|100000|200000|auto)" " duplex (half|full|auto)\n" " Set speed and duplex for all ports or port_id\n\n" @@ -778,12 +816,16 @@ static void cmd_help_long_parsed(void *parsed_result, "port config all max-pkt-len (value)\n" " Set the max packet length.\n\n" + "port config all max-lro-pkt-size (value)\n" + " Set the max LRO aggregated packet size.\n\n" + "port config all drop-en (on|off)\n" " Enable or disable packet drop on all RX queues of all ports when no " "receive buffers available.\n\n" "port config all rss (all|default|ip|tcp|udp|sctp|" - "ether|port|vxlan|geneve|nvgre|vxlan-gpe|none|)\n" + "ether|port|vxlan|geneve|nvgre|vxlan-gpe|none|level-default|" + "level-outer|level-inner|)\n" " Set the RSS mode.\n\n" "port config port-id rss reta (hash,queue)[,(hash,queue)]\n" @@ -853,16 +895,16 @@ static void cmd_help_long_parsed(void *parsed_result, "port config rx_offload vlan_strip|" "ipv4_cksum|udp_cksum|tcp_cksum|tcp_lro|qinq_strip|" "outer_ipv4_cksum|macsec_strip|header_split|" - "vlan_filter|vlan_extend|jumbo_frame|crc_strip|" - "scatter|timestamp|security|keep_crc on|off\n" + "vlan_filter|vlan_extend|jumbo_frame|scatter|" + "buffer_split|timestamp|security|keep_crc on|off\n" " Enable or disable a per port Rx offloading" " on all Rx queues of a port\n\n" "port (port_id) rxq (queue_id) rx_offload vlan_strip|" "ipv4_cksum|udp_cksum|tcp_cksum|tcp_lro|qinq_strip|" "outer_ipv4_cksum|macsec_strip|header_split|" - "vlan_filter|vlan_extend|jumbo_frame|crc_strip|" - "scatter|timestamp|security|keep_crc on|off\n" + "vlan_filter|vlan_extend|jumbo_frame|scatter|" + "buffer_split|timestamp|security|keep_crc on|off\n" " Enable or disable a per queue Rx offloading" " only on a specific Rx queue\n\n" @@ -871,7 +913,7 @@ static void cmd_help_long_parsed(void *parsed_result, "udp_tso|outer_ipv4_cksum|qinq_insert|vxlan_tnl_tso|" "gre_tnl_tso|ipip_tnl_tso|geneve_tnl_tso|" "macsec_insert|mt_lockfree|multi_segs|mbuf_fast_free|" - "security|match_metadata on|off\n" + "security on|off\n" " Enable or disable a per port Tx offloading" " on all Tx queues of a port\n\n" @@ -895,6 +937,11 @@ static void cmd_help_long_parsed(void *parsed_result, "port config (port_id) tx_metadata (value)\n" " Set Tx metadata value per port. Testpmd will add this value" " to any Tx packet sent from this port\n\n" + + "port config (port_id) dynf (name) set|clear\n" + " Register a dynf and Set/clear this flag on Tx. " + "Testpmd will set this value to any Tx packet " + "sent from this port\n\n" ); } @@ -1053,7 +1100,7 @@ static void cmd_help_long_parsed(void *parsed_result, "get_hash_global_config (port_id)\n" " Get the global configurations of hash filters.\n\n" - "set_hash_global_config (port_id) (toeplitz|simple_xor|default)" + "set_hash_global_config (port_id) (toeplitz|simple_xor|symmetric_toeplitz|default)" " (ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|ipv6|" "ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|l2_payload)" " (enable|disable)\n" @@ -1113,6 +1160,28 @@ static void cmd_help_long_parsed(void *parsed_result, " Restrict ingress traffic to the defined" " flow rules\n\n" + "flow aged {port_id} [destroy]\n" + " List and destroy aged flows" + " flow rules\n\n" + + "flow shared_action {port_id} create" + " [action_id {shared_action_id}]" + " [ingress] [egress]" + " action {action} / end\n" + " Create shared action.\n\n" + + "flow shared_action {port_id} update" + " {shared_action_id} action {action} / end\n" + " Update shared action.\n\n" + + "flow shared_action {port_id} destroy" + " action_id {shared_action_id} [...]\n" + " Destroy specific shared actions.\n\n" + + "flow shared_action {port_id} query" + " {shared_action_id}\n" + " Query an existing shared action.\n\n" + "set vxlan ip-version (ipv4|ipv6) vni (vni) udp-src" " (udp-src) udp-dst (udp-dst) ip-src (ip-src) ip-dst" " (ip-dst) eth-src (eth-src) eth-dst (eth-dst)\n" @@ -1170,14 +1239,9 @@ static void cmd_help_long_parsed(void *parsed_result, "show port tm node stats (port_id) (node_id) (clear)\n" " Display the port TM node stats.\n\n" -#if defined RTE_LIBRTE_PMD_SOFTNIC && defined RTE_LIBRTE_SCHED - "set port tm hierarchy default (port_id)\n" - " Set default traffic Management hierarchy on a port\n\n" -#endif - "add port tm node shaper profile (port_id) (shaper_profile_id)" " (cmit_tb_rate) (cmit_tb_size) (peak_tb_rate) (peak_tb_size)" - " (packet_length_adjust)\n" + " (packet_length_adjust) (packet_mode)\n" " Add port tm node private shaper profile.\n\n" "del port tm node shaper profile (port_id) (shaper_profile_id)\n" @@ -1209,6 +1273,12 @@ static void cmd_help_long_parsed(void *parsed_result, " [(shared_shaper_id_0) (shared_shaper_id_1)...]\n" " Add port tm nonleaf node.\n\n" + "add port tm nonleaf node pktmode (port_id) (node_id) (parent_node_id)" + " (priority) (weight) (level_id) (shaper_profile_id)" + " (n_sp_priorities) (stats_mask) (n_shared_shapers)" + " [(shared_shaper_id_0) (shared_shaper_id_1)...]\n" + " Add port tm nonleaf node with pkt mode enabled.\n\n" + "add port tm leaf node (port_id) (node_id) (parent_node_id)" " (priority) (weight) (level_id) (shaper_profile_id)" " (cman_mode) (wred_profile_id) (stats_mask) (n_shared_shapers)" @@ -1292,8 +1362,8 @@ struct cmd_operate_port_result { }; static void cmd_operate_port_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_operate_port_result *res = parsed_result; @@ -1338,8 +1408,8 @@ struct cmd_operate_specific_port_result { }; static void cmd_operate_specific_port_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_operate_specific_port_result *res = parsed_result; @@ -1387,8 +1457,8 @@ struct cmd_set_port_setup_on_result { }; static void cmd_set_port_setup_on_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_port_setup_on_result *res = parsed_result; @@ -1434,12 +1504,12 @@ cmdline_parse_inst_t cmd_set_port_setup_on = { struct cmd_operate_attach_port_result { cmdline_fixed_string_t port; cmdline_fixed_string_t keyword; - cmdline_fixed_string_t identifier; + cmdline_multi_string_t identifier; }; static void cmd_operate_attach_port_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_operate_attach_port_result *res = parsed_result; @@ -1457,7 +1527,7 @@ cmdline_parse_token_string_t cmd_operate_attach_port_keyword = keyword, "attach"); cmdline_parse_token_string_t cmd_operate_attach_port_identifier = TOKEN_STRING_INITIALIZER(struct cmd_operate_attach_port_result, - identifier, NULL); + identifier, TOKEN_STRING_MULTI); cmdline_parse_inst_t cmd_operate_attach_port = { .f = cmd_operate_attach_port_parsed, @@ -1480,15 +1550,17 @@ struct cmd_operate_detach_port_result { }; static void cmd_operate_detach_port_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_operate_detach_port_result *res = parsed_result; - if (!strcmp(res->keyword, "detach")) + if (!strcmp(res->keyword, "detach")) { + RTE_ETH_VALID_PORTID_OR_RET(res->port_id); detach_port_device(res->port_id); - else + } else { printf("Unknown parameter\n"); + } } cmdline_parse_token_string_t cmd_operate_detach_port_port = @@ -1521,13 +1593,13 @@ struct cmd_operate_detach_device_result { }; static void cmd_operate_detach_device_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_operate_detach_device_result *res = parsed_result; if (!strcmp(res->keyword, "detach")) - detach_device(res->identifier); + detach_devargs(res->identifier); else printf("Unknown parameter\n"); } @@ -1605,6 +1677,8 @@ parse_and_check_speed_duplex(char *speedstr, char *duplexstr, uint32_t *speed) *speed = ETH_LINK_SPEED_50G; } else if (!strcmp(speedstr, "100000")) { *speed = ETH_LINK_SPEED_100G; + } else if (!strcmp(speedstr, "200000")) { + *speed = ETH_LINK_SPEED_200G; } else if (!strcmp(speedstr, "auto")) { *speed = ETH_LINK_SPEED_AUTONEG; } else { @@ -1618,8 +1692,8 @@ parse_and_check_speed_duplex(char *speedstr, char *duplexstr, uint32_t *speed) static void cmd_config_speed_all_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_speed_all *res = parsed_result; uint32_t link_speed; @@ -1652,7 +1726,7 @@ cmdline_parse_token_string_t cmd_config_speed_all_item1 = TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, item1, "speed"); cmdline_parse_token_string_t cmd_config_speed_all_value1 = TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, value1, - "10#100#1000#10000#25000#40000#50000#100000#auto"); + "10#100#1000#10000#25000#40000#50000#100000#200000#auto"); cmdline_parse_token_string_t cmd_config_speed_all_item2 = TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, item2, "duplex"); cmdline_parse_token_string_t cmd_config_speed_all_value2 = @@ -1663,7 +1737,7 @@ cmdline_parse_inst_t cmd_config_speed_all = { .f = cmd_config_speed_all_parsed, .data = NULL, .help_str = "port config all speed " - "10|100|1000|10000|25000|40000|50000|100000|auto duplex " + "10|100|1000|10000|25000|40000|50000|100000|200000|auto duplex " "half|full|auto", .tokens = { (void *)&cmd_config_speed_all_port, @@ -1690,8 +1764,8 @@ struct cmd_config_speed_specific { static void cmd_config_speed_specific_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_speed_specific *res = parsed_result; uint32_t link_speed; @@ -1727,7 +1801,7 @@ cmdline_parse_token_string_t cmd_config_speed_specific_item1 = "speed"); cmdline_parse_token_string_t cmd_config_speed_specific_value1 = TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, value1, - "10#100#1000#10000#25000#40000#50000#100000#auto"); + "10#100#1000#10000#25000#40000#50000#100000#200000#auto"); cmdline_parse_token_string_t cmd_config_speed_specific_item2 = TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, item2, "duplex"); @@ -1739,7 +1813,7 @@ cmdline_parse_inst_t cmd_config_speed_specific = { .f = cmd_config_speed_specific_parsed, .data = NULL, .help_str = "port config speed " - "10|100|1000|10000|25000|40000|50000|100000|auto duplex " + "10|100|1000|10000|25000|40000|50000|100000|200000|auto duplex " "half|full|auto", .tokens = { (void *)&cmd_config_speed_specific_port, @@ -1764,8 +1838,8 @@ struct cmd_config_loopback_all { static void cmd_config_loopback_all_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_loopback_all *res = parsed_result; portid_t pid; @@ -1820,8 +1894,8 @@ struct cmd_config_loopback_specific { static void cmd_config_loopback_specific_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_loopback_specific *res = parsed_result; @@ -1880,8 +1954,8 @@ struct cmd_config_rx_tx { static void cmd_config_rx_tx_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_rx_tx *res = parsed_result; @@ -1908,18 +1982,13 @@ cmd_config_rx_tx_parsed(void *parsed_result, nb_txq = res->value; } else if (!strcmp(res->name, "rxd")) { - if (res->value <= 0 || res->value > RTE_TEST_RX_DESC_MAX) { - printf("rxd %d invalid - must be > 0 && <= %d\n", - res->value, RTE_TEST_RX_DESC_MAX); + if (check_nb_rxd(res->value) != 0) return; - } nb_rxd = res->value; } else if (!strcmp(res->name, "txd")) { - if (res->value <= 0 || res->value > RTE_TEST_TX_DESC_MAX) { - printf("txd %d invalid - must be > 0 && <= %d\n", - res->value, RTE_TEST_TX_DESC_MAX); + if (check_nb_txd(res->value) != 0) return; - } + nb_txd = res->value; } else { printf("Unknown parameter\n"); @@ -1970,8 +2039,8 @@ struct cmd_config_max_pkt_len_result { static void cmd_config_max_pkt_len_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_max_pkt_len_result *res = parsed_result; portid_t pid; @@ -2041,6 +2110,78 @@ cmdline_parse_inst_t cmd_config_max_pkt_len = { }, }; +/* *** config max LRO aggregated packet size *** */ +struct cmd_config_max_lro_pkt_size_result { + cmdline_fixed_string_t port; + cmdline_fixed_string_t keyword; + cmdline_fixed_string_t all; + cmdline_fixed_string_t name; + uint32_t value; +}; + +static void +cmd_config_max_lro_pkt_size_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ + struct cmd_config_max_lro_pkt_size_result *res = parsed_result; + portid_t pid; + + if (!all_ports_stopped()) { + printf("Please stop all ports first\n"); + return; + } + + RTE_ETH_FOREACH_DEV(pid) { + struct rte_port *port = &ports[pid]; + + if (!strcmp(res->name, "max-lro-pkt-size")) { + if (res->value == + port->dev_conf.rxmode.max_lro_pkt_size) + return; + + port->dev_conf.rxmode.max_lro_pkt_size = res->value; + } else { + printf("Unknown parameter\n"); + return; + } + } + + init_port_config(); + + cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); +} + +cmdline_parse_token_string_t cmd_config_max_lro_pkt_size_port = + TOKEN_STRING_INITIALIZER(struct cmd_config_max_lro_pkt_size_result, + port, "port"); +cmdline_parse_token_string_t cmd_config_max_lro_pkt_size_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_config_max_lro_pkt_size_result, + keyword, "config"); +cmdline_parse_token_string_t cmd_config_max_lro_pkt_size_all = + TOKEN_STRING_INITIALIZER(struct cmd_config_max_lro_pkt_size_result, + all, "all"); +cmdline_parse_token_string_t cmd_config_max_lro_pkt_size_name = + TOKEN_STRING_INITIALIZER(struct cmd_config_max_lro_pkt_size_result, + name, "max-lro-pkt-size"); +cmdline_parse_token_num_t cmd_config_max_lro_pkt_size_value = + TOKEN_NUM_INITIALIZER(struct cmd_config_max_lro_pkt_size_result, + value, UINT32); + +cmdline_parse_inst_t cmd_config_max_lro_pkt_size = { + .f = cmd_config_max_lro_pkt_size_parsed, + .data = NULL, + .help_str = "port config all max-lro-pkt-size ", + .tokens = { + (void *)&cmd_config_max_lro_pkt_size_port, + (void *)&cmd_config_max_lro_pkt_size_keyword, + (void *)&cmd_config_max_lro_pkt_size_all, + (void *)&cmd_config_max_lro_pkt_size_name, + (void *)&cmd_config_max_lro_pkt_size_value, + NULL, + }, +}; + /* *** configure port MTU *** */ struct cmd_config_mtu_result { cmdline_fixed_string_t port; @@ -2052,8 +2193,8 @@ struct cmd_config_mtu_result { static void cmd_config_mtu_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_mtu_result *res = parsed_result; @@ -2103,8 +2244,8 @@ struct cmd_config_rx_mode_flag { static void cmd_config_rx_mode_flag_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_rx_mode_flag *res = parsed_result; @@ -2171,8 +2312,8 @@ struct cmd_config_rss { static void cmd_config_rss_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_rss *res = parsed_result; struct rte_eth_rss_conf rss_conf = { .rss_key_len = 0, }; @@ -2184,9 +2325,14 @@ cmd_config_rss_parsed(void *parsed_result, int ret; if (!strcmp(res->value, "all")) - rss_conf.rss_hf = ETH_RSS_IP | ETH_RSS_TCP | - ETH_RSS_UDP | ETH_RSS_SCTP | - ETH_RSS_L2_PAYLOAD; + rss_conf.rss_hf = ETH_RSS_ETH | ETH_RSS_VLAN | ETH_RSS_IP | + ETH_RSS_TCP | ETH_RSS_UDP | ETH_RSS_SCTP | + ETH_RSS_L2_PAYLOAD | ETH_RSS_L2TPV3 | ETH_RSS_ESP | + ETH_RSS_AH | ETH_RSS_PFCP | ETH_RSS_GTPU; + else if (!strcmp(res->value, "eth")) + rss_conf.rss_hf = ETH_RSS_ETH; + else if (!strcmp(res->value, "vlan")) + rss_conf.rss_hf = ETH_RSS_VLAN; else if (!strcmp(res->value, "ip")) rss_conf.rss_hf = ETH_RSS_IP; else if (!strcmp(res->value, "udp")) @@ -2205,9 +2351,54 @@ cmd_config_rss_parsed(void *parsed_result, rss_conf.rss_hf = ETH_RSS_GENEVE; else if (!strcmp(res->value, "nvgre")) rss_conf.rss_hf = ETH_RSS_NVGRE; + else if (!strcmp(res->value, "l3-pre32")) + rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE32; + else if (!strcmp(res->value, "l3-pre40")) + rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE40; + else if (!strcmp(res->value, "l3-pre48")) + rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE48; + else if (!strcmp(res->value, "l3-pre56")) + rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE56; + else if (!strcmp(res->value, "l3-pre64")) + rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE64; + else if (!strcmp(res->value, "l3-pre96")) + rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE96; + else if (!strcmp(res->value, "l3-src-only")) + rss_conf.rss_hf = ETH_RSS_L3_SRC_ONLY; + else if (!strcmp(res->value, "l3-dst-only")) + rss_conf.rss_hf = ETH_RSS_L3_DST_ONLY; + else if (!strcmp(res->value, "l4-src-only")) + rss_conf.rss_hf = ETH_RSS_L4_SRC_ONLY; + else if (!strcmp(res->value, "l4-dst-only")) + rss_conf.rss_hf = ETH_RSS_L4_DST_ONLY; + else if (!strcmp(res->value, "l2-src-only")) + rss_conf.rss_hf = ETH_RSS_L2_SRC_ONLY; + else if (!strcmp(res->value, "l2-dst-only")) + rss_conf.rss_hf = ETH_RSS_L2_DST_ONLY; + else if (!strcmp(res->value, "l2tpv3")) + rss_conf.rss_hf = ETH_RSS_L2TPV3; + else if (!strcmp(res->value, "esp")) + rss_conf.rss_hf = ETH_RSS_ESP; + else if (!strcmp(res->value, "ah")) + rss_conf.rss_hf = ETH_RSS_AH; + else if (!strcmp(res->value, "pfcp")) + rss_conf.rss_hf = ETH_RSS_PFCP; + else if (!strcmp(res->value, "pppoe")) + rss_conf.rss_hf = ETH_RSS_PPPOE; + else if (!strcmp(res->value, "gtpu")) + rss_conf.rss_hf = ETH_RSS_GTPU; else if (!strcmp(res->value, "none")) rss_conf.rss_hf = 0; - else if (!strcmp(res->value, "default")) + else if (!strcmp(res->value, "level-default")) { + rss_hf &= (~ETH_RSS_LEVEL_MASK); + rss_conf.rss_hf = (rss_hf | ETH_RSS_LEVEL_PMD_DEFAULT); + } else if (!strcmp(res->value, "level-outer")) { + rss_hf &= (~ETH_RSS_LEVEL_MASK); + rss_conf.rss_hf = (rss_hf | ETH_RSS_LEVEL_OUTERMOST); + } else if (!strcmp(res->value, "level-inner")) { + rss_hf &= (~ETH_RSS_LEVEL_MASK); + rss_conf.rss_hf = (rss_hf | ETH_RSS_LEVEL_INNERMOST); + } else if (!strcmp(res->value, "default")) use_default = 1; else if (isdigit(res->value[0]) && atoi(res->value) > 0 && atoi(res->value) < 64) @@ -2244,8 +2435,10 @@ cmd_config_rss_parsed(void *parsed_result, i, -diag, strerror(-diag)); } } - if (all_updated && !use_default) + if (all_updated && !use_default) { rss_hf = rss_conf.rss_hf; + printf("rss_hf %#"PRIx64"\n", rss_hf); + } } cmdline_parse_token_string_t cmd_config_rss_port = @@ -2263,7 +2456,9 @@ cmdline_parse_inst_t cmd_config_rss = { .f = cmd_config_rss_parsed, .data = NULL, .help_str = "port config all rss " - "all|default|ip|tcp|udp|sctp|ether|port|vxlan|geneve|nvgre|vxlan-gpe|none|", + "all|default|eth|vlan|ip|tcp|udp|sctp|ether|port|vxlan|geneve|" + "nvgre|vxlan-gpe|l2tpv3|esp|ah|pfcp|none|level-default|" + "level-outer|level-inner|", .tokens = { (void *)&cmd_config_rss_port, (void *)&cmd_config_rss_keyword, @@ -2311,8 +2506,8 @@ parse_and_check_key_hexa_digit(char *key, int idx) static void cmd_config_rss_hash_key_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_rss_hash_key *res = parsed_result; uint8_t hash_key[RSS_HASH_KEY_LENGTH]; @@ -2372,7 +2567,10 @@ cmdline_parse_token_string_t cmd_config_rss_hash_key_rss_type = "ipv4#ipv4-frag#ipv4-tcp#ipv4-udp#ipv4-sctp#" "ipv4-other#ipv6#ipv6-frag#ipv6-tcp#ipv6-udp#" "ipv6-sctp#ipv6-other#l2-payload#ipv6-ex#" - "ipv6-tcp-ex#ipv6-udp-ex"); + "ipv6-tcp-ex#ipv6-udp-ex#" + "l3-src-only#l3-dst-only#l4-src-only#l4-dst-only#" + "l2-src-only#l2-dst-only#s-vlan#c-vlan#" + "l2tpv3#esp#ah#pfcp#pppoe#gtpu"); cmdline_parse_token_string_t cmd_config_rss_hash_key_value = TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, key, NULL); @@ -2382,7 +2580,10 @@ cmdline_parse_inst_t cmd_config_rss_hash_key = { .help_str = "port config rss-hash-key " "ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|" "ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|" - "l2-payload|ipv6-ex|ipv6-tcp-ex|ipv6-udp-ex " + "l2-payload|ipv6-ex|ipv6-tcp-ex|ipv6-udp-ex|" + "l3-src-only|l3-dst-only|l4-src-only|l4-dst-only|" + "l2-src-only|l2-dst-only|s-vlan|c-vlan|" + "l2tpv3|esp|ah|pfcp|pppoe|gtpu " "", .tokens = { (void *)&cmd_config_rss_hash_key_port, @@ -2408,8 +2609,8 @@ struct cmd_config_rxtx_ring_size { static void cmd_config_rxtx_ring_size_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_rxtx_ring_size *res = parsed_result; struct rte_port *port; @@ -2502,8 +2703,8 @@ struct cmd_config_rxtx_queue { static void cmd_config_rxtx_queue_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_rxtx_queue *res = parsed_result; uint8_t isrx; @@ -2597,8 +2798,8 @@ struct cmd_config_deferred_start_rxtx_queue { static void cmd_config_deferred_start_rxtx_queue_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_deferred_start_rxtx_queue *res = parsed_result; struct rte_port *port; @@ -2695,8 +2896,8 @@ cmdline_parse_token_string_t cmd_setup_rxtx_queue_setup = static void cmd_setup_rxtx_queue_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_setup_rxtx_queue *res = parsed_result; struct rte_port *port; @@ -2736,7 +2937,7 @@ cmd_setup_rxtx_queue_parsed( if (!numa_support || socket_id == NUMA_NO_CONFIG) socket_id = port->socket_id; - mp = mbuf_pool_find(socket_id); + mp = mbuf_pool_find(socket_id, 0); if (mp == NULL) { printf("Failed to setup RX queue: " "No mempool allocation" @@ -2744,12 +2945,12 @@ cmd_setup_rxtx_queue_parsed( rxring_numa[res->portid]); return; } - ret = rte_eth_rx_queue_setup(res->portid, - res->qid, - port->nb_rx_desc[res->qid], - socket_id, - &port->rx_conf[res->qid], - mp); + ret = rx_queue_setup(res->portid, + res->qid, + port->nb_rx_desc[res->qid], + socket_id, + &port->rx_conf[res->qid], + mp); if (ret) printf("Failed to setup RX queue\n"); } else { @@ -2851,8 +3052,8 @@ parse_reta_config(const char *str, static void cmd_set_rss_reta_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { int ret; struct rte_eth_dev_info dev_info; @@ -2973,8 +3174,8 @@ showport_parse_reta_config(struct rte_eth_rss_reta_entry64 *conf, static void cmd_showport_reta_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_showport_reta *res = parsed_result; struct rte_eth_rss_reta_entry64 reta_conf[8]; @@ -3046,7 +3247,7 @@ struct cmd_showport_rss_hash { }; static void cmd_showport_rss_hash_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, + __rte_unused struct cmdline *cl, void *show_rss_key) { struct cmd_showport_rss_hash *res = parsed_result; @@ -3108,8 +3309,8 @@ struct cmd_config_dcb { static void cmd_config_dcb_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_dcb *res = parsed_result; portid_t port_id = res->port_id; @@ -3206,8 +3407,8 @@ struct cmd_config_burst { static void cmd_config_burst_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_burst *res = parsed_result; struct rte_eth_dev_info dev_info; @@ -3297,8 +3498,8 @@ struct cmd_config_thresh { static void cmd_config_thresh_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_thresh *res = parsed_result; @@ -3366,8 +3567,8 @@ struct cmd_config_threshold { static void cmd_config_threshold_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_threshold *res = parsed_result; @@ -3424,9 +3625,9 @@ struct cmd_stop_result { cmdline_fixed_string_t stop; }; -static void cmd_stop_parsed(__attribute__((unused)) void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) +static void cmd_stop_parsed(__rte_unused void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) { stop_packet_forwarding(); } @@ -3517,8 +3718,8 @@ struct cmd_set_list_result { }; static void cmd_set_list_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_list_result *res; union { @@ -3585,8 +3786,8 @@ struct cmd_setmask_result { }; static void cmd_set_mask_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_setmask_result *res = parsed_result; @@ -3633,8 +3834,8 @@ struct cmd_set_result { }; static void cmd_set_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_result *res = parsed_result; if (!strcmp(res->what, "nbport")) { @@ -3680,8 +3881,8 @@ struct cmd_set_log_result { static void cmd_set_log_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_log_result *res; int ret; @@ -3718,6 +3919,98 @@ cmdline_parse_inst_t cmd_set_log = { }, }; +/* *** SET SEGMENT OFFSETS OF RX PACKETS SPLIT *** */ + +struct cmd_set_rxoffs_result { + cmdline_fixed_string_t cmd_keyword; + cmdline_fixed_string_t rxoffs; + cmdline_fixed_string_t seg_offsets; +}; + +static void +cmd_set_rxoffs_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ + struct cmd_set_rxoffs_result *res; + unsigned int seg_offsets[MAX_SEGS_BUFFER_SPLIT]; + unsigned int nb_segs; + + res = parsed_result; + nb_segs = parse_item_list(res->seg_offsets, "segment offsets", + MAX_SEGS_BUFFER_SPLIT, seg_offsets, 0); + if (nb_segs > 0) + set_rx_pkt_offsets(seg_offsets, nb_segs); +} + +cmdline_parse_token_string_t cmd_set_rxoffs_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_set_rxoffs_result, + cmd_keyword, "set"); +cmdline_parse_token_string_t cmd_set_rxoffs_name = + TOKEN_STRING_INITIALIZER(struct cmd_set_rxoffs_result, + rxoffs, "rxoffs"); +cmdline_parse_token_string_t cmd_set_rxoffs_offsets = + TOKEN_STRING_INITIALIZER(struct cmd_set_rxoffs_result, + seg_offsets, NULL); + +cmdline_parse_inst_t cmd_set_rxoffs = { + .f = cmd_set_rxoffs_parsed, + .data = NULL, + .help_str = "set rxoffs ", + .tokens = { + (void *)&cmd_set_rxoffs_keyword, + (void *)&cmd_set_rxoffs_name, + (void *)&cmd_set_rxoffs_offsets, + NULL, + }, +}; + +/* *** SET SEGMENT LENGTHS OF RX PACKETS SPLIT *** */ + +struct cmd_set_rxpkts_result { + cmdline_fixed_string_t cmd_keyword; + cmdline_fixed_string_t rxpkts; + cmdline_fixed_string_t seg_lengths; +}; + +static void +cmd_set_rxpkts_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ + struct cmd_set_rxpkts_result *res; + unsigned int seg_lengths[MAX_SEGS_BUFFER_SPLIT]; + unsigned int nb_segs; + + res = parsed_result; + nb_segs = parse_item_list(res->seg_lengths, "segment lengths", + MAX_SEGS_BUFFER_SPLIT, seg_lengths, 0); + if (nb_segs > 0) + set_rx_pkt_segments(seg_lengths, nb_segs); +} + +cmdline_parse_token_string_t cmd_set_rxpkts_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_set_rxpkts_result, + cmd_keyword, "set"); +cmdline_parse_token_string_t cmd_set_rxpkts_name = + TOKEN_STRING_INITIALIZER(struct cmd_set_rxpkts_result, + rxpkts, "rxpkts"); +cmdline_parse_token_string_t cmd_set_rxpkts_lengths = + TOKEN_STRING_INITIALIZER(struct cmd_set_rxpkts_result, + seg_lengths, NULL); + +cmdline_parse_inst_t cmd_set_rxpkts = { + .f = cmd_set_rxpkts_parsed, + .data = NULL, + .help_str = "set rxpkts ", + .tokens = { + (void *)&cmd_set_rxpkts_keyword, + (void *)&cmd_set_rxpkts_name, + (void *)&cmd_set_rxpkts_lengths, + NULL, + }, +}; + /* *** SET SEGMENT LENGTHS OF TXONLY PACKETS *** */ struct cmd_set_txpkts_result { @@ -3728,8 +4021,8 @@ struct cmd_set_txpkts_result { static void cmd_set_txpkts_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_txpkts_result *res; unsigned seg_lengths[RTE_MAX_SEGS_PER_PKT]; @@ -3774,8 +4067,8 @@ struct cmd_set_txsplit_result { static void cmd_set_txsplit_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_txsplit_result *res; @@ -3805,6 +4098,52 @@ cmdline_parse_inst_t cmd_set_txsplit = { }, }; +/* *** SET TIMES FOR TXONLY PACKETS SCHEDULING ON TIMESTAMPS *** */ + +struct cmd_set_txtimes_result { + cmdline_fixed_string_t cmd_keyword; + cmdline_fixed_string_t txtimes; + cmdline_fixed_string_t tx_times; +}; + +static void +cmd_set_txtimes_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ + struct cmd_set_txtimes_result *res; + unsigned int tx_times[2] = {0, 0}; + unsigned int n_times; + + res = parsed_result; + n_times = parse_item_list(res->tx_times, "tx times", + 2, tx_times, 0); + if (n_times == 2) + set_tx_pkt_times(tx_times); +} + +cmdline_parse_token_string_t cmd_set_txtimes_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_set_txtimes_result, + cmd_keyword, "set"); +cmdline_parse_token_string_t cmd_set_txtimes_name = + TOKEN_STRING_INITIALIZER(struct cmd_set_txtimes_result, + txtimes, "txtimes"); +cmdline_parse_token_string_t cmd_set_txtimes_value = + TOKEN_STRING_INITIALIZER(struct cmd_set_txtimes_result, + tx_times, NULL); + +cmdline_parse_inst_t cmd_set_txtimes = { + .f = cmd_set_txtimes_parsed, + .data = NULL, + .help_str = "set txtimes ,", + .tokens = { + (void *)&cmd_set_txtimes_keyword, + (void *)&cmd_set_txtimes_name, + (void *)&cmd_set_txtimes_value, + NULL, + }, +}; + /* *** ADD/REMOVE ALL VLAN IDENTIFIERS TO/FROM A PORT VLAN RX FILTER *** */ struct cmd_rx_vlan_filter_all_result { cmdline_fixed_string_t rx_vlan; @@ -3815,8 +4154,8 @@ struct cmd_rx_vlan_filter_all_result { static void cmd_rx_vlan_filter_all_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_rx_vlan_filter_all_result *res = parsed_result; @@ -3866,8 +4205,8 @@ struct cmd_vlan_offload_result { static void cmd_vlan_offload_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { int on; struct cmd_vlan_offload_result *res = parsed_result; @@ -3918,6 +4257,8 @@ cmd_vlan_offload_parsed(void *parsed_result, } else if (!strcmp(res->what, "filter")) rx_vlan_filter_set(port_id, on); + else if (!strcmp(res->what, "qinq_strip")) + rx_vlan_qinq_strip_set(port_id, on); else vlan_extend_set(port_id, on); @@ -3932,7 +4273,7 @@ cmdline_parse_token_string_t cmd_vlan_offload_set = set, "set"); cmdline_parse_token_string_t cmd_vlan_offload_what = TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result, - what, "strip#filter#qinq#stripq"); + what, "strip#filter#qinq_strip#extend#stripq"); cmdline_parse_token_string_t cmd_vlan_offload_on = TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result, on, "on#off"); @@ -3943,9 +4284,9 @@ cmdline_parse_token_string_t cmd_vlan_offload_portid = cmdline_parse_inst_t cmd_vlan_offload = { .f = cmd_vlan_offload_parsed, .data = NULL, - .help_str = "vlan set strip|filter|qinq|stripq on|off " + .help_str = "vlan set strip|filter|qinq_strip|extend|stripq on|off " ": " - "Filter/Strip for rx side qinq(extended) for both rx/tx sides", + "Strip/Filter/QinQ for rx side Extend for both rx/tx sides", .tokens = { (void *)&cmd_vlan_offload_vlan, (void *)&cmd_vlan_offload_set, @@ -3968,8 +4309,8 @@ struct cmd_vlan_tpid_result { static void cmd_vlan_tpid_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_vlan_tpid_result *res = parsed_result; enum rte_vlan_type vlan_type; @@ -4030,8 +4371,8 @@ struct cmd_rx_vlan_filter_result { static void cmd_rx_vlan_filter_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_rx_vlan_filter_result *res = parsed_result; @@ -4079,11 +4420,14 @@ struct cmd_tx_vlan_set_result { static void cmd_tx_vlan_set_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_tx_vlan_set_result *res = parsed_result; + if (port_id_is_invalid(res->port_id, ENABLED_WARN)) + return; + if (!port_is_stopped(res->port_id)) { printf("Please stop port %d first\n", res->port_id); return; @@ -4133,11 +4477,14 @@ struct cmd_tx_vlan_set_qinq_result { static void cmd_tx_vlan_set_qinq_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_tx_vlan_set_qinq_result *res = parsed_result; + if (port_id_is_invalid(res->port_id, ENABLED_WARN)) + return; + if (!port_is_stopped(res->port_id)) { printf("Please stop port %d first\n", res->port_id); return; @@ -4192,8 +4539,8 @@ struct cmd_tx_vlan_set_pvid_result { static void cmd_tx_vlan_set_pvid_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_tx_vlan_set_pvid_result *res = parsed_result; @@ -4246,11 +4593,14 @@ struct cmd_tx_vlan_reset_result { static void cmd_tx_vlan_reset_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_tx_vlan_reset_result *res = parsed_result; + if (port_id_is_invalid(res->port_id, ENABLED_WARN)) + return; + if (!port_is_stopped(res->port_id)) { printf("Please stop port %d first\n", res->port_id); return; @@ -4368,8 +4718,8 @@ cmd_config_queue_tx_offloads(struct rte_port *port) static void cmd_csum_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_csum_result *res = parsed_result; int hw = 0; @@ -4519,8 +4869,8 @@ struct cmd_csum_tunnel_result { static void cmd_csum_tunnel_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_csum_tunnel_result *res = parsed_result; @@ -4572,8 +4922,8 @@ struct cmd_tso_set_result { static void cmd_tso_set_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_tso_set_result *res = parsed_result; struct rte_eth_dev_info dev_info; @@ -4711,8 +5061,8 @@ check_tunnel_tso_nic_support(portid_t port_id) static void cmd_tunnel_tso_set_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_tunnel_tso_set_result *res = parsed_result; struct rte_eth_dev_info dev_info; @@ -4832,8 +5182,8 @@ struct cmd_gro_enable_result { static void cmd_gro_enable_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_gro_enable_result *res; @@ -4882,8 +5232,8 @@ struct cmd_gro_show_result { static void cmd_gro_show_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_gro_show_result *res; @@ -4928,8 +5278,8 @@ struct cmd_gro_flush_result { static void cmd_gro_flush_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_gro_flush_result *res; @@ -4976,8 +5326,8 @@ struct cmd_gso_enable_result { static void cmd_gso_enable_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_gso_enable_result *res; @@ -5026,14 +5376,14 @@ struct cmd_gso_size_result { static void cmd_gso_size_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_gso_size_result *res = parsed_result; if (test_done == 0) { printf("Before setting GSO segsz, please first" - " stop fowarding\n"); + " stop forwarding\n"); return; } @@ -5084,8 +5434,8 @@ struct cmd_gso_show_result { static void cmd_gso_show_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_gso_show_result *res = parsed_result; @@ -5141,8 +5491,8 @@ struct cmd_set_flush_rx { static void cmd_set_flush_rx_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_flush_rx *res = parsed_result; no_flush_rx = (uint8_t)((strcmp(res->mode, "on") == 0) ? 0 : 1); @@ -5180,8 +5530,8 @@ struct cmd_set_link_check { static void cmd_set_link_check_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_link_check *res = parsed_result; no_link_check = (uint8_t)((strcmp(res->mode, "on") == 0) ? 0 : 1); @@ -5222,8 +5572,8 @@ struct cmd_set_bypass_mode_result { static void cmd_set_bypass_mode_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_bypass_mode_result *res = parsed_result; portid_t port_id = res->port_id; @@ -5290,8 +5640,8 @@ struct cmd_set_bypass_event_result { static void cmd_set_bypass_event_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { int32_t rc = -EINVAL; struct cmd_set_bypass_event_result *res = parsed_result; @@ -5397,8 +5747,8 @@ struct cmd_set_bypass_timeout_result { static void cmd_set_bypass_timeout_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { __rte_unused struct cmd_set_bypass_timeout_result *res = parsed_result; @@ -5459,8 +5809,8 @@ struct cmd_show_bypass_config_result { static void cmd_show_bypass_config_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_show_bypass_config_result *res = parsed_result; portid_t port_id = res->port_id; @@ -5469,7 +5819,7 @@ cmd_show_bypass_config_parsed(void *parsed_result, uint32_t event_mode; uint32_t bypass_mode; uint32_t timeout = bypass_timeout; - int i; + unsigned int i; static const char * const timeouts[RTE_PMD_IXGBE_BYPASS_TMT_NUM] = {"off", "1.5", "2", "3", "4", "8", "16", "32"}; @@ -5482,7 +5832,6 @@ cmd_show_bypass_config_parsed(void *parsed_result, "OS/board off", "power supply off", "timeout"}; - int num_events = (sizeof events) / (sizeof events[0]); /* Display the bypass mode.*/ if (rte_pmd_ixgbe_bypass_state_show(port_id, &bypass_mode) != 0) { @@ -5503,7 +5852,7 @@ cmd_show_bypass_config_parsed(void *parsed_result, printf("\tbypass timeout = %s\n", timeouts[timeout]); /* Display the bypass events and associated modes. */ - for (i = RTE_PMD_IXGBE_BYPASS_EVENT_START; i < num_events; i++) { + for (i = RTE_PMD_IXGBE_BYPASS_EVENT_START; i < RTE_DIM(events); i++) { if (rte_pmd_ixgbe_bypass_event_show(port_id, i, &event_mode)) { printf("\tFailed to get bypass mode for event = %s\n", @@ -5560,8 +5909,8 @@ struct cmd_set_bonding_mode_result { }; static void cmd_set_bonding_mode_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_bonding_mode_result *res = parsed_result; portid_t port_id = res->port_id; @@ -5613,8 +5962,8 @@ struct cmd_set_bonding_lacp_dedicated_queues_result { }; static void cmd_set_bonding_lacp_dedicated_queues_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_bonding_lacp_dedicated_queues_result *res = parsed_result; portid_t port_id = res->port_id; @@ -5691,8 +6040,8 @@ struct cmd_set_bonding_balance_xmit_policy_result { }; static void cmd_set_bonding_balance_xmit_policy_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_bonding_balance_xmit_policy_result *res = parsed_result; portid_t port_id = res->port_id; @@ -5757,8 +6106,8 @@ struct cmd_show_bonding_config_result { }; static void cmd_show_bonding_config_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_show_bonding_config_result *res = parsed_result; int bonding_mode, agg_mode; @@ -5901,8 +6250,8 @@ struct cmd_set_bonding_primary_result { }; static void cmd_set_bonding_primary_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_bonding_primary_result *res = parsed_result; portid_t master_port_id = res->port_id; @@ -5958,8 +6307,8 @@ struct cmd_add_bonding_slave_result { }; static void cmd_add_bonding_slave_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_add_bonding_slave_result *res = parsed_result; portid_t master_port_id = res->port_id; @@ -6016,8 +6365,8 @@ struct cmd_remove_bonding_slave_result { }; static void cmd_remove_bonding_slave_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_remove_bonding_slave_result *res = parsed_result; portid_t master_port_id = res->port_id; @@ -6076,8 +6425,8 @@ struct cmd_create_bonded_device_result { static int bond_dev_num = 0; static void cmd_create_bonded_device_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_create_bonded_device_result *res = parsed_result; char ethdev_name[RTE_ETH_NAME_MAX_LEN]; @@ -6156,8 +6505,8 @@ struct cmd_set_bond_mac_addr_result { }; static void cmd_set_bond_mac_addr_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_bond_mac_addr_result *res = parsed_result; int ret; @@ -6211,8 +6560,8 @@ struct cmd_set_bond_mon_period_result { }; static void cmd_set_bond_mon_period_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_bond_mon_period_result *res = parsed_result; int ret; @@ -6267,8 +6616,8 @@ struct cmd_set_bonding_agg_mode_policy_result { static void cmd_set_bonding_agg_mode(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_bonding_agg_mode_policy_result *res = parsed_result; uint8_t policy = AGG_BANDWIDTH; @@ -6329,8 +6678,8 @@ struct cmd_set_fwd_mode_result { }; static void cmd_set_fwd_mode_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_fwd_mode_result *res = parsed_result; @@ -6389,8 +6738,8 @@ struct cmd_set_fwd_retry_mode_result { }; static void cmd_set_fwd_retry_mode_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_fwd_retry_mode_result *res = parsed_result; @@ -6460,8 +6809,8 @@ struct cmd_set_burst_tx_retry_result { }; static void cmd_set_burst_tx_retry_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_burst_tx_retry_result *res = parsed_result; @@ -6516,7 +6865,7 @@ struct cmd_set_promisc_mode_result { }; static void cmd_set_promisc_mode_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, + __rte_unused struct cmdline *cl, void *allports) { struct cmd_set_promisc_mode_result *res = parsed_result; @@ -6588,7 +6937,7 @@ struct cmd_set_allmulti_mode_result { }; static void cmd_set_allmulti_mode_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, + __rte_unused struct cmdline *cl, void *allports) { struct cmd_set_allmulti_mode_result *res = parsed_result; @@ -6603,17 +6952,11 @@ static void cmd_set_allmulti_mode_parsed(void *parsed_result, /* all ports */ if (allports) { RTE_ETH_FOREACH_DEV(i) { - if (enable) - rte_eth_allmulticast_enable(i); - else - rte_eth_allmulticast_disable(i); + eth_set_allmulticast_mode(i, enable); } } else { - if (enable) - rte_eth_allmulticast_enable(res->port_num); - else - rte_eth_allmulticast_disable(res->port_num); + eth_set_allmulticast_mode(res->port_num, enable); } } @@ -6893,7 +7236,7 @@ cmdline_parse_inst_t cmd_link_flow_control_set_autoneg = { static void cmd_link_flow_ctrl_set_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, + __rte_unused struct cmdline *cl, void *data) { struct cmd_link_flow_ctrl_set_result *res = parsed_result; @@ -6982,8 +7325,8 @@ struct cmd_priority_flow_ctrl_set_result { static void cmd_priority_flow_ctrl_set_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_priority_flow_ctrl_set_result *res = parsed_result; struct rte_eth_pfc_conf pfc_conf; @@ -6997,9 +7340,10 @@ cmd_priority_flow_ctrl_set_parsed(void *parsed_result, * the RTE_FC_RX_PAUSE, Respond to the pause frame at the Tx side. */ static enum rte_eth_fc_mode rx_tx_onoff_2_pfc_mode[2][2] = { - {RTE_FC_NONE, RTE_FC_RX_PAUSE}, {RTE_FC_TX_PAUSE, RTE_FC_FULL} + {RTE_FC_NONE, RTE_FC_TX_PAUSE}, {RTE_FC_RX_PAUSE, RTE_FC_FULL} }; + memset(&pfc_conf, 0, sizeof(struct rte_eth_pfc_conf)); rx_fc_enable = (!strncmp(res->rx_pfc_mode, "on",2)) ? 1 : 0; tx_fc_enable = (!strncmp(res->tx_pfc_mode, "on",2)) ? 1 : 0; pfc_conf.fc.mode = rx_tx_onoff_2_pfc_mode[rx_fc_enable][tx_fc_enable]; @@ -7075,9 +7419,9 @@ struct cmd_reset_result { cmdline_fixed_string_t def; }; -static void cmd_reset_parsed(__attribute__((unused)) void *parsed_result, +static void cmd_reset_parsed(__rte_unused void *parsed_result, struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused void *data) { cmdline_printf(cl, "Reset to default forwarding configuration...\n"); set_def_fwd_config(); @@ -7108,9 +7452,9 @@ struct cmd_start_result { cmdline_parse_token_string_t cmd_start_start = TOKEN_STRING_INITIALIZER(struct cmd_start_result, start, "start"); -static void cmd_start_parsed(__attribute__((unused)) void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) +static void cmd_start_parsed(__rte_unused void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) { start_packet_forwarding(0); } @@ -7132,9 +7476,9 @@ struct cmd_start_tx_first_result { }; static void -cmd_start_tx_first_parsed(__attribute__((unused)) void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) +cmd_start_tx_first_parsed(__rte_unused void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) { start_packet_forwarding(1); } @@ -7167,8 +7511,8 @@ struct cmd_start_tx_first_n_result { static void cmd_start_tx_first_n_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_start_tx_first_n_result *res = parsed_result; @@ -7216,9 +7560,9 @@ cmdline_parse_token_string_t cmd_set_link_up_port = cmdline_parse_token_num_t cmd_set_link_up_port_id = TOKEN_NUM_INITIALIZER(struct cmd_set_link_up_result, port_id, UINT16); -static void cmd_set_link_up_parsed(__attribute__((unused)) void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) +static void cmd_set_link_up_parsed(__rte_unused void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_link_up_result *res = parsed_result; dev_set_link_up(res->port_id); @@ -7256,9 +7600,9 @@ cmdline_parse_token_num_t cmd_set_link_down_port_id = TOKEN_NUM_INITIALIZER(struct cmd_set_link_down_result, port_id, UINT16); static void cmd_set_link_down_parsed( - __attribute__((unused)) void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_link_down_result *res = parsed_result; dev_set_link_down(res->port_id); @@ -7285,8 +7629,8 @@ struct cmd_showcfg_result { }; static void cmd_showcfg_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_showcfg_result *res = parsed_result; if (!strcmp(res->what, "rxtx")) @@ -7295,8 +7639,14 @@ static void cmd_showcfg_parsed(void *parsed_result, fwd_lcores_config_display(); else if (!strcmp(res->what, "fwd")) pkt_fwd_config_display(&cur_fwd_config); + else if (!strcmp(res->what, "rxoffs")) + show_rx_pkt_offsets(); + else if (!strcmp(res->what, "rxpkts")) + show_rx_pkt_segments(); else if (!strcmp(res->what, "txpkts")) show_tx_pkt_segments(); + else if (!strcmp(res->what, "txtimes")) + show_tx_pkt_times(); } cmdline_parse_token_string_t cmd_showcfg_show = @@ -7305,12 +7655,12 @@ cmdline_parse_token_string_t cmd_showcfg_port = TOKEN_STRING_INITIALIZER(struct cmd_showcfg_result, cfg, "config"); cmdline_parse_token_string_t cmd_showcfg_what = TOKEN_STRING_INITIALIZER(struct cmd_showcfg_result, what, - "rxtx#cores#fwd#txpkts"); + "rxtx#cores#fwd#rxoffs#rxpkts#txpkts#txtimes"); cmdline_parse_inst_t cmd_showcfg = { .f = cmd_showcfg_parsed, .data = NULL, - .help_str = "show config rxtx|cores|fwd|txpkts", + .help_str = "show config rxtx|cores|fwd|rxoffs|rxpkts|txpkts|txtimes", .tokens = { (void *)&cmd_showcfg_show, (void *)&cmd_showcfg_port, @@ -7328,8 +7678,8 @@ struct cmd_showportall_result { }; static void cmd_showportall_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { portid_t i; @@ -7402,8 +7752,8 @@ struct cmd_showport_result { }; static void cmd_showport_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_showport_result *res = parsed_result; if (!strcmp(res->show, "clear")) { @@ -7466,8 +7816,8 @@ struct cmd_showdevice_result { }; static void cmd_showdevice_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_showdevice_result *res = parsed_result; if (!strcmp(res->what, "info")) { @@ -7502,6 +7852,51 @@ cmdline_parse_inst_t cmd_showdevice = { NULL, }, }; + +/* *** SHOW MODULE EEPROM/EEPROM port INFO *** */ +struct cmd_showeeprom_result { + cmdline_fixed_string_t show; + cmdline_fixed_string_t port; + uint16_t portnum; + cmdline_fixed_string_t type; +}; + +static void cmd_showeeprom_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ + struct cmd_showeeprom_result *res = parsed_result; + + if (!strcmp(res->type, "eeprom")) + port_eeprom_display(res->portnum); + else if (!strcmp(res->type, "module_eeprom")) + port_module_eeprom_display(res->portnum); + else + printf("Unknown argument\n"); +} + +cmdline_parse_token_string_t cmd_showeeprom_show = + TOKEN_STRING_INITIALIZER(struct cmd_showeeprom_result, show, "show"); +cmdline_parse_token_string_t cmd_showeeprom_port = + TOKEN_STRING_INITIALIZER(struct cmd_showeeprom_result, port, "port"); +cmdline_parse_token_num_t cmd_showeeprom_portnum = + TOKEN_NUM_INITIALIZER(struct cmd_showeeprom_result, portnum, UINT16); +cmdline_parse_token_string_t cmd_showeeprom_type = + TOKEN_STRING_INITIALIZER(struct cmd_showeeprom_result, type, "module_eeprom#eeprom"); + +cmdline_parse_inst_t cmd_showeeprom = { + .f = cmd_showeeprom_parsed, + .data = NULL, + .help_str = "show port module_eeprom|eeprom", + .tokens = { + (void *)&cmd_showeeprom_show, + (void *)&cmd_showeeprom_port, + (void *)&cmd_showeeprom_portnum, + (void *)&cmd_showeeprom_type, + NULL, + }, +}; + /* *** SHOW QUEUE INFO *** */ struct cmd_showqueue_result { cmdline_fixed_string_t show; @@ -7513,8 +7908,8 @@ struct cmd_showqueue_result { static void cmd_showqueue_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_showqueue_result *res = parsed_result; @@ -7602,8 +7997,8 @@ struct cmd_read_reg_result { static void cmd_read_reg_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_read_reg_result *res = parsed_result; port_reg_display(res->port_id, res->reg_off); @@ -7643,8 +8038,8 @@ struct cmd_read_reg_bit_field_result { static void cmd_read_reg_bit_field_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_read_reg_bit_field_result *res = parsed_result; port_reg_bit_field_display(res->port_id, res->reg_off, @@ -7697,8 +8092,8 @@ struct cmd_read_reg_bit_result { static void cmd_read_reg_bit_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_read_reg_bit_result *res = parsed_result; port_reg_bit_display(res->port_id, res->reg_off, res->bit_pos); @@ -7741,8 +8136,8 @@ struct cmd_write_reg_result { static void cmd_write_reg_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_write_reg_result *res = parsed_result; port_reg_set(res->port_id, res->reg_off, res->value); @@ -7786,8 +8181,8 @@ struct cmd_write_reg_bit_field_result { static void cmd_write_reg_bit_field_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_write_reg_bit_field_result *res = parsed_result; port_reg_bit_field_set(res->port_id, res->reg_off, @@ -7846,8 +8241,8 @@ struct cmd_write_reg_bit_result { static void cmd_write_reg_bit_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_write_reg_bit_result *res = parsed_result; port_reg_bit_set(res->port_id, res->reg_off, res->bit_pos, res->value); @@ -7895,8 +8290,8 @@ struct cmd_read_rxd_txd_result { static void cmd_read_rxd_txd_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_read_rxd_txd_result *res = parsed_result; @@ -7937,9 +8332,9 @@ struct cmd_quit_result { cmdline_fixed_string_t quit; }; -static void cmd_quit_parsed(__attribute__((unused)) void *parsed_result, +static void cmd_quit_parsed(__rte_unused void *parsed_result, struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused void *data) { cmdline_quit(cl); } @@ -7966,8 +8361,8 @@ struct cmd_mac_addr_result { }; static void cmd_mac_addr_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_mac_addr_result *res = parsed_result; int ret; @@ -8021,8 +8416,8 @@ struct cmd_eth_peer_result { }; static void cmd_set_eth_peer_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_eth_peer_result *res = parsed_result; @@ -8069,8 +8464,8 @@ struct cmd_set_qmap_result { static void cmd_set_qmap_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_qmap_result *res = parsed_result; int is_rx = (strcmp(res->what, "tx") == 0) ? 0 : 1; @@ -8122,8 +8517,8 @@ struct cmd_set_xstats_hide_zero_result { static void cmd_set_xstats_hide_zero_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_xstats_hide_zero_result *res; uint16_t on_off = 0; @@ -8155,6 +8550,90 @@ cmdline_parse_inst_t cmd_set_xstats_hide_zero = { }, }; +/* *** SET OPTION TO ENABLE MEASUREMENT OF CPU CYCLES *** */ +struct cmd_set_record_core_cycles_result { + cmdline_fixed_string_t keyword; + cmdline_fixed_string_t name; + cmdline_fixed_string_t on_off; +}; + +static void +cmd_set_record_core_cycles_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ + struct cmd_set_record_core_cycles_result *res; + uint16_t on_off = 0; + + res = parsed_result; + on_off = !strcmp(res->on_off, "on") ? 1 : 0; + set_record_core_cycles(on_off); +} + +cmdline_parse_token_string_t cmd_set_record_core_cycles_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_set_record_core_cycles_result, + keyword, "set"); +cmdline_parse_token_string_t cmd_set_record_core_cycles_name = + TOKEN_STRING_INITIALIZER(struct cmd_set_record_core_cycles_result, + name, "record-core-cycles"); +cmdline_parse_token_string_t cmd_set_record_core_cycles_on_off = + TOKEN_STRING_INITIALIZER(struct cmd_set_record_core_cycles_result, + on_off, "on#off"); + +cmdline_parse_inst_t cmd_set_record_core_cycles = { + .f = cmd_set_record_core_cycles_parsed, + .data = NULL, + .help_str = "set record-core-cycles on|off", + .tokens = { + (void *)&cmd_set_record_core_cycles_keyword, + (void *)&cmd_set_record_core_cycles_name, + (void *)&cmd_set_record_core_cycles_on_off, + NULL, + }, +}; + +/* *** SET OPTION TO ENABLE DISPLAY OF RX AND TX BURSTS *** */ +struct cmd_set_record_burst_stats_result { + cmdline_fixed_string_t keyword; + cmdline_fixed_string_t name; + cmdline_fixed_string_t on_off; +}; + +static void +cmd_set_record_burst_stats_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ + struct cmd_set_record_burst_stats_result *res; + uint16_t on_off = 0; + + res = parsed_result; + on_off = !strcmp(res->on_off, "on") ? 1 : 0; + set_record_burst_stats(on_off); +} + +cmdline_parse_token_string_t cmd_set_record_burst_stats_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_set_record_burst_stats_result, + keyword, "set"); +cmdline_parse_token_string_t cmd_set_record_burst_stats_name = + TOKEN_STRING_INITIALIZER(struct cmd_set_record_burst_stats_result, + name, "record-burst-stats"); +cmdline_parse_token_string_t cmd_set_record_burst_stats_on_off = + TOKEN_STRING_INITIALIZER(struct cmd_set_record_burst_stats_result, + on_off, "on#off"); + +cmdline_parse_inst_t cmd_set_record_burst_stats = { + .f = cmd_set_record_burst_stats_parsed, + .data = NULL, + .help_str = "set record-burst-stats on|off", + .tokens = { + (void *)&cmd_set_record_burst_stats_keyword, + (void *)&cmd_set_record_burst_stats_name, + (void *)&cmd_set_record_burst_stats_on_off, + NULL, + }, +}; + /* *** CONFIGURE UNICAST HASH TABLE *** */ struct cmd_set_uc_hash_table { cmdline_fixed_string_t set; @@ -8167,8 +8646,8 @@ struct cmd_set_uc_hash_table { static void cmd_set_uc_hash_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { int ret=0; struct cmd_set_uc_hash_table *res = parsed_result; @@ -8228,8 +8707,8 @@ struct cmd_set_uc_all_hash_table { static void cmd_set_uc_all_hash_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { int ret=0; struct cmd_set_uc_all_hash_table *res = parsed_result; @@ -8292,8 +8771,8 @@ struct cmd_set_vf_macvlan_filter { static void cmd_set_vf_macvlan_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { int is_on, ret = 0; struct cmd_set_vf_macvlan_filter *res = parsed_result; @@ -8395,8 +8874,8 @@ struct cmd_set_vf_traffic { static void cmd_set_vf_traffic_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_vf_traffic *res = parsed_result; int is_rx = (strcmp(res->what, "rx") == 0) ? 1 : 0; @@ -8457,8 +8936,8 @@ struct cmd_set_vf_rxmode { static void cmd_set_vf_rxmode_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { int ret = -ENOTSUP; uint16_t vf_rxmode = 0; @@ -8548,8 +9027,8 @@ struct cmd_vf_mac_addr_result { }; static void cmd_vf_mac_addr_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_vf_mac_addr_result *res = parsed_result; int ret = -ENOTSUP; @@ -8625,8 +9104,8 @@ struct cmd_vf_rx_vlan_filter { static void cmd_vf_rx_vlan_filter_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_vf_rx_vlan_filter *res = parsed_result; int ret = -ENOTSUP; @@ -8718,8 +9197,8 @@ struct cmd_queue_rate_limit_result { }; static void cmd_queue_rate_limit_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_queue_rate_limit_result *res = parsed_result; int ret = 0; @@ -8787,8 +9266,8 @@ struct cmd_vf_rate_limit_result { }; static void cmd_vf_rate_limit_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_vf_rate_limit_result *res = parsed_result; int ret = 0; @@ -8869,8 +9348,8 @@ struct cmd_tunnel_filter_result { static void cmd_tunnel_filter_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_tunnel_filter_result *res = parsed_result; struct rte_eth_tunnel_filter_conf tunnel_filter_conf; @@ -9013,8 +9492,8 @@ struct cmd_tunnel_udp_config { static void cmd_tunnel_udp_config_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_tunnel_udp_config *res = parsed_result; struct rte_eth_udp_tunnel tunnel_udp; @@ -9075,8 +9554,8 @@ struct cmd_config_tunnel_udp_port { static void cmd_cfg_tunnel_udp_port_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_tunnel_udp_port *res = parsed_result; struct rte_eth_udp_tunnel tunnel_udp; @@ -9158,8 +9637,8 @@ struct cmd_global_config_result { static void cmd_global_config_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_global_config_result *res = parsed_result; struct rte_eth_global_cfg conf; @@ -9170,6 +9649,10 @@ cmd_global_config_parsed(void *parsed_result, conf.cfg.gre_key_len = res->len; ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE, RTE_ETH_FILTER_SET, &conf); +#ifdef RTE_LIBRTE_I40E_PMD + if (ret == -ENOTSUP) + ret = rte_pmd_i40e_set_gre_key_len(res->port_id, res->len); +#endif if (ret != 0) printf("Global config error\n"); } @@ -9248,8 +9731,8 @@ cmdline_parse_token_string_t cmd_mirror_mask_on = static void cmd_set_mirror_mask_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { int ret,nb_item,i; struct cmd_set_mirror_mask_result *res = parsed_result; @@ -9359,8 +9842,8 @@ cmdline_parse_token_string_t cmd_mirror_link_on = static void cmd_set_mirror_link_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { int ret; struct cmd_set_mirror_link_result *res = parsed_result; @@ -9433,8 +9916,8 @@ cmdline_parse_token_num_t cmd_rm_mirror_rule_ruleid = static void cmd_reset_mirror_rule_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { int ret; struct cmd_set_mirror_link_result *res = parsed_result; @@ -9474,14 +9957,66 @@ dump_struct_sizes(void) #undef DUMP_SIZE } + +/* Dump the socket memory statistics on console */ +static void +dump_socket_mem(FILE *f) +{ + struct rte_malloc_socket_stats socket_stats; + unsigned int i; + size_t total = 0; + size_t alloc = 0; + size_t free = 0; + unsigned int n_alloc = 0; + unsigned int n_free = 0; + static size_t last_allocs; + static size_t last_total; + + + for (i = 0; i < RTE_MAX_NUMA_NODES; i++) { + if (rte_malloc_get_socket_stats(i, &socket_stats) || + !socket_stats.heap_totalsz_bytes) + continue; + total += socket_stats.heap_totalsz_bytes; + alloc += socket_stats.heap_allocsz_bytes; + free += socket_stats.heap_freesz_bytes; + n_alloc += socket_stats.alloc_count; + n_free += socket_stats.free_count; + fprintf(f, + "Socket %u: size(M) total: %.6lf alloc: %.6lf(%.3lf%%) free: %.6lf \tcount alloc: %-4u free: %u\n", + i, + (double)socket_stats.heap_totalsz_bytes / (1024 * 1024), + (double)socket_stats.heap_allocsz_bytes / (1024 * 1024), + (double)socket_stats.heap_allocsz_bytes * 100 / + (double)socket_stats.heap_totalsz_bytes, + (double)socket_stats.heap_freesz_bytes / (1024 * 1024), + socket_stats.alloc_count, + socket_stats.free_count); + } + fprintf(f, + "Total : size(M) total: %.6lf alloc: %.6lf(%.3lf%%) free: %.6lf \tcount alloc: %-4u free: %u\n", + (double)total / (1024 * 1024), (double)alloc / (1024 * 1024), + (double)alloc * 100 / (double)total, + (double)free / (1024 * 1024), + n_alloc, n_free); + if (last_allocs) + fprintf(stdout, "Memory total change: %.6lf(M), allocation change: %.6lf(M)\n", + ((double)total - (double)last_total) / (1024 * 1024), + (double)(alloc - (double)last_allocs) / 1024 / 1024); + last_allocs = alloc; + last_total = total; +} + static void cmd_dump_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_dump_result *res = parsed_result; if (!strcmp(res->dump, "dump_physmem")) rte_dump_physmem_layout(stdout); + else if (!strcmp(res->dump, "dump_socket_mem")) + dump_socket_mem(stdout); else if (!strcmp(res->dump, "dump_memzone")) rte_memzone_dump(stdout); else if (!strcmp(res->dump, "dump_struct_sizes")) @@ -9500,6 +10035,7 @@ cmdline_parse_token_string_t cmd_dump_dump = TOKEN_STRING_INITIALIZER(struct cmd_dump_result, dump, "dump_physmem#" "dump_memzone#" + "dump_socket_mem#" "dump_struct_sizes#" "dump_ring#" "dump_mempool#" @@ -9524,7 +10060,7 @@ struct cmd_dump_one_result { }; static void cmd_dump_one_parsed(void *parsed_result, struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused void *data) { struct cmd_dump_one_result *res = parsed_result; @@ -9578,8 +10114,8 @@ struct cmd_syn_filter_result { static void cmd_syn_filter_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_syn_filter_result *res = parsed_result; struct rte_eth_syn_filter syn_filter; @@ -9672,8 +10208,8 @@ struct cmd_queue_region_result { static void cmd_queue_region_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_queue_region_result *res = parsed_result; int ret = -ENOTSUP; @@ -9771,8 +10307,8 @@ struct cmd_region_flowtype_result { static void cmd_region_flowtype_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_region_flowtype_result *res = parsed_result; int ret = -ENOTSUP; @@ -9862,8 +10398,8 @@ struct cmd_user_priority_region_result { static void cmd_user_priority_region_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_user_priority_region_result *res = parsed_result; int ret = -ENOTSUP; @@ -9953,8 +10489,8 @@ struct cmd_flush_queue_region_result { static void cmd_flush_queue_region_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_flush_queue_region_result *res = parsed_result; int ret = -ENOTSUP; @@ -10035,8 +10571,8 @@ struct cmd_show_queue_region_info { static void cmd_show_queue_region_info_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_show_queue_region_info *res = parsed_result; int ret = -ENOTSUP; @@ -10119,8 +10655,8 @@ struct cmd_2tuple_filter_result { static void cmd_2tuple_filter_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct rte_eth_ntuple_filter filter; struct cmd_2tuple_filter_result *res = parsed_result; @@ -10274,8 +10810,8 @@ struct cmd_5tuple_filter_result { static void cmd_5tuple_filter_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct rte_eth_ntuple_filter filter; struct cmd_5tuple_filter_result *res = parsed_result; @@ -10482,8 +11018,8 @@ static int xdigit2val(unsigned char c) static void cmd_flex_filter_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { int ret = 0; struct rte_eth_flex_filter filter; @@ -10689,8 +11225,8 @@ cmdline_parse_token_num_t cmd_ethertype_filter_queue_id = static void cmd_ethertype_filter_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_ethertype_filter_result *res = parsed_result; struct rte_eth_ethertype_filter filter; @@ -10913,8 +11449,8 @@ do { \ static void cmd_flow_director_filter_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_flow_director_result *res = parsed_result; struct rte_eth_fdir_filter entry; @@ -11533,8 +12069,8 @@ cmdline_parse_token_num_t cmd_flush_flow_director_port_id = static void cmd_flush_flow_director_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_flow_director_result *res = parsed_result; int ret = 0; @@ -11591,8 +12127,8 @@ struct cmd_flow_director_mask_result { static void cmd_flow_director_mask_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_flow_director_mask_result *res = parsed_result; struct rte_eth_fdir_masks *mask; @@ -11783,8 +12319,8 @@ struct cmd_flow_director_flex_mask_result { static void cmd_flow_director_flex_mask_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_flow_director_flex_mask_result *res = parsed_result; struct rte_eth_fdir_info fdir_info; @@ -11937,8 +12473,8 @@ parse_offsets(const char *q_arg, uint16_t *offsets, uint16_t max_num) static void cmd_flow_director_flxpld_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_flow_director_flexpayload_result *res = parsed_result; struct rte_eth_flex_payload_cfg flex_cfg; @@ -12199,6 +12735,9 @@ cmd_get_hash_global_config_parsed(void *parsed_result, case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR: printf("Hash function is Simple XOR\n"); break; + case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ: + printf("Hash function is Symmetric Toeplitz\n"); + break; default: printf("Unknown hash function\n"); break; @@ -12272,6 +12811,9 @@ cmd_set_hash_global_config_parsed(void *parsed_result, else if (!strcmp(res->hash_func, "simple_xor")) info.info.global_conf.hash_func = RTE_ETH_HASH_FUNCTION_SIMPLE_XOR; + else if (!strcmp(res->hash_func, "symmetric_toeplitz")) + info.info.global_conf.hash_func = + RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ; else if (!strcmp(res->hash_func, "default")) info.info.global_conf.hash_func = RTE_ETH_HASH_FUNCTION_DEFAULT; @@ -12301,7 +12843,7 @@ cmdline_parse_token_num_t cmd_set_hash_global_config_port_id = port_id, UINT16); cmdline_parse_token_string_t cmd_set_hash_global_config_hash_func = TOKEN_STRING_INITIALIZER(struct cmd_set_hash_global_config_result, - hash_func, "toeplitz#simple_xor#default"); + hash_func, "toeplitz#simple_xor#symmetric_toeplitz#default"); cmdline_parse_token_string_t cmd_set_hash_global_config_flow_type = TOKEN_STRING_INITIALIZER(struct cmd_set_hash_global_config_result, flow_type, @@ -12315,7 +12857,7 @@ cmdline_parse_inst_t cmd_set_hash_global_config = { .f = cmd_set_hash_global_config_parsed, .data = NULL, .help_str = "set_hash_global_config " - "toeplitz|simple_xor|default " + "toeplitz|simple_xor|symmetric_toeplitz|default " "ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|" "ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|" "l2_payload enable|disable", @@ -12535,8 +13077,8 @@ struct cmd_mcast_addr_result { }; static void cmd_mcast_addr_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_mcast_addr_result *res = parsed_result; @@ -12650,8 +13192,8 @@ str2fdir_l2_tunnel_type(char *string) static void cmd_config_l2_tunnel_eth_type_all_parsed (void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_l2_tunnel_eth_type_result *res = parsed_result; struct rte_eth_l2_tunnel_conf entry; @@ -12685,8 +13227,8 @@ cmdline_parse_inst_t cmd_config_l2_tunnel_eth_type_all = { static void cmd_config_l2_tunnel_eth_type_specific_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_l2_tunnel_eth_type_result *res = parsed_result; @@ -12761,9 +13303,9 @@ cmdline_parse_token_string_t cmd_config_l2_tunnel_en_dis_en_dis = static void cmd_config_l2_tunnel_en_dis_all_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) -{ + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ struct cmd_config_l2_tunnel_en_dis_result *res = parsed_result; struct rte_eth_l2_tunnel_conf entry; portid_t pid; @@ -12803,8 +13345,8 @@ cmdline_parse_inst_t cmd_config_l2_tunnel_en_dis_all = { static void cmd_config_l2_tunnel_en_dis_specific_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_l2_tunnel_en_dis_result *res = parsed_result; @@ -12959,8 +13501,8 @@ cmdline_parse_token_num_t cmd_config_e_tag_vf_id = static void cmd_config_e_tag_insertion_en_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_e_tag_result *res = parsed_result; @@ -12981,8 +13523,8 @@ cmd_config_e_tag_insertion_en_parsed( static void cmd_config_e_tag_insertion_dis_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_e_tag_result *res = parsed_result; @@ -13040,8 +13582,8 @@ cmdline_parse_inst_t cmd_config_e_tag_insertion_dis = { static void cmd_config_e_tag_stripping_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_e_tag_result *res = parsed_result; @@ -13085,8 +13627,8 @@ cmdline_parse_inst_t cmd_config_e_tag_stripping_en_dis = { static void cmd_config_e_tag_forwarding_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_e_tag_result *res = parsed_result; struct rte_eth_l2_tunnel_conf entry; @@ -13129,8 +13671,8 @@ cmdline_parse_inst_t cmd_config_e_tag_forwarding_en_dis = { static void cmd_config_e_tag_filter_add_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_e_tag_result *res = parsed_result; struct rte_eth_l2_tunnel_conf entry; @@ -13187,8 +13729,8 @@ cmdline_parse_inst_t cmd_config_e_tag_filter_add = { static void cmd_config_e_tag_filter_del_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_e_tag_result *res = parsed_result; struct rte_eth_l2_tunnel_conf entry; @@ -13285,8 +13827,8 @@ cmdline_parse_token_string_t cmd_vf_vlan_anti_spoof_on_off = static void cmd_set_vf_vlan_anti_spoof_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_vf_vlan_anti_spoof_result *res = parsed_result; int ret = -ENOTSUP; @@ -13391,8 +13933,8 @@ cmdline_parse_token_string_t cmd_vf_mac_anti_spoof_on_off = static void cmd_set_vf_mac_anti_spoof_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_vf_mac_anti_spoof_result *res = parsed_result; int ret = -ENOTSUP; @@ -13497,8 +14039,8 @@ cmdline_parse_token_string_t cmd_vf_vlan_stripq_on_off = static void cmd_set_vf_vlan_stripq_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_vf_vlan_stripq_result *res = parsed_result; int ret = -ENOTSUP; @@ -13603,8 +14145,8 @@ cmdline_parse_token_num_t cmd_vf_vlan_insert_vlan_id = static void cmd_set_vf_vlan_insert_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_vf_vlan_insert_result *res = parsed_result; int ret = -ENOTSUP; @@ -13697,8 +14239,8 @@ cmdline_parse_token_string_t cmd_tx_loopback_on_off = static void cmd_set_tx_loopback_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_tx_loopback_result *res = parsed_result; int ret = -ENOTSUP; @@ -13797,8 +14339,8 @@ cmdline_parse_token_string_t cmd_all_queues_drop_en_on_off = static void cmd_set_all_queues_drop_en_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_all_queues_drop_en_result *res = parsed_result; int ret = -ENOTSUP; @@ -13893,8 +14435,8 @@ cmdline_parse_token_string_t cmd_vf_split_drop_en_on_off = static void cmd_set_vf_split_drop_en_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_vf_split_drop_en_result *res = parsed_result; int ret = -ENOTSUP; @@ -13986,8 +14528,8 @@ cmdline_parse_token_etheraddr_t cmd_set_vf_mac_addr_mac_addr = static void cmd_set_vf_mac_addr_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_vf_mac_addr_result *res = parsed_result; int ret = -ENOTSUP; @@ -14100,8 +14642,8 @@ cmdline_parse_token_string_t cmd_macsec_offload_on_rp_on_off = static void cmd_set_macsec_offload_on_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_macsec_offload_on_result *res = parsed_result; int ret = -ENOTSUP; @@ -14199,8 +14741,8 @@ cmdline_parse_token_string_t cmd_macsec_offload_off_off = static void cmd_set_macsec_offload_off_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_macsec_offload_off_result *res = parsed_result; int ret = -ENOTSUP; @@ -14298,8 +14840,8 @@ cmdline_parse_token_num_t cmd_macsec_sc_pi = static void cmd_set_macsec_sc_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_macsec_sc_result *res = parsed_result; int ret = -ENOTSUP; @@ -14398,8 +14940,8 @@ cmdline_parse_token_string_t cmd_macsec_sa_key = static void cmd_set_macsec_sa_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_macsec_sa_result *res = parsed_result; int ret = -ENOTSUP; @@ -14510,8 +15052,8 @@ cmdline_parse_token_string_t cmd_vf_promisc_on_off = static void cmd_set_vf_promisc_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_vf_promisc_result *res = parsed_result; int ret = -ENOTSUP; @@ -14600,8 +15142,8 @@ cmdline_parse_token_string_t cmd_vf_allmulti_on_off = static void cmd_set_vf_allmulti_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_vf_allmulti_result *res = parsed_result; int ret = -ENOTSUP; @@ -14690,8 +15232,8 @@ cmdline_parse_token_string_t cmd_set_vf_broadcast_on_off = static void cmd_set_vf_broadcast_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_vf_broadcast_result *res = parsed_result; int ret = -ENOTSUP; @@ -14784,8 +15326,8 @@ cmdline_parse_token_string_t cmd_set_vf_vlan_tag_on_off = static void cmd_set_vf_vlan_tag_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_vf_vlan_tag_result *res = parsed_result; int ret = -ENOTSUP; @@ -14907,8 +15449,8 @@ cmdline_parse_token_num_t cmd_vf_tc_bw_tc_map = static void cmd_vf_max_bw_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_vf_tc_bw_result *res = parsed_result; int ret = -ENOTSUP; @@ -15001,8 +15543,8 @@ vf_tc_min_bw_parse_bw_list(uint8_t *bw_list, static void cmd_vf_tc_min_bw_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_vf_tc_bw_result *res = parsed_result; uint8_t tc_num; @@ -15059,8 +15601,8 @@ cmdline_parse_inst_t cmd_vf_tc_min_bw = { static void cmd_tc_min_bw_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_vf_tc_bw_result *res = parsed_result; struct rte_port *port; @@ -15122,8 +15664,8 @@ cmdline_parse_inst_t cmd_tc_min_bw = { static void cmd_vf_tc_max_bw_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_vf_tc_bw_result *res = parsed_result; int ret = -ENOTSUP; @@ -15173,80 +15715,6 @@ cmdline_parse_inst_t cmd_vf_tc_max_bw = { }, }; - -#if defined RTE_LIBRTE_PMD_SOFTNIC && defined RTE_LIBRTE_SCHED - -/* *** Set Port default Traffic Management Hierarchy *** */ -struct cmd_set_port_tm_hierarchy_default_result { - cmdline_fixed_string_t set; - cmdline_fixed_string_t port; - cmdline_fixed_string_t tm; - cmdline_fixed_string_t hierarchy; - cmdline_fixed_string_t def; - portid_t port_id; -}; - -cmdline_parse_token_string_t cmd_set_port_tm_hierarchy_default_set = - TOKEN_STRING_INITIALIZER( - struct cmd_set_port_tm_hierarchy_default_result, set, "set"); -cmdline_parse_token_string_t cmd_set_port_tm_hierarchy_default_port = - TOKEN_STRING_INITIALIZER( - struct cmd_set_port_tm_hierarchy_default_result, port, "port"); -cmdline_parse_token_string_t cmd_set_port_tm_hierarchy_default_tm = - TOKEN_STRING_INITIALIZER( - struct cmd_set_port_tm_hierarchy_default_result, tm, "tm"); -cmdline_parse_token_string_t cmd_set_port_tm_hierarchy_default_hierarchy = - TOKEN_STRING_INITIALIZER( - struct cmd_set_port_tm_hierarchy_default_result, - hierarchy, "hierarchy"); -cmdline_parse_token_string_t cmd_set_port_tm_hierarchy_default_default = - TOKEN_STRING_INITIALIZER( - struct cmd_set_port_tm_hierarchy_default_result, - def, "default"); -cmdline_parse_token_num_t cmd_set_port_tm_hierarchy_default_port_id = - TOKEN_NUM_INITIALIZER( - struct cmd_set_port_tm_hierarchy_default_result, - port_id, UINT16); - -static void cmd_set_port_tm_hierarchy_default_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) -{ - struct cmd_set_port_tm_hierarchy_default_result *res = parsed_result; - struct rte_port *p; - portid_t port_id = res->port_id; - - if (port_id_is_invalid(port_id, ENABLED_WARN)) - return; - - p = &ports[port_id]; - - /* Forward mode: tm */ - if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "softnic")) { - printf(" softnicfwd mode not enabled(error)\n"); - return; - } - - /* Set the default tm hierarchy */ - p->softport.default_tm_hierarchy_enable = 1; -} - -cmdline_parse_inst_t cmd_set_port_tm_hierarchy_default = { - .f = cmd_set_port_tm_hierarchy_default_parsed, - .data = NULL, - .help_str = "set port tm hierarchy default ", - .tokens = { - (void *)&cmd_set_port_tm_hierarchy_default_set, - (void *)&cmd_set_port_tm_hierarchy_default_port, - (void *)&cmd_set_port_tm_hierarchy_default_tm, - (void *)&cmd_set_port_tm_hierarchy_default_hierarchy, - (void *)&cmd_set_port_tm_hierarchy_default_default, - (void *)&cmd_set_port_tm_hierarchy_default_port_id, - NULL, - }, -}; -#endif - /** Set VXLAN encapsulation details */ struct cmd_set_vxlan_result { cmdline_fixed_string_t set; @@ -15334,8 +15802,8 @@ cmdline_parse_token_etheraddr_t cmd_set_vxlan_eth_dst_value = TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_vxlan_result, eth_dst); static void cmd_set_vxlan_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_vxlan_result *res = parsed_result; union { @@ -15534,8 +16002,8 @@ cmdline_parse_token_etheraddr_t cmd_set_nvgre_eth_dst_value = TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_nvgre_result, eth_dst); static void cmd_set_nvgre_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_nvgre_result *res = parsed_result; union { @@ -15665,8 +16133,8 @@ cmdline_parse_token_etheraddr_t cmd_set_l2_encap_eth_dst_value = TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_l2_encap_result, eth_dst); static void cmd_set_l2_encap_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_l2_encap_result *res = parsed_result; @@ -15744,8 +16212,8 @@ cmdline_parse_token_string_t cmd_set_l2_decap_l2_decap_with_vlan = "l2_decap-with-vlan"); static void cmd_set_l2_decap_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_l2_decap_result *res = parsed_result; @@ -15843,8 +16311,8 @@ cmdline_parse_token_etheraddr_t cmd_set_mplsogre_encap_eth_dst_value = eth_dst); static void cmd_set_mplsogre_encap_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_mplsogre_encap_result *res = parsed_result; union { @@ -15958,8 +16426,8 @@ cmdline_parse_token_string_t cmd_set_mplsogre_decap_ip_version_value = ip_version, "ipv4#ipv6"); static void cmd_set_mplsogre_decap_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_mplsogre_decap_result *res = parsed_result; @@ -16079,8 +16547,8 @@ cmdline_parse_token_etheraddr_t cmd_set_mplsoudp_encap_eth_dst_value = eth_dst); static void cmd_set_mplsoudp_encap_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_mplsoudp_encap_result *res = parsed_result; union { @@ -16205,8 +16673,8 @@ cmdline_parse_token_string_t cmd_set_mplsoudp_decap_ip_version_value = ip_version, "ipv4#ipv6"); static void cmd_set_mplsoudp_decap_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_mplsoudp_decap_result *res = parsed_result; @@ -16250,8 +16718,8 @@ cmdline_parse_inst_t cmd_set_mplsoudp_decap_with_vlan = { static void cmd_strict_link_prio_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_vf_tc_bw_result *res = parsed_result; int ret = -ENOTSUP; @@ -16314,8 +16782,8 @@ cmdline_parse_token_string_t cmd_ddp_add_filepath = static void cmd_ddp_add_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_ddp_add_result *res = parsed_result; uint8_t *buff; @@ -16394,8 +16862,8 @@ cmdline_parse_token_string_t cmd_ddp_del_filepath = static void cmd_ddp_del_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_ddp_del_result *res = parsed_result; uint8_t *buff; @@ -16459,8 +16927,8 @@ cmdline_parse_token_string_t cmd_ddp_info_filepath = static void cmd_ddp_info_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_ddp_info_result *res = parsed_result; uint8_t *pkg; @@ -16698,9 +17166,9 @@ cmdline_parse_token_num_t cmd_ddp_get_list_port_id = static void cmd_ddp_get_list_parsed( - __attribute__((unused)) void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) { #ifdef RTE_LIBRTE_I40E_PMD struct cmd_ddp_get_list_result *res = parsed_result; @@ -16715,8 +17183,10 @@ cmd_ddp_get_list_parsed( #ifdef RTE_LIBRTE_I40E_PMD size = PROFILE_INFO_SIZE * MAX_PROFILE_NUM + 4; p_list = (struct rte_pmd_i40e_profile_list *)malloc(size); - if (!p_list) + if (!p_list) { printf("%s: Failed to malloc buffer\n", __func__); + return; + } if (ret == -ENOTSUP) ret = rte_pmd_i40e_get_ddp_list(res->port_id, @@ -16774,9 +17244,9 @@ struct cmd_cfg_input_set_result { static void cmd_cfg_input_set_parsed( - __attribute__((unused)) void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) { #ifdef RTE_LIBRTE_I40E_PMD struct cmd_cfg_input_set_result *res = parsed_result; @@ -16897,9 +17367,9 @@ struct cmd_clear_input_set_result { static void cmd_clear_input_set_parsed( - __attribute__((unused)) void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) { #ifdef RTE_LIBRTE_I40E_PMD struct cmd_clear_input_set_result *res = parsed_result; @@ -17016,8 +17486,8 @@ cmdline_parse_token_num_t cmd_show_vf_stats_vf_id = static void cmd_show_vf_stats_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_show_vf_stats_result *res = parsed_result; struct rte_eth_stats stats; @@ -17125,8 +17595,8 @@ cmdline_parse_token_num_t cmd_clear_vf_stats_vf_id = static void cmd_clear_vf_stats_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_clear_vf_stats_result *res = parsed_result; int ret = -ENOTSUP; @@ -17217,8 +17687,8 @@ cmdline_parse_token_string_t cmd_pctype_mapping_reset_reset = static void cmd_pctype_mapping_reset_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_pctype_mapping_reset_result *res = parsed_result; int ret = -ENOTSUP; @@ -17295,8 +17765,8 @@ cmdline_parse_token_string_t cmd_pctype_mapping_get_mapping = static void cmd_pctype_mapping_get_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_pctype_mapping_get_result *res = parsed_result; int ret = -ENOTSUP; @@ -17411,8 +17881,8 @@ cmdline_parse_token_num_t cmd_pctype_mapping_update_flow_type = static void cmd_pctype_mapping_update_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_pctype_mapping_update_result *res = parsed_result; int ret = -ENOTSUP; @@ -17509,8 +17979,8 @@ cmdline_parse_token_num_t cmd_ptype_mapping_get_valid_only = static void cmd_ptype_mapping_get_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_ptype_mapping_get_result *res = parsed_result; int ret = -ENOTSUP; @@ -17614,8 +18084,8 @@ cmdline_parse_token_num_t cmd_ptype_mapping_replace_pkt_type = static void cmd_ptype_mapping_replace_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_ptype_mapping_replace_result *res = parsed_result; int ret = -ENOTSUP; @@ -17696,8 +18166,8 @@ cmdline_parse_token_num_t cmd_ptype_mapping_reset_port_id = static void cmd_ptype_mapping_reset_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_ptype_mapping_reset_result *res = parsed_result; int ret = -ENOTSUP; @@ -17777,8 +18247,8 @@ cmdline_parse_token_num_t cmd_ptype_mapping_update_sw_ptype = static void cmd_ptype_mapping_update_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_ptype_mapping_update_result *res = parsed_result; int ret = -ENOTSUP; @@ -17844,8 +18314,8 @@ cmdline_parse_token_string_t cmd_load_cmdfile_filename = static void cmd_load_from_file_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_cmdfile_result *res = parsed_result; @@ -17919,8 +18389,8 @@ print_rx_offloads(uint64_t offloads) static void cmd_rx_offload_get_capa_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_rx_offload_get_capa_result *res = parsed_result; struct rte_eth_dev_info dev_info; @@ -17993,8 +18463,8 @@ cmdline_parse_token_string_t cmd_rx_offload_get_configuration_configuration = static void cmd_rx_offload_get_configuration_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_rx_offload_get_configuration_result *res = parsed_result; struct rte_eth_dev_info dev_info; @@ -18073,7 +18543,8 @@ cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_offload = offload, "vlan_strip#ipv4_cksum#udp_cksum#tcp_cksum#tcp_lro#" "qinq_strip#outer_ipv4_cksum#macsec_strip#" "header_split#vlan_filter#vlan_extend#jumbo_frame#" - "crc_strip#scatter#timestamp#security#keep_crc"); + "scatter#buffer_split#timestamp#security#" + "keep_crc#rss_hash"); cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_on_off = TOKEN_STRING_INITIALIZER (struct cmd_config_per_port_rx_offload_result, @@ -18105,8 +18576,8 @@ search_rx_offload(const char *name) static void cmd_config_per_port_rx_offload_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_per_port_rx_offload_result *res = parsed_result; portid_t port_id = res->port_id; @@ -18153,8 +18624,8 @@ cmdline_parse_inst_t cmd_config_per_port_rx_offload = { .help_str = "port config rx_offload vlan_strip|ipv4_cksum|" "udp_cksum|tcp_cksum|tcp_lro|qinq_strip|outer_ipv4_cksum|" "macsec_strip|header_split|vlan_filter|vlan_extend|" - "jumbo_frame|crc_strip|scatter|timestamp|security|keep_crc " - "on|off", + "jumbo_frame|scatter|buffer_split|timestamp|security|" + "keep_crc|rss_hash on|off", .tokens = { (void *)&cmd_config_per_port_rx_offload_result_port, (void *)&cmd_config_per_port_rx_offload_result_config, @@ -18203,7 +18674,7 @@ cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_offload = offload, "vlan_strip#ipv4_cksum#udp_cksum#tcp_cksum#tcp_lro#" "qinq_strip#outer_ipv4_cksum#macsec_strip#" "header_split#vlan_filter#vlan_extend#jumbo_frame#" - "crc_strip#scatter#timestamp#security#keep_crc"); + "scatter#buffer_split#timestamp#security#keep_crc"); cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_on_off = TOKEN_STRING_INITIALIZER (struct cmd_config_per_queue_rx_offload_result, @@ -18211,8 +18682,8 @@ cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_on_off = static void cmd_config_per_queue_rx_offload_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_per_queue_rx_offload_result *res = parsed_result; struct rte_eth_dev_info dev_info; @@ -18259,8 +18730,8 @@ cmdline_parse_inst_t cmd_config_per_queue_rx_offload = { "vlan_strip|ipv4_cksum|" "udp_cksum|tcp_cksum|tcp_lro|qinq_strip|outer_ipv4_cksum|" "macsec_strip|header_split|vlan_filter|vlan_extend|" - "jumbo_frame|crc_strip|scatter|timestamp|security|keep_crc " - "on|off", + "jumbo_frame|scatter|buffer_split|timestamp|security|" + "keep_crc on|off", .tokens = { (void *)&cmd_config_per_queue_rx_offload_result_port, (void *)&cmd_config_per_queue_rx_offload_result_port_id, @@ -18329,8 +18800,8 @@ print_tx_offloads(uint64_t offloads) static void cmd_tx_offload_get_capa_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_tx_offload_get_capa_result *res = parsed_result; struct rte_eth_dev_info dev_info; @@ -18403,8 +18874,8 @@ cmdline_parse_token_string_t cmd_tx_offload_get_configuration_configuration = static void cmd_tx_offload_get_configuration_parsed( void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_tx_offload_get_configuration_result *res = parsed_result; struct rte_eth_dev_info dev_info; @@ -18485,7 +18956,7 @@ cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_offload = "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#" "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#" "mt_lockfree#multi_segs#mbuf_fast_free#security#" - "match_metadata"); + "send_on_timestamp"); cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_on_off = TOKEN_STRING_INITIALIZER (struct cmd_config_per_port_tx_offload_result, @@ -18520,8 +18991,8 @@ search_tx_offload(const char *name) static void cmd_config_per_port_tx_offload_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_per_port_tx_offload_result *res = parsed_result; portid_t port_id = res->port_id; @@ -18571,7 +19042,7 @@ cmdline_parse_inst_t cmd_config_per_port_tx_offload = { "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|" "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|" "mt_lockfree|multi_segs|mbuf_fast_free|security|" - "match_metadata on|off", + "send_on_timestamp on|off", .tokens = { (void *)&cmd_config_per_port_tx_offload_result_port, (void *)&cmd_config_per_port_tx_offload_result_config, @@ -18629,8 +19100,8 @@ cmdline_parse_token_string_t cmd_config_per_queue_tx_offload_result_on_off = static void cmd_config_per_queue_tx_offload_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_per_queue_tx_offload_result *res = parsed_result; struct rte_eth_dev_info dev_info; @@ -18703,19 +19174,20 @@ struct cmd_config_tx_metadata_specific_result { static void cmd_config_tx_metadata_specific_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_config_tx_metadata_specific_result *res = parsed_result; if (port_id_is_invalid(res->port_id, ENABLED_WARN)) return; - ports[res->port_id].tx_metadata = rte_cpu_to_be_32(res->value); + ports[res->port_id].tx_metadata = res->value; /* Add/remove callback to insert valid metadata in every Tx packet. */ if (ports[res->port_id].tx_metadata) add_tx_md_callback(res->port_id); else remove_tx_md_callback(res->port_id); + rte_flow_dynf_metadata_register(); } cmdline_parse_token_string_t cmd_config_tx_metadata_specific_port = @@ -18748,6 +19220,89 @@ cmdline_parse_inst_t cmd_config_tx_metadata_specific = { }, }; +/* *** set dynf *** */ +struct cmd_config_tx_dynf_specific_result { + cmdline_fixed_string_t port; + cmdline_fixed_string_t keyword; + uint16_t port_id; + cmdline_fixed_string_t item; + cmdline_fixed_string_t name; + cmdline_fixed_string_t value; +}; + +static void +cmd_config_dynf_specific_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ + struct cmd_config_tx_dynf_specific_result *res = parsed_result; + struct rte_mbuf_dynflag desc_flag; + int flag; + uint64_t old_port_flags; + + if (port_id_is_invalid(res->port_id, ENABLED_WARN)) + return; + flag = rte_mbuf_dynflag_lookup(res->name, NULL); + if (flag <= 0) { + if (strlcpy(desc_flag.name, res->name, + RTE_MBUF_DYN_NAMESIZE) >= RTE_MBUF_DYN_NAMESIZE) { + printf("Flag name too long\n"); + return; + } + desc_flag.flags = 0; + flag = rte_mbuf_dynflag_register(&desc_flag); + if (flag < 0) { + printf("Can't register flag\n"); + return; + } + strcpy(dynf_names[flag], desc_flag.name); + } + old_port_flags = ports[res->port_id].mbuf_dynf; + if (!strcmp(res->value, "set")) { + ports[res->port_id].mbuf_dynf |= 1UL << flag; + if (old_port_flags == 0) + add_tx_dynf_callback(res->port_id); + } else { + ports[res->port_id].mbuf_dynf &= ~(1UL << flag); + if (ports[res->port_id].mbuf_dynf == 0) + remove_tx_dynf_callback(res->port_id); + } +} + +cmdline_parse_token_string_t cmd_config_tx_dynf_specific_port = + TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result, + keyword, "port"); +cmdline_parse_token_string_t cmd_config_tx_dynf_specific_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result, + keyword, "config"); +cmdline_parse_token_num_t cmd_config_tx_dynf_specific_port_id = + TOKEN_NUM_INITIALIZER(struct cmd_config_tx_dynf_specific_result, + port_id, UINT16); +cmdline_parse_token_string_t cmd_config_tx_dynf_specific_item = + TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result, + item, "dynf"); +cmdline_parse_token_string_t cmd_config_tx_dynf_specific_name = + TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result, + name, NULL); +cmdline_parse_token_string_t cmd_config_tx_dynf_specific_value = + TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result, + value, "set#clear"); + +cmdline_parse_inst_t cmd_config_tx_dynf_specific = { + .f = cmd_config_dynf_specific_parsed, + .data = NULL, + .help_str = "port config dynf set|clear", + .tokens = { + (void *)&cmd_config_tx_dynf_specific_port, + (void *)&cmd_config_tx_dynf_specific_keyword, + (void *)&cmd_config_tx_dynf_specific_port_id, + (void *)&cmd_config_tx_dynf_specific_item, + (void *)&cmd_config_tx_dynf_specific_name, + (void *)&cmd_config_tx_dynf_specific_value, + NULL, + }, +}; + /* *** display tx_metadata per port configuration *** */ struct cmd_show_tx_metadata_result { cmdline_fixed_string_t cmd_show; @@ -18758,8 +19313,8 @@ struct cmd_show_tx_metadata_result { static void cmd_show_tx_metadata_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_show_tx_metadata_result *res = parsed_result; @@ -18769,7 +19324,7 @@ cmd_show_tx_metadata_parsed(void *parsed_result, } if (!strcmp(res->cmd_keyword, "tx_metadata")) { printf("Port %u tx_metadata: %u\n", res->cmd_pid, - rte_be_to_cpu_32(ports[res->cmd_pid].tx_metadata)); + ports[res->cmd_pid].tx_metadata); } } @@ -18799,6 +19354,562 @@ cmdline_parse_inst_t cmd_show_tx_metadata = { }, }; +/* *** show fec capability per port configuration *** */ +struct cmd_show_fec_capability_result { + cmdline_fixed_string_t cmd_show; + cmdline_fixed_string_t cmd_port; + cmdline_fixed_string_t cmd_fec; + cmdline_fixed_string_t cmd_keyword; + portid_t cmd_pid; +}; + +static void +cmd_show_fec_capability_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ +#define FEC_CAP_NUM 2 + struct cmd_show_fec_capability_result *res = parsed_result; + struct rte_eth_fec_capa speed_fec_capa[FEC_CAP_NUM]; + unsigned int num = FEC_CAP_NUM; + unsigned int ret_num; + int ret; + + if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { + printf("Invalid port id %u\n", res->cmd_pid); + return; + } + + ret = rte_eth_fec_get_capability(res->cmd_pid, speed_fec_capa, num); + if (ret == -ENOTSUP) { + printf("Function not implemented\n"); + return; + } else if (ret < 0) { + printf("Get FEC capability failed\n"); + return; + } + + ret_num = (unsigned int)ret; + show_fec_capability(ret_num, speed_fec_capa); +} + +cmdline_parse_token_string_t cmd_show_fec_capability_show = + TOKEN_STRING_INITIALIZER(struct cmd_show_fec_capability_result, + cmd_show, "show"); +cmdline_parse_token_string_t cmd_show_fec_capability_port = + TOKEN_STRING_INITIALIZER(struct cmd_show_fec_capability_result, + cmd_port, "port"); +cmdline_parse_token_num_t cmd_show_fec_capability_pid = + TOKEN_NUM_INITIALIZER(struct cmd_show_fec_capability_result, + cmd_pid, UINT16); +cmdline_parse_token_string_t cmd_show_fec_capability_fec = + TOKEN_STRING_INITIALIZER(struct cmd_show_fec_capability_result, + cmd_fec, "fec"); +cmdline_parse_token_string_t cmd_show_fec_capability_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_show_fec_capability_result, + cmd_keyword, "capabilities"); + +cmdline_parse_inst_t cmd_show_capability = { + .f = cmd_show_fec_capability_parsed, + .data = NULL, + .help_str = "show port fec capabilities", + .tokens = { + (void *)&cmd_show_fec_capability_show, + (void *)&cmd_show_fec_capability_port, + (void *)&cmd_show_fec_capability_pid, + (void *)&cmd_show_fec_capability_fec, + (void *)&cmd_show_fec_capability_keyword, + NULL, + }, +}; + +/* *** show fec mode per port configuration *** */ +struct cmd_show_fec_metadata_result { + cmdline_fixed_string_t cmd_show; + cmdline_fixed_string_t cmd_port; + cmdline_fixed_string_t cmd_keyword; + portid_t cmd_pid; +}; + +static void +cmd_show_fec_mode_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ +#define FEC_NAME_SIZE 16 + struct cmd_show_fec_metadata_result *res = parsed_result; + uint32_t mode; + char buf[FEC_NAME_SIZE]; + int ret; + + if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { + printf("Invalid port id %u\n", res->cmd_pid); + return; + } + ret = rte_eth_fec_get(res->cmd_pid, &mode); + if (ret == -ENOTSUP) { + printf("Function not implemented\n"); + return; + } else if (ret < 0) { + printf("Get FEC mode failed\n"); + return; + } + + switch (mode) { + case RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC): + strlcpy(buf, "off", sizeof(buf)); + break; + case RTE_ETH_FEC_MODE_CAPA_MASK(AUTO): + strlcpy(buf, "auto", sizeof(buf)); + break; + case RTE_ETH_FEC_MODE_CAPA_MASK(BASER): + strlcpy(buf, "baser", sizeof(buf)); + break; + case RTE_ETH_FEC_MODE_CAPA_MASK(RS): + strlcpy(buf, "rs", sizeof(buf)); + break; + default: + return; + } + + printf("%s\n", buf); +} + +cmdline_parse_token_string_t cmd_show_fec_mode_show = + TOKEN_STRING_INITIALIZER(struct cmd_show_fec_metadata_result, + cmd_show, "show"); +cmdline_parse_token_string_t cmd_show_fec_mode_port = + TOKEN_STRING_INITIALIZER(struct cmd_show_fec_metadata_result, + cmd_port, "port"); +cmdline_parse_token_num_t cmd_show_fec_mode_pid = + TOKEN_NUM_INITIALIZER(struct cmd_show_fec_metadata_result, + cmd_pid, UINT16); +cmdline_parse_token_string_t cmd_show_fec_mode_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_show_fec_metadata_result, + cmd_keyword, "fec_mode"); + +cmdline_parse_inst_t cmd_show_fec_mode = { + .f = cmd_show_fec_mode_parsed, + .data = NULL, + .help_str = "show port fec_mode", + .tokens = { + (void *)&cmd_show_fec_mode_show, + (void *)&cmd_show_fec_mode_port, + (void *)&cmd_show_fec_mode_pid, + (void *)&cmd_show_fec_mode_keyword, + NULL, + }, +}; + +/* *** set fec mode per port configuration *** */ +struct cmd_set_port_fec_mode { + cmdline_fixed_string_t set; + cmdline_fixed_string_t port; + portid_t port_id; + cmdline_fixed_string_t fec_mode; + cmdline_fixed_string_t fec_value; +}; + +/* Common CLI fields for set fec mode */ +cmdline_parse_token_string_t cmd_set_port_fec_mode_set = + TOKEN_STRING_INITIALIZER + (struct cmd_set_port_fec_mode, + set, "set"); +cmdline_parse_token_string_t cmd_set_port_fec_mode_port = + TOKEN_STRING_INITIALIZER + (struct cmd_set_port_fec_mode, + port, "port"); +cmdline_parse_token_num_t cmd_set_port_fec_mode_port_id = + TOKEN_NUM_INITIALIZER + (struct cmd_set_port_fec_mode, + port_id, UINT16); +cmdline_parse_token_string_t cmd_set_port_fec_mode_str = + TOKEN_STRING_INITIALIZER + (struct cmd_set_port_fec_mode, + fec_mode, "fec_mode"); +cmdline_parse_token_string_t cmd_set_port_fec_mode_value = + TOKEN_STRING_INITIALIZER + (struct cmd_set_port_fec_mode, + fec_value, NULL); + +static void +cmd_set_port_fec_mode_parsed( + void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ + struct cmd_set_port_fec_mode *res = parsed_result; + uint16_t port_id = res->port_id; + uint32_t mode; + int ret; + + ret = parse_fec_mode(res->fec_value, &mode); + if (ret < 0) { + printf("Unknown fec mode: %s for Port %d\n", res->fec_value, + port_id); + return; + } + + ret = rte_eth_fec_set(port_id, mode); + if (ret == -ENOTSUP) { + printf("Function not implemented\n"); + return; + } else if (ret < 0) { + printf("Set FEC mode failed\n"); + return; + } +} + +cmdline_parse_inst_t cmd_set_fec_mode = { + .f = cmd_set_port_fec_mode_parsed, + .data = NULL, + .help_str = "set port fec_mode auto|off|rs|baser", + .tokens = { + (void *)&cmd_set_port_fec_mode_set, + (void *)&cmd_set_port_fec_mode_port, + (void *)&cmd_set_port_fec_mode_port_id, + (void *)&cmd_set_port_fec_mode_str, + (void *)&cmd_set_port_fec_mode_value, + NULL, + }, +}; + +/* show port supported ptypes */ + +/* Common result structure for show port ptypes */ +struct cmd_show_port_supported_ptypes_result { + cmdline_fixed_string_t show; + cmdline_fixed_string_t port; + portid_t port_id; + cmdline_fixed_string_t ptypes; +}; + +/* Common CLI fields for show port ptypes */ +cmdline_parse_token_string_t cmd_show_port_supported_ptypes_show = + TOKEN_STRING_INITIALIZER + (struct cmd_show_port_supported_ptypes_result, + show, "show"); +cmdline_parse_token_string_t cmd_show_port_supported_ptypes_port = + TOKEN_STRING_INITIALIZER + (struct cmd_show_port_supported_ptypes_result, + port, "port"); +cmdline_parse_token_num_t cmd_show_port_supported_ptypes_port_id = + TOKEN_NUM_INITIALIZER + (struct cmd_show_port_supported_ptypes_result, + port_id, UINT16); +cmdline_parse_token_string_t cmd_show_port_supported_ptypes_ptypes = + TOKEN_STRING_INITIALIZER + (struct cmd_show_port_supported_ptypes_result, + ptypes, "ptypes"); + +static void +cmd_show_port_supported_ptypes_parsed( + void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ +#define RSVD_PTYPE_MASK 0xf0000000 +#define MAX_PTYPES_PER_LAYER 16 +#define LTYPE_NAMESIZE 32 +#define PTYPE_NAMESIZE 256 + struct cmd_show_port_supported_ptypes_result *res = parsed_result; + char buf[PTYPE_NAMESIZE], ltype[LTYPE_NAMESIZE]; + uint32_t ptype_mask = RTE_PTYPE_L2_MASK; + uint32_t ptypes[MAX_PTYPES_PER_LAYER]; + uint16_t port_id = res->port_id; + int ret, i; + + ret = rte_eth_dev_get_supported_ptypes(port_id, ptype_mask, NULL, 0); + if (ret < 0) + return; + + while (ptype_mask != RSVD_PTYPE_MASK) { + + switch (ptype_mask) { + case RTE_PTYPE_L2_MASK: + strlcpy(ltype, "L2", sizeof(ltype)); + break; + case RTE_PTYPE_L3_MASK: + strlcpy(ltype, "L3", sizeof(ltype)); + break; + case RTE_PTYPE_L4_MASK: + strlcpy(ltype, "L4", sizeof(ltype)); + break; + case RTE_PTYPE_TUNNEL_MASK: + strlcpy(ltype, "Tunnel", sizeof(ltype)); + break; + case RTE_PTYPE_INNER_L2_MASK: + strlcpy(ltype, "Inner L2", sizeof(ltype)); + break; + case RTE_PTYPE_INNER_L3_MASK: + strlcpy(ltype, "Inner L3", sizeof(ltype)); + break; + case RTE_PTYPE_INNER_L4_MASK: + strlcpy(ltype, "Inner L4", sizeof(ltype)); + break; + default: + return; + } + + ret = rte_eth_dev_get_supported_ptypes(res->port_id, + ptype_mask, ptypes, + MAX_PTYPES_PER_LAYER); + + if (ret > 0) + printf("Supported %s ptypes:\n", ltype); + else + printf("%s ptypes unsupported\n", ltype); + + for (i = 0; i < ret; ++i) { + rte_get_ptype_name(ptypes[i], buf, sizeof(buf)); + printf("%s\n", buf); + } + + ptype_mask <<= 4; + } +} + +cmdline_parse_inst_t cmd_show_port_supported_ptypes = { + .f = cmd_show_port_supported_ptypes_parsed, + .data = NULL, + .help_str = "show port ptypes", + .tokens = { + (void *)&cmd_show_port_supported_ptypes_show, + (void *)&cmd_show_port_supported_ptypes_port, + (void *)&cmd_show_port_supported_ptypes_port_id, + (void *)&cmd_show_port_supported_ptypes_ptypes, + NULL, + }, +}; + +/* *** display rx/tx descriptor status *** */ +struct cmd_show_rx_tx_desc_status_result { + cmdline_fixed_string_t cmd_show; + cmdline_fixed_string_t cmd_port; + cmdline_fixed_string_t cmd_keyword; + cmdline_fixed_string_t cmd_desc; + cmdline_fixed_string_t cmd_status; + portid_t cmd_pid; + portid_t cmd_qid; + portid_t cmd_did; +}; + +static void +cmd_show_rx_tx_desc_status_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ + struct cmd_show_rx_tx_desc_status_result *res = parsed_result; + int rc; + + if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { + printf("invalid port id %u\n", res->cmd_pid); + return; + } + + if (!strcmp(res->cmd_keyword, "rxq")) { + rc = rte_eth_rx_descriptor_status(res->cmd_pid, res->cmd_qid, + res->cmd_did); + if (rc < 0) { + printf("Invalid queueid = %d\n", res->cmd_qid); + return; + } + if (rc == RTE_ETH_RX_DESC_AVAIL) + printf("Desc status = AVAILABLE\n"); + else if (rc == RTE_ETH_RX_DESC_DONE) + printf("Desc status = DONE\n"); + else + printf("Desc status = UNAVAILABLE\n"); + } else if (!strcmp(res->cmd_keyword, "txq")) { + rc = rte_eth_tx_descriptor_status(res->cmd_pid, res->cmd_qid, + res->cmd_did); + if (rc < 0) { + printf("Invalid queueid = %d\n", res->cmd_qid); + return; + } + if (rc == RTE_ETH_TX_DESC_FULL) + printf("Desc status = FULL\n"); + else if (rc == RTE_ETH_TX_DESC_DONE) + printf("Desc status = DONE\n"); + else + printf("Desc status = UNAVAILABLE\n"); + } +} + +cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_show = + TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, + cmd_show, "show"); +cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_port = + TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, + cmd_port, "port"); +cmdline_parse_token_num_t cmd_show_rx_tx_desc_status_pid = + TOKEN_NUM_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, + cmd_pid, UINT16); +cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, + cmd_keyword, "rxq#txq"); +cmdline_parse_token_num_t cmd_show_rx_tx_desc_status_qid = + TOKEN_NUM_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, + cmd_qid, UINT16); +cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_desc = + TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, + cmd_desc, "desc"); +cmdline_parse_token_num_t cmd_show_rx_tx_desc_status_did = + TOKEN_NUM_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, + cmd_did, UINT16); +cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_status = + TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, + cmd_status, "status"); +cmdline_parse_inst_t cmd_show_rx_tx_desc_status = { + .f = cmd_show_rx_tx_desc_status_parsed, + .data = NULL, + .help_str = "show port rxq|txq desc " + "status", + .tokens = { + (void *)&cmd_show_rx_tx_desc_status_show, + (void *)&cmd_show_rx_tx_desc_status_port, + (void *)&cmd_show_rx_tx_desc_status_pid, + (void *)&cmd_show_rx_tx_desc_status_keyword, + (void *)&cmd_show_rx_tx_desc_status_qid, + (void *)&cmd_show_rx_tx_desc_status_desc, + (void *)&cmd_show_rx_tx_desc_status_did, + (void *)&cmd_show_rx_tx_desc_status_status, + NULL, + }, +}; + +/* Common result structure for set port ptypes */ +struct cmd_set_port_ptypes_result { + cmdline_fixed_string_t set; + cmdline_fixed_string_t port; + portid_t port_id; + cmdline_fixed_string_t ptype_mask; + uint32_t mask; +}; + +/* Common CLI fields for set port ptypes */ +cmdline_parse_token_string_t cmd_set_port_ptypes_set = + TOKEN_STRING_INITIALIZER + (struct cmd_set_port_ptypes_result, + set, "set"); +cmdline_parse_token_string_t cmd_set_port_ptypes_port = + TOKEN_STRING_INITIALIZER + (struct cmd_set_port_ptypes_result, + port, "port"); +cmdline_parse_token_num_t cmd_set_port_ptypes_port_id = + TOKEN_NUM_INITIALIZER + (struct cmd_set_port_ptypes_result, + port_id, UINT16); +cmdline_parse_token_string_t cmd_set_port_ptypes_mask_str = + TOKEN_STRING_INITIALIZER + (struct cmd_set_port_ptypes_result, + ptype_mask, "ptype_mask"); +cmdline_parse_token_num_t cmd_set_port_ptypes_mask_u32 = + TOKEN_NUM_INITIALIZER + (struct cmd_set_port_ptypes_result, + mask, UINT32); + +static void +cmd_set_port_ptypes_parsed( + void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ + struct cmd_set_port_ptypes_result *res = parsed_result; +#define PTYPE_NAMESIZE 256 + char ptype_name[PTYPE_NAMESIZE]; + uint16_t port_id = res->port_id; + uint32_t ptype_mask = res->mask; + int ret, i; + + ret = rte_eth_dev_get_supported_ptypes(port_id, RTE_PTYPE_ALL_MASK, + NULL, 0); + if (ret <= 0) { + printf("Port %d doesn't support any ptypes.\n", port_id); + return; + } + + uint32_t ptypes[ret]; + + ret = rte_eth_dev_set_ptypes(port_id, ptype_mask, ptypes, ret); + if (ret < 0) { + printf("Unable to set requested ptypes for Port %d\n", port_id); + return; + } + + printf("Successfully set following ptypes for Port %d\n", port_id); + for (i = 0; i < ret && ptypes[i] != RTE_PTYPE_UNKNOWN; i++) { + rte_get_ptype_name(ptypes[i], ptype_name, sizeof(ptype_name)); + printf("%s\n", ptype_name); + } + + clear_ptypes = false; +} + +cmdline_parse_inst_t cmd_set_port_ptypes = { + .f = cmd_set_port_ptypes_parsed, + .data = NULL, + .help_str = "set port ptype_mask ", + .tokens = { + (void *)&cmd_set_port_ptypes_set, + (void *)&cmd_set_port_ptypes_port, + (void *)&cmd_set_port_ptypes_port_id, + (void *)&cmd_set_port_ptypes_mask_str, + (void *)&cmd_set_port_ptypes_mask_u32, + NULL, + }, +}; + +/* *** display mac addresses added to a port *** */ +struct cmd_showport_macs_result { + cmdline_fixed_string_t cmd_show; + cmdline_fixed_string_t cmd_port; + cmdline_fixed_string_t cmd_keyword; + portid_t cmd_pid; +}; + +static void +cmd_showport_macs_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ + struct cmd_showport_macs_result *res = parsed_result; + + if (port_id_is_invalid(res->cmd_pid, ENABLED_WARN)) + return; + + if (!strcmp(res->cmd_keyword, "macs")) + show_macs(res->cmd_pid); + else if (!strcmp(res->cmd_keyword, "mcast_macs")) + show_mcast_macs(res->cmd_pid); +} + +cmdline_parse_token_string_t cmd_showport_macs_show = + TOKEN_STRING_INITIALIZER(struct cmd_showport_macs_result, + cmd_show, "show"); +cmdline_parse_token_string_t cmd_showport_macs_port = + TOKEN_STRING_INITIALIZER(struct cmd_showport_macs_result, + cmd_port, "port"); +cmdline_parse_token_num_t cmd_showport_macs_pid = + TOKEN_NUM_INITIALIZER(struct cmd_showport_macs_result, + cmd_pid, UINT16); +cmdline_parse_token_string_t cmd_showport_macs_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_showport_macs_result, + cmd_keyword, "macs#mcast_macs"); + +cmdline_parse_inst_t cmd_showport_macs = { + .f = cmd_showport_macs_parsed, + .data = NULL, + .help_str = "show port macs|mcast_macs", + .tokens = { + (void *)&cmd_showport_macs_show, + (void *)&cmd_showport_macs_port, + (void *)&cmd_showport_macs_pid, + (void *)&cmd_showport_macs_keyword, + NULL, + }, +}; + /* ******************************************************************************** */ /* list of instructions */ @@ -18809,6 +19920,7 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_load_from_file, (cmdline_parse_inst_t *)&cmd_showport, (cmdline_parse_inst_t *)&cmd_showqueue, + (cmdline_parse_inst_t *)&cmd_showeeprom, (cmdline_parse_inst_t *)&cmd_showportall, (cmdline_parse_inst_t *)&cmd_showdevice, (cmdline_parse_inst_t *)&cmd_showcfg, @@ -18821,8 +19933,11 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_reset, (cmdline_parse_inst_t *)&cmd_set_numbers, (cmdline_parse_inst_t *)&cmd_set_log, + (cmdline_parse_inst_t *)&cmd_set_rxoffs, + (cmdline_parse_inst_t *)&cmd_set_rxpkts, (cmdline_parse_inst_t *)&cmd_set_txpkts, (cmdline_parse_inst_t *)&cmd_set_txsplit, + (cmdline_parse_inst_t *)&cmd_set_txtimes, (cmdline_parse_inst_t *)&cmd_set_fwd_list, (cmdline_parse_inst_t *)&cmd_set_fwd_mask, (cmdline_parse_inst_t *)&cmd_set_fwd_mode, @@ -18895,6 +20010,8 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_set_fwd_eth_peer, (cmdline_parse_inst_t *)&cmd_set_qmap, (cmdline_parse_inst_t *)&cmd_set_xstats_hide_zero, + (cmdline_parse_inst_t *)&cmd_set_record_core_cycles, + (cmdline_parse_inst_t *)&cmd_set_record_burst_stats, (cmdline_parse_inst_t *)&cmd_operate_port, (cmdline_parse_inst_t *)&cmd_operate_specific_port, (cmdline_parse_inst_t *)&cmd_operate_attach_port, @@ -18908,6 +20025,7 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_config_rx_tx, (cmdline_parse_inst_t *)&cmd_config_mtu, (cmdline_parse_inst_t *)&cmd_config_max_pkt_len, + (cmdline_parse_inst_t *)&cmd_config_max_lro_pkt_size, (cmdline_parse_inst_t *)&cmd_config_rx_mode_flag, (cmdline_parse_inst_t *)&cmd_config_rss, (cmdline_parse_inst_t *)&cmd_config_rxtx_ring_size, @@ -18916,6 +20034,7 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_setup_rxtx_queue, (cmdline_parse_inst_t *)&cmd_config_rss_reta, (cmdline_parse_inst_t *)&cmd_showport_reta, + (cmdline_parse_inst_t *)&cmd_showport_macs, (cmdline_parse_inst_t *)&cmd_config_burst, (cmdline_parse_inst_t *)&cmd_config_thresh, (cmdline_parse_inst_t *)&cmd_config_threshold, @@ -19009,9 +20128,6 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_vf_tc_max_bw, (cmdline_parse_inst_t *)&cmd_strict_link_prio, (cmdline_parse_inst_t *)&cmd_tc_min_bw, -#if defined RTE_LIBRTE_PMD_SOFTNIC && defined RTE_LIBRTE_SCHED - (cmdline_parse_inst_t *)&cmd_set_port_tm_hierarchy_default, -#endif (cmdline_parse_inst_t *)&cmd_set_vxlan, (cmdline_parse_inst_t *)&cmd_set_vxlan_tos_ttl, (cmdline_parse_inst_t *)&cmd_set_vxlan_with_vlan, @@ -19037,6 +20153,8 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_clear_input_set, (cmdline_parse_inst_t *)&cmd_show_vf_stats, (cmdline_parse_inst_t *)&cmd_clear_vf_stats, + (cmdline_parse_inst_t *)&cmd_show_port_supported_ptypes, + (cmdline_parse_inst_t *)&cmd_set_port_ptypes, (cmdline_parse_inst_t *)&cmd_ptype_mapping_get, (cmdline_parse_inst_t *)&cmd_ptype_mapping_replace, (cmdline_parse_inst_t *)&cmd_ptype_mapping_reset, @@ -19063,6 +20181,7 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_del_port_tm_node_wred_profile, (cmdline_parse_inst_t *)&cmd_set_port_tm_node_shaper_profile, (cmdline_parse_inst_t *)&cmd_add_port_tm_nonleaf_node, + (cmdline_parse_inst_t *)&cmd_add_port_tm_nonleaf_node_pmode, (cmdline_parse_inst_t *)&cmd_add_port_tm_leaf_node, (cmdline_parse_inst_t *)&cmd_del_port_tm_node, (cmdline_parse_inst_t *)&cmd_set_port_tm_node_parent, @@ -19087,7 +20206,14 @@ cmdline_parse_ctx_t main_ctx[] = { #endif (cmdline_parse_inst_t *)&cmd_config_tx_metadata_specific, (cmdline_parse_inst_t *)&cmd_show_tx_metadata, + (cmdline_parse_inst_t *)&cmd_show_rx_tx_desc_status, (cmdline_parse_inst_t *)&cmd_set_raw, + (cmdline_parse_inst_t *)&cmd_show_set_raw, + (cmdline_parse_inst_t *)&cmd_show_set_raw_all, + (cmdline_parse_inst_t *)&cmd_config_tx_dynf_specific, + (cmdline_parse_inst_t *)&cmd_show_fec_mode, + (cmdline_parse_inst_t *)&cmd_set_fec_mode, + (cmdline_parse_inst_t *)&cmd_show_capability, NULL, };