Remove prefix coloring support, refine hybrid management mode
authorSteven Barth <steven@midlink.org>
Sun, 29 Mar 2015 12:37:13 +0000 (14:37 +0200)
committerSteven Barth <steven@midlink.org>
Sun, 29 Mar 2015 12:37:13 +0000 (14:37 +0200)
CMakeLists.txt
src/dhcpv6-ia.c
src/odhcpd.c
src/odhcpd.h
src/router.c
src/ubus.c

index dd750b3..34a21d0 100644 (file)
@@ -10,10 +10,6 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -std=c99")
 
 add_definitions(-D_GNU_SOURCE -Wall -Werror -Wextra)
 
 
 add_definitions(-D_GNU_SOURCE -Wall -Werror -Wextra)
 
-if(${EXT_PREFIX_CLASS})
-       add_definitions(-DEXT_PREFIX_CLASS=${EXT_PREFIX_CLASS})
-endif(${EXT_PREFIX_CLASS})
-
 if (${EXT_CER_ID})
        add_definitions(-DEXT_CER_ID=${EXT_CER_ID})
 endif(${EXT_CER_ID})
 if (${EXT_CER_ID})
        add_definitions(-DEXT_CER_ID=${EXT_CER_ID})
 endif(${EXT_CER_ID})
index d103ecb..c97a079 100644 (file)
@@ -419,8 +419,6 @@ static void managed_handle_pd_data(struct ustream *s, _unused int bytes_new)
                        else
                                n->valid += now;
 
                        else
                                n->valid += now;
 
-                       n->has_class = false;
-                       n->class = 0;
                        n->dprefix = 0;
 
                        ++c->managed_size;
                        n->dprefix = 0;
 
                        ++c->managed_size;
@@ -524,23 +522,6 @@ static bool assign_pd(struct interface *iface, struct dhcpv6_assignment *assign)
 
 static bool assign_na(struct interface *iface, struct dhcpv6_assignment *assign)
 {
 
 static bool assign_na(struct interface *iface, struct dhcpv6_assignment *assign)
 {
-       bool match = false;
-       for (size_t i = 0; i < iface->ia_addr_len; ++i) {
-               if (!iface->ia_addr[i].has_class) {
-                       match = true;
-                       continue;
-               } else if (assign->classes_cnt) {
-                       for (size_t j = 0; j < assign->classes_cnt; ++j)
-                               if (assign->classes[j] == iface->ia_addr[i].class)
-                                       match = true;
-               } else if (assign->all_class) {
-                       match = true;
-               }
-       }
-
-       if (!match)
-               return false;
-
        // Seed RNG with checksum of DUID
        uint32_t seed = 0;
        for (size_t i = 0; i < assign->clid_len; ++i)
        // Seed RNG with checksum of DUID
        uint32_t seed = 0;
        for (size_t i = 0; i < assign->clid_len; ++i)
@@ -731,23 +712,13 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status,
 
                        struct odhcpd_ipaddr *addrs = (a->managed) ? a->managed : iface->ia_addr;
                        size_t addrlen = (a->managed) ? (size_t)a->managed_size : iface->ia_addr_len;
 
                        struct odhcpd_ipaddr *addrs = (a->managed) ? a->managed : iface->ia_addr;
                        size_t addrlen = (a->managed) ? (size_t)a->managed_size : iface->ia_addr_len;
+                       size_t mostpref = 0;
 
 
-                       for (size_t i = 0; i < addrlen; ++i) {
-                               bool match = true;
-                               if (addrs[i].has_class) {
-                                       match = false;
-                                       if (a->classes_cnt) {
-                                               for (size_t j = 0; j < a->classes_cnt; ++j)
-                                                       if (a->classes[j] == addrs[i].class)
-                                                               match = true;
-                                       } else if (a->all_class) {
-                                               match = true;
-                                       }
-                               }
-
-                               if (!match)
-                                       continue;
+                       for (size_t i = 0; i < addrlen; ++i)
+                               if (addrs[i].preferred > addrs[mostpref].preferred)
+                                       mostpref = i;
 
 
+                       for (size_t i = 0; i < addrlen; ++i) {
                                uint32_t prefix_pref = addrs[i].preferred - now;
                                uint32_t prefix_valid = addrs[i].valid - now;
 
                                uint32_t prefix_pref = addrs[i].preferred - now;
                                uint32_t prefix_valid = addrs[i].valid - now;
 
@@ -755,21 +726,6 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status,
                                                addrs[i].preferred <= (uint32_t)now)
                                        continue;
 
                                                addrs[i].preferred <= (uint32_t)now)
                                        continue;
 
-                               if (prefix_pref > 86400)
-                                       prefix_pref = 86400;
-
-                               if (prefix_valid > 86400)
-                                       prefix_valid = 86400;
-
-#ifdef DHCPV6_OPT_PREFIX_CLASS
-                               struct {
-                                       uint16_t code;
-                                       uint16_t length;
-                                       uint16_t class;
-                               } pclass = {htons(DHCPV6_OPT_PREFIX_CLASS),
-                                       htons(2), htons(iface->ia_addr[i].class)};
-#endif
-
                                if (a->length < 128) {
                                        struct dhcpv6_ia_prefix p = {
                                                .type = htons(DHCPV6_OPT_IA_PREFIX),
                                if (a->length < 128) {
                                        struct dhcpv6_ia_prefix p = {
                                                .type = htons(DHCPV6_OPT_IA_PREFIX),
@@ -783,21 +739,11 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status,
 
                                        size_t entrlen = sizeof(p) - 4;
 
 
                                        size_t entrlen = sizeof(p) - 4;
 
-#ifdef DHCPV6_OPT_PREFIX_CLASS
-                                       if (iface->ia_addr[i].has_class) {
-                                               entrlen += sizeof(pclass);
-                                               p.len = htons(entrlen);
-                                       }
-#endif
-
                                        if (datalen + entrlen + 4 > buflen ||
                                                        (a->assigned == 0 && a->managed_size == 0))
                                                continue;
 
                                        memcpy(buf + datalen, &p, sizeof(p));
                                        if (datalen + entrlen + 4 > buflen ||
                                                        (a->assigned == 0 && a->managed_size == 0))
                                                continue;
 
                                        memcpy(buf + datalen, &p, sizeof(p));
-#ifdef DHCPV6_OPT_PREFIX_CLASS
-                                       memcpy(buf + datalen + sizeof(p), &pclass, sizeof(pclass));
-#endif
                                        datalen += entrlen + 4;
                                } else {
                                        struct dhcpv6_ia_addr n = {
                                        datalen += entrlen + 4;
                                } else {
                                        struct dhcpv6_ia_addr n = {
@@ -810,24 +756,13 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status,
                                        n.addr.s6_addr32[3] = htonl(a->assigned);
                                        size_t entrlen = sizeof(n) - 4;
 
                                        n.addr.s6_addr32[3] = htonl(a->assigned);
                                        size_t entrlen = sizeof(n) - 4;
 
-                                       if (!a->accept_reconf && iface->managed < RELAYD_MANAGED_NO_AFLAG &&
-                                                       addrs[i].prefix == 64)
-                                               n.preferred = htonl(1);
-
-#ifdef DHCPV6_OPT_PREFIX_CLASS
-                                       if (iface->ia_addr[i].has_class) {
-                                               entrlen += sizeof(pclass);
-                                               n.len = htons(entrlen);
-                                       }
-#endif
+                                       if (iface->managed < RELAYD_MANAGED_NO_AFLAG && i != mostpref)
+                                               continue;
 
                                        if (datalen + entrlen + 4 > buflen || a->assigned == 0)
                                                continue;
 
                                        memcpy(buf + datalen, &n, sizeof(n));
 
                                        if (datalen + entrlen + 4 > buflen || a->assigned == 0)
                                                continue;
 
                                        memcpy(buf + datalen, &n, sizeof(n));
-#ifdef DHCPV6_OPT_PREFIX_CLASS
-                                       memcpy(buf + datalen + sizeof(n), &pclass, sizeof(pclass));
-#endif
                                        datalen += entrlen + 4;
                                }
 
                                        datalen += entrlen + 4;
                                }
 
@@ -1025,7 +960,6 @@ ssize_t dhcpv6_handle_ia(uint8_t *buf, size_t buflen, struct interface *iface,
        uint8_t *clid_data = NULL, clid_len = 0, mac[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
        char hostname[256];
        size_t hostname_len = 0;
        uint8_t *clid_data = NULL, clid_len = 0, mac[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
        char hostname[256];
        size_t hostname_len = 0;
-       bool class_oro = false;
        bool notonlink = false;
        char duidbuf[261];
 
        bool notonlink = false;
        char duidbuf[261];
 
@@ -1048,14 +982,6 @@ ssize_t dhcpv6_handle_ia(uint8_t *buf, size_t buflen, struct interface *iface,
 
                        if (dn_expand(&fqdn_buf[1], &fqdn_buf[olen], &fqdn_buf[1], hostname, sizeof(hostname)) > 0)
                                hostname_len = strcspn(hostname, ".");
 
                        if (dn_expand(&fqdn_buf[1], &fqdn_buf[olen], &fqdn_buf[1], hostname, sizeof(hostname)) > 0)
                                hostname_len = strcspn(hostname, ".");
-               } else if (otype == DHCPV6_OPT_ORO) {
-#ifdef DHCPV6_OPT_PREFIX_CLASS
-                       for (size_t i = 0; i + 1 < olen; i += 2) {
-                               if (odata[i] == (DHCPV6_OPT_PREFIX_CLASS >> 8) &&
-                                               odata[i + 1] == (DHCPV6_OPT_PREFIX_CLASS & 0xff))
-                                       class_oro = true;
-                       }
-#endif
                } else if (otype == DHCPV6_OPT_RECONF_ACCEPT) {
                        accept_reconf = true;
                }
                } else if (otype == DHCPV6_OPT_RECONF_ACCEPT) {
                        accept_reconf = true;
                }
@@ -1079,10 +1005,6 @@ ssize_t dhcpv6_handle_ia(uint8_t *buf, size_t buflen, struct interface *iface,
                uint8_t reqlen = (is_pd) ? 62 : 128;
                uint32_t reqhint = 0;
 
                uint8_t reqlen = (is_pd) ? 62 : 128;
                uint32_t reqhint = 0;
 
-               const uint8_t classes_max = 32;
-               uint8_t classes_cnt = 0;
-               uint16_t classes[classes_max];
-
                // Parse request hint for IA-PD
                if (is_pd) {
                        uint8_t *sdata;
                // Parse request hint for IA-PD
                if (is_pd) {
                        uint8_t *sdata;
@@ -1098,20 +1020,6 @@ ssize_t dhcpv6_handle_ia(uint8_t *buf, size_t buflen, struct interface *iface,
                                        if (reqlen > 32 && reqlen <= 64)
                                                reqhint &= (1U << (64 - reqlen)) - 1;
                                }
                                        if (reqlen > 32 && reqlen <= 64)
                                                reqhint &= (1U << (64 - reqlen)) - 1;
                                }
-
-#ifdef DHCPV6_OPT_PREFIX_CLASS
-                               uint8_t *xdata;
-                               uint16_t xtype, xlen;
-                               dhcpv6_for_each_option(&p[1], sdata + slen, xtype, xlen, xdata) {
-                                       if (xtype != DHCPV6_OPT_PREFIX_CLASS || xlen != 2)
-                                               continue;
-
-                                       if (classes_cnt >= classes_max)
-                                               continue;
-
-                                       classes[classes_cnt++] = (uint16_t)xdata[0] << 8 | (uint16_t)xdata[1];
-                               }
-#endif
                        }
 
                        if (reqlen > 64)
                        }
 
                        if (reqlen > 64)
@@ -1124,20 +1032,6 @@ ssize_t dhcpv6_handle_ia(uint8_t *buf, size_t buflen, struct interface *iface,
                                        continue;
 
                                ia_addr_present = true;
                                        continue;
 
                                ia_addr_present = true;
-#ifdef DHCPV6_OPT_PREFIX_CLASS
-                               uint8_t *xdata;
-                               uint16_t xtype, xlen;
-                               struct dhcpv6_ia_addr *p = (struct dhcpv6_ia_addr*)&sdata[-4];
-                               dhcpv6_for_each_option(&p[1], sdata + slen, xtype, xlen, xdata) {
-                                       if (xtype != DHCPV6_OPT_PREFIX_CLASS || xlen != 2)
-                                               continue;
-
-                                       if (classes_cnt >= classes_max)
-                                               continue;
-
-                                       classes[classes_cnt++] = (uint16_t)xdata[0] << 8 | (uint16_t)xdata[1];
-                               }
-#endif
                        }
                }
 
                        }
                }
 
@@ -1159,11 +1053,6 @@ ssize_t dhcpv6_handle_ia(uint8_t *buf, size_t buflen, struct interface *iface,
                                a->peer = *addr;
                                a->reconf_cnt = 0;
                                a->reconf_sent = 0;
                                a->peer = *addr;
                                a->reconf_cnt = 0;
                                a->reconf_sent = 0;
-                               a->all_class = class_oro;
-                               a->classes_cnt = classes_cnt;
-                               a->classes = realloc(a->classes, classes_cnt * sizeof(uint16_t));
-                               if (a->classes)
-                                       memcpy(a->classes, classes, classes_cnt * sizeof(uint16_t));
                                break;
                        }
                }
                                break;
                        }
                }
@@ -1183,13 +1072,6 @@ ssize_t dhcpv6_handle_ia(uint8_t *buf, size_t buflen, struct interface *iface,
                                        a->length = reqlen;
                                        a->peer = *addr;
                                        a->assigned = reqhint;
                                        a->length = reqlen;
                                        a->peer = *addr;
                                        a->assigned = reqhint;
-                                       a->all_class = class_oro;
-                                       a->classes_cnt = classes_cnt;
-                                       if (classes_cnt) {
-                                               a->classes = malloc(classes_cnt * sizeof(uint16_t));
-                                               if (a->classes)
-                                                       memcpy(a->classes, classes, classes_cnt * sizeof(uint16_t));
-                                       }
 
                                        if (first)
                                                memcpy(a->key, first->key, sizeof(a->key));
 
                                        if (first)
                                                memcpy(a->key, first->key, sizeof(a->key));
index 24ef891..76dee9e 100644 (file)
@@ -256,14 +256,6 @@ ssize_t odhcpd_get_interface_addresses(int ifindex,
                if (ifa->ifa_flags & IFA_F_DEPRECATED)
                        addrs[ret].preferred = 0;
 
                if (ifa->ifa_flags & IFA_F_DEPRECATED)
                        addrs[ret].preferred = 0;
 
-               addrs[ret].has_class = false;
-               addrs[ret].class = 0;
-#ifdef WITH_UBUS
-               struct interface *iface = odhcpd_get_interface_by_index(ifindex);
-               if (iface)
-                       addrs[ret].has_class = ubus_get_class(iface->ifname,
-                                       &addrs[ret].addr, &addrs[ret].class);
-#endif
                ++ret;
        }
 
                ++ret;
        }
 
index bc837d5..95dcb00 100644 (file)
@@ -69,8 +69,6 @@ struct odhcpd_ipaddr {
        struct in6_addr addr;
        uint8_t prefix;
        uint8_t dprefix;
        struct in6_addr addr;
        uint8_t prefix;
        uint8_t dprefix;
-       bool has_class;
-       uint16_t class;
        uint32_t preferred;
        uint32_t valid;
 };
        uint32_t preferred;
        uint32_t valid;
 };
@@ -206,14 +204,6 @@ void odhcpd_bmemcpy(void *av, const void *bv, size_t bits);
 
 int config_parse_interface(void *data, size_t len, const char *iname, bool overwrite);
 
 
 int config_parse_interface(void *data, size_t len, const char *iname, bool overwrite);
 
-#ifdef WITH_UBUS
-int init_ubus(void);
-const char* ubus_get_ifname(const char *name);
-void ubus_apply_network(void);
-bool ubus_has_prefix(const char *name, const char *ifname);
-bool ubus_get_class(const char *ifname, const struct in6_addr *addr, uint16_t *pclass);
-#endif
-
 
 // Exported module initializers
 int init_router(void);
 
 // Exported module initializers
 int init_router(void);
index 3d26c58..60d6b3f 100644 (file)
@@ -176,7 +176,7 @@ static bool parse_routes(struct odhcpd_ipaddr *n, ssize_t len)
 
        char line[512], ifname[16];
        bool found_default = false;
 
        char line[512], ifname[16];
        bool found_default = false;
-       struct odhcpd_ipaddr p = {IN6ADDR_ANY_INIT, 0, 0, false, 0, 0, 0};
+       struct odhcpd_ipaddr p = {IN6ADDR_ANY_INIT, 0, 0, 0, 0};
        while (fgets(line, sizeof(line), fp_route)) {
                uint32_t rflags;
                if (sscanf(line, "00000000000000000000000000000000 00 "
        while (fgets(line, sizeof(line), fp_route)) {
                uint32_t rflags;
                if (sscanf(line, "00000000000000000000000000000000 00 "
@@ -262,7 +262,7 @@ static uint64_t send_router_advert(struct interface *iface, const struct in6_add
 
        for (ssize_t i = 0; i < ipcnt; ++i) {
                struct odhcpd_ipaddr *addr = &addrs[i];
 
        for (ssize_t i = 0; i < ipcnt; ++i) {
                struct odhcpd_ipaddr *addr = &addrs[i];
-               if (addr->prefix > 96 || addr->has_class)
+               if (addr->prefix > 96)
                        continue; // Address not suitable
 
                if (addr->preferred > MaxPreferredTime)
                        continue; // Address not suitable
 
                if (addr->preferred > MaxPreferredTime)
index fbe7e1a..0b51183 100644 (file)
@@ -360,68 +360,6 @@ bool ubus_has_prefix(const char *name, const char *ifname)
 }
 
 
 }
 
 
-enum {
-       ADDR_ATTR_ADDR,
-       ADDR_ATTR_CLASS,
-       ADDR_ATTR_MAX
-};
-
-static const struct blobmsg_policy addr_attrs[ADDR_ATTR_MAX] = {
-       [ADDR_ATTR_ADDR] = { .name = "address", .type = BLOBMSG_TYPE_STRING },
-       [ADDR_ATTR_CLASS] = { .name = "class", .type = BLOBMSG_TYPE_STRING },
-};
-
-bool ubus_get_class(const char *ifname, const struct in6_addr *addr, uint16_t *pclass)
-{
-       struct blob_attr *c, *cur;
-       unsigned rem;
-
-       if (!dump)
-               return false;
-
-       blobmsg_for_each_attr(c, dump, rem) {
-               struct blob_attr *tb[IFACE_ATTR_MAX];
-               blobmsg_parse(iface_attrs, IFACE_ATTR_MAX, tb, blobmsg_data(c), blobmsg_data_len(c));
-
-               if (!tb[IFACE_ATTR_IFNAME])
-                       continue;
-
-               if (strcmp(ifname, blobmsg_get_string(tb[IFACE_ATTR_IFNAME])))
-                       continue;
-
-               if ((cur = tb[IFACE_ATTR_ADDRESS])) {
-                       if (blobmsg_type(cur) != BLOBMSG_TYPE_ARRAY || !blobmsg_check_attr(cur, NULL))
-                               continue;
-
-                       struct blob_attr *d;
-                       unsigned drem;
-                       blobmsg_for_each_attr(d, cur, drem) {
-                               struct blob_attr *t[ADDR_ATTR_MAX];
-                               blobmsg_parse(addr_attrs, ADDR_ATTR_MAX, t, blobmsg_data(d), blobmsg_data_len(d));
-
-                               if (!t[ADDR_ATTR_ADDR] || !t[ADDR_ATTR_CLASS])
-                                       continue;
-
-                               const char *addrs = blobmsg_get_string(t[ADDR_ATTR_ADDR]);
-                               const char *class = blobmsg_get_string(t[ADDR_ATTR_CLASS]);
-
-                               struct in6_addr ip6addr;
-                               inet_pton(AF_INET6, addrs, &ip6addr);
-
-                               if (IN6_ARE_ADDR_EQUAL(&ip6addr, addr)) {
-                                       *pclass = atoi(class);
-                                       return true;
-                               }
-                       }
-               }
-
-               return false;
-       }
-
-       return false;
-}
-
-
 int init_ubus(void)
 {
        if (!(ubus = ubus_connect(NULL))) {
 int init_ubus(void)
 {
        if (!(ubus = ubus_connect(NULL))) {