1 
2 #include "dnsdist.hh"
3 
makeDNSResponseFromIDState(IDState & ids,PacketBuffer & data,bool isTCP)4 DNSResponse makeDNSResponseFromIDState(IDState& ids, PacketBuffer& data, bool isTCP)
5 {
6   DNSResponse dr(&ids.qname, ids.qtype, ids.qclass, &ids.origDest, &ids.origRemote, data, isTCP, &ids.sentTime.d_start);
7   dr.origFlags = ids.origFlags;
8   dr.cacheFlags = ids.cacheFlags;
9   dr.ecsAdded = ids.ecsAdded;
10   dr.ednsAdded = ids.ednsAdded;
11   dr.useZeroScope = ids.useZeroScope;
12   dr.packetCache = std::move(ids.packetCache);
13   dr.delayMsec = ids.delayMsec;
14   dr.skipCache = ids.skipCache;
15   dr.cacheKey = ids.cacheKey;
16   dr.cacheKeyNoECS = ids.cacheKeyNoECS;
17   dr.dnssecOK = ids.dnssecOK;
18   dr.tempFailureTTL = ids.tempFailureTTL;
19   dr.qTag = std::move(ids.qTag);
20   dr.subnet = std::move(ids.subnet);
21   dr.uniqueId = std::move(ids.uniqueId);
22 
23   if (ids.dnsCryptQuery) {
24     dr.dnsCryptQuery = std::move(ids.dnsCryptQuery);
25   }
26 
27   dr.hopRemote = &ids.hopRemote;
28   dr.hopLocal = &ids.hopLocal;
29 
30   return dr;
31 }
32 
setIDStateFromDNSQuestion(IDState & ids,DNSQuestion & dq,DNSName && qname)33 void setIDStateFromDNSQuestion(IDState& ids, DNSQuestion& dq, DNSName&& qname)
34 {
35   ids.origRemote = *dq.remote;
36   ids.origDest = *dq.local;
37   ids.sentTime.set(*dq.queryTime);
38   ids.qname = std::move(qname);
39   ids.qtype = dq.qtype;
40   ids.qclass = dq.qclass;
41   ids.delayMsec = dq.delayMsec;
42   ids.tempFailureTTL = dq.tempFailureTTL;
43   ids.origFlags = dq.origFlags;
44   ids.cacheFlags = dq.cacheFlags;
45   ids.cacheKey = dq.cacheKey;
46   ids.cacheKeyNoECS = dq.cacheKeyNoECS;
47   ids.subnet = dq.subnet;
48   ids.skipCache = dq.skipCache;
49   ids.packetCache = dq.packetCache;
50   ids.ednsAdded = dq.ednsAdded;
51   ids.ecsAdded = dq.ecsAdded;
52   ids.useZeroScope = dq.useZeroScope;
53   ids.qTag = dq.qTag;
54   ids.dnssecOK = dq.dnssecOK;
55   ids.uniqueId = std::move(dq.uniqueId);
56 
57   if (dq.hopRemote) {
58     ids.hopRemote = *dq.hopRemote;
59   }
60   else {
61     ids.hopRemote.sin4.sin_family = 0;
62   }
63 
64   if (dq.hopLocal) {
65     ids.hopLocal = *dq.hopLocal;
66   }
67   else {
68     ids.hopLocal.sin4.sin_family = 0;
69   }
70 
71   ids.dnsCryptQuery = std::move(dq.dnsCryptQuery);
72 }
73