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 subnetOpts;
- subnetOpts.setSource(*srcmask);
+ subnetOpts->setSource(*srcmask);
outgoingECSBits = srcmask->getBits();
outgoingECSAddr = srcmask->getNetwork();
- opts.emplace_back(EDNSOptionCode::ECS, subnetOpts.makeOptString());
+ opts.emplace_back(EDNSOptionCode::ECS, subnetOpts->makeOptString());
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;
bool d_haveEDNS{false};
};
+class 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>();