]> git.decadent.org.uk Git - odhcp6c.git/commitdiff
Merge branch 'hnet'
authorSteven Barth <steven@midlink.org>
Sat, 31 Aug 2013 08:11:15 +0000 (10:11 +0200)
committerSteven Barth <steven@midlink.org>
Sat, 31 Aug 2013 08:11:15 +0000 (10:11 +0200)
Conflicts:
src/ra.c

1  2 
README
src/odhcp6c.c
src/ra.c

diff --combined README
index cccb3ea8ee053500e2b142b06f8d9709ccaf2cc8,3f2087fe65f45cdc3cceec939ebf5795cec037b3..32b6893828c6d7b357580642238bb926c68998f9
--- 1/README
--- 2/README
+++ b/README
@@@ -16,7 -16,8 +16,7 @@@ especially routers. It compiles to onl
  
  2. Handling of non-temporary addresses (IA_NA)
        a) handling of valid and preferred lifetimes
 -      b) duplicate address detection
 -      c) automatic fallback to stateless or PD-only mode
 +      b) automatic fallback to stateless or PD-only mode
  
  3. Support for DHCPv6 extension
        a) Reconfigure-Messages
@@@ -67,7 -68,7 +67,7 @@@ Environment
  * SIP_DOMAIN          A space-separated list of SIP domains
  * OPTION_<num>                Custom option received as base-16
  * PREFIXES            A space-separated list of prefixes currently assigned
-                               Format: <prefix>/<length>,preferred,valid[,excluded=<excluded-prefix>/<length>]
+                               Format: <prefix>/<length>,preferred,valid[,excluded=<excluded-prefix>/<length>][,class=<prefix class #>]
  * ADDRESSES           A space-separated list of addresses currently assigned
                                Format: <address>/<length>,preferred,valid
  * RA_ADDRESSES                A space-separated list of addresses from RA-prefixes
diff --combined src/odhcp6c.c
index 38b8e82fe9560b421c634bf2ee631a0a03e92904,d47e17c158ab1b8d2ffe4026954d8a4e6e934793..b2c6b9815558f14c54aee130821f859e820588e9
@@@ -375,9 -375,10 +375,9 @@@ bool odhcp6c_signal_process(void
  {
        if (do_signal == SIGIO) {
                do_signal = 0;
 -              bool ra_rtnled = ra_rtnl_process();
                bool ra_updated = ra_process();
  
 -              if (ra_rtnled || (ra_updated && (bound || allow_slaac_only == 0)))
 +              if (ra_updated && (bound || allow_slaac_only == 0))
                        script_call("ra-updated"); // Immediate process urgent events
                else if (ra_updated && !bound && allow_slaac_only > 0)
                        script_delay_call("ra-updated", allow_slaac_only);
@@@ -459,6 -460,7 +459,7 @@@ void odhcp6c_update_entry_safe(enum odh
                if (x) {
                        x->valid = new->valid;
                        x->preferred = new->preferred;
+                         x->prefix_class = new->prefix_class;
                } else {
                        odhcp6c_add_state(state, new, sizeof(*new));
                }
diff --combined src/ra.c
index 4c1302cc45482db6967021e7ba6dd52f34f8c913,9a579851524786704875d675100d8fded72ef6b7..9c1ed74d4ee4e89b90702ae8f33554ff34706bff
+++ b/src/ra.c
@@@ -34,7 -34,7 +34,7 @@@
  #include "ra.h"
  
  
 -static int sock = -1, rtnl_sock = -1;
 +static int sock = -1;
  static unsigned if_index = 0;
  static char if_name[IF_NAMESIZE] = {0};
  static volatile int rs_attempt = 0;
@@@ -90,6 -90,18 +90,6 @@@ int ra_init(const char *ifname, const s
                }
        }
  
 -      // Open rtnetlink socket
 -      rtnl_sock = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE);
 -      struct sockaddr_nl rtnl_kernel = { .nl_family = AF_NETLINK };
 -      if (connect(rtnl_sock, (struct sockaddr*)&rtnl_kernel, sizeof(rtnl_kernel)))
 -              return -1;
 -      uint32_t group = RTNLGRP_IPV6_IFADDR;
 -      setsockopt(rtnl_sock, SOL_NETLINK, NETLINK_ADD_MEMBERSHIP, &group, sizeof(group));
 -
 -      // Add async-mode
 -      fcntl(rtnl_sock, F_SETOWN, ourpid);
 -      fcntl(rtnl_sock, F_SETFL, fcntl(rtnl_sock, F_GETFL) | O_ASYNC);
 -
        // Send RS
        signal(SIGALRM, ra_send_rs);
        ra_send_rs(SIGALRM);
@@@ -128,12 -140,69 +128,12 @@@ static void update_proc(const char *sec
  }
  
  
 -static bool ra_deduplicate(const struct in6_addr *any, uint8_t length)
 -{
 -  struct odhcp6c_entry entry = {IN6ADDR_ANY_INIT, length, 0, *any, 0, 0, 0};
 -      struct odhcp6c_entry *x = odhcp6c_find_entry(STATE_RA_PREFIX, &entry);
 -      if (x && IN6_ARE_ADDR_EQUAL(&x->target, any)) {
 -              odhcp6c_random(&x->target.s6_addr32[2], 2 * sizeof(uint32_t));
 -      } else if (odhcp6c_find_entry(STATE_IA_NA, &entry)) {
 -              dhcpv6_request(DHCPV6_MSG_DECLINE);
 -              raise(SIGUSR2);
 -      }
 -
 -      return !!x;
 -}
 -
 -
 -bool ra_rtnl_process(void)
 -{
 -      bool found = false;
 -      uint32_t elapsed = odhcp6c_elapsed();
 -      uint8_t buf[8192];
 -      while (true) {
 -              ssize_t len = recv(rtnl_sock, buf, sizeof(buf), MSG_DONTWAIT);
 -              if (len < 0)
 -                      break;
 -
 -              if (elapsed > 10)
 -                      continue;
 -
 -              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;
 -                      if (NLMSG_PAYLOAD(nh, 0) < sizeof(*ifa) || ifa->ifa_index != if_index ||
 -                                      (nh->nlmsg_type == RTM_NEWADDR && !(ifa->ifa_flags & IFA_F_DADFAILED)) ||
 -                                      (nh->nlmsg_type == RTM_DELADDR && !(ifa->ifa_flags & IFA_F_TENTATIVE)) ||
 -                                      (nh->nlmsg_type != RTM_NEWADDR && nh->nlmsg_type != RTM_DELADDR))
 -                              continue;
 -
 -                      ssize_t alen = NLMSG_PAYLOAD(nh, sizeof(*ifa));
 -                      for (struct rtattr *rta = (struct rtattr*)&ifa[1]; RTA_OK(rta, alen);
 -                                      rta = RTA_NEXT(rta, alen))
 -                              if (rta->rta_type == IFA_ADDRESS && RTA_PAYLOAD(rta) >= sizeof(*addr))
 -                                      addr = RTA_DATA(rta);
 -
 -                      if (addr) {
 -                              char ipbuf[INET6_ADDRSTRLEN];
 -                              inet_ntop(AF_INET6, addr, ipbuf, sizeof(ipbuf));
 -                              syslog(LOG_WARNING, "duplicate address detected: %s (code: %u:%x)",
 -                                              ipbuf, (unsigned)nh->nlmsg_type, (unsigned)ifa->ifa_flags);
 -                              found |= ra_deduplicate(addr, ifa->ifa_prefixlen);
 -                      }
 -              }
 -      }
 -      return found;
 -}
 -
 -
  bool ra_process(void)
  {
        bool found = false;
        uint8_t buf[1500];
        struct nd_router_advert *adv = (struct nd_router_advert*)buf;
-       struct odhcp6c_entry entry = {IN6ADDR_ANY_INIT, 0, 0, IN6ADDR_ANY_INIT, 0, 0};
+       struct odhcp6c_entry entry = {IN6ADDR_ANY_INIT, 0, 0, IN6ADDR_ANY_INIT, 0, 0, 0};
        const struct in6_addr any = IN6ADDR_ANY_INIT;
  
        while (true) {