99{
101 uint16_t nb_rxd = rx_ring_size;
102 uint16_t nb_txd = tx_ring_size;
103 int retval = -1;
104 uint16_t q;
105 struct rte_eth_dev_info dev_info;
106 struct rte_eth_txconf txconf;
107 struct rte_eth_link link;
108
109
110 if (!rte_eth_dev_is_valid_port(iface)) {
111 TLOG() <<
"Specified interface " << iface <<
" is not valid in EAL!";
112 throw InvalidEALPort(
ERS_HERE, iface);
113 }
114
115
116 if ((retval = rte_eth_dev_info_get(iface, &dev_info)) != 0) {
117 TLOG() <<
"Error during getting device (iface " << iface <<
") retval: " << retval;
118 throw FailedToRetrieveInterfaceInfo(
ERS_HERE, iface, retval);
119 }
120
121 TLOG() <<
"Iface " << iface <<
" RX Ring info :"
122 << " min " << dev_info.rx_desc_lim.nb_min
123 << " max " << dev_info.rx_desc_lim.nb_max
124 << " align " << dev_info.rx_desc_lim.nb_align
125 ;
126
127
128 if (with_reset) {
129 if ((retval = rte_eth_dev_reset(iface)) != 0) {
130 throw FailedToResetInterface(
ERS_HERE, iface, retval);
131 }
132 }
133
134
135 if (with_mq_rss) {
137
138 if ((iface_conf.rxmode.mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) != 0) {
139 TLOG() <<
"Ethdev port config prepared with RX RSS mq_mode!";
140 if ((iface_conf.rxmode.offloads & RTE_ETH_RX_OFFLOAD_RSS_HASH) != 0) {
141 TLOG() <<
"Ethdev port config prepared with RX RSS mq_mode with offloading is requested!";
142 }
143 }
144 }
145
146 TLOG() <<
"Configuring Iface " <<
iface <<
" rx rings: " << rx_rings <<
", tx rings " << tx_rings;
147
148
149 if ((retval = rte_eth_dev_configure(iface, rx_rings, tx_rings, &iface_conf)) != 0) {
150 throw FailedToConfigureInterface(
ERS_HERE, iface,
"Device Configuration", retval);
151 }
152
153
155 {
156 uint16_t mtu;
157 rte_eth_dev_get_mtu(iface, &mtu);
158 TLOG() <<
"Interface: " <<
iface <<
" MTU: " << mtu;
159 }
160
161
162
163
164
165
166 rte_eth_dev_set_ptypes(iface, RTE_PTYPE_L2_MASK | RTE_PTYPE_L3_MASK | RTE_PTYPE_L4_MASK, NULL, 0);
167
168
169
170
171
172
173 if ((retval = rte_eth_dev_adjust_nb_rx_tx_desc(iface, &nb_rxd, &nb_txd)) != 0) {
174 throw FailedToConfigureInterface(
ERS_HERE, iface,
"Adjust tx/rx descriptors", retval);
175 }
176
177
178 for (q = 0; q < rx_rings; q++) {
179
180 if ((retval = rte_eth_rx_queue_setup(iface, q, nb_rxd, rte_eth_dev_socket_id(iface), NULL, mbuf_pool[q].get())) < 0) {
181
182 throw FailedToConfigureInterface(
ERS_HERE, iface,
"Rx queues setup", retval);
183 }
184 }
185
186 txconf = dev_info.default_txconf;
187 txconf.offloads = iface_conf.txmode.offloads;
188
189
190 txconf.tx_rs_thresh = 32;
191 txconf.tx_free_thresh = 32;
192 txconf.tx_thresh.wthresh = 0;
193
194
195 for (q = 0; q < tx_rings; q++) {
196 if ((retval = rte_eth_tx_queue_setup(iface, q, nb_txd, rte_eth_dev_socket_id(iface), &txconf)) < 0) {
197 throw FailedToConfigureInterface(
ERS_HERE, iface,
"Tx queues setup", retval);
198 }
199 }
200
201
202 if ((retval = rte_eth_dev_start(iface)) < 0) {
203 throw FailedToConfigureInterface(
ERS_HERE, iface,
"MAC address retrival", retval);
204 }
205
206 if ((retval = rte_eth_link_get(iface, &link)) != 0) {
207 throw FailedToRetrieveLinkStatus(
ERS_HERE, iface, retval);
208 }
209
210 TLOG() <<
"Link: speed=" << link.link_speed <<
" duplex=" << link.link_duplex <<
" autoneg=" << link.link_autoneg <<
" status=" << link.link_status;
211
212 if ( check_link_status && link.link_status == 0 ) {
214 }
215
216
217 struct rte_ether_addr addr;
218 if ((retval = rte_eth_macaddr_get(iface, &addr)) == 0) {
220 } else {
221 throw FailedToConfigureInterface(
ERS_HERE, iface,
"MAC address retrival", retval);
222 }
223
224
225 if ((retval = rte_eth_dev_info_get(iface, &dev_info)) != 0) {
226 TLOG() <<
"Error during getting device (iface " <<
iface <<
") retval: " << retval;
227 throw FailedToConfigureInterface(
ERS_HERE, iface,
"Device information retrival", retval);
228 }
229
230 TLOG() <<
"Iface[" <<
iface <<
"] Rx Ring info:"
231 << " min=" << dev_info.rx_desc_lim.nb_min
232 << " max=" << dev_info.rx_desc_lim.nb_max
233 << " align=" << dev_info.rx_desc_lim.nb_align;
234 TLOG() <<
"Iface[" <<
iface <<
"] Tx Ring info:"
235 << " min=" << dev_info.rx_desc_lim.nb_min
236 << " max=" << dev_info.rx_desc_lim.nb_max
237 << " align=" << dev_info.rx_desc_lim.nb_align;
238
239 for (size_t j = 0; j < dev_info.nb_rx_queues; j++) {
240
241 struct rte_eth_rxq_info queue_info;
242 int count;
243
244 retval = rte_eth_rx_queue_info_get(iface, j, &queue_info);
245 if (retval != 0)
246 continue;
247
248 count = rte_eth_rx_queue_count(iface, j);
249 TLOG() <<
"rx[" << j <<
"] descriptors=" << count <<
"/" << queue_info.nb_desc
250 << " scattered=" << (queue_info.scattered_rx ? "yes" : "no")
251 << " conf.drop_en=" << (queue_info.conf.rx_drop_en ? "yes" : "no")
252 << " conf.rx_deferred_start=" << (queue_info.conf.rx_deferred_start ? "yes" : "no")
253 << " rx_buf_size=" << queue_info.rx_buf_size;
254 }
255
256 return 0;
257}
#define RTE_JUMBO_ETHER_MTU
static const struct rte_eth_conf iface_conf_default
void iface_conf_rss_mode(struct rte_eth_conf &iface_conf, bool mode=false, bool offload=false)
std::string get_mac_addr_str(const rte_ether_addr &addr)