]> git.decadent.org.uk Git - odhcp6c.git/blobdiff - src/ra.c
Fix compile error
[odhcp6c.git] / src / ra.c
index 68746016781c7d4b1b3dc111159f074bf01d015c..602191aef05d216bc9adcda602a80ef7d5650117 100644 (file)
--- a/src/ra.c
+++ b/src/ra.c
@@ -145,7 +145,7 @@ bool ra_rtnl_process(void)
                if (len < 0)
                        break;
 
-               for (struct nlmsghdr *nh = (struct nlmsghdr*)buf; NLMSG_OK(nh, len);
+               for (struct nlmsghdr *nh = (struct nlmsghdr*)buf; NLMSG_OK(nh, (size_t)len);
                                        nh = NLMSG_NEXT(nh, len)) {
                        struct ifaddrmsg *ifa = NLMSG_DATA(nh);
                        struct in6_addr *addr = NULL;
@@ -193,13 +193,14 @@ bool ra_process(void)
                }
 
                found = true;
+               uint32_t router_valid = ntohs(adv->nd_ra_router_lifetime);
 
                // Parse default route
                entry.router = from.sin6_addr;
                entry.priority = pref_to_priority(adv->nd_ra_flags_reserved);
                if (entry.priority < 0)
                        entry.priority = pref_to_priority(0);
-               entry.valid = ntohs(adv->nd_ra_router_lifetime);
+               entry.valid = router_valid;
                entry.preferred = entry.valid;
                odhcp6c_update_entry(STATE_RA_ROUTE, &entry);
 
@@ -210,6 +211,7 @@ bool ra_process(void)
                if (adv->nd_ra_retransmit)
                        update_proc("neigh", "retrans_time_ms", ntohl(adv->nd_ra_retransmit));
 
+
                // Evaluate options
                struct icmpv6_opt *opt;
                icmpv6_for_each_option(opt, &adv[1], &buf[len]) {
@@ -246,7 +248,7 @@ bool ra_process(void)
                                        continue;
 
                                if (pinfo->nd_opt_pi_flags_reserved & ND_OPT_PI_FLAG_ONLINK)
-                                       odhcp6c_update_entry_safe(STATE_RA_ROUTE, &entry, 7201);
+                                       odhcp6c_update_entry_safe(STATE_RA_ROUTE, &entry, 7200);
 
                                if (!(pinfo->nd_opt_pi_flags_reserved & ND_OPT_PI_FLAG_AUTO) ||
                                                pinfo->nd_opt_pi_prefix_len != 64)
@@ -255,10 +257,30 @@ bool ra_process(void)
                                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, 7201);
-                       }
+                               odhcp6c_update_entry_safe(STATE_RA_PREFIX, &entry, 7200);
+                       } else if (opt->type == ND_OPT_RECURSIVE_DNS && opt->len > 2) {
+                               entry.router = from.sin6_addr;
+                               entry.priority = 0;
+                               entry.length = 128;
+                               entry.valid = ntohl(*((uint32_t*)&opt->data[2]));
+                               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));
+                                       odhcp6c_update_entry(STATE_RA_DNS, &entry);
+                               }
+                       }
                }
+
+               size_t ra_dns_len;
+               struct odhcp6c_entry *entry = odhcp6c_get_state(STATE_RA_DNS, &ra_dns_len);
+               for (size_t i = 0; i < len / sizeof(*entry); ++i)
+                       if (IN6_ARE_ADDR_EQUAL(&entry[i].router, &from.sin6_addr) &&
+                                       entry[i].valid > router_valid)
+                               entry[i].valid = router_valid;
        }
+
+       odhcp6c_expire();
        return found;
 }