- entry.target.s6_addr32[2] = lladdr.s6_addr32[2];
- entry.target.s6_addr32[3] = lladdr.s6_addr32[3];
-
- odhcp6c_update_entry_safe(STATE_RA_PREFIX, &entry, 7200);
+ entry->target.s6_addr32[2] = lladdr.s6_addr32[2];
+ entry->target.s6_addr32[3] = lladdr.s6_addr32[3];
+
+ changed |= odhcp6c_update_entry(STATE_RA_PREFIX, entry, 7200, true);
+ } else if (opt->type == ND_OPT_RECURSIVE_DNS && opt->len > 2) {
+ entry->router = from.sin6_addr;
+ entry->priority = 0;
+ entry->length = 128;
+ uint32_t *valid = (uint32_t*)&opt->data[2];
+ entry->valid = ntohl(*valid);
+ entry->preferred = 0;
+
+ for (ssize_t i = 0; i < (opt->len - 1) / 2; ++i) {
+ 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;
+ }