DnsServer: dns forwarder feature implemented. Added check for truncation while resolving to shift to TCP in such cases. Added configurable retry value.

This commit is contained in:
Shreyas Zare
2017-01-21 20:45:11 +05:30
parent 53b27a9f15
commit bddaa748ba

View File

@@ -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
}