Browse Source

Remove prefix coloring support, refine hybrid management mode

Steven Barth 9 years ago
parent
commit
7103b67707
6 changed files with 9 additions and 211 deletions
  1. 0 4
      CMakeLists.txt
  2. 7 125
      src/dhcpv6-ia.c
  3. 0 8
      src/odhcpd.c
  4. 0 10
      src/odhcpd.h
  5. 2 2
      src/router.c
  6. 0 62
      src/ubus.c

+ 0 - 4
CMakeLists.txt

@@ -10,10 +10,6 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -std=c99")
 
 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})

+ 7 - 125
src/dhcpv6-ia.c

@@ -419,8 +419,6 @@ static void managed_handle_pd_data(struct ustream *s, _unused int bytes_new)
 			else
 				n->valid += now;
 
-			n->has_class = false;
-			n->class = 0;
 			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)
 {
-	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)
@@ -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;
+			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;
 
@@ -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;
 
-				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),
@@ -783,21 +739,11 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status,
 
 					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));
-#ifdef DHCPV6_OPT_PREFIX_CLASS
-					memcpy(buf + datalen + sizeof(p), &pclass, sizeof(pclass));
-#endif
 					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;
 
-					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));
-#ifdef DHCPV6_OPT_PREFIX_CLASS
-					memcpy(buf + datalen + sizeof(n), &pclass, sizeof(pclass));
-#endif
 					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;
-	bool class_oro = false;
 	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, ".");
-		} 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;
 		}
@@ -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;
 
-		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;
@@ -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;
 				}
-
-#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)
@@ -1124,20 +1032,6 @@ ssize_t dhcpv6_handle_ia(uint8_t *buf, size_t buflen, struct interface *iface,
 					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->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;
 			}
 		}
@@ -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->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));

+ 0 - 8
src/odhcpd.c

@@ -256,14 +256,6 @@ ssize_t odhcpd_get_interface_addresses(int ifindex,
 		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;
 	}
 

+ 0 - 10
src/odhcpd.h

@@ -69,8 +69,6 @@ struct odhcpd_ipaddr {
 	struct in6_addr addr;
 	uint8_t prefix;
 	uint8_t dprefix;
-	bool has_class;
-	uint16_t class;
 	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);
 
-#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);

+ 2 - 2
src/router.c

@@ -176,7 +176,7 @@ static bool parse_routes(struct odhcpd_ipaddr *n, ssize_t len)
 
 	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 "
@@ -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];
-		if (addr->prefix > 96 || addr->has_class)
+		if (addr->prefix > 96)
 			continue; // Address not suitable
 
 		if (addr->preferred > MaxPreferredTime)

+ 0 - 62
src/ubus.c

@@ -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))) {