htons(DHCPV6_OPT_SIP_SERVER_A),
htons(DHCPV6_OPT_AFTR_NAME),
htons(DHCPV6_OPT_PD_EXCLUDE),
+#ifdef EXT_PREFIX_CLASS
htons(DHCPV6_OPT_PREFIX_CLASS),
+#endif
};
odhcp6c_add_state(STATE_ORO, oro, sizeof(oro));
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 (stype == DHCPV6_OPT_STATUS && slen >= 2)
+ error = ((int)sdata[0]) << 8 | ((int)sdata[1]);
- if (error)
- continue;
+ if (error) {
+ syslog(LOG_WARNING, "Server returned IAID status %i!", error);
+ raise(SIGUSR2);
+ break;
+ }
uint32_t n = dhcpv6_parse_ia(&ia_hdr[1], odata + olen);
}
}
+ if (t1 == UINT32_MAX)
+ t1 = 300;
+
+ if (t2 == UINT32_MAX)
+ t2 = 600;
+
+ if (t3 == UINT32_MAX)
+ t3 = 3600;
+
return true;
}
// Update address IA
dhcpv6_for_each_option(opt, end, otype, olen, odata) {
- struct odhcp6c_entry entry = {IN6ADDR_ANY_INIT,
- 0, 0, IN6ADDR_ANY_INIT, 0, 0, 0};
+ struct odhcp6c_entry entry = {IN6ADDR_ANY_INIT, 0, 0,
+ IN6ADDR_ANY_INIT, 0, 0, 0};
if (otype == DHCPV6_OPT_IA_PREFIX) {
struct dhcpv6_ia_prefix *prefix = (void*)&odata[-4];
uint16_t stype, slen;
uint8_t *sdata;
+#ifdef EXT_PREFIX_CLASS
// Find prefix class, if any
dhcpv6_for_each_option(&prefix[1], odata + olen,
- stype, slen, sdata)
- if (stype == DHCPV6_OPT_PREFIX_CLASS && slen == 2)
- entry.prefix_class = ntohs(*((uint16_t*)sdata));
+ stype, slen, sdata)
+ if (stype == DHCPV6_OPT_PREFIX_CLASS && slen == 2)
+ entry.class = sdata[0] << 8 | sdata[1];
+#endif
// Parse PD-exclude
bool ok = true;
entry.length = 128;
entry.target = addr->addr;
+#ifdef EXT_PREFIX_CLASS
uint16_t stype, slen;
uint8_t *sdata;
-
// Find prefix class, if any
dhcpv6_for_each_option(&addr[1], odata + olen,
- stype, slen, sdata)
- if (stype == DHCPV6_OPT_PREFIX_CLASS && slen == 2)
- entry.prefix_class = ntohs(*((uint16_t*)sdata));
-
+ stype, slen, sdata)
+ if (stype == DHCPV6_OPT_PREFIX_CLASS && slen == 2)
+ entry.class = sdata[0] << 8 | sdata[1];
+#endif
+
odhcp6c_update_entry(STATE_IA_NA, &entry);
}
-
if (entry.valid > 0 && timeout > entry.valid)
timeout = entry.valid;
}