]> git.decadent.org.uk Git - odhcp6c.git/blobdiff - src/dhcpv6.c
Fix receive rounds end condition
[odhcp6c.git] / src / dhcpv6.c
index b727818139a1aba2f5fffd9032a9a26856a6be26..e07886780f8f352bad24e95ca31ed136ada47904 100644 (file)
@@ -145,6 +145,7 @@ int init_dhcpv6(const char *ifname, int request_pd, int sol_timeout)
                                                sizeof(ifr.ifr_name));
                                if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0)
                                        continue;
+
                                memcpy(&duid[8], ifr.ifr_hwaddr.sa_data,
                                                ETHER_ADDR_LEN);
                        }
@@ -169,31 +170,21 @@ int init_dhcpv6(const char *ifname, int request_pd, int sol_timeout)
        };
        odhcp6c_add_state(STATE_ORO, oro, sizeof(oro));
 
-       do {
-               // Configure IPv6-options
-               int val = 1;
-               if (setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof(val)) < 0)
-                       break;
-               if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)) < 0)
-                       break;
-               if (setsockopt(sock, IPPROTO_IPV6, IPV6_RECVPKTINFO, &val, sizeof(val)) < 0)
-                       break;
-
-               val = 0;
-               if (setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &val, sizeof(val)) < 0)
-                       break;
-               if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, ifname, strlen(ifname)) < 0)
-                       break;
-
-               struct sockaddr_in6 client_addr = { .sin6_family = AF_INET6,
-                       .sin6_port = htons(DHCPV6_CLIENT_PORT), .sin6_flowinfo = 0 };
-               if (bind(sock, (struct sockaddr*)&client_addr, sizeof(client_addr)) < 0)
-                       break;
-
-               return 0;
-       } while (0);
+       // Configure IPv6-options
+       int val = 1;
+       setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof(val));
+       setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
+       setsockopt(sock, IPPROTO_IPV6, IPV6_RECVPKTINFO, &val, sizeof(val));
+       val = 0;
+       setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &val, sizeof(val));
+       setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, ifname, strlen(ifname));
+
+       struct sockaddr_in6 client_addr = { .sin6_family = AF_INET6,
+               .sin6_port = htons(DHCPV6_CLIENT_PORT), .sin6_flowinfo = 0 };
+       if (bind(sock, (struct sockaddr*)&client_addr, sizeof(client_addr)) < 0)
+               return -1;
 
-       return -1;
+       return 0;
 }
 
 
@@ -478,7 +469,7 @@ int dhcpv6_request(enum dhcpv6_msg type)
                }
 
                // Receive rounds
-               for (; len < 0 && round_start < round_end;
+               for (; len < 0 && (round_start < round_end);
                                round_start = odhcp6c_get_milli_time()) {
                        uint8_t buf[1536], cmsg_buf[CMSG_SPACE(sizeof(struct in6_pktinfo))];
                        struct iovec iov = {buf, sizeof(buf)};