]> granicus.if.org Git - pdns/commitdiff
it is a wip
authorbert hubert <bert.hubert@powerdns.com>
Wed, 28 Oct 2015 15:53:59 +0000 (16:53 +0100)
committerbert hubert <bert.hubert@powerdns.com>
Wed, 28 Oct 2015 15:53:59 +0000 (16:53 +0100)
modules/geoipbackend/geoipbackend.cc
pdns/Makefile.am
pdns/lwres.cc
pdns/recursor_cache.hh
pdns/sdig.cc

index 329af97beb0ab9019f7ee07cd60bc89be74e26e6..19a7b5e910c223f6cf3e2d39af9ae9974e64ab95 100644 (file)
@@ -15,6 +15,7 @@ public:
   int ttl;
   map<DNSName, string> services;
   map<DNSName, vector<DNSResourceRecord> > records;
+  uint8_t ipv4EDNSScope{24}, ipv6EDNSScope{64};
 };
 
 static vector<GeoIPDomain> s_domains;
@@ -95,6 +96,9 @@ void GeoIPBackend::initialize() {
     dom.id = s_domains.size();
     dom.domain = DNSName(domain["domain"].as<string>());
     dom.ttl = domain["ttl"].as<int>();
+    dom.ipv4EDNSScope = domain["ipv4ednsscope"].as<int>(24);
+    dom.ipv6EDNSScope = domain["ipv6ednsscope"].as<int>(64);
+
 
     for(YAML::const_iterator recs = domain["records"].begin(); recs != domain["records"].end(); recs++) {
       DNSName qname = DNSName(recs->first.as<string>());
@@ -247,7 +251,7 @@ void GeoIPBackend::lookup(const QType &qtype, const DNSName& qdomain, DNSPacket
   if (ri != dom.records.end()) { // return static value
     for(DNSResourceRecord& rr : ri->second) {
       if (qtype == QType::ANY || rr.qtype == qtype) {
-        rr.scopeMask = (v6 ? 128 : 32);
+       rr.scopeMask = (v6 ? dom.ipv6EDNSScope : dom.ipv4EDNSScope);
         d_result.push_back(rr);
         d_result.back().qname = qdomain;
       }
@@ -264,7 +268,7 @@ void GeoIPBackend::lookup(const QType &qtype, const DNSName& qdomain, DNSPacket
   rr.content = format;
   rr.auth = 1;
   rr.ttl = dom.ttl;
-  rr.scopeMask = (v6 ? 128 : 32);
+  rr.scopeMask = (v6 ? dom.ipv6EDNSScope : dom.ipv4EDNSScope);
   d_result.push_back(rr);
 }
 
index 69ae6a732a56ddbf218133d02b614d97031bd245..b034870f6d26e6af831d02350e5ab1c0526ae344 100644 (file)
@@ -1116,6 +1116,7 @@ pdns_recursor_SOURCES = \
        dnsrecords.cc dnsrecords.hh \
        dnssecinfra.cc \
        dnswriter.cc dnswriter.hh \
+       ednssubnet.cc ednssubnet.hh \
        filterpo.cc filterpo.hh \
        gss_context.cc gss_context.hh \
        iputils.cc \
index e8e6a5daad6a60410f762421e097ef39be10cebd..1d30ca127a6200956a94c8ffec19bf6ac434ed64 100644 (file)
@@ -47,6 +47,7 @@
 #include "dns_random.hh"
 #include <boost/scoped_array.hpp>
 #include <boost/algorithm/string.hpp>
+#include "ednssubnet.hh"
 
 //! returns -2 for OS limits error, -1 for permanent error that has to do with remote **transport**, 0 for timeout, 1 for success
 /** lwr is only filled out in case 1 was returned, and even when returning 1 for 'success', lwr might contain DNS errors
@@ -68,6 +69,9 @@ int asyncresolve(const ComboAddress& ip, const DNSName& domain, int type, bool d
 
   if(EDNS0Level && !doTCP) {
     DNSPacketWriter::optvect_t opts;
+    EDNSSubnetOpts eo;
+    eo.source = Netmask("2001:470:1f0b:27e:1850:ae41:cc31:7765");
+    opts.push_back(make_pair(8, makeEDNSSubnetOptsString(eo)));
 
     pw.addOpt(1200, 0, EDNSOpts::DNSSECOK, opts); // 1200 bytes answer size
     pw.commit();
index 1c643d08431912900d58b8eba8ab4a53f5cebbb9..c814d0f18c27bee717db8530aaf3387a5cbd0a77 100644 (file)
@@ -16,7 +16,7 @@
 #include <boost/multi_index/key_extractors.hpp>
 #include <boost/multi_index/sequenced_index.hpp>
 #include <boost/version.hpp>
-
+#include "iputils.hh"
 #undef max
 
 #define L theL()
@@ -49,7 +49,7 @@ private:
   struct CacheEntry
   {
     CacheEntry(const boost::tuple<DNSName, uint16_t>& key, const vector<shared_ptr<DNSRecordContent>>& records, bool auth) : 
-      d_qname(key.get<0>()), d_qtype(key.get<1>()), d_auth(auth), d_records(records), d_ttd(0)
+      d_qname(key.get<0>()), d_qtype(key.get<1>()), d_auth(auth), d_ttd(0), d_records(records)
     {}
 
     typedef vector<std::shared_ptr<DNSRecordContent>> records_t;
@@ -59,11 +59,12 @@ private:
       return d_ttd;
     }
 
-    DNSName d_qname;
+    DNSName d_qname; 
     uint16_t d_qtype;
     bool d_auth;
-    records_t d_records;
     uint32_t d_ttd;
+    records_t d_records;
+    vector<pair<Netmask, records_t> > d_subnetspecific;
   };
 
   typedef multi_index_container<
index 95e9bde2a9aeef7608c19ea9585c880f463637cc..19227a41a4b578e76d1e143775d6525d77aee6d7 100644 (file)
@@ -60,8 +60,6 @@ try
       bufsize=2800;
     DNSPacketWriter::optvect_t opts;
     if(ednsnm) {
-
-    
       EDNSSubnetOpts eo;
       eo.source = *ednsnm;
       opts.push_back(make_pair(8, makeEDNSSubnetOptsString(eo)));