inet: Return router advertisement packet length in callback.
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Thu, 5 Jan 2012 11:38:06 +0000 (13:38 +0200)
committerDaniel Wagner <daniel.wagner@bmw-carit.de>
Thu, 5 Jan 2012 12:17:26 +0000 (13:17 +0100)
The length of the RA packet must be returned in callback,
otherwise callback cannot check RA options. The prefix length
RA option is needed in stateful DHCPv6 implementation.

src/6to4.c
src/connman.h
src/inet.c
src/network.c

index 0dfcbf7..7712ea3 100644 (file)
@@ -449,12 +449,13 @@ error:
        return -1;
 }
 
-static void receive_rs_reply(struct nd_router_advert *reply, void *user_data)
+static void receive_rs_reply(struct nd_router_advert *reply,
+                       unsigned int length, void *user_data)
 {
        char *address = user_data;
        struct in_addr ip4addr;
 
-       DBG("reply %p address %s", reply, address);
+       DBG("reply %p len %d address %s", reply, length, address);
 
        /* We try to create tunnel if autoconfiguration did not work i.e.,
         * we did not receive any reply to router solicitation message.
index ae24217..e42cbe1 100644 (file)
@@ -137,7 +137,7 @@ int __connman_inet_modify_address(int cmd, int flags, int index, int family,
 #include <netinet/icmp6.h>
 
 typedef void (*__connman_inet_rs_cb_t) (struct nd_router_advert *reply,
-                                       void *user_data);
+                                       unsigned int length, void *user_data);
 
 int __connman_inet_ipv6_send_rs(int index, int timeout,
                        __connman_inet_rs_cb_t callback, void *user_data);
index a2a66da..a659ab0 100644 (file)
@@ -1456,7 +1456,7 @@ static gboolean rs_timeout_cb(gpointer user_data)
                return FALSE;
 
        if (data->callback != NULL)
-               data->callback(NULL, data->user_data);
+               data->callback(NULL, 0, data->user_data);
 
        data->rs_timeout = 0;
        rs_cleanup(data);
@@ -1488,16 +1488,18 @@ static int icmpv6_recv(int fd, gpointer user_data)
 
        len = recvmsg(fd, &mhdr, 0);
        if (len < 0) {
-               data->callback(NULL, data->user_data);
+               data->callback(NULL, 0, data->user_data);
                rs_cleanup(data);
                return -errno;
        }
 
        hdr = (struct nd_router_advert *)buf;
+       DBG("code %d len %zd hdr %zd", hdr->nd_ra_code, len,
+                               sizeof(struct nd_router_advert));
        if (hdr->nd_ra_code != 0)
                return 0;
 
-       data->callback(hdr, data->user_data);
+       data->callback(hdr, len, data->user_data);
        rs_cleanup(data);
 
        return len;
index 6dee555..e2266d0 100644 (file)
@@ -982,7 +982,8 @@ static void dhcpv6_info_callback(struct connman_network *network,
        stop_dhcpv6(network);
 }
 
-static void check_dhcpv6(struct nd_router_advert *reply, void *user_data)
+static void check_dhcpv6(struct nd_router_advert *reply,
+                       unsigned int length, void *user_data)
 {
        struct connman_network *network = user_data;