}
extern std::vector<std::shared_ptr<XskSocket>> g_xsk;
auto socket = std::make_shared<XskSocket>(frameNums, ifName, queue_id, path, poolName);
- g_xsk.push_back(socket);
+ g_xsk.push_back(socket);
return socket;
});
luaCtx.registerFunction<std::string(std::shared_ptr<XskSocket>::*)()const>("getMetrics", [](const std::shared_ptr<XskSocket>& xsk) {
throw runtime_error("invalid source addr");
}
xsk->addWorker(xskInfo, d_config.sourceAddr, getProtocol() != dnsdist::Protocol::DoUDP);
- memcpy(d_config.sourceMACAddr, xsk->source, sizeof(MACAddr));
+ d_config.sourceMACAddr = xsk->source;
xskInfo->sharedEmptyFrameOffset = xsk->sharedEmptyFrameOffset;
}
#endif /* HAVE_XSK */
PacketBuffer getHealthCheckPacket(const std::shared_ptr<DownstreamState>& ds, FDMultiplexer* mplexer, std::shared_ptr<HealthCheckData>& data);
void setHealthCheckTime(const std::shared_ptr<DownstreamState>& ds, const std::shared_ptr<HealthCheckData>& data);
bool handleResponse(std::shared_ptr<HealthCheckData>& data);
-
#include <linux/tcp.h>
#include <linux/udp.h>
#include <net/if.h>
+#include <net/if_arp.h>
#include <netinet/in.h>
#include <poll.h>
#include <stdexcept>
}
void XskSocket::getMACFromIfName()
{
- ifreq ifr;
- auto fd = ::socket(AF_INET, SOCK_DGRAM, 0);
+ ifreq ifr{};
+ auto fd = FDWrapper(::socket(AF_INET, SOCK_DGRAM, 0));
+ if (fd < 0) {
+ throw std::runtime_error("Error creating a socket to get the MAC address of interface " + ifName);
+ }
+
+ if (ifName.size() >= IFNAMSIZ) {
+ throw std::runtime_error("Unable to get MAC address for interface " + ifName + ": name too long");
+ }
+
strncpy(ifr.ifr_name, ifName.c_str(), ifName.length() + 1);
- if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) {
- throw runtime_error("Error getting MAC addr");
+ if (ioctl(fd.getHandle(), SIOCGIFHWADDR, &ifr) < 0 || ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) {
+ throw std::runtime_error("Error getting MAC address for interface " + ifName);
}
- memcpy(source, ifr.ifr_hwaddr.sa_data, sizeof(source));
- close(fd);
+ static_assert(sizeof(ifr.ifr_hwaddr.sa_data) >= std::tuple_size<decltype(source)>{}, "The size of an ARPHRD_ETHER MAC address is smaller than expected");
+ memcpy(source.data(), ifr.ifr_hwaddr.sa_data, source.size());
}
[[nodiscard]] int XskSocket::timeDifference(const timespec& t1, const timespec& t2) noexcept
{