[Dnsmasq-discuss] 2.68rc4: bind-interfaces, FreeBSD, IPv6 2001:... addr fails and loses error code, parallel build brittle

Matthias Andree matthias.andree at gmx.de
Sun Dec 1 01:59:49 GMT 2013


Greetings,

testing 2.68rc4, I have found three issues, on FreeBSD 9.2 amd64:

1. the Makefiles might not thoroughly list all dependencies required to
build the dnsmasq executable; I found my build miss cache.o when linking
(compiling with make -j + high number), re-running make immediately
after the failure "solved" the problem.
I am using a local UFS file system, so no NFS time skew.
I am using GNU make 3.82.

2. Binding IPv6 addresses on FreeBSD does not appear to work properly,
with bind-interfaces option.

3. And the error from 2. does not get properly reported either, the
error code is apparently lost somewhere, or errno gets reset.

This is the dnsmasq.conf, domain made up (build configuration is below
in the log of the successful start):

> domain-needed
> bogus-priv
> no-resolv
> no-poll
> server=127.0.0.1
> except-interface=lo0
> bind-interfaces
> expand-hosts
> domain=EXAMPLE.org


This is the interface configuration, with some information masked:

> em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
> 	options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
> 	ether ...
> 	inet 192.168.33.14 netmask 0xffffff00 broadcast 192.168.33.255
> 	inet6 fe80::a00:..ff:fe..:1234%em0 prefixlen 64 scopeid 0x1 
> 	inet6 2001:....:....:....:a00:..ff:fe..:1234 prefixlen 64 autoconf 
> 	inet6 2001:....:....:....:b0e1:f6da:....:.... prefixlen 64 autoconf temporary 
> 	nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
> 	media: Ethernet autoselect (1000baseT <full-duplex>)
> 	status: active
> lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
> 	options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
> 	inet6 ::1 prefixlen 128 
> 	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4 
> 	inet 127.0.0.1 netmask 0xff000000 
> 	nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
> 	groups: lo


This is the error when running things:

> $ LC_ALL=C sudo /var/tmp/usr/ports.svn/dns/dnsmasq-devel/work/stage/usr/local/sbin/dnsmasq -d
> 
> dnsmasq: failed to create listening socket for 2001:4dd0:ff00:893e:b0e1:f6da:b2d8:9720%em0: No error: 0

Now, this doesn't help at all, so let's go for details and use truss:

> $ LC_ALL=C sudo truss dnsmasq -d 2>&1 | egrep -v close.*ERR#9
> mmap(0x0,32768,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34366386176 (0x800657000)
> issetugid(0x800857a60,0x7fffffffefc8,0x40,0x0,0xffff800800858a98,0x0) = 0 (0x0)

...

> open("/usr/local/etc/dnsmasq.conf",O_RDONLY,0666) = 3 (0x3)
> fstat(3,{ mode=-rw-r--r-- ,inode=10763926,size=25245,blksize=16384 }) = 0 (0x0)
> read(3,"# Configuration file for dnsmasq"...,16384) = 16384 (0x4000)
> read(3,"#dhcp-option-force=208,f1:00:74:"...,16384) = 8861 (0x229d)
> read(3,0x801c84000,16384)			 = 0 (0x0)
> close(3)					 = 0 (0x0)
> madvise(0x801cd2000,0x1000,0x5,0xd1,0x7fffffffce00,0xffffffff) = 0 (0x0)
> madvise(0x801ccf000,0x1000,0x5,0xce,0x7fffffffce00,0xffffffff) = 0 (0x0)
> madvise(0x801c84000,0x4000,0x5,0x83,0x7fffffffce00,0xffffffff) = 0 (0x0)
> open("/dev/null",O_RDWR,0160002740)		 = 3 (0x3)
> open("/dev/null",O_RDWR,0160002740)		 = 4 (0x4)
> open("/dev/null",O_RDWR,0160002740)		 = 5 (0x5)
> close(3)					 = 0 (0x0)
> close(4)					 = 0 (0x0)
> close(5)					 = 0 (0x0)
> clock_gettime(13,{1385861339.000000000 })	 = 0 (0x0)
> socket(PF_INET,SOCK_DGRAM,0)			 = 3 (0x3)
> __sysctl(0x7fffffffd730,0x6,0x0,0x7fffffffd748,0x0,0x0) = 0 (0x0)
> __sysctl(0x7fffffffd730,0x6,0x801c80400,0x7fffffffd748,0x0,0x0) = 0 (0x0)
> socket(PF_INET6,SOCK_DGRAM,0)			 = 4 (0x4)
> socket(PF_INET,SOCK_DGRAM,0)			 = 5 (0x5)
> ioctl(5,SIOCGIFINDEX,0xffffd730)		 = 0 (0x0)
> close(5)					 = 0 (0x0)
> ioctl(4,SIOCGIFAFLAG_IN6,0xffffd7d0)		 = 0 (0x0)
> ioctl(4,SIOCGIFALIFETIME_IN6,0xffffd7d0)	 = 0 (0x0)
> __sysctl(0x7fffffffd610,0x6,0x0,0x7fffffffd628,0x0,0x0) = 0 (0x0)
> __sysctl(0x7fffffffd610,0x6,0x801c80400,0x7fffffffd628,0x0,0x0) = 0 (0x0)
> ioctl(3,SIOCGIFFLAGS,0xffffd6e0)		 = 0 (0x0)
> ioctl(3,SIOCGIFMTU,0xffffd6e0)			 = 0 (0x0)
> socket(PF_INET,SOCK_DGRAM,0)			 = 5 (0x5)
> ioctl(5,SIOCGIFINDEX,0xffffd730)		 = 0 (0x0)
> close(5)					 = 0 (0x0)
> ioctl(4,SIOCGIFAFLAG_IN6,0xffffd7d0)		 = 0 (0x0)
> ioctl(4,SIOCGIFALIFETIME_IN6,0xffffd7d0)	 = 0 (0x0)
> __sysctl(0x7fffffffd610,0x6,0x0,0x7fffffffd628,0x0,0x0) = 0 (0x0)
> __sysctl(0x7fffffffd610,0x6,0x801cb1400,0x7fffffffd628,0x0,0x0) = 0 (0x0)
> ioctl(3,SIOCGIFFLAGS,0xffffd6e0)		 = 0 (0x0)
> ioctl(3,SIOCGIFMTU,0xffffd6e0)			 = 0 (0x0)
> socket(PF_INET,SOCK_DGRAM,0)			 = 5 (0x5)
> ioctl(5,SIOCGIFINDEX,0xffffd730)		 = 0 (0x0)
> close(5)					 = 0 (0x0)
> ioctl(4,SIOCGIFAFLAG_IN6,0xffffd7d0)		 = 0 (0x0)
> ioctl(4,SIOCGIFALIFETIME_IN6,0xffffd7d0)	 = 0 (0x0)
> __sysctl(0x7fffffffd610,0x6,0x0,0x7fffffffd628,0x0,0x0) = 0 (0x0)
> __sysctl(0x7fffffffd610,0x6,0x801cb1400,0x7fffffffd628,0x0,0x0) = 0 (0x0)
> ioctl(3,SIOCGIFFLAGS,0xffffd6e0)		 = 0 (0x0)
> ioctl(3,SIOCGIFMTU,0xffffd6e0)			 = 0 (0x0)
> socket(PF_INET,SOCK_DGRAM,0)			 = 5 (0x5)
> ioctl(5,SIOCGIFINDEX,0xffffd730)		 = 0 (0x0)
> close(5)					 = 0 (0x0)
> ioctl(4,SIOCGIFAFLAG_IN6,0xffffd7d0)		 = 0 (0x0)
> ioctl(4,SIOCGIFALIFETIME_IN6,0xffffd7d0)	 = 0 (0x0)
> __sysctl(0x7fffffffd610,0x6,0x0,0x7fffffffd628,0x0,0x0) = 0 (0x0)
> __sysctl(0x7fffffffd610,0x6,0x801cb1400,0x7fffffffd628,0x0,0x0) = 0 (0x0)
> ioctl(3,SIOCGIFFLAGS,0xffffd6e0)		 = 0 (0x0)
> ioctl(3,SIOCGIFMTU,0xffffd6e0)			 = 0 (0x0)
> socket(PF_INET,SOCK_DGRAM,0)			 = 5 (0x5)
> ioctl(5,SIOCGIFINDEX,0xffffd730)		 = 0 (0x0)
> close(5)					 = 0 (0x0)
> ioctl(4,SIOCGIFAFLAG_IN6,0xffffd7d0)		 = 0 (0x0)
> ioctl(4,SIOCGIFALIFETIME_IN6,0xffffd7d0)	 = 0 (0x0)
> __sysctl(0x7fffffffd610,0x6,0x0,0x7fffffffd628,0x0,0x0) = 0 (0x0)
> __sysctl(0x7fffffffd610,0x6,0x801cb1400,0x7fffffffd628,0x0,0x0) = 0 (0x0)
> ioctl(3,SIOCGIFFLAGS,0xffffd6e0)		 = 0 (0x0)
> ioctl(3,SIOCGIFMTU,0xffffd6e0)			 = 0 (0x0)
> close(4)					 = 0 (0x0)
> __sysctl(0x7fffffffd730,0x6,0x0,0x7fffffffd748,0x0,0x0) = 0 (0x0)
> __sysctl(0x7fffffffd730,0x6,0x801c81400,0x7fffffffd748,0x0,0x0) = 0 (0x0)
> socket(PF_INET,SOCK_DGRAM,0)			 = 4 (0x4)
> ioctl(4,SIOCGIFINDEX,0xffffd730)		 = 0 (0x0)
> close(4)					 = 0 (0x0)
> __sysctl(0x7fffffffd610,0x6,0x0,0x7fffffffd628,0x0,0x0) = 0 (0x0)
> __sysctl(0x7fffffffd610,0x6,0x801c81400,0x7fffffffd628,0x0,0x0) = 0 (0x0)
> ioctl(3,SIOCGIFFLAGS,0xffffd6e0)		 = 0 (0x0)
> ioctl(3,SIOCGIFMTU,0xffffd6e0)			 = 0 (0x0)
> socket(PF_INET,SOCK_DGRAM,0)			 = 4 (0x4)
> ioctl(4,SIOCGIFINDEX,0xffffd730)		 = 0 (0x0)
> close(4)					 = 0 (0x0)
> __sysctl(0x7fffffffd610,0x6,0x0,0x7fffffffd628,0x0,0x0) = 0 (0x0)
> __sysctl(0x7fffffffd610,0x6,0x801c81400,0x7fffffffd628,0x0,0x0) = 0 (0x0)
> ioctl(3,SIOCGIFFLAGS,0xffffd6e0)		 = 0 (0x0)
> ioctl(3,SIOCGIFMTU,0xffffd6e0)			 = 0 (0x0)
> close(3)					 = 0 (0x0)
> socket(PF_INET,SOCK_DGRAM,0)			 = 3 (0x3)
> setsockopt(0x3,0xffff,0x4,0x7fffffffd8d4,0x4,0xffffffff) = 0 (0x0)
> fcntl(3,F_GETFL,)				 = 2 (0x2)
> fcntl(3,F_SETFL,O_NONBLOCK|0x2)			 = 0 (0x0)
> bind(3,{ AF_INET 192.168.33.14:53 },16)		 = 0 (0x0)
> socket(PF_INET,SOCK_STREAM,0)			 = 4 (0x4)
> setsockopt(0x4,0xffff,0x4,0x7fffffffd8d4,0x4,0xffffffff) = 0 (0x0)
> fcntl(4,F_GETFL,)				 = 2 (0x2)
> fcntl(4,F_SETFL,O_NONBLOCK|0x2)			 = 0 (0x0)
> bind(4,{ AF_INET 192.168.33.14:53 },16)		 = 0 (0x0)
> listen(0x4,0x5,0x10,0x7fffffffd8d4,0x4,0xffffffff) = 0 (0x0)
> socket(PF_INET6,SOCK_DGRAM,0)			 = 5 (0x5)
> setsockopt(0x5,0xffff,0x4,0x7fffffffd8d4,0x4,0x0) = 0 (0x0)
> fcntl(5,F_GETFL,)				 = 2 (0x2)
> fcntl(5,F_SETFL,O_NONBLOCK|0x2)			 = 0 (0x0)
> setsockopt(0x5,0x29,0x1b,0x7fffffffd8d4,0x4,0x0) = 0 (0x0)
> bind(5,{ AF_INET6 [2001:....:....:....:b0e1:f6da:....:....]:53 },28) ERR#49 'Can't assign requested address'

Corresponding to EADDRNOTAVAIL.  Removing the alias causes the same
issue on the other 2001:... address.  Removing both 2001:... aliases
lets dnsmasq start up, and lsof -i:53 -n gives this:

> named    889 bind   20u  IPv4 0xfffffe0005d823d0      0t0  TCP 127.0.0.1:domain (LISTEN)
> named    889 bind  512u  IPv4 0xfffffe0005b590c0      0t0  UDP 127.0.0.1:domain
> dnsmasq 5727 root    3u  IPv4 0xfffffe0005b59890      0t0  UDP 192.168.33.14:domain
> dnsmasq 5727 root    4u  IPv4 0xfffffe006fa6eb70      0t0  TCP 192.168.33.14:domain (LISTEN)
> dnsmasq 5727 root    5u  IPv6 0xfffffe0005b0d2d0      0t0  UDP [fe80::a00:..ff:fe..:1234%em0]:domain
> dnsmasq 5727 root    6u  IPv6 0xfffffe006f253000      0t0  TCP [fe80::a00:..ff:fe..:1234%em0]:domain (LISTEN)

Not sure what's going on there when it's trying to bind 2001:... addresses.

Now, if I remove bind-interfaces, I get:

> dnsmasq: started, version 2.67 cachesize 150
> dnsmasq: compile time options: IPv6 GNU-getopt no-DBus i18n IDN DHCP DHCPv6 Lua TFTP no-conntrack no-ipset auth
> dnsmasq: using nameserver 127.0.0.1#53
> dnsmasq: read /etc/hosts - 5 addresses

and

> COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
> named    889 bind   20u  IPv4 0xfffffe0005d823d0      0t0  TCP localhost:domain (LISTEN)
> named    889 bind  512u  IPv4 0xfffffe0005b590c0      0t0  UDP localhost:domain
> dnsmasq 4664 root    3u  IPv4 0xfffffe0005b59720      0t0  UDP *:domain
> dnsmasq 4664 root    4u  IPv4 0xfffffe006f9f37a0      0t0  TCP *:domain (LISTEN)
> dnsmasq 4664 root    5u  IPv6 0xfffffe0005b596f0      0t0  UDP *:domain
> dnsmasq 4664 root    6u  IPv6 0xfffffe006fa6f7a0      0t0  TCP *:domain (LISTEN)

Do you need anything else to debug this?

Best regards
Matthias



More information about the Dnsmasq-discuss mailing list