const auto& fds = xsk->getDescriptors();
// list of workers that need to be notified
std::set<int> needNotify;
+ std::vector<XskPacket> packets;
while (true) {
try {
auto ready = xsk->wait(-1);
dnsdist::configuration::refreshLocalRuntimeConfiguration();
// descriptor 0 gets incoming AF_XDP packets
if ((fds.at(0).revents & POLLIN) != 0) {
- auto packets = xsk->recv(64, &failed);
+ xsk->recv(packets, 64, &failed);
dnsdist::metrics::g_stats.nonCompliantQueries += failed;
for (auto& packet : packets) {
const auto dest = packet.getToAddr();
}
}
-std::vector<XskPacket> XskSocket::recv(uint32_t recvSizeMax, uint32_t* failedCount)
+void XskSocket::recv(std::vector<XskPacket>& packets, uint32_t recvSizeMax, uint32_t* failedCount)
{
+ packets.clear();
uint32_t idx{0};
- std::vector<XskPacket> res;
// how many descriptors to packets have been filled
const auto recvSize = xsk_ring_cons__peek(&rx, recvSizeMax, &idx);
if (recvSize == 0) {
- return res;
+ return;
}
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
const auto baseAddr = reinterpret_cast<uint64_t>(umem.bufBase);
uint32_t failed = 0;
uint32_t processed = 0;
- res.reserve(recvSize);
+ packets.reserve(recvSize);
for (; processed < recvSize; processed++) {
try {
const auto* desc = xsk_ring_cons__rx_desc(&rx, idx++);
markAsFree(packet);
}
else {
- res.push_back(packet);
+ packets.push_back(packet);
}
}
catch (const std::exception& exp) {
if (failedCount != nullptr) {
*failedCount = failed;
}
-
- return res;
}
void XskSocket::pickUpReadyPacket(std::vector<XskPacket>& packets)
// add as many packets as possible to the rx queue for sending */
void send(std::vector<XskPacket>& packets);
// look at incoming packets in rx, return them if parsing succeeeded
- [[nodiscard]] std::vector<XskPacket> recv(uint32_t recvSizeMax, uint32_t* failedCount);
+ void recv(std::vector<XskPacket>& packets, uint32_t recvSizeMax, uint32_t* failedCount);
void addWorker(std::shared_ptr<XskWorker> worker);
void addWorkerRoute(const std::shared_ptr<XskWorker>& worker, const ComboAddress& dest);
void removeWorkerRoute(const ComboAddress& dest);