From 931367f3c9574b7fc473fdce23627f4108cfb90d Mon Sep 17 00:00:00 2001 From: Jukka Rissanen Date: Thu, 5 Jan 2012 13:38:06 +0200 Subject: [PATCH] inet: Return router advertisement packet length in callback. 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 | 5 +++-- src/connman.h | 2 +- src/inet.c | 8 +++++--- src/network.c | 3 ++- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/6to4.c b/src/6to4.c index 0dfcbf7..7712ea3 100644 --- a/src/6to4.c +++ b/src/6to4.c @@ -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. diff --git a/src/connman.h b/src/connman.h index ae24217..e42cbe1 100644 --- a/src/connman.h +++ b/src/connman.h @@ -137,7 +137,7 @@ int __connman_inet_modify_address(int cmd, int flags, int index, int family, #include 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); diff --git a/src/inet.c b/src/inet.c index a2a66da..a659ab0 100644 --- a/src/inet.c +++ b/src/inet.c @@ -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; diff --git a/src/network.c b/src/network.c index 6dee555..e2266d0 100644 --- a/src/network.c +++ b/src/network.c @@ -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; -- 2.7.4