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);