Skip to content

Commit 7010285

Browse files
authored
Merge pull request #132 from CESNET/dpdk-check-caps
dpdk: check capabilities and skip unsupported features
2 parents 74761c6 + 1725298 commit 7010285

File tree

2 files changed

+45
-4
lines changed

2 files changed

+45
-4
lines changed

input/dpdk.cpp

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,13 +166,26 @@ void DpdkCore::validatePort()
166166

167167
struct 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

186199
void 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 << "\tRX offload: " << rteDevInfo.rx_offload_capa << std::endl;
281+
std::cerr << "\tflow 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 << "\tDetected 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 << "\tDetected HW timestamp capability: " << (m_supportedHWTimestamp ? "yes" : "no") << std::endl;
257294
}
258295

259296
bool 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

input/dpdk.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ class DpdkCore {
177177
uint16_t m_currentRxId;
178178
int m_rxTimestampOffset;
179179
bool m_isNfbDpdkDriver;
180+
bool m_supportedRSS;
181+
bool m_supportedHWTimestamp;
180182

181183
bool isConfigured = false;
182184
static DpdkCore* m_instance;

0 commit comments

Comments
 (0)