From bddaa748babea7d93b53c827b384a3046c028abb Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sat, 21 Jan 2017 20:45:11 +0530 Subject: [PATCH] DnsServer: dns forwarder feature implemented. Added check for truncation while resolving to shift to TCP in such cases. Added configurable retry value. --- DnsServerCore/DnsServer.cs | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/DnsServerCore/DnsServer.cs b/DnsServerCore/DnsServer.cs index 06da253b..1e57c58e 100644 --- a/DnsServerCore/DnsServer.cs +++ b/DnsServerCore/DnsServer.cs @@ -47,6 +47,7 @@ namespace DnsServerCore bool _allowRecursion; NameServerAddress[] _forwarders; bool _enableIPv6 = false; + int _retries = 2; #endregion @@ -371,25 +372,41 @@ namespace DnsServerCore foreach (DnsQuestionRecord questionRecord in request.Question) { - NameServerAddress[] nameServers = NameServerAddress.GetNameServersFromResponse(cacheResponse, _enableIPv6); + NameServerAddress[] nameServers; - if (nameServers.Length == 0) + if (_forwarders == null) { - if (_enableIPv6) - nameServers = DnsClient.ROOT_NAME_SERVERS_IPv6; - else - nameServers = DnsClient.ROOT_NAME_SERVERS_IPv4; + nameServers = NameServerAddress.GetNameServersFromResponse(cacheResponse, _enableIPv6); + + if (nameServers.Length == 0) + { + if (_enableIPv6) + nameServers = DnsClient.ROOT_NAME_SERVERS_IPv6; + else + nameServers = DnsClient.ROOT_NAME_SERVERS_IPv4; + } + } + else + { + nameServers = _forwarders; } int hopCount = 0; bool working = true; + bool tcp = false; while (working && ((hopCount++) < 64)) { - DnsClient client = new DnsClient(nameServers, _enableIPv6, false); + DnsClient client = new DnsClient(nameServers, _enableIPv6, tcp, _retries); DnsDatagram response = client.Resolve(questionRecord); + if (response.Header.Truncation) + { + tcp = true; + continue; + } + Zone.CacheResponse(_cacheZoneRoot, response); switch (response.Header.RCODE) @@ -481,6 +498,13 @@ namespace DnsServerCore get { return _enableIPv6; } set { _enableIPv6 = value; } } + + public int Retries + { + get { return _retries; } + set { _retries = value; } + } + #endregion }