On Wed, Nov 05, 2008 at 12:22:03PM +0800, Uwe Dippel wrote: > Here is what Stuart requested. > I hope the attachment goes through! > > 00f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ > 0100: 0000 0000 0000 0000 6382 5363 3401 0035 ........c.Sc4..5
And that might be the problem. The DHCP overload option (#52, or hex 34) has the correct length (01) but a value of 0. This indicates no overload and Solaris is upset that the option is even there in this case. So much for trying to simplify the code by using a standard header. So this option needs to be overwritten with DHO_PAD if there is no overloading. This (untested) diff might help. Unfortunately I have no Solaris to test against and I'm off to work now. Test reports welcome, or better fixes. .... Ken Index: options.c =================================================================== RCS file: /cvs/src/usr.sbin/dhcpd/options.c,v retrieving revision 1.22 diff -u -p -r1.22 options.c --- options.c 10 Sep 2008 00:22:49 -0000 1.22 +++ options.c 5 Nov 2008 13:12:49 -0000 @@ -459,7 +459,12 @@ zapfrags: if (bufix < buflen) buffer[bufix++] = DHO_END; - /* Fill in overload option value based on space used for options. */ + /* + * Fill in overload option value based on space used for options. + * N.B.: Some OS's/dhclients (e.g. Solaris) freak if they see an + * overload option with a value of 0. Overwrite the option + * with DHO_PAD if no overloading is used. + */ if (overload && bufix > main_buffer_size) { overflow = bufix - main_buffer_size; if (overload & 1) { @@ -468,6 +473,10 @@ zapfrags: } if (overflow > 0) buffer[6] |= 2; + } else { + buffer[4] = DHO_PAD; + buffer[5] = DHO_PAD; + buffer[6] = DHO_PAD; } return (bufix);