From: Nick Hainke <[email protected]>

The prefix_filter allows to select which prefix should be assigned
to clients if you have multiple prefixes on an interface.
Currently, the filter only applies to RAs and does work with
a dhcpv6 server.

This commit enables the filter also on dhcpv6.

Signed-off-by: Nick Hainke <[email protected]>
---
 src/dhcpv6-ia.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/src/dhcpv6-ia.c b/src/dhcpv6-ia.c
index a59fc20..10b627a 100644
--- a/src/dhcpv6-ia.c
+++ b/src/dhcpv6-ia.c
@@ -231,9 +231,21 @@ void dhcpv6_ia_enum_addrs(struct interface *iface, struct 
dhcp_assignment *c,
                if (!valid_addr(&addrs[i], now))
                        continue;
 
+               /* Filter Out Prefixes */
+               if (odhcpd_bmemcmp(&addrs[i].addr, &iface->pio_filter_addr,
+                       iface->pio_filter_length) != 0 ||
+                       addrs[i].prefix < iface->pio_filter_length) {
+                       char addrbuf[INET6_ADDRSTRLEN];
+                       syslog(LOG_INFO, "Address %s filtered out on %s",
+                               inet_ntop(AF_INET6, &addrs[i].addr.in6, 
addrbuf, sizeof(addrbuf)),
+                               iface->name);
+                       continue;
+               }
+
                addr = addrs[i].addr.in6;
                pref = addrs[i].preferred;
                valid = addrs[i].valid;
+
                if (c->flags & OAF_DHCPV6_NA) {
                        if (!ADDR_ENTRY_VALID_IA_ADDR(iface, i, m, addrs))
                                continue;
@@ -847,6 +859,18 @@ static size_t build_ia(uint8_t *buf, size_t buflen, 
uint16_t status,
                size_t m = get_preferred_addr(addrs, addrlen);
 
                for (size_t i = 0; i < addrlen; ++i) {
+
+                       /* Filter Out Prefixes */
+                       if (odhcpd_bmemcmp(&addrs[i].addr, 
&iface->pio_filter_addr,
+                               iface->pio_filter_length) != 0 ||
+                               addrs[i].prefix < iface->pio_filter_length) {
+                               char addrbuf[INET6_ADDRSTRLEN];
+                               syslog(LOG_INFO, "Address %s filtered out on 
%s",
+                                       inet_ntop(AF_INET6, &addrs[i].addr.in6, 
addrbuf, sizeof(addrbuf)),
+                                       iface->name);
+                               continue;
+                       }
+
                        uint32_t prefix_pref = addrs[i].preferred;
                        uint32_t prefix_valid = addrs[i].valid;
 
-- 
2.29.2


_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to