On 09/22/10 05:07 PM, Alasdair Lumsden wrote:
Hi All,
I actually obtained help on IRC for this from a very kind gentleman, and the issue is now
hopefully resolved. I'm sending this email for future reference for anyone googling
something similar. The "solution" is here:
http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6852739
Basically alter the code slightly and recompile mdns. Here was what I wrote
prior to getting help on IRC:
-----
I'm encountering issues setting up an AI server inside a zone - mainly, I can't
get mdns to work.
When I enable the svc:/network/dns/multicast:default service, it goes into
maintenance mode due to restarting too quickly. If I run it on the command line
with the -debug option, it stops and starts:
# /usr/lib/inet/mdnsd -debug
starting
stopping
#
If I run mdnsd in the global zone, it's fine. However inside a zone, it doesn't
want to work. I compared the truss output of the two, and spotted something.
This is the output from inside the zone:
8678: so_socket(PF_INET, SOCK_DGRAM, IPPROTO_IP, 0x00000000, SOV_XPG4_2) = 5
8678: ioctl(5, SIOCGLIFNUM, 0x08047B00) = 0
8678: ioctl(5, SIOCGLIFCONF, 0x08047B10) = 0
8678: ioctl(5, SIOCGLIFZONE, 0x08047050) = 0
8678: zone_lookup(0x00000000) = 2
8678: ioctl(5, SIOCGLIFZONE, 0x08047050) = 0
8678: zone_lookup(0x00000000) = 2
8678: close(5) = 0
8678: open("/etc/resolv.conf", O_RDONLY) = 5
This differs from the global zone:
8654: so_socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP, 0x00000000, SOV_XPG4_2) = 5
8654: ioctl(5, SIOCGLIFNUM, 0x08047AE0) = 0
8654: ioctl(5, SIOCGLIFCONF, 0x08047AF0) = 0
8654: ioctl(5, SIOCGLIFZONE, 0x080471A0) = 0
8654: zone_lookup(0x00000000) = 0
8654: ioctl(5, SIOCGLIFFLAGS, 0x080471A0) = 0
8654: so_socket(PF_INET, SOCK_DGRAM, IPPROTO_IP, 0x00000000, SOV_DEFAULT) = 6
8654: ioctl(6, SIOCGLIFINDEX, 0x08046FB0) = 0
8654: close(6) = 0
8654: close(5) = 0
So they seem to take different code paths based on whether it's inside a zone
or not. I tracked it down to this bit of code:
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/cmd-inet/usr.lib/mdnsd/mDNSUNP.c#376
#ifdef HAVE_SOLARIS_ZONES
/* Check the zone associated with the address */
lifrcopy = *lifr;
if (ioctl(sockfd, SIOCGLIFZONE,&lifrcopy)< 0) {
/* interface removed */
if (errno == ENXIO)
continue;
return(NULL);
}
if (lifrcopy.lifr_zoneid != getzoneid())
continue;
#endif
getzoneid() is responsible for the zone_lookup system call. I have no idea why
it gets called twice above and only once below. But I suspect this code is
broken somehow.
If anyone has any ideas as to how to solve this, please let me know.
The above HAVE_SOLARIS_ZONES code is both broken and unnecessary.
Just remove it and rebuild mdnsd and you should be fine.
Erik
_______________________________________________
install-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/install-discuss