From: Ruben d'Arco Date: Tue, 26 Feb 2013 22:09:58 +0000 (+0100) Subject: Add support for forwarding to master X-Git-Tag: rec-3.6.0-rc1~556^2~3^2~74 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b31488872fee7d619e9538a27f440c7fb7517ab1;p=thirdparty%2Fpdns.git Add support for forwarding to master We now forward to masters whenever we are a slave. Code is not very well tested, but works on simple test setup. We need to add an option to enable/disable dis behaviour --- diff --git a/pdns/dnsparser.cc b/pdns/dnsparser.cc old mode 100644 new mode 100755 diff --git a/pdns/packethandler.hh b/pdns/packethandler.hh old mode 100644 new mode 100755 index 3a1cff00ee..d75b4dd895 --- a/pdns/packethandler.hh +++ b/pdns/packethandler.hh @@ -104,6 +104,7 @@ private: void emitNSEC(const std::string& before, const std::string& after, const std::string& toNSEC, const SOAData& sd, DNSPacket *r, int mode); void emitNSEC3(const NSEC3PARAMRecordContent &ns3rc, const SOAData& sd, const std::string& unhashed, const std::string& begin, const std::string& end, const std::string& toNSEC3, DNSPacket *r, int mode); int processUpdate(DNSPacket *p); + int forwardPacket(const string &msgPrefix, DNSPacket *p, DomainInfo *di); uint16_t performUpdate(const string &msgPrefix, const DNSRecord *rr, DomainInfo *di, bool narrow, bool haveNSEC3, const NSEC3PARAMRecordContent *ns3pr, bool *updatedSerial); int checkUpdatePrescan(const DNSRecord *rr); int checkUpdatePrerequisites(const DNSRecord *rr, DomainInfo *di); diff --git a/pdns/rfc2136handler.cc b/pdns/rfc2136handler.cc index c1fd0554c2..8c8c2a86f8 100755 --- a/pdns/rfc2136handler.cc +++ b/pdns/rfc2136handler.cc @@ -7,6 +7,8 @@ #include "base32.hh" #include "misc.hh" #include "arguments.hh" +#include "resolver.hh" +#include "dns_random.hh" extern PacketCache PC; @@ -339,6 +341,91 @@ uint16_t PacketHandler::performUpdate(const string &msgPrefix, const DNSRecord * return recordsToDelete.size() + changedRecords; } +int PacketHandler::forwardPacket(const string &msgPrefix, DNSPacket *p, DomainInfo *di) { + for(vector::const_iterator master=di->masters.begin(); master != di->masters.end(); master++) { + ComboAddress remote; + try { + remote =ComboAddress(*master, 53); //TODO: parse master and check if it has a port, also delete? + } + catch (...) { + L<