b8c1e02d75988e4b8f6590497d2379f1a6210177
[dpdk.git] / examples / l2fwd-event / l2fwd_common.c
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: %02X:%02X:%02X:%02X:%02X:%02X\n\n",
112                         port_id,
113                         rsrc->eth_addr[port_id].addr_bytes[0],
114                         rsrc->eth_addr[port_id].addr_bytes[1],
115                         rsrc->eth_addr[port_id].addr_bytes[2],
116                         rsrc->eth_addr[port_id].addr_bytes[3],
117                         rsrc->eth_addr[port_id].addr_bytes[4],
118                         rsrc->eth_addr[port_id].addr_bytes[5]);
119         }
120
121         return nb_ports_available;
122 }