@@ -166,13 +166,26 @@ void DpdkCore::validatePort()
166166
167167struct rte_eth_conf DpdkCore::createPortConfig ()
168168{
169+ if (m_rxQueueCount > 1 && !m_supportedRSS) {
170+ std::cerr << " RSS is not supported by card, multiple queues will not work as expected." << std::endl;
171+ throw PluginError (" Required RSS for q>1 is not supported." );
172+ }
173+
169174#if RTE_VERSION >= RTE_VERSION_NUM(21, 11, 0, 0)
170175 rte_eth_conf portConfig {.rxmode = {.mtu = RTE_ETHER_MAX_LEN}};
171176#else
172177 rte_eth_conf portConfig {.rxmode = {.max_rx_pkt_len = RTE_ETHER_MAX_LEN}};
173178#endif
174- portConfig.rxmode .mq_mode = ETH_MQ_RX_RSS;
175- portConfig.rxmode .offloads |= RTE_ETH_RX_OFFLOAD_TIMESTAMP;
179+
180+ if (m_supportedRSS) {
181+ portConfig.rxmode .mq_mode = ETH_MQ_RX_RSS;
182+ } else {
183+ portConfig.rxmode .mq_mode = RTE_ETH_MQ_RX_NONE;
184+ }
185+
186+ if (m_supportedHWTimestamp) {
187+ portConfig.rxmode .offloads |= RTE_ETH_RX_OFFLOAD_TIMESTAMP;
188+ }
176189 return portConfig;
177190}
178191
@@ -185,6 +198,11 @@ void DpdkCore::configurePort(const struct rte_eth_conf& portConfig)
185198
186199void DpdkCore::configureRSS ()
187200{
201+ if (!m_supportedRSS) {
202+ std::cerr << " SKipped RSS hash setting for port " << m_portId << " ." << std::endl;
203+ return ;
204+ }
205+
188206 constexpr size_t RSS_KEY_LEN = 40 ;
189207 // biflow hash key
190208 static uint8_t rssKey[RSS_KEY_LEN] = {
@@ -201,7 +219,7 @@ void DpdkCore::configureRSS()
201219 };
202220
203221 if (rte_eth_dev_rss_hash_update (m_portId, &rssConfig)) {
204- throw PluginError ( " Unable to set RSS hash" ) ;
222+ std::cerr << " Setting RSS hash for port " << m_portId << " . " << std::endl ;
205223 }
206224}
207225
@@ -239,9 +257,11 @@ void DpdkCore::configure(const char* params)
239257 m_portId = parser.port_num ();
240258 m_rxQueueCount = parser.rx_queues ();
241259 configureEal (parser.eal_params ());
260+
261+ /* recognize NIC driver and check capabilities */
262+ recognizeDriver ();
242263 registerRxTimestamp ();
243264 initInterface ();
244- recognizeDriver ();
245265 isConfigured = true ;
246266}
247267
@@ -251,9 +271,26 @@ void DpdkCore::recognizeDriver()
251271 if (rte_eth_dev_info_get (m_portId, &rteDevInfo)) {
252272 throw PluginError (" Unable to get rte dev info" );
253273 }
274+
254275 if (std::strcmp (rteDevInfo.driver_name , " net_nfb" ) == 0 ) {
255276 m_isNfbDpdkDriver = true ;
256277 }
278+
279+ std::cerr << " Capabilities of the port " << m_portId << " with driver " << rteDevInfo.driver_name << " :" << std::endl;
280+ std::cerr << " \t RX offload: " << rteDevInfo.rx_offload_capa << std::endl;
281+ std::cerr << " \t flow type RSS offloads: " << rteDevInfo.flow_type_rss_offloads << std::endl;
282+
283+ /* Check if RSS hashing is supported in NIC */
284+ m_supportedRSS = (rteDevInfo.flow_type_rss_offloads & RTE_ETH_RSS_IP) != 0 ;
285+ std::cerr << " \t Detected RSS offload capability: " << (m_supportedRSS ? " yes" : " no" ) << std::endl;
286+
287+ /* Check if HW timestamps are supported, we support NFB cards only */
288+ if (m_isNfbDpdkDriver) {
289+ m_supportedHWTimestamp = (rteDevInfo.flow_type_rss_offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP) != 0 ;
290+ } else {
291+ m_supportedHWTimestamp = false ;
292+ }
293+ std::cerr << " \t Detected HW timestamp capability: " << (m_supportedHWTimestamp ? " yes" : " no" ) << std::endl;
257294}
258295
259296bool DpdkCore::isNfbDpdkDriver ()
@@ -297,6 +334,8 @@ void DpdkCore::startIfReady()
297334 configureRSS ();
298335 enablePort ();
299336 is_ifc_ready = true ;
337+
338+ std::cerr << " DPDK input at port " << m_portId << " started." << std::endl;
300339 }
301340}
302341
0 commit comments