13850cb06SSunil Kumar Kori /* SPDX-License-Identifier: BSD-3-Clause 23850cb06SSunil Kumar Kori * Copyright(c) 2023 Marvell. 33850cb06SSunil Kumar Kori */ 43850cb06SSunil Kumar Kori 53850cb06SSunil Kumar Kori #include <stdio.h> 63850cb06SSunil Kumar Kori #include <stdlib.h> 73850cb06SSunil Kumar Kori #include <string.h> 83850cb06SSunil Kumar Kori 93850cb06SSunil Kumar Kori #include <cmdline_parse.h> 103850cb06SSunil Kumar Kori #include <cmdline_parse_num.h> 113850cb06SSunil Kumar Kori #include <cmdline_parse_string.h> 123850cb06SSunil Kumar Kori #include <cmdline_socket.h> 133850cb06SSunil Kumar Kori #include <rte_bitops.h> 143850cb06SSunil Kumar Kori #include <rte_ethdev.h> 153850cb06SSunil Kumar Kori #include <rte_mempool.h> 163850cb06SSunil Kumar Kori 173850cb06SSunil Kumar Kori #include "ethdev_priv.h" 183850cb06SSunil Kumar Kori #include "module_api.h" 193850cb06SSunil Kumar Kori 203850cb06SSunil Kumar Kori static const char 213850cb06SSunil Kumar Kori cmd_ethdev_mtu_help[] = "ethdev <ethdev_name> mtu <mtu_sz>"; 223850cb06SSunil Kumar Kori 233850cb06SSunil Kumar Kori static const char 243850cb06SSunil Kumar Kori cmd_ethdev_prom_mode_help[] = "ethdev <ethdev_name> promiscuous <on/off>"; 253850cb06SSunil Kumar Kori 263850cb06SSunil Kumar Kori static const char 273850cb06SSunil Kumar Kori cmd_ethdev_help[] = "ethdev <ethdev_name> rxq <n_queues> txq <n_queues> <mempool_name>"; 283850cb06SSunil Kumar Kori 293850cb06SSunil Kumar Kori static const char 303850cb06SSunil Kumar Kori cmd_ethdev_stats_help[] = "ethdev <ethdev_name> stats"; 313850cb06SSunil Kumar Kori 323850cb06SSunil Kumar Kori static const char 333850cb06SSunil Kumar Kori cmd_ethdev_show_help[] = "ethdev <ethdev_name> show"; 343850cb06SSunil Kumar Kori 353850cb06SSunil Kumar Kori static const char 363850cb06SSunil Kumar Kori cmd_ethdev_ip4_addr_help[] = "ethdev <ethdev_name> ip4 addr add <ip> netmask <mask>"; 373850cb06SSunil Kumar Kori 383850cb06SSunil Kumar Kori static const char 393850cb06SSunil Kumar Kori cmd_ethdev_ip6_addr_help[] = "ethdev <ethdev_name> ip6 addr add <ip> netmask <mask>"; 403850cb06SSunil Kumar Kori 410eb39f1dSRakesh Kudurumalla static const char 420eb39f1dSRakesh Kudurumalla cmd_ethdev_forward_help[] = "ethdev forward <tx_dev_name> <rx_dev_name>"; 430eb39f1dSRakesh Kudurumalla 443850cb06SSunil Kumar Kori static struct rte_eth_conf port_conf_default = { 453850cb06SSunil Kumar Kori .link_speeds = 0, 463850cb06SSunil Kumar Kori .rxmode = { 473850cb06SSunil Kumar Kori .mq_mode = RTE_ETH_MQ_RX_NONE, 483850cb06SSunil Kumar Kori .mtu = 9000 - (RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN), /* Jumbo frame MTU */ 493850cb06SSunil Kumar Kori }, 503850cb06SSunil Kumar Kori .rx_adv_conf = { 513850cb06SSunil Kumar Kori .rss_conf = { 523850cb06SSunil Kumar Kori .rss_key = NULL, 533850cb06SSunil Kumar Kori .rss_key_len = 40, 543850cb06SSunil Kumar Kori .rss_hf = 0, 553850cb06SSunil Kumar Kori }, 563850cb06SSunil Kumar Kori }, 573850cb06SSunil Kumar Kori .txmode = { 583850cb06SSunil Kumar Kori .mq_mode = RTE_ETH_MQ_TX_NONE, 593850cb06SSunil Kumar Kori }, 603850cb06SSunil Kumar Kori .lpbk_mode = 0, 613850cb06SSunil Kumar Kori }; 623850cb06SSunil Kumar Kori 633850cb06SSunil Kumar Kori uint32_t enabled_port_mask; 643850cb06SSunil Kumar Kori static struct ethdev_head eth_node = TAILQ_HEAD_INITIALIZER(eth_node); 653850cb06SSunil Kumar Kori 663850cb06SSunil Kumar Kori 673850cb06SSunil Kumar Kori static struct ethdev* 683850cb06SSunil Kumar Kori ethdev_port_by_id(uint16_t port_id) 693850cb06SSunil Kumar Kori { 703850cb06SSunil Kumar Kori struct ethdev *port; 713850cb06SSunil Kumar Kori 723850cb06SSunil Kumar Kori TAILQ_FOREACH(port, ð_node, next) { 733850cb06SSunil Kumar Kori if (port->config.port_id == port_id) 743850cb06SSunil Kumar Kori return port; 753850cb06SSunil Kumar Kori } 763850cb06SSunil Kumar Kori return NULL; 773850cb06SSunil Kumar Kori } 783850cb06SSunil Kumar Kori 792c7debd9SRakesh Kudurumalla int16_t 802c7debd9SRakesh Kudurumalla ethdev_txport_by_rxport_get(uint16_t portid_rx) 812c7debd9SRakesh Kudurumalla { 822c7debd9SRakesh Kudurumalla int portid = -EINVAL; 832c7debd9SRakesh Kudurumalla struct ethdev *port; 842c7debd9SRakesh Kudurumalla 852c7debd9SRakesh Kudurumalla port = ethdev_port_by_id(portid_rx); 862c7debd9SRakesh Kudurumalla if (port) 872c7debd9SRakesh Kudurumalla portid = port->tx_port_id; 882c7debd9SRakesh Kudurumalla 892c7debd9SRakesh Kudurumalla return portid; 902c7debd9SRakesh Kudurumalla } 912c7debd9SRakesh Kudurumalla 923850cb06SSunil Kumar Kori void * 933850cb06SSunil Kumar Kori ethdev_mempool_list_by_portid(uint16_t portid) 943850cb06SSunil Kumar Kori { 953850cb06SSunil Kumar Kori struct ethdev *port; 963850cb06SSunil Kumar Kori 973850cb06SSunil Kumar Kori if (portid >= RTE_MAX_ETHPORTS) 983850cb06SSunil Kumar Kori return NULL; 993850cb06SSunil Kumar Kori 1003850cb06SSunil Kumar Kori port = ethdev_port_by_id(portid); 1013850cb06SSunil Kumar Kori if (port) 1023850cb06SSunil Kumar Kori return &(port->config.rx.mp); 1033850cb06SSunil Kumar Kori else 1043850cb06SSunil Kumar Kori return NULL; 1053850cb06SSunil Kumar Kori } 1063850cb06SSunil Kumar Kori 1073850cb06SSunil Kumar Kori int16_t 1083850cb06SSunil Kumar Kori ethdev_portid_by_ip4(uint32_t ip, uint32_t mask) 1093850cb06SSunil Kumar Kori { 1103850cb06SSunil Kumar Kori int portid = -EINVAL; 1113850cb06SSunil Kumar Kori struct ethdev *port; 1123850cb06SSunil Kumar Kori 1133850cb06SSunil Kumar Kori TAILQ_FOREACH(port, ð_node, next) { 1143850cb06SSunil Kumar Kori if (mask == 0) { 1153850cb06SSunil Kumar Kori if ((port->ip4_addr.ip & port->ip4_addr.mask) == (ip & port->ip4_addr.mask)) 1163850cb06SSunil Kumar Kori return port->config.port_id; 1173850cb06SSunil Kumar Kori } else { 1183850cb06SSunil Kumar Kori if ((port->ip4_addr.ip & port->ip4_addr.mask) == (ip & mask)) 1193850cb06SSunil Kumar Kori return port->config.port_id; 1203850cb06SSunil Kumar Kori } 1213850cb06SSunil Kumar Kori } 1223850cb06SSunil Kumar Kori 1233850cb06SSunil Kumar Kori return portid; 1243850cb06SSunil Kumar Kori } 1253850cb06SSunil Kumar Kori 1263850cb06SSunil Kumar Kori int16_t 1272cfebc3fSRobin Jarry ethdev_portid_by_ip6(struct rte_ipv6_addr *ip, struct rte_ipv6_addr *mask) 1283850cb06SSunil Kumar Kori { 1293850cb06SSunil Kumar Kori struct ethdev *port; 1303850cb06SSunil Kumar Kori 1313850cb06SSunil Kumar Kori TAILQ_FOREACH(port, ð_node, next) { 1322cfebc3fSRobin Jarry uint8_t depth = rte_ipv6_mask_depth(&port->ip6_addr.mask); 1332cfebc3fSRobin Jarry if (mask != NULL) 1342cfebc3fSRobin Jarry depth = RTE_MAX(depth, rte_ipv6_mask_depth(mask)); 1352cfebc3fSRobin Jarry if (rte_ipv6_addr_eq_prefix(&port->ip6_addr.ip, ip, depth)) 1363850cb06SSunil Kumar Kori return port->config.port_id; 1373850cb06SSunil Kumar Kori } 1383850cb06SSunil Kumar Kori 1392cfebc3fSRobin Jarry return -EINVAL; 1403850cb06SSunil Kumar Kori } 1413850cb06SSunil Kumar Kori 1423850cb06SSunil Kumar Kori void 1433850cb06SSunil Kumar Kori ethdev_list_clean(void) 1443850cb06SSunil Kumar Kori { 1453850cb06SSunil Kumar Kori struct ethdev *port; 1463850cb06SSunil Kumar Kori 1473850cb06SSunil Kumar Kori while (!TAILQ_EMPTY(ð_node)) { 1483850cb06SSunil Kumar Kori port = TAILQ_FIRST(ð_node); 1493850cb06SSunil Kumar Kori TAILQ_REMOVE(ð_node, port, next); 1503850cb06SSunil Kumar Kori } 1513850cb06SSunil Kumar Kori } 1523850cb06SSunil Kumar Kori 1533850cb06SSunil Kumar Kori void 1543850cb06SSunil Kumar Kori ethdev_stop(void) 1553850cb06SSunil Kumar Kori { 1563850cb06SSunil Kumar Kori uint16_t portid; 1573850cb06SSunil Kumar Kori int rc; 1583850cb06SSunil Kumar Kori 1593850cb06SSunil Kumar Kori RTE_ETH_FOREACH_DEV(portid) { 1603850cb06SSunil Kumar Kori if ((enabled_port_mask & (1 << portid)) == 0) 1613850cb06SSunil Kumar Kori continue; 1623850cb06SSunil Kumar Kori printf("Closing port %d...", portid); 1633850cb06SSunil Kumar Kori rc = rte_eth_dev_stop(portid); 1643850cb06SSunil Kumar Kori if (rc != 0) 1653850cb06SSunil Kumar Kori printf("Failed to stop port %u: %s\n", 1663850cb06SSunil Kumar Kori portid, rte_strerror(-rc)); 1673850cb06SSunil Kumar Kori rte_eth_dev_close(portid); 1683850cb06SSunil Kumar Kori printf(" Done\n"); 1693850cb06SSunil Kumar Kori } 1703850cb06SSunil Kumar Kori 1713850cb06SSunil Kumar Kori ethdev_list_clean(); 172aff63b6dSSunil Kumar Kori route_ip4_list_clean(); 17383b8e58eSRakesh Kudurumalla route_ip6_list_clean(); 1749a3a41ebSSunil Kumar Kori neigh4_list_clean(); 1759a3a41ebSSunil Kumar Kori neigh6_list_clean(); 1763850cb06SSunil Kumar Kori printf("Bye...\n"); 1773850cb06SSunil Kumar Kori } 1783850cb06SSunil Kumar Kori 1793850cb06SSunil Kumar Kori void 1803850cb06SSunil Kumar Kori ethdev_start(void) 1813850cb06SSunil Kumar Kori { 1823850cb06SSunil Kumar Kori uint16_t portid; 1833850cb06SSunil Kumar Kori int rc; 1843850cb06SSunil Kumar Kori 1853850cb06SSunil Kumar Kori RTE_ETH_FOREACH_DEV(portid) 1863850cb06SSunil Kumar Kori { 1873850cb06SSunil Kumar Kori if ((enabled_port_mask & (1 << portid)) == 0) 1883850cb06SSunil Kumar Kori continue; 1893850cb06SSunil Kumar Kori 1903850cb06SSunil Kumar Kori rc = rte_eth_dev_start(portid); 1913850cb06SSunil Kumar Kori if (rc < 0) 1923850cb06SSunil Kumar Kori rte_exit(EXIT_FAILURE, "rte_eth_dev_start: err=%d, port=%d\n", rc, portid); 1933850cb06SSunil Kumar Kori } 1943850cb06SSunil Kumar Kori } 1953850cb06SSunil Kumar Kori 1963850cb06SSunil Kumar Kori static int 1973850cb06SSunil Kumar Kori ethdev_show(const char *name) 1983850cb06SSunil Kumar Kori { 1993850cb06SSunil Kumar Kori uint16_t mtu = 0, port_id = 0; 2003850cb06SSunil Kumar Kori struct rte_eth_dev_info info; 2013850cb06SSunil Kumar Kori struct rte_eth_stats stats; 2023850cb06SSunil Kumar Kori struct rte_ether_addr addr; 2033850cb06SSunil Kumar Kori struct rte_eth_link link; 2043850cb06SSunil Kumar Kori uint32_t length; 2053850cb06SSunil Kumar Kori int rc; 2063850cb06SSunil Kumar Kori 2073850cb06SSunil Kumar Kori rc = rte_eth_dev_get_port_by_name(name, &port_id); 2083850cb06SSunil Kumar Kori if (rc < 0) 2093850cb06SSunil Kumar Kori return rc; 2103850cb06SSunil Kumar Kori 211*fe02b98cSStephen Hemminger rc = rte_eth_dev_info_get(port_id, &info); 212*fe02b98cSStephen Hemminger if (rc < 0) 213*fe02b98cSStephen Hemminger return rc; 214*fe02b98cSStephen Hemminger 215*fe02b98cSStephen Hemminger rc = rte_eth_link_get(port_id, &link); 216*fe02b98cSStephen Hemminger if (rc < 0) 217*fe02b98cSStephen Hemminger return rc; 218*fe02b98cSStephen Hemminger 219*fe02b98cSStephen Hemminger rc = rte_eth_stats_get(port_id, &stats); 220*fe02b98cSStephen Hemminger if (rc < 0) 221*fe02b98cSStephen Hemminger return rc; 222*fe02b98cSStephen Hemminger 223*fe02b98cSStephen Hemminger rc = rte_eth_macaddr_get(port_id, &addr); 224*fe02b98cSStephen Hemminger if (rc < 0) 225*fe02b98cSStephen Hemminger return rc; 226*fe02b98cSStephen Hemminger 2273850cb06SSunil Kumar Kori rte_eth_dev_get_mtu(port_id, &mtu); 2283850cb06SSunil Kumar Kori 2293850cb06SSunil Kumar Kori length = strlen(conn->msg_out); 2303850cb06SSunil Kumar Kori conn->msg_out += length; 2313850cb06SSunil Kumar Kori snprintf(conn->msg_out, conn->msg_out_len_max, 2323850cb06SSunil Kumar Kori "%s: flags=<%s> mtu %u\n" 2333850cb06SSunil Kumar Kori "\tether " RTE_ETHER_ADDR_PRT_FMT " rxqueues %u txqueues %u\n" 2343850cb06SSunil Kumar Kori "\tport# %u speed %s\n" 2353850cb06SSunil Kumar Kori "\tRX packets %" PRIu64" bytes %" PRIu64"\n" 2363850cb06SSunil Kumar Kori "\tRX errors %" PRIu64" missed %" PRIu64" no-mbuf %" PRIu64"\n" 2373850cb06SSunil Kumar Kori "\tTX packets %" PRIu64" bytes %" PRIu64"\n" 2383850cb06SSunil Kumar Kori "\tTX errors %" PRIu64"\n\n", 2393850cb06SSunil Kumar Kori name, 2403850cb06SSunil Kumar Kori link.link_status ? "UP" : "DOWN", 2413850cb06SSunil Kumar Kori mtu, 2423850cb06SSunil Kumar Kori RTE_ETHER_ADDR_BYTES(&addr), 2433850cb06SSunil Kumar Kori info.nb_rx_queues, 2443850cb06SSunil Kumar Kori info.nb_tx_queues, 2453850cb06SSunil Kumar Kori port_id, 2463850cb06SSunil Kumar Kori rte_eth_link_speed_to_str(link.link_speed), 2473850cb06SSunil Kumar Kori stats.ipackets, 2483850cb06SSunil Kumar Kori stats.ibytes, 2493850cb06SSunil Kumar Kori stats.ierrors, 2503850cb06SSunil Kumar Kori stats.imissed, 2513850cb06SSunil Kumar Kori stats.rx_nombuf, 2523850cb06SSunil Kumar Kori stats.opackets, 2533850cb06SSunil Kumar Kori stats.obytes, 2543850cb06SSunil Kumar Kori stats.oerrors); 2553850cb06SSunil Kumar Kori 2563850cb06SSunil Kumar Kori length = strlen(conn->msg_out); 2573850cb06SSunil Kumar Kori conn->msg_out_len_max -= length; 2583850cb06SSunil Kumar Kori return 0; 2593850cb06SSunil Kumar Kori } 2603850cb06SSunil Kumar Kori 2613850cb06SSunil Kumar Kori static int 2623850cb06SSunil Kumar Kori ethdev_ip4_addr_add(const char *name, struct ipv4_addr_config *config) 2633850cb06SSunil Kumar Kori { 2643850cb06SSunil Kumar Kori struct ethdev *eth_hdl; 2653850cb06SSunil Kumar Kori uint16_t portid = 0; 2663850cb06SSunil Kumar Kori int rc; 2673850cb06SSunil Kumar Kori 2683850cb06SSunil Kumar Kori rc = rte_eth_dev_get_port_by_name(name, &portid); 2693850cb06SSunil Kumar Kori if (rc < 0) 2703850cb06SSunil Kumar Kori return rc; 2713850cb06SSunil Kumar Kori 2723850cb06SSunil Kumar Kori eth_hdl = ethdev_port_by_id(portid); 2733850cb06SSunil Kumar Kori 2743850cb06SSunil Kumar Kori if (eth_hdl) { 2753850cb06SSunil Kumar Kori eth_hdl->ip4_addr.ip = config->ip; 2763850cb06SSunil Kumar Kori eth_hdl->ip4_addr.mask = config->mask; 2773850cb06SSunil Kumar Kori return 0; 2783850cb06SSunil Kumar Kori } 2793850cb06SSunil Kumar Kori 2803850cb06SSunil Kumar Kori rc = -EINVAL; 2813850cb06SSunil Kumar Kori return rc; 2823850cb06SSunil Kumar Kori } 2833850cb06SSunil Kumar Kori 2843850cb06SSunil Kumar Kori static int 2853850cb06SSunil Kumar Kori ethdev_ip6_addr_add(const char *name, struct ipv6_addr_config *config) 2863850cb06SSunil Kumar Kori { 2873850cb06SSunil Kumar Kori struct ethdev *eth_hdl; 2883850cb06SSunil Kumar Kori uint16_t portid = 0; 2892cfebc3fSRobin Jarry int rc; 2903850cb06SSunil Kumar Kori 2913850cb06SSunil Kumar Kori rc = rte_eth_dev_get_port_by_name(name, &portid); 2923850cb06SSunil Kumar Kori if (rc < 0) 2933850cb06SSunil Kumar Kori return rc; 2943850cb06SSunil Kumar Kori 2953850cb06SSunil Kumar Kori eth_hdl = ethdev_port_by_id(portid); 2963850cb06SSunil Kumar Kori 2973850cb06SSunil Kumar Kori if (eth_hdl) { 2982cfebc3fSRobin Jarry eth_hdl->ip6_addr.ip = config->ip; 2992cfebc3fSRobin Jarry eth_hdl->ip6_addr.mask = config->mask; 3003850cb06SSunil Kumar Kori return 0; 3013850cb06SSunil Kumar Kori } 3023850cb06SSunil Kumar Kori rc = -EINVAL; 3033850cb06SSunil Kumar Kori return rc; 3043850cb06SSunil Kumar Kori } 3053850cb06SSunil Kumar Kori 3063850cb06SSunil Kumar Kori static int 3073850cb06SSunil Kumar Kori ethdev_prom_mode_config(const char *name, bool enable) 3083850cb06SSunil Kumar Kori { 3093850cb06SSunil Kumar Kori struct ethdev *eth_hdl; 3103850cb06SSunil Kumar Kori uint16_t portid = 0; 3113850cb06SSunil Kumar Kori int rc; 3123850cb06SSunil Kumar Kori 3133850cb06SSunil Kumar Kori rc = rte_eth_dev_get_port_by_name(name, &portid); 3143850cb06SSunil Kumar Kori if (rc < 0) 3153850cb06SSunil Kumar Kori return rc; 3163850cb06SSunil Kumar Kori 3173850cb06SSunil Kumar Kori eth_hdl = ethdev_port_by_id(portid); 3183850cb06SSunil Kumar Kori 3193850cb06SSunil Kumar Kori if (eth_hdl) { 3203850cb06SSunil Kumar Kori if (enable) 3213850cb06SSunil Kumar Kori rc = rte_eth_promiscuous_enable(portid); 3223850cb06SSunil Kumar Kori else 3233850cb06SSunil Kumar Kori rc = rte_eth_promiscuous_disable(portid); 3243850cb06SSunil Kumar Kori if (rc < 0) 3253850cb06SSunil Kumar Kori return rc; 3263850cb06SSunil Kumar Kori 3273850cb06SSunil Kumar Kori eth_hdl->config.promiscuous = enable; 3283850cb06SSunil Kumar Kori return 0; 3293850cb06SSunil Kumar Kori } 3303850cb06SSunil Kumar Kori 3313850cb06SSunil Kumar Kori rc = -EINVAL; 3323850cb06SSunil Kumar Kori return rc; 3333850cb06SSunil Kumar Kori } 3343850cb06SSunil Kumar Kori 3353850cb06SSunil Kumar Kori static int 3363850cb06SSunil Kumar Kori ethdev_mtu_config(const char *name, uint32_t mtu) 3373850cb06SSunil Kumar Kori { 3383850cb06SSunil Kumar Kori struct ethdev *eth_hdl; 3393850cb06SSunil Kumar Kori uint16_t portid = 0; 3403850cb06SSunil Kumar Kori int rc; 3413850cb06SSunil Kumar Kori 3423850cb06SSunil Kumar Kori rc = rte_eth_dev_get_port_by_name(name, &portid); 3433850cb06SSunil Kumar Kori if (rc < 0) 3443850cb06SSunil Kumar Kori return rc; 3453850cb06SSunil Kumar Kori 3463850cb06SSunil Kumar Kori eth_hdl = ethdev_port_by_id(portid); 3473850cb06SSunil Kumar Kori 3483850cb06SSunil Kumar Kori if (eth_hdl) { 3493850cb06SSunil Kumar Kori rc = rte_eth_dev_set_mtu(portid, mtu); 3503850cb06SSunil Kumar Kori if (rc < 0) 3513850cb06SSunil Kumar Kori return rc; 3523850cb06SSunil Kumar Kori 3533850cb06SSunil Kumar Kori eth_hdl->config.mtu = mtu; 3543850cb06SSunil Kumar Kori return 0; 3553850cb06SSunil Kumar Kori } 3563850cb06SSunil Kumar Kori 3573850cb06SSunil Kumar Kori rc = -EINVAL; 3583850cb06SSunil Kumar Kori return rc; 3593850cb06SSunil Kumar Kori } 3603850cb06SSunil Kumar Kori 3613850cb06SSunil Kumar Kori static int 3623850cb06SSunil Kumar Kori ethdev_process(const char *name, struct ethdev_config *params) 3633850cb06SSunil Kumar Kori { 3643850cb06SSunil Kumar Kori struct rte_eth_dev_info port_info; 3653850cb06SSunil Kumar Kori struct rte_eth_conf port_conf; 3663850cb06SSunil Kumar Kori struct ethdev_rss_config *rss; 3673850cb06SSunil Kumar Kori struct rte_mempool *mempool; 3683850cb06SSunil Kumar Kori struct ethdev *ethdev_port; 3693850cb06SSunil Kumar Kori struct rte_ether_addr smac; 3703850cb06SSunil Kumar Kori uint16_t port_id = 0; 3713850cb06SSunil Kumar Kori int numa_node, rc; 3723850cb06SSunil Kumar Kori uint32_t i; 3733850cb06SSunil Kumar Kori 3743850cb06SSunil Kumar Kori /* Check input params */ 3753850cb06SSunil Kumar Kori if (!name || !name[0] || !params || !params->rx.n_queues || !params->rx.queue_size || 3763850cb06SSunil Kumar Kori !params->tx.n_queues || !params->tx.queue_size) 3773850cb06SSunil Kumar Kori return -EINVAL; 3783850cb06SSunil Kumar Kori 3793850cb06SSunil Kumar Kori rc = rte_eth_dev_get_port_by_name(name, &port_id); 3803850cb06SSunil Kumar Kori if (rc) 3813850cb06SSunil Kumar Kori return -EINVAL; 3823850cb06SSunil Kumar Kori 3833850cb06SSunil Kumar Kori if (!ethdev_port_by_id(port_id)) { 3843850cb06SSunil Kumar Kori ethdev_port = malloc(sizeof(struct ethdev)); 3853850cb06SSunil Kumar Kori if (!ethdev_port) 3863850cb06SSunil Kumar Kori return -EINVAL; 3873850cb06SSunil Kumar Kori } else { 3883850cb06SSunil Kumar Kori return 0; 3893850cb06SSunil Kumar Kori } 3903850cb06SSunil Kumar Kori 3913850cb06SSunil Kumar Kori rc = rte_eth_dev_info_get(port_id, &port_info); 3923850cb06SSunil Kumar Kori if (rc) { 3933850cb06SSunil Kumar Kori rc = -EINVAL; 3943850cb06SSunil Kumar Kori goto exit; 3953850cb06SSunil Kumar Kori } 3963850cb06SSunil Kumar Kori 3973850cb06SSunil Kumar Kori mempool = rte_mempool_lookup(params->rx.mempool_name); 3983850cb06SSunil Kumar Kori if (!mempool) { 3993850cb06SSunil Kumar Kori rc = -EINVAL; 4003850cb06SSunil Kumar Kori goto exit; 4013850cb06SSunil Kumar Kori } 4023850cb06SSunil Kumar Kori 4033850cb06SSunil Kumar Kori params->rx.mp = mempool; 4043850cb06SSunil Kumar Kori 4053850cb06SSunil Kumar Kori rss = params->rx.rss; 4063850cb06SSunil Kumar Kori if (rss) { 4073850cb06SSunil Kumar Kori if (!port_info.reta_size || port_info.reta_size > RTE_ETH_RSS_RETA_SIZE_512) { 4083850cb06SSunil Kumar Kori rc = -EINVAL; 4093850cb06SSunil Kumar Kori goto exit; 4103850cb06SSunil Kumar Kori } 4113850cb06SSunil Kumar Kori 4123850cb06SSunil Kumar Kori if (!rss->n_queues || rss->n_queues >= ETHDEV_RXQ_RSS_MAX) { 4133850cb06SSunil Kumar Kori rc = -EINVAL; 4143850cb06SSunil Kumar Kori goto exit; 4153850cb06SSunil Kumar Kori } 4163850cb06SSunil Kumar Kori 4173850cb06SSunil Kumar Kori for (i = 0; i < rss->n_queues; i++) 4183850cb06SSunil Kumar Kori if (rss->queue_id[i] >= port_info.max_rx_queues) { 4193850cb06SSunil Kumar Kori rc = -EINVAL; 4203850cb06SSunil Kumar Kori goto exit; 4213850cb06SSunil Kumar Kori } 4223850cb06SSunil Kumar Kori } 4233850cb06SSunil Kumar Kori 4243850cb06SSunil Kumar Kori /* Port */ 4253850cb06SSunil Kumar Kori memcpy(&port_conf, &port_conf_default, sizeof(struct rte_eth_conf)); 4263850cb06SSunil Kumar Kori if (rss) { 4273850cb06SSunil Kumar Kori uint64_t rss_hf = RTE_ETH_RSS_IP | RTE_ETH_RSS_TCP | RTE_ETH_RSS_UDP; 4283850cb06SSunil Kumar Kori 4293850cb06SSunil Kumar Kori port_conf.rxmode.mq_mode = RTE_ETH_MQ_RX_RSS; 4303850cb06SSunil Kumar Kori port_conf.rx_adv_conf.rss_conf.rss_hf = rss_hf & port_info.flow_type_rss_offloads; 4313850cb06SSunil Kumar Kori } 4323850cb06SSunil Kumar Kori 4333850cb06SSunil Kumar Kori numa_node = rte_eth_dev_socket_id(port_id); 4343850cb06SSunil Kumar Kori if (numa_node == SOCKET_ID_ANY) 4353850cb06SSunil Kumar Kori numa_node = 0; 4363850cb06SSunil Kumar Kori 4373850cb06SSunil Kumar Kori if (params->mtu) 4383850cb06SSunil Kumar Kori port_conf.rxmode.mtu = params->mtu; 4393850cb06SSunil Kumar Kori 4403850cb06SSunil Kumar Kori rc = rte_eth_dev_configure(port_id, params->rx.n_queues, params->tx.n_queues, 4413850cb06SSunil Kumar Kori &port_conf); 4423850cb06SSunil Kumar Kori if (rc < 0) { 4433850cb06SSunil Kumar Kori rc = -EINVAL; 4443850cb06SSunil Kumar Kori goto exit; 4453850cb06SSunil Kumar Kori } 4463850cb06SSunil Kumar Kori 4473850cb06SSunil Kumar Kori rc = rte_eth_macaddr_get(port_id, &smac); 4483850cb06SSunil Kumar Kori if (rc < 0) { 4493850cb06SSunil Kumar Kori rc = -EINVAL; 4503850cb06SSunil Kumar Kori goto exit; 4513850cb06SSunil Kumar Kori } 4523850cb06SSunil Kumar Kori 4533850cb06SSunil Kumar Kori printf("Port_id = %d srcmac = %x:%x:%x:%x:%x:%x\n", port_id, 4543850cb06SSunil Kumar Kori smac.addr_bytes[0], smac.addr_bytes[1], 4553850cb06SSunil Kumar Kori smac.addr_bytes[2], smac.addr_bytes[3], 4563850cb06SSunil Kumar Kori smac.addr_bytes[4], smac.addr_bytes[5]); 4573850cb06SSunil Kumar Kori 4583850cb06SSunil Kumar Kori /* Port RX */ 4593850cb06SSunil Kumar Kori for (i = 0; i < params->rx.n_queues; i++) { 4603850cb06SSunil Kumar Kori rc = rte_eth_rx_queue_setup(port_id, i, params->rx.queue_size, numa_node, NULL, 4613850cb06SSunil Kumar Kori mempool); 4623850cb06SSunil Kumar Kori if (rc < 0) { 4633850cb06SSunil Kumar Kori rc = -EINVAL; 4643850cb06SSunil Kumar Kori goto exit; 4653850cb06SSunil Kumar Kori } 4663850cb06SSunil Kumar Kori } 4673850cb06SSunil Kumar Kori 4683850cb06SSunil Kumar Kori /* Port TX */ 4693850cb06SSunil Kumar Kori for (i = 0; i < params->tx.n_queues; i++) { 4703850cb06SSunil Kumar Kori rc = rte_eth_tx_queue_setup(port_id, i, params->tx.queue_size, numa_node, NULL); 4713850cb06SSunil Kumar Kori if (rc < 0) { 4723850cb06SSunil Kumar Kori rc = -EINVAL; 4733850cb06SSunil Kumar Kori goto exit; 4743850cb06SSunil Kumar Kori } 4753850cb06SSunil Kumar Kori } 4763850cb06SSunil Kumar Kori 4773850cb06SSunil Kumar Kori memcpy(ðdev_port->config, params, sizeof(struct ethdev_config)); 4783850cb06SSunil Kumar Kori memcpy(ethdev_port->config.dev_name, name, strlen(name)); 4793850cb06SSunil Kumar Kori ethdev_port->config.port_id = port_id; 4803850cb06SSunil Kumar Kori enabled_port_mask |= RTE_BIT32(port_id); 4813850cb06SSunil Kumar Kori 4823850cb06SSunil Kumar Kori TAILQ_INSERT_TAIL(ð_node, ethdev_port, next); 4833850cb06SSunil Kumar Kori return 0; 4843850cb06SSunil Kumar Kori exit: 4853850cb06SSunil Kumar Kori free(ethdev_port); 4863850cb06SSunil Kumar Kori return rc; 4873850cb06SSunil Kumar Kori 4883850cb06SSunil Kumar Kori } 4893850cb06SSunil Kumar Kori 4903850cb06SSunil Kumar Kori static int 4913850cb06SSunil Kumar Kori ethdev_stats_show(const char *name) 4923850cb06SSunil Kumar Kori { 4933850cb06SSunil Kumar Kori uint64_t diff_pkts_rx, diff_pkts_tx, diff_bytes_rx, diff_bytes_tx; 4943850cb06SSunil Kumar Kori static uint64_t prev_pkts_rx[RTE_MAX_ETHPORTS]; 4953850cb06SSunil Kumar Kori static uint64_t prev_pkts_tx[RTE_MAX_ETHPORTS]; 4963850cb06SSunil Kumar Kori static uint64_t prev_bytes_rx[RTE_MAX_ETHPORTS]; 4973850cb06SSunil Kumar Kori static uint64_t prev_bytes_tx[RTE_MAX_ETHPORTS]; 4983850cb06SSunil Kumar Kori static uint64_t prev_cycles[RTE_MAX_ETHPORTS]; 4993850cb06SSunil Kumar Kori uint64_t mpps_rx, mpps_tx, mbps_rx, mbps_tx; 5003850cb06SSunil Kumar Kori uint64_t diff_ns, diff_cycles, curr_cycles; 5013850cb06SSunil Kumar Kori struct rte_eth_stats stats; 5023850cb06SSunil Kumar Kori static const char *nic_stats_border = "########################"; 5033850cb06SSunil Kumar Kori uint16_t port_id, len; 5043850cb06SSunil Kumar Kori int rc; 5053850cb06SSunil Kumar Kori 5063850cb06SSunil Kumar Kori rc = rte_eth_dev_get_port_by_name(name, &port_id); 5073850cb06SSunil Kumar Kori if (rc < 0) 5083850cb06SSunil Kumar Kori return rc; 5093850cb06SSunil Kumar Kori 5103850cb06SSunil Kumar Kori rc = rte_eth_stats_get(port_id, &stats); 5113850cb06SSunil Kumar Kori if (rc != 0) { 5123850cb06SSunil Kumar Kori fprintf(stderr, 5133850cb06SSunil Kumar Kori "%s: Error: failed to get stats (port %u): %d", 5143850cb06SSunil Kumar Kori __func__, port_id, rc); 5153850cb06SSunil Kumar Kori return rc; 5163850cb06SSunil Kumar Kori } 5173850cb06SSunil Kumar Kori 5183850cb06SSunil Kumar Kori len = strlen(conn->msg_out); 5193850cb06SSunil Kumar Kori conn->msg_out += len; 5203850cb06SSunil Kumar Kori snprintf(conn->msg_out, conn->msg_out_len_max, 5213850cb06SSunil Kumar Kori "\n %s NIC statistics for port %-2d %s\n" 5223850cb06SSunil Kumar Kori " RX-packets: %-10"PRIu64" RX-missed: %-10"PRIu64" RX-bytes: ""%-"PRIu64"\n" 5233850cb06SSunil Kumar Kori " RX-errors: %-"PRIu64"\n" 5243850cb06SSunil Kumar Kori " RX-nombuf: %-10"PRIu64"\n" 5253850cb06SSunil Kumar Kori " TX-packets: %-10"PRIu64" TX-errors: %-10"PRIu64" TX-bytes: ""%-"PRIu64"\n", 5263850cb06SSunil Kumar Kori nic_stats_border, port_id, nic_stats_border, stats.ipackets, stats.imissed, 5273850cb06SSunil Kumar Kori stats.ibytes, stats.ierrors, stats.rx_nombuf, stats.opackets, stats.oerrors, 5283850cb06SSunil Kumar Kori stats.obytes); 5293850cb06SSunil Kumar Kori 5303850cb06SSunil Kumar Kori len = strlen(conn->msg_out) - len; 5313850cb06SSunil Kumar Kori conn->msg_out_len_max -= len; 5323850cb06SSunil Kumar Kori 5333850cb06SSunil Kumar Kori diff_ns = 0; 5343850cb06SSunil Kumar Kori diff_cycles = 0; 5353850cb06SSunil Kumar Kori 5363850cb06SSunil Kumar Kori curr_cycles = rte_rdtsc(); 5373850cb06SSunil Kumar Kori if (prev_cycles[port_id] != 0) 5383850cb06SSunil Kumar Kori diff_cycles = curr_cycles - prev_cycles[port_id]; 5393850cb06SSunil Kumar Kori 5403850cb06SSunil Kumar Kori prev_cycles[port_id] = curr_cycles; 5413850cb06SSunil Kumar Kori diff_ns = diff_cycles > 0 ? 5423850cb06SSunil Kumar Kori diff_cycles * (1 / (double)rte_get_tsc_hz()) * NS_PER_SEC : 0; 5433850cb06SSunil Kumar Kori 5443850cb06SSunil Kumar Kori diff_pkts_rx = (stats.ipackets > prev_pkts_rx[port_id]) ? 5453850cb06SSunil Kumar Kori (stats.ipackets - prev_pkts_rx[port_id]) : 0; 5463850cb06SSunil Kumar Kori diff_pkts_tx = (stats.opackets > prev_pkts_tx[port_id]) ? 5473850cb06SSunil Kumar Kori (stats.opackets - prev_pkts_tx[port_id]) : 0; 5483850cb06SSunil Kumar Kori prev_pkts_rx[port_id] = stats.ipackets; 5493850cb06SSunil Kumar Kori prev_pkts_tx[port_id] = stats.opackets; 5503850cb06SSunil Kumar Kori mpps_rx = diff_ns > 0 ? 5513850cb06SSunil Kumar Kori (double)diff_pkts_rx / diff_ns * NS_PER_SEC : 0; 5523850cb06SSunil Kumar Kori mpps_tx = diff_ns > 0 ? 5533850cb06SSunil Kumar Kori (double)diff_pkts_tx / diff_ns * NS_PER_SEC : 0; 5543850cb06SSunil Kumar Kori 5553850cb06SSunil Kumar Kori diff_bytes_rx = (stats.ibytes > prev_bytes_rx[port_id]) ? 5563850cb06SSunil Kumar Kori (stats.ibytes - prev_bytes_rx[port_id]) : 0; 5573850cb06SSunil Kumar Kori diff_bytes_tx = (stats.obytes > prev_bytes_tx[port_id]) ? 5583850cb06SSunil Kumar Kori (stats.obytes - prev_bytes_tx[port_id]) : 0; 5593850cb06SSunil Kumar Kori prev_bytes_rx[port_id] = stats.ibytes; 5603850cb06SSunil Kumar Kori prev_bytes_tx[port_id] = stats.obytes; 5613850cb06SSunil Kumar Kori mbps_rx = diff_ns > 0 ? 5623850cb06SSunil Kumar Kori (double)diff_bytes_rx / diff_ns * NS_PER_SEC : 0; 5633850cb06SSunil Kumar Kori mbps_tx = diff_ns > 0 ? 5643850cb06SSunil Kumar Kori (double)diff_bytes_tx / diff_ns * NS_PER_SEC : 0; 5653850cb06SSunil Kumar Kori 5663850cb06SSunil Kumar Kori len = strlen(conn->msg_out); 5673850cb06SSunil Kumar Kori snprintf(conn->msg_out + len, conn->msg_out_len_max, 5683850cb06SSunil Kumar Kori "\n Throughput (since last show)\n" 5693850cb06SSunil Kumar Kori " Rx-pps: %12"PRIu64" Rx-bps: %12"PRIu64"\n Tx-pps: %12" 5703850cb06SSunil Kumar Kori PRIu64" Tx-bps: %12"PRIu64"\n" 5713850cb06SSunil Kumar Kori " %s############################%s\n", 5723850cb06SSunil Kumar Kori mpps_rx, mbps_rx * 8, mpps_tx, mbps_tx * 8, nic_stats_border, nic_stats_border); 5733850cb06SSunil Kumar Kori return 0; 5743850cb06SSunil Kumar Kori } 5753850cb06SSunil Kumar Kori 5760f32dac4SSunil Kumar Kori void 5770f32dac4SSunil Kumar Kori cmd_ethdev_dev_mtu_parsed(void *parsed_result, __rte_unused struct cmdline *cl, 5780f32dac4SSunil Kumar Kori void *data __rte_unused) 5793850cb06SSunil Kumar Kori { 5800f32dac4SSunil Kumar Kori struct cmd_ethdev_dev_mtu_result *res = parsed_result; 5813850cb06SSunil Kumar Kori int rc = -EINVAL; 5823850cb06SSunil Kumar Kori 5833850cb06SSunil Kumar Kori rc = ethdev_mtu_config(res->dev, res->size); 5843850cb06SSunil Kumar Kori if (rc < 0) 5850f32dac4SSunil Kumar Kori printf(MSG_CMD_FAIL, res->ethdev); 5863850cb06SSunil Kumar Kori } 5873850cb06SSunil Kumar Kori 5880f32dac4SSunil Kumar Kori void 5890f32dac4SSunil Kumar Kori cmd_ethdev_dev_promiscuous_parsed(void *parsed_result, __rte_unused struct cmdline *cl, 5900f32dac4SSunil Kumar Kori void *data __rte_unused) 5913850cb06SSunil Kumar Kori { 5920f32dac4SSunil Kumar Kori struct cmd_ethdev_dev_promiscuous_result *res = parsed_result; 5933850cb06SSunil Kumar Kori bool enable = false; 5943850cb06SSunil Kumar Kori int rc = -EINVAL; 5953850cb06SSunil Kumar Kori 5963850cb06SSunil Kumar Kori if (!strcmp(res->enable, "on")) 5973850cb06SSunil Kumar Kori enable = true; 5983850cb06SSunil Kumar Kori 5993850cb06SSunil Kumar Kori rc = ethdev_prom_mode_config(res->dev, enable); 6003850cb06SSunil Kumar Kori if (rc < 0) 6010f32dac4SSunil Kumar Kori printf(MSG_CMD_FAIL, res->ethdev); 6023850cb06SSunil Kumar Kori } 6033850cb06SSunil Kumar Kori 6040f32dac4SSunil Kumar Kori void 6050f32dac4SSunil Kumar Kori cmd_ethdev_dev_ip4_addr_add_parsed(void *parsed_result, __rte_unused struct cmdline *cl, 6060f32dac4SSunil Kumar Kori void *data __rte_unused) 6073850cb06SSunil Kumar Kori { 6080f32dac4SSunil Kumar Kori struct cmd_ethdev_dev_ip4_addr_add_result *res = parsed_result; 6093850cb06SSunil Kumar Kori struct ipv4_addr_config config; 6103850cb06SSunil Kumar Kori int rc = -EINVAL; 6113850cb06SSunil Kumar Kori 6120f32dac4SSunil Kumar Kori config.ip = rte_be_to_cpu_32(res->ip.addr.ipv4.s_addr); 6130f32dac4SSunil Kumar Kori config.mask = rte_be_to_cpu_32(res->mask.addr.ipv4.s_addr); 6143850cb06SSunil Kumar Kori 6153850cb06SSunil Kumar Kori rc = ethdev_ip4_addr_add(res->dev, &config); 6163850cb06SSunil Kumar Kori if (rc < 0) 6170f32dac4SSunil Kumar Kori printf(MSG_CMD_FAIL, res->ethdev); 6183850cb06SSunil Kumar Kori } 6193850cb06SSunil Kumar Kori 6200f32dac4SSunil Kumar Kori void 6210f32dac4SSunil Kumar Kori cmd_ethdev_dev_ip6_addr_add_parsed(void *parsed_result, __rte_unused struct cmdline *cl, 6220f32dac4SSunil Kumar Kori void *data __rte_unused) 6233850cb06SSunil Kumar Kori { 6240f32dac4SSunil Kumar Kori struct cmd_ethdev_dev_ip6_addr_add_result *res = parsed_result; 6252cfebc3fSRobin Jarry struct ipv6_addr_config config = { 6262cfebc3fSRobin Jarry .ip = res->ip.addr.ipv6, 6272cfebc3fSRobin Jarry .mask = res->mask.addr.ipv6, 6282cfebc3fSRobin Jarry }; 6292cfebc3fSRobin Jarry int rc; 6303850cb06SSunil Kumar Kori 6313850cb06SSunil Kumar Kori rc = ethdev_ip6_addr_add(res->dev, &config); 6323850cb06SSunil Kumar Kori if (rc < 0) 6330f32dac4SSunil Kumar Kori printf(MSG_CMD_FAIL, res->ethdev); 6343850cb06SSunil Kumar Kori } 6353850cb06SSunil Kumar Kori 6360f32dac4SSunil Kumar Kori void 6370f32dac4SSunil Kumar Kori cmd_ethdev_dev_show_parsed(void *parsed_result, __rte_unused struct cmdline *cl, 6380f32dac4SSunil Kumar Kori void *data __rte_unused) 6393850cb06SSunil Kumar Kori { 6400f32dac4SSunil Kumar Kori struct cmd_ethdev_dev_show_result *res = parsed_result; 6413850cb06SSunil Kumar Kori int rc = -EINVAL; 6423850cb06SSunil Kumar Kori 6433850cb06SSunil Kumar Kori rc = ethdev_show(res->dev); 6443850cb06SSunil Kumar Kori if (rc < 0) 6453850cb06SSunil Kumar Kori printf(MSG_ARG_INVALID, res->dev); 6463850cb06SSunil Kumar Kori } 6473850cb06SSunil Kumar Kori 6480f32dac4SSunil Kumar Kori void 6490f32dac4SSunil Kumar Kori cmd_ethdev_dev_stats_parsed(void *parsed_result, __rte_unused struct cmdline *cl, 6500f32dac4SSunil Kumar Kori void *data __rte_unused) 6513850cb06SSunil Kumar Kori { 6520f32dac4SSunil Kumar Kori struct cmd_ethdev_dev_stats_result *res = parsed_result; 6533850cb06SSunil Kumar Kori int rc = -EINVAL; 6543850cb06SSunil Kumar Kori 6553850cb06SSunil Kumar Kori rc = ethdev_stats_show(res->dev); 6563850cb06SSunil Kumar Kori if (rc < 0) 6573850cb06SSunil Kumar Kori printf(MSG_ARG_INVALID, res->dev); 6583850cb06SSunil Kumar Kori } 6593850cb06SSunil Kumar Kori 6600f32dac4SSunil Kumar Kori void 6610f32dac4SSunil Kumar Kori cmd_ethdev_parsed(void *parsed_result, __rte_unused struct cmdline *cl, void *data __rte_unused) 6623850cb06SSunil Kumar Kori { 6630f32dac4SSunil Kumar Kori struct cmd_ethdev_result *res = parsed_result; 6643850cb06SSunil Kumar Kori struct ethdev_config config; 6653850cb06SSunil Kumar Kori int rc; 6663850cb06SSunil Kumar Kori 6673850cb06SSunil Kumar Kori memset(&config, 0, sizeof(struct ethdev_config)); 6683850cb06SSunil Kumar Kori config.rx.n_queues = res->nb_rxq; 6693850cb06SSunil Kumar Kori config.rx.queue_size = ETHDEV_RX_DESC_DEFAULT; 6703850cb06SSunil Kumar Kori memcpy(config.rx.mempool_name, res->mempool, strlen(res->mempool)); 6713850cb06SSunil Kumar Kori 6723850cb06SSunil Kumar Kori config.tx.n_queues = res->nb_txq; 6733850cb06SSunil Kumar Kori config.tx.queue_size = ETHDEV_TX_DESC_DEFAULT; 6743850cb06SSunil Kumar Kori 6753850cb06SSunil Kumar Kori config.mtu = port_conf_default.rxmode.mtu; 6763850cb06SSunil Kumar Kori 6773850cb06SSunil Kumar Kori rc = ethdev_process(res->dev, &config); 6783850cb06SSunil Kumar Kori if (rc < 0) 6790f32dac4SSunil Kumar Kori printf(MSG_CMD_FAIL, res->ethdev); 6803850cb06SSunil Kumar Kori } 6813850cb06SSunil Kumar Kori 6820f32dac4SSunil Kumar Kori void 6830f32dac4SSunil Kumar Kori cmd_help_ethdev_parsed(__rte_unused void *parsed_result, __rte_unused struct cmdline *cl, 6843850cb06SSunil Kumar Kori __rte_unused void *data) 6853850cb06SSunil Kumar Kori { 6863850cb06SSunil Kumar Kori size_t len; 6873850cb06SSunil Kumar Kori 6883850cb06SSunil Kumar Kori len = strlen(conn->msg_out); 6893850cb06SSunil Kumar Kori conn->msg_out += len; 6900f32dac4SSunil Kumar Kori snprintf(conn->msg_out, conn->msg_out_len_max, "\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", 6913850cb06SSunil Kumar Kori "----------------------------- ethdev command help -----------------------------", 6923850cb06SSunil Kumar Kori cmd_ethdev_help, cmd_ethdev_ip4_addr_help, cmd_ethdev_ip6_addr_help, 6930f32dac4SSunil Kumar Kori cmd_ethdev_forward_help, cmd_ethdev_prom_mode_help, cmd_ethdev_mtu_help, 6940f32dac4SSunil Kumar Kori cmd_ethdev_stats_help, cmd_ethdev_show_help); 6953850cb06SSunil Kumar Kori 6963850cb06SSunil Kumar Kori len = strlen(conn->msg_out); 6973850cb06SSunil Kumar Kori conn->msg_out_len_max -= len; 6983850cb06SSunil Kumar Kori } 6993850cb06SSunil Kumar Kori 7000eb39f1dSRakesh Kudurumalla static int 7010eb39f1dSRakesh Kudurumalla ethdev_forward_config(char *tx_dev, char *rx_dev) 7020eb39f1dSRakesh Kudurumalla { 7030eb39f1dSRakesh Kudurumalla uint16_t portid_rx = 0; 7040eb39f1dSRakesh Kudurumalla uint16_t portid_tx = 0; 7050eb39f1dSRakesh Kudurumalla struct ethdev *port; 7060eb39f1dSRakesh Kudurumalla int rc = -EINVAL; 7070eb39f1dSRakesh Kudurumalla 7080eb39f1dSRakesh Kudurumalla rc = rte_eth_dev_get_port_by_name(tx_dev, &portid_tx); 7090eb39f1dSRakesh Kudurumalla if (rc < 0) 7100eb39f1dSRakesh Kudurumalla return rc; 7110eb39f1dSRakesh Kudurumalla 7120eb39f1dSRakesh Kudurumalla rc = rte_eth_dev_get_port_by_name(rx_dev, &portid_rx); 7130eb39f1dSRakesh Kudurumalla if (rc < 0) 7140eb39f1dSRakesh Kudurumalla return rc; 7150eb39f1dSRakesh Kudurumalla 7160eb39f1dSRakesh Kudurumalla port = ethdev_port_by_id(portid_rx); 7170eb39f1dSRakesh Kudurumalla if (port) { 7180eb39f1dSRakesh Kudurumalla port->tx_port_id = portid_tx; 7190eb39f1dSRakesh Kudurumalla rc = 0; 7200eb39f1dSRakesh Kudurumalla } else { 7210eb39f1dSRakesh Kudurumalla rc = -EINVAL; 7220eb39f1dSRakesh Kudurumalla } 7230eb39f1dSRakesh Kudurumalla 7240eb39f1dSRakesh Kudurumalla return rc; 7250eb39f1dSRakesh Kudurumalla } 7260eb39f1dSRakesh Kudurumalla 7270f32dac4SSunil Kumar Kori void 7280f32dac4SSunil Kumar Kori cmd_ethdev_forward_parsed(void *parsed_result, __rte_unused struct cmdline *cl, 7290f32dac4SSunil Kumar Kori void *data __rte_unused) 7300eb39f1dSRakesh Kudurumalla { 7310f32dac4SSunil Kumar Kori struct cmd_ethdev_forward_result *res = parsed_result; 7320eb39f1dSRakesh Kudurumalla int rc = -EINVAL; 7330eb39f1dSRakesh Kudurumalla 7340eb39f1dSRakesh Kudurumalla rc = ethdev_forward_config(res->tx_dev, res->rx_dev); 7350eb39f1dSRakesh Kudurumalla if (rc < 0) 7360f32dac4SSunil Kumar Kori printf(MSG_CMD_FAIL, res->ethdev); 7370eb39f1dSRakesh Kudurumalla } 738