htons(DHCPV6_OPT_PD_EXCLUDE),
htons(DHCPV6_OPT_SOL_MAX_RT),
htons(DHCPV6_OPT_INF_MAX_RT),
-#ifdef EXT_PREFIX_CLASS
- htons(DHCPV6_OPT_PREFIX_CLASS),
-#endif
#ifdef EXT_CER_ID
htons(DHCPV6_OPT_CER_ID),
#endif
.addr = e[j].target
};
+ if (type == DHCPV6_MSG_REQUEST) {
+ p.preferred = htonl(e[j].preferred);
+ p.valid = htonl(e[j].valid);
+ }
+
memcpy(ia_pd + ia_pd_len, &p, sizeof(p));
ia_pd_len += sizeof(p);
pa[i].type = htons(DHCPV6_OPT_IA_ADDR);
pa[i].len = htons(sizeof(pa[i]) - 4U);
pa[i].addr = e[i].target;
- pa[i].preferred = 0;
- pa[i].valid = 0;
+
+ if (type == DHCPV6_MSG_REQUEST) {
+ pa[i].preferred = htonl(e[i].preferred);
+ pa[i].valid = htonl(e[i].valid);
+ } else {
+ pa[i].preferred = 0;
+ pa[i].valid = 0;
+ }
}
ia_na = pa;
{
uint8_t *odata;
uint16_t otype, olen;
- uint32_t refresh = UINT32_MAX;
+ uint32_t refresh = 86400;
int ret = 1;
bool handled_status_codes[_DHCPV6_Status_Max] = { false, };
&& olen > -4 + sizeof(struct dhcpv6_ia_hdr)) {
struct dhcpv6_ia_hdr *ia_hdr = (void*)(&odata[-4]);
+ if ((na_mode == IA_MODE_NONE && otype == DHCPV6_OPT_IA_NA) ||
+ (pd_mode == IA_MODE_NONE && otype == DHCPV6_OPT_IA_PD))
+ continue;
+
// Test ID
if (ia_hdr->iaid != htonl(1) && otype == DHCPV6_OPT_IA_NA)
continue;
// Update address IA
dhcpv6_for_each_option(&ia_hdr[1], end, otype, olen, odata) {
struct odhcp6c_entry entry = {IN6ADDR_ANY_INIT, 0, 0,
- IN6ADDR_ANY_INIT, 0, 0, 0, 0, 0, 0};
+ IN6ADDR_ANY_INIT, 0, 0, 0, 0, 0};
entry.iaid = ia_hdr->iaid;
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.class = sdata[0] << 8 | sdata[1];
-#endif
-
// Parse PD-exclude
bool ok = true;
dhcpv6_for_each_option(odata + sizeof(*prefix) - 4U,
}
if (ok) {
- odhcp6c_update_entry(STATE_IA_PD, &entry);
+ odhcp6c_update_entry(STATE_IA_PD, &entry, 0, false);
parsed_ia++;
}
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.class = sdata[0] << 8 | sdata[1];
-#endif
-
- odhcp6c_update_entry(STATE_IA_NA, &entry);
+ odhcp6c_update_entry(STATE_IA_NA, &entry, 0, false);
parsed_ia++;
}
}
}
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;
}
}