string ping;
bool weWantEDNSSubnet = false;
- uint8_t outgoingECSBits = 0;
- ComboAddress outgoingECSAddr;
+ std::optional<EDNSSubnetOpts> subnetOpts = std::nullopt;
if (EDNS0Level > 0) {
DNSPacketWriter::optvect_t opts;
if (srcmask) {
- EDNSSubnetOpts eo;
- eo.source = *srcmask;
- outgoingECSBits = srcmask->getBits();
- outgoingECSAddr = srcmask->getNetwork();
- opts.emplace_back(EDNSOptionCode::ECS, makeEDNSSubnetOptsString(eo));
+ subnetOpts = EDNSSubnetOpts{};
+ subnetOpts->source = *srcmask;
+ opts.emplace_back(EDNSOptionCode::ECS, makeEDNSSubnetOptsString(*subnetOpts));
weWantEDNSSubnet = true;
}
if (!doTCP) {
int queryfd;
- ret = asendto(vpacket.data(), vpacket.size(), 0, address, qid, domain, type, weWantEDNSSubnet, &queryfd, *now);
+ ret = asendto(vpacket.data(), vpacket.size(), 0, address, qid, domain, type, subnetOpts, &queryfd, *now);
if (ret != LWResult::Result::Success) {
return ret;
IPv4 and IPv6. Still I'm pretty sure it doesn't matter in real life, so let's not duplicate
entries in our cache. */
if (reso.scope.getBits()) {
- uint8_t bits = std::min(reso.scope.getBits(), outgoingECSBits);
+ uint8_t bits = std::min(reso.scope.getBits(), subnetOpts->source.getBits());
+ auto outgoingECSAddr = subnetOpts->source.getNetwork();
outgoingECSAddr.truncate(bits);
srcmask = Netmask(outgoingECSAddr, bits);
}
bool d_haveEDNS{false};
};
+struct EDNSSubnetOpts;
+
LWResult::Result asendto(const void* data, size_t len, int flags, const ComboAddress& toAddress, uint16_t qid,
- const DNSName& domain, uint16_t qtype, bool ecs, int* fileDesc, timeval& now);
+ const DNSName& domain, uint16_t qtype, const std::optional<EDNSSubnetOpts>& ecs, int* fileDesc, timeval& now);
LWResult::Result arecvfrom(PacketBuffer& packet, int flags, const ComboAddress& fromAddr, size_t& len, uint16_t qid,
const DNSName& domain, uint16_t qtype, int fileDesc, const struct timeval& now);
/* these two functions are used by LWRes */
LWResult::Result asendto(const void* data, size_t len, int /* flags */,
- const ComboAddress& toAddress, uint16_t qid, const DNSName& domain, uint16_t qtype, bool ecs, int* fileDesc, timeval& now)
+ const ComboAddress& toAddress, uint16_t qid, const DNSName& domain, uint16_t qtype, const std::optional<EDNSSubnetOpts>& ecs, int* fileDesc, timeval& now)
{
auto pident = std::make_shared<PacketID>();