[Dnsmasq-discuss] [PATCH] Fix DNS resolution when reconnecting to VPN or other similar interfaces
Dan Williams
dcbw at redhat.com
Sun Nov 13 15:40:09 GMT 2016
On Sat, 2016-11-12 at 20:14 -0500, Nikolay Martynov wrote:
> If interface goes down and then interface with same name brought up
> (e.g. VPN) then sending data for fds bound to this interfaces fails
> with ENODEV. Fix this by rebinding opened fd to current interface
> name.
Does this commit fix your issue too? Something similar was already
committed upstream:
http://thekelleys.org.uk/gitweb/?p=dnsmasq.git;a=commit;h=2675f2061525bc954be14988d64384b74aa7bf8b
Dan
> Signed-off-by: Nikolay Martynov <mar.kolya at gmail.com>
> ---
> src/network.c | 11 ++++++++++-
> 1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/src/network.c b/src/network.c
> index e7722fd..af7f94f 100644
> --- a/src/network.c
> +++ b/src/network.c
> @@ -1228,8 +1228,17 @@ static struct serverfd *allocate_sfd(union
> mysockaddr *addr, char *intname)
> /* may have a suitable one already */
> for (sfd = daemon->sfds; sfd; sfd = sfd->next )
> if (sockaddr_isequal(&sfd->source_addr, addr) &&
> - strcmp(intname, sfd->interface) == 0)
> + strcmp(intname, sfd->interface) == 0) {
> +#if defined(SO_BINDTODEVICE)
> + /* Interface may have went down and reopened after we have
> + opened this sfd (e.g. VPN). This makes interface-bound fd
> + invalid.
> + Bind fd to new interface instance to avoid errors */
> + if (intname[0] != 0)
> + setsockopt(sfd->fd, SOL_SOCKET, SO_BINDTODEVICE, intname,
> IF_NAMESIZE) == -1;
> +#endif
> return sfd;
> + }
>
> /* need to make a new one. */
> errno = ENOMEM; /* in case malloc fails. */
More information about the Dnsmasq-discuss
mailing list