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

Reply via email to