DNSAction::Action operator()(DNSQuestion* dnsquestion, std::string* ruleresult) const override
{
(void)ruleresult;
- setEDNSOption(*dnsquestion, d_code, d_data);
+ setEDNSOption(*dnsquestion, d_code, d_data, true);
return Action::None;
}
{
}
- DNSResponseAction::Action operator()(DNSResponse* response, std::string* ruleresult) const override
+ DNSResponseAction::Action operator()(DNSResponse* response, [[maybe_unused]] std::string* ruleresult) const override
{
- setEDNSOption(*response, d_code, d_data);
+ setEDNSOption(*response, d_code, d_data, false);
return Action::None;
}
return true;
}
-bool setEDNSOption(DNSQuestion& dnsQuestion, uint16_t ednsCode, const std::string& ednsData)
+bool setEDNSOption(DNSQuestion& dnsQuestion, uint16_t ednsCode, const std::string& ednsData, bool isQuery)
{
std::string optRData;
generateEDNSOption(ednsCode, ednsData, optRData);
}
dnsQuestion.getMutableData() = std::move(newContent);
- if (!dnsQuestion.ids.ednsAdded && ednsAdded) {
+ if (isQuery && !dnsQuestion.ids.ednsAdded && ednsAdded) {
dnsQuestion.ids.ednsAdded = true;
}
header.arcount = htons(1);
return true;
});
- // make sure that any EDNS sent by the backend is removed before forwarding the response to the client
- dnsQuestion.ids.ednsAdded = true;
+
+ if (isQuery) {
+ // make sure that any EDNS sent by the backend is removed before forwarding the response to the client
+ dnsQuestion.ids.ednsAdded = true;
+ }
}
return true;
bool queryHasEDNS(const DNSQuestion& dnsQuestion);
bool getEDNS0Record(const PacketBuffer& packet, EDNS0Record& edns0);
-bool setEDNSOption(DNSQuestion& dnsQuestion, uint16_t ednsCode, const std::string& data);
+bool setEDNSOption(DNSQuestion& dnsQuestion, uint16_t ednsCode, const std::string& data, bool isQuery = true);
struct InternalQueryState;
namespace dnsdist