xref: /dpdk/examples/l2fwd-event/l2fwd_common.c (revision c9902a15bd005b6d4fe072cf7b60fe4ee679155f)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2019 Marvell International Ltd.
3  */
4 
5 #include "l2fwd_common.h"
6 
7 int
8 l2fwd_event_init_ports(struct l2fwd_resources *rsrc)
9 {
10 	uint16_t nb_rxd = RTE_TEST_RX_DESC_DEFAULT;
11 	uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT;
12 	struct rte_eth_conf port_conf = {
13 		.rxmode = {
14 			.max_rx_pkt_len = RTE_ETHER_MAX_LEN,
15 			.split_hdr_size = 0,
16 		},
17 		.txmode = {
18 			.mq_mode = ETH_MQ_TX_NONE,
19 		},
20 	};
21 	uint16_t nb_ports_available = 0;
22 	uint16_t port_id;
23 	int ret;
24 
25 	if (rsrc->event_mode) {
26 		port_conf.rxmode.mq_mode = ETH_MQ_RX_RSS;
27 		port_conf.rx_adv_conf.rss_conf.rss_key = NULL;
28 		port_conf.rx_adv_conf.rss_conf.rss_hf = ETH_RSS_IP;
29 	}
30 
31 	/* Initialise each port */
32 	RTE_ETH_FOREACH_DEV(port_id) {
33 		struct rte_eth_conf local_port_conf = port_conf;
34 		struct rte_eth_dev_info dev_info;
35 		struct rte_eth_rxconf rxq_conf;
36 		struct rte_eth_txconf txq_conf;
37 
38 		/* skip ports that are not enabled */
39 		if ((rsrc->enabled_port_mask & (1 << port_id)) == 0) {
40 			printf("Skipping disabled port %u\n", port_id);
41 			continue;
42 		}
43 		nb_ports_available++;
44 
45 		/* init port */
46 		printf("Initializing port %u... ", port_id);
47 		fflush(stdout);
48 
49 		ret = rte_eth_dev_info_get(port_id, &dev_info);
50 		if (ret != 0)
51 			rte_panic("Error during getting device (port %u) info: %s\n",
52 				  port_id, strerror(-ret));
53 		local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
54 			dev_info.flow_type_rss_offloads;
55 		if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
56 				port_conf.rx_adv_conf.rss_conf.rss_hf) {
57 			printf("Port %u modified RSS hash function based on hardware support,"
58 			       "requested:%#"PRIx64" configured:%#"PRIx64"",
59 				port_id,
60 				port_conf.rx_adv_conf.rss_conf.rss_hf,
61 				local_port_conf.rx_adv_conf.rss_conf.rss_hf);
62 		}
63 
64 		if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
65 			local_port_conf.txmode.offloads |=
66 				DEV_TX_OFFLOAD_MBUF_FAST_FREE;
67 		/* Configure RX and TX queue. 8< */
68 		ret = rte_eth_dev_configure(port_id, 1, 1, &local_port_conf);
69 		if (ret < 0)
70 			rte_panic("Cannot configure device: err=%d, port=%u\n",
71 				  ret, port_id);
72 		/* >8 End of configuration RX and TX queue. */
73 
74 		ret = rte_eth_dev_adjust_nb_rx_tx_desc(port_id, &nb_rxd,
75 						       &nb_txd);
76 		if (ret < 0)
77 			rte_panic("Cannot adjust number of descriptors: err=%d, port=%u\n",
78 				  ret, port_id);
79 
80 		rte_eth_macaddr_get(port_id, &rsrc->eth_addr[port_id]);
81 
82 		/* init one RX queue */
83 		fflush(stdout);
84 		rxq_conf = dev_info.default_rxconf;
85 		rxq_conf.offloads = local_port_conf.rxmode.offloads;
86 		/* Using lcore to poll one or several ports. 8< */
87 		ret = rte_eth_rx_queue_setup(port_id, 0, nb_rxd,
88 					     rte_eth_dev_socket_id(port_id),
89 					     &rxq_conf,
90 					     rsrc->pktmbuf_pool);
91 		if (ret < 0)
92 			rte_panic("rte_eth_rx_queue_setup:err=%d, port=%u\n",
93 				  ret, port_id);
94 
95 		/* >8 End of using lcore to poll one or several ports. */
96 
97 		/* Init one TX queue on each port. 8< */
98 		fflush(stdout);
99 		txq_conf = dev_info.default_txconf;
100 		txq_conf.offloads = local_port_conf.txmode.offloads;
101 		ret = rte_eth_tx_queue_setup(port_id, 0, nb_txd,
102 				rte_eth_dev_socket_id(port_id),
103 				&txq_conf);
104 		if (ret < 0)
105 			rte_panic("rte_eth_tx_queue_setup:err=%d, port=%u\n",
106 				  ret, port_id);
107 		/* >8 End of init one TX queue on each port. */
108 
109 		rte_eth_promiscuous_enable(port_id);
110 
111 		printf("Port %u,MAC address: " RTE_ETHER_ADDR_PRT_FMT "\n\n",
112 			port_id,
113 			RTE_ETHER_ADDR_BYTES(&rsrc->eth_addr[port_id]));
114 	}
115 
116 	return nb_ports_available;
117 }
118