return addEDNSToQueryTurnedResponse(dq);
}
-bool fixUpResponse(char** response, uint16_t* responseLen, size_t* responseSize, const DNSName& qname, uint16_t origFlags, bool ednsAdded, bool ecsAdded, std::vector<uint8_t>& rewrittenResponse, uint16_t addRoom)
+bool fixUpResponse(char** response, uint16_t* responseLen, size_t* responseSize, const DNSName& qname, uint16_t origFlags, bool ednsAdded, bool ecsAdded, std::vector<uint8_t>& rewrittenResponse, uint16_t addRoom, bool* zeroScope)
{
struct dnsheader* dh = (struct dnsheader*) *response;
int res = locateEDNSOptRR(responseStr, &optStart, &optLen, &last);
if (res == 0) {
+ if(zeroScope)
+ *zeroScope = optLen > 18 && !responseStr.at(optStart + 18);
+
if (ednsAdded) {
/* we added the entire OPT RR,
therefore we need to remove it entirely */
addRoom = DNSCRYPT_MAX_RESPONSE_PADDING_AND_MAC_SIZE;
}
#endif
- if (!fixUpResponse(&response, &responseLen, &responseSize, ids->qname, ids->origFlags, ids->ednsAdded, ids->ecsAdded, rewrittenResponse, addRoom)) {
+ bool zeroScope=false;
+ if (!fixUpResponse(&response, &responseLen, &responseSize, ids->qname, ids->origFlags, ids->ednsAdded, ids->ecsAdded, rewrittenResponse, addRoom, &zeroScope)) {
continue;
}
if (ids->packetCache && !ids->skipCache) {
- ids->packetCache->insert(ids->cacheKey, ids->subnet, ids->origFlags, ids->dnssecOK, ids->qname, ids->qtype, ids->qclass, response, responseLen, false, dh->rcode, ids->tempFailureTTL);
+ ids->packetCache->insert(zeroScope ? ids->cacheKeyNoECS : ids->cacheKey, ids->subnet, ids->origFlags, ids->dnssecOK, ids->qname, ids->qtype, ids->qclass, response, responseLen, false, dh->rcode, ids->tempFailureTTL);
}
if (ids->cs && !ids->cs->muted) {
bool ednsAdded = false;
bool ecsAdded = false;
+ uint32_t cacheKeyNoECS = 0;
+ uint32_t cacheKey = 0;
+ boost::optional<Netmask> subnet;
+ uint16_t cachedResponseSize = dq.size;
+ uint32_t allowExpired = ss ? 0 : g_staleCacheEntriesTTL;
+
if (dq.useECS && ((ss && ss->useECS) || (!ss && serverPool->getECS()))) {
+ if (packetCache && !dq.skipCache) {
+ dnssecOK = (getEDNSZ(dq) & EDNS_HEADER_FLAG_DO);
+ }
+
+ uint16_t cachedResponseSize = dq.size;
+ uint32_t allowExpired = ss ? 0 : g_staleCacheEntriesTTL;
+ boost::optional<Netmask> subnet;
+ if (packetCache && !dq.skipCache && packetCache->get(dq, consumed, dh->id, query, &cachedResponseSize, &cacheKeyNoECS, subnet, dnssecOK, allowExpired)) {
+ goto sendIt;
+ }
+
if (!handleEDNSClientSubnet(dq, &(ednsAdded), &(ecsAdded), g_preserveTrailingData)) {
vinfolog("Dropping query from %s because we couldn't insert the ECS value", remote.toStringWithPort());
return;
}
}
- uint32_t cacheKey = 0;
- boost::optional<Netmask> subnet;
if (packetCache && !dq.skipCache) {
- uint16_t cachedResponseSize = dq.size;
- uint32_t allowExpired = ss ? 0 : g_staleCacheEntriesTTL;
- dnssecOK = (getEDNSZ(dq) & EDNS_HEADER_FLAG_DO);
if (packetCache->get(dq, consumed, dh->id, query, &cachedResponseSize, &cacheKey, subnet, dnssecOK, allowExpired)) {
+ sendIt:;
DNSResponse dr(dq.qname, dq.qtype, dq.qclass, dq.consumed, dq.local, dq.remote, reinterpret_cast<dnsheader*>(query), dq.size, cachedResponseSize, false, &queryRealTime);
#ifdef HAVE_PROTOBUF
dr.uniqueId = dq.uniqueId;
ids->tempFailureTTL = dq.tempFailureTTL;
ids->origFlags = origFlags;
ids->cacheKey = cacheKey;
+ ids->cacheKeyNoECS = cacheKeyNoECS;
ids->subnet = subnet;
ids->skipCache = dq.skipCache;
ids->packetCache = packetCache;
std::shared_ptr<DNSDistPacketCache> packetCache{nullptr};
std::shared_ptr<QTag> qTag{nullptr};
const ClientState* cs{nullptr};
- uint32_t cacheKey; // 8
+ uint32_t cacheKey; // 4
+ uint32_t cacheKeyNoECS; // 4
uint16_t age; // 4
uint16_t qtype; // 2
uint16_t qclass; // 2
bool processQuery(LocalHolders& holders, DNSQuestion& dq, string& poolname, int* delayMsec, const struct timespec& now);
bool processResponse(LocalStateHolder<vector<DNSDistResponseRuleAction> >& localRespRulactions, DNSResponse& dr, int* delayMsec);
bool fixUpQueryTurnedResponse(DNSQuestion& dq, const uint16_t origFlags);
-bool fixUpResponse(char** response, uint16_t* responseLen, size_t* responseSize, const DNSName& qname, uint16_t origFlags, bool ednsAdded, bool ecsAdded, std::vector<uint8_t>& rewrittenResponse, uint16_t addRoom);
+bool fixUpResponse(char** response, uint16_t* responseLen, size_t* responseSize, const DNSName& qname, uint16_t origFlags, bool ednsAdded, bool ecsAdded, std::vector<uint8_t>& rewrittenResponse, uint16_t addRoom, bool* zeroScope=0);
void restoreFlags(struct dnsheader* dh, uint16_t origFlags);
bool checkQueryHeaders(const struct dnsheader* dh);