[Dnsmasq-discuss] It works: multiple dnsmasqs running

Gene Czarcinski gene at czarc.net
Mon Oct 15 18:05:44 BST 2012


On 10/15/2012 12:04 PM, Simon Kelley wrote:
> On 15/10/12 15:48, Gene Czarcinski wrote:
>> On 10/15/2012 06:47 AM, Simon Kelley wrote:
>>> On 13/10/12 19:39, Gene Czarcinski wrote:
>>>
>>>> I again proved to myself that specifying listen-address=<ip4-address>
>>>> and listen-address=<ip6-address> does not work with dhcp6 whereas
>>>> specifying interface=eth0 does.  I am not sure how/why it seems to 
>>>> work
>>>> with dhcp4 (as demonstrated by libvirt) but not dhcp6.  BTW, there is
>>>> one difference: libvirt specifies --listen-address on the command line
>>>> whereas I had it in a conf file.
>>>
>>> conf-file versus command line will make no difference. Which address
>>> are you using? the Link-local one or a globally-routed one?
>> I have tried both and it makes no difference.
>>
>> I am using a manually configured IPv6 address.
>>
>> I have done a "little" instrumentation o dnsmasq to attempt to locate
>> the problem (that's "expert talk" for adding a whole bunch of my_syslog
>> lines to to see what is going on and just what is being executed).  In
>> fact, I have added a lot of lines which produce lots and lots of
>> messages in syslog.
>>
>> I believe I can see what the problem is but not necessarily how to fix
>> it.  The reason that dhcp4 works and dhcp6 does not is that dhcp4 has a
>> "fallback" when an interface is not specified.
>>
>> I have looked at a lot of code so far and a lot of syslog files. I found
>> the difference in dhcp_packet() versus dhcp6_packet() ... dhcp_packet()
>> adds an async function complete_context() to make things work. But, I
>> have never done any socket programming before and it took me at least a
>> little while to realize what is going on (or at least I believe that I
>> do). [I was wonder why all those iface_check() calls where being made.]
>>
>> When a ff00::1:2 dhcp6 packet arrived, dhcp6_packet() did not fined any
>> entry for the incoming device in the daemon->if_names list, so it just
>> drops the packet.
>>
>> I am sure that you can come up with a solution much quicker than I can
>> but I am going to continue looking into this to see if I can fix it.
>> Like I said, I have never done any programming with sockets and this
>> interests me.
>>
>
> What's supposed to happen in dhcp6_packet() is that the IPv6 address 
> in dest matches the --listen-address address. The check for this is 
> done by iface_check() , which should return 1.
>
> So the crucial bit of information is what is in the variable dest?
>
> Something like
>
> { char buf[200];
>   inet_ntop(AF_INET6, &dest.addr.addr6, buf, 200);
>   my_syslog(MS_DHCP | LOG_INFO, "destination address is %s", buf);
> }
>
> will do the trick.
>
>
I did not really need that because I had already "instrumented" 
iface_check().  It is failing because iface_check() is checking the 
wrong list.  Instead of checking the daemon->if_names and 
daemon->if_addrs lists which it does, it should be checking the 
daemon->interfaces list which is very carefully built when 
enumerate_interfaces() is called in dnsmasq.c

iface_check() is called a lot and I don't know if changing it would 
break something else but having a new interfaces_check() should work ... 
or, just put the code into dhcp6_packet().

And, I do believe that I have learn a little about socket programming.

Gene

Gene



More information about the Dnsmasq-discuss mailing list