- memcpy(&entry.target, &opt->data[6 + i * sizeof(entry.target)],
- sizeof(entry.target));
- changed |= odhcp6c_update_entry(STATE_RA_DNS, &entry, 0, true);
+ memcpy(&entry->target, &opt->data[6 + i * sizeof(entry->target)],
+ sizeof(entry->target));
+ changed |= odhcp6c_update_entry(STATE_RA_DNS, entry, 0, true);
+ }
+ } else if (opt->type == ND_OPT_DNSSL && opt->len > 1) {
+ uint32_t *valid = (uint32_t*)&opt->data[2];
+ uint8_t *buf = &opt->data[6];
+ uint8_t *end = &buf[(opt->len - 1) * 8];
+
+ entry->router = from.sin6_addr;
+ entry->valid = ntohl(*valid);
+
+ while (buf < end) {
+ int len = dn_expand(buf, end, buf, (char*)entry->auxtarget, 256);
+ if (len < 1)
+ break;
+
+ buf = &buf[len];
+ entry->auxlen = strlen((char*)entry->auxtarget);
+
+ if (entry->auxlen == 0)
+ continue;
+
+ changed |= odhcp6c_update_entry(STATE_RA_SEARCH, entry, 0, true);
+ entry->auxlen = 0;