X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=src%2Fdhcpv6.c;h=cb2aa76f7c7ba01de307ca59f991ad2b9baf0bfc;hb=518cdfc1dbf5c61859f6faaf678e0bbed82755a6;hp=ca41db6b48e88dd90d05b73eb270f4d585fc5c55;hpb=2015de99e2495e886a0e5c748a654d7d5b112cf9;p=project%2Fodhcp6c.git diff --git a/src/dhcpv6.c b/src/dhcpv6.c index ca41db6..cb2aa76 100644 --- a/src/dhcpv6.c +++ b/src/dhcpv6.c @@ -464,7 +464,8 @@ static void dhcpv6_send(enum dhcpv6_msg type, uint8_t trid[3], uint32_t ecs) struct sockaddr_in6 srv = {AF_INET6, htons(DHCPV6_SERVER_PORT), 0, ALL_DHCPV6_RELAYS, ifindex}; - struct msghdr msg = {&srv, sizeof(srv), iov, cnt, NULL, 0, 0}; + struct msghdr msg = {.msg_name = &srv, .msg_namelen = sizeof(srv), + .msg_iov = iov, .msg_iovlen = cnt}; sendmsg(sock, &msg, 0); } @@ -486,8 +487,8 @@ int dhcpv6_request(enum dhcpv6_msg type) if (retx->delay) { struct timespec ts = {0, 0}; - ts.tv_nsec = dhcpv6_rand_delay(10 * DHCPV6_REQ_DELAY); - nanosleep(&ts, NULL); + ts.tv_nsec = (dhcpv6_rand_delay((10000 * DHCPV6_REQ_DELAY) / 2) + (1000 * DHCPV6_REQ_DELAY) / 2) * 1000000; + while (nanosleep(&ts, &ts) < 0 && errno == EINTR); } if (type == DHCPV6_MSG_UNKNOWN) @@ -552,8 +553,9 @@ int dhcpv6_request(enum dhcpv6_msg type) uint8_t buf[1536], cmsg_buf[CMSG_SPACE(sizeof(struct in6_pktinfo))]; struct iovec iov = {buf, sizeof(buf)}; struct sockaddr_in6 addr; - struct msghdr msg = {&addr, sizeof(addr), &iov, 1, - cmsg_buf, sizeof(cmsg_buf), 0}; + struct msghdr msg = {.msg_name = &addr, .msg_namelen = sizeof(addr), + .msg_iov = &iov, .msg_iovlen = 1, .msg_control = cmsg_buf, + .msg_controllen = sizeof(cmsg_buf)}; struct in6_pktinfo *pktinfo = NULL; @@ -1354,23 +1356,8 @@ static void dhcpv6_handle_ia_status_code(const enum dhcpv6_msg orig, } break; - case DHCPV6_NoAddrsAvail: - case DHCPV6_NoPrefixAvail: - switch (orig) { - case DHCPV6_MSG_REQUEST: - if (*ret != 0) - *ret = 0; - break; - default: - break; - } - break; - - case DHCPV6_NotOnLink: - // TODO handle not onlink in case of confirm - break; - default: + *ret = 0; break; } }