- if (orig == DHCPV6_MSG_SOLICIT &&
- (otype == DHCPV6_OPT_IA_PD || otype == DHCPV6_OPT_IA_NA) &&
- olen > sizeof(struct dhcpv6_ia_hdr)) {
- struct dhcpv6_ia_hdr *ia_hdr = (void*)(&odata[-4]);
- dhcpv6_parse_ia(&ia_hdr[1], odata + olen);
- }
+ if ((!have_na && na_mode == IA_MODE_FORCE) ||
+ (!have_pd && pd_mode == IA_MODE_FORCE))
+ return -1;
+
+ if (na_mode != IA_MODE_NONE && !have_na) {
+ cand.has_noaddravail = true;
+ cand.preference -= 1000;
+ }
+
+ if (pd_mode != IA_MODE_NONE) {
+ if (have_pd)
+ cand.preference += 2000 + (128 - have_pd);
+ else
+ cand.preference -= 2000;