continue;
}
- if (fd != ids->backendFD) {
+ if (!ids->isXSK() && fd != ids->backendFD) {
dss->restoreState(queryId, std::move(*ids));
continue;
}
return false;
}
else {
- const auto& xskInfo = ss->pickWorkerForSending();
- ids.backendFD = xskInfo->workerWaker;
assignOutgoingUDPQueryToBackend(ss, dh->id, dq, query, false);
auto sourceAddr = ss->pickSourceAddressForSending();
packet.setAddr(sourceAddr, ss->d_config.sourceMACAddr, ss->d_config.remote, ss->d_config.destMACAddr);
#ifdef HAVE_XSK
void registerXsk(std::vector<std::shared_ptr<XskSocket>>& xsks);
[[nodiscard]] ComboAddress pickSourceAddressForSending();
- [[nodiscard]] const std::shared_ptr<XskWorker>& pickWorkerForSending();
#endif /* HAVE_XSK */
dnsdist::Protocol getProtocol() const
return (*addresses)[idx % numberOfAddresses];
}
-[[nodiscard]] const std::shared_ptr<XskWorker>& DownstreamState::pickWorkerForSending()
-{
- auto numberOfWorkers = d_xskInfos.size();
- if (numberOfWorkers == 0) {
- throw std::runtime_error("No XSK worker available for sending XSK data to backend " + getNameWithAddr());
- }
- size_t idx = dnsdist::getRandomValue(numberOfWorkers);
- return d_xskInfos[idx % numberOfWorkers];
-}
-
void DownstreamState::registerXsk(std::vector<std::shared_ptr<XskSocket>>& xsks)
{
d_xskSockets = xsks;
auto localRespRuleActions = g_respruleactions.getLocal();
auto localCacheInsertedRespRuleActions = g_cacheInsertedRespRuleActions.getLocal();
auto pollfds = getPollFdsForWorker(*xskInfo);
- const auto xskFd = xskInfo->workerWaker.getHandle();
while (!dss->isStopped()) {
poll(pollfds.data(), pollfds.size(), -1);
bool needNotify = false;
auto ids = dss->getState(queryId);
if (ids) {
if (!ids->isXSK()) {
- // if (xskFd != ids->backendFD || !ids->isXSK()) {
dss->restoreState(queryId, std::move(*ids));
ids = std::nullopt;
}