]> git.decadent.org.uk Git - odhcp6c.git/blobdiff - src/dhcpv6.c
Check for local addr more often
[odhcp6c.git] / src / dhcpv6.c
index 785b57b03aedf1543dea2ff08a08594599873ceb..f128ed88fa52e82a064c9c4065a4dbc14dd4a4a7 100644 (file)
@@ -744,18 +744,21 @@ static int dhcpv6_handle_reply(enum dhcpv6_msg orig,
                        if (ia_hdr->iaid != 1 || l_t2 < l_t1)
                                continue;
 
-                       bool error = false;
+                       int error = 0;
                        uint16_t stype, slen;
                        uint8_t *sdata;
                        // Test status and bail if error
                        dhcpv6_for_each_option(&ia_hdr[1], odata + olen,
                                        stype, slen, sdata)
-                               if (stype == DHCPV6_OPT_STATUS && slen >= 2 &&
-                                               (sdata[0] || sdata[1]))
-                                       error = true;
-
-                       if (error)
-                               continue;
+                               if (stype == DHCPV6_OPT_STATUS && slen >= 2)
+                                       error = ((int)sdata[0]) << 8 | ((int)sdata[1]);
+
+                       if (error) {
+                               syslog(LOG_WARNING, "Server returned IAID status %i!", error);
+                               if (error != 2)
+                                       raise(SIGUSR2);
+                               break;
+                       }
 
                        uint32_t n = dhcpv6_parse_ia(&ia_hdr[1], odata + olen);
 
@@ -821,6 +824,15 @@ static int dhcpv6_handle_reply(enum dhcpv6_msg orig,
                }
        }
 
+       if (t1 == UINT32_MAX)
+               t1 = 300;
+
+       if (t2 == UINT32_MAX)
+               t2 = 600;
+
+       if (t3 == UINT32_MAX)
+               t3 = 3600;
+
        return true;
 }