udhcpc6: fix endianness
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 7 Nov 2011 15:21:24 +0000 (16:21 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 7 Nov 2011 15:21:24 +0000 (16:21 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/udhcp/d6_common.h
networking/udhcp/d6_dhcpc.c

index 88afaf8af3e9bf6e76c77983b815dd83676477b1..36d822f7e06ee039b680a66911c4a11b8823bf0c 100644 (file)
@@ -54,10 +54,10 @@ struct udp_d6_packet {
 /*** Options ***/
 
 struct d6_option {
-       uint8_t code;
        uint8_t code_hi;
-       uint8_t len;
+       uint8_t code;
        uint8_t len_hi;
+       uint8_t len;
        uint8_t data[1];
 } PACKED;
 
index d1baaae9b4c8d0912cdd83bfde5ac2649a18ea13..62d79b363b6901ea66905d0376608c9dde5e2489 100644 (file)
@@ -97,20 +97,20 @@ static void *d6_find_option(uint8_t *option, uint8_t *option_end, unsigned code)
        int len_m4 = option_end - option - 4;
        while (len_m4 >= 0) {
                /* Next option's len is too big? */
-               if (option[2] > len_m4)
+               if (option[3] > len_m4)
                        return NULL; /* yes. bogus packet! */
                /* So far we treat any opts with code >255
                 * or len >255 as bogus, and stop at once.
                 * This simplifies big-endian handling.
                 */
-               if (option[1] != 0 || option[3] != 0)
+               if (option[0] != 0 || option[2] != 0)
                        return NULL;
                /* Option seems to be valid */
                /* Does its code match? */
-               if (option[0] == code)
+               if (option[1] == code)
                        return option; /* yes! */
-               option += option[2] + 4;
-               len_m4 -= option[2] + 4;
+               option += option[3] + 4;
+               len_m4 -= option[3] + 4;
        }
        return NULL;
 }
@@ -120,7 +120,7 @@ static void *d6_copy_option(uint8_t *option, uint8_t *option_end, unsigned code)
        uint8_t *opt = d6_find_option(option, option_end, code);
        if (!opt)
                return opt;
-       return memcpy(xmalloc(opt[2] + 4), opt, opt[2] + 4);
+       return memcpy(xmalloc(opt[3] + 4), opt, opt[3] + 4);
 }
 
 static void *d6_store_blob(void *dst, const void *src, unsigned len)
@@ -920,8 +920,8 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
                clientid = xzalloc(2+2+2+2+6);
                clientid->code = D6_OPT_CLIENTID;
                clientid->len = 2+2+6;
-               clientid->data[0] = 3; /* DUID-LL */
-               clientid->data[2] = 1; /* ethernet */
+               clientid->data[1] = 3; /* DUID-LL */
+               clientid->data[3] = 1; /* ethernet */
                clientid_mac_ptr = clientid->data + 2+2;
                memcpy(clientid_mac_ptr, client_config.client_mac, 6);
                client_config.clientid = (void*)clientid;