]> git.decadent.org.uk Git - odhcp6c.git/blobdiff - src/dhcpv6.c
Be less picky when erroring out due to strange IA status-codes
[odhcp6c.git] / src / dhcpv6.c
index ca41db6b48e88dd90d05b73eb270f4d585fc5c55..cb2aa76f7c7ba01de307ca59f991ad2b9baf0bfc 100644 (file)
@@ -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;
        }
 }