[reSIProcate] DNS update in Ares

Dario Bozzali Dario.Bozzali at ifminfomaster.com
Thu Dec 4 02:34:09 CST 2008


Hi all,
I had a look at the code in rutil/dns and I think that it could be possible to reload DNS servers configuration even after stack initialization.
First of all I'm developing application under Windows OS, so I used IP helper functions to detect network configuration changes.
Then I tried to change some source code in rutil and it seems to work, even if DNS queries that are running during configuration reload terminate with cause ARES_EDESTRUCTION (I didn't find a better solution).
I would appreciate any suggestion/opinion/comment regarding following changes.

In rutil\dns\DnsStub.hxx I added the following method declaration:
		bool reloadDnsServers();
and the following data members:
		std::vector<GenericIPAddress> mAdditionalNameservers;
		AfterSocketCreationFuncPtr mSocketFunc;

In rutil\dns\DnsStub.cxx I changed DnsStub constructor:
DnsStub::DnsStub(const NameserverList& additional,
                 AfterSocketCreationFuncPtr socketFunc,
                 AsyncProcessHandler* asyncProcessHandler) :
   mTransform(0),
   mDnsProvider(ExternalDnsFactory::createExternalDns()),
   mAsyncProcessHandler(asyncProcessHandler)
{
	mAdditionalNameservers = additional;
	mSocketFunc = socketFunc;
[...]
}

Then I defined the following method definition:
bool
DnsStub::reloadDnsServers()
{
	bool changed = mDnsProvider->checkDnsChange(); 

	if (changed) {
		doClearDnsCache();

		mDnsProvider->init(mAdditionalNameservers,
								 mSocketFunc,
								 mDnsTimeout,
								 mDnsTries,
								 mDnsFeatures);
	}

	return changed;
}

Finally in rutil\dns\AresDns.cxx I changed method AresDns::internalInit() using ares_destroy() instead of ares_destroy_suppress_callbacks() function like in CARES:
int
AresDns::internalInit(const std::vector<GenericIPAddress>& additionalNameservers,
                      AfterSocketCreationFuncPtr socketfunc,
                      unsigned int features,
                      ares_channeldata** channel,
                      int timeout,
                      int tries
)
{
   if(*channel)
   {
#if defined(USE_ARES)
	ares_destroy(*channel);
#elif defined(USE_CARES)
      // Callbacks will be supressed by looking for the ARES_EDESTRUCTION
      // sentinel status
      ares_destroy(*channel);
#endif
      *channel = 0;
   }
[...]

I think it could also be possible to change AresDns::init() and AresDns::internalInit() methods declaration adding a new parameter (int suppressCallbacks, if necessary defaulted with value 1), so that it could be possible to use "void ares_destroy_internal(ares_channel channel, int suppressCallbacks);" function (this function is used internally by ares_destroy ares_destroy_suppress_callbacks functions): in this way we can decide at initialization time to suppress callback or not.

Thank you in advance and best regards.

Dario.


________________________________


-----Original Message-----
From: Byron Campen [mailto:bcampen at estacado.net] 
Sent: martedì 2 dicembre 2008 0.37
To: Dario Bozzali
Cc: resiprocate-devel at list.resiprocate.org
Subject: Re: [reSIProcate] DNS update in Ares

	I don't think this can be done while the stack is already up.

Best regards,
Byron Campen

> Hi all,
> I have a question related to Ares and DNS servers.
> DNS servers in Ares are configured at application startup time.
> Does it exist in Resiprocate the opportunity to detect that something 
> has been changed in network configuration so that I can refresh/update 
> DNS servers in Ares?
> Any suggestion would be appreciated.
> Thank you in advance.
>
> Best regards,
> Dario.
> _______________________________________________
> resiprocate-devel mailing list
> resiprocate-devel at resiprocate.org
> https://list.resiprocate.org/mailman/listinfo/resiprocate-devel




More information about the resiprocate-devel mailing list