xref: /dpdk/app/graph/ethdev.c (revision fe02b98cd3925d455731f0201030c587a387eef0)
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, &eth_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, &eth_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, &eth_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(&eth_node)) {
1483850cb06SSunil Kumar Kori 		port = TAILQ_FIRST(&eth_node);
1493850cb06SSunil Kumar Kori 		TAILQ_REMOVE(&eth_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(&ethdev_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(&eth_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