map: be less restrictive when matching lw4over6 prefixes

Signed-off-by: Steven Barth <steven@midlink.org>

SVN-Revision: 46819
This commit is contained in:
Steven Barth 2015-09-08 12:13:29 +00:00
parent 48fe93ea6b
commit 1b91cd2663
2 changed files with 11 additions and 6 deletions

View file

@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=map PKG_NAME:=map
PKG_VERSION:=4 PKG_VERSION:=4
PKG_RELEASE:=4 PKG_RELEASE:=5
PKG_LICENSE:=GPL-2.0 PKG_LICENSE:=GPL-2.0
include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/package.mk

View file

@ -3,6 +3,7 @@
* *
* Author: Steven Barth <cyrus@openwrt.org> * Author: Steven Barth <cyrus@openwrt.org>
* Copyright (c) 2014-2015 cisco Systems, Inc. * Copyright (c) 2014-2015 cisco Systems, Inc.
* Copyright (c) 2015 Steven Barth <cyrus@openwrt.org>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 * it under the terms of the GNU General Public License version 2
@ -112,7 +113,7 @@ static void handle_dump(struct ubus_request *req __attribute__((unused)),
} }
static void match_prefix(int *pdlen, struct in6_addr *pd, struct blob_attr *cur, static void match_prefix(int *pdlen, struct in6_addr *pd, struct blob_attr *cur,
const struct in6_addr *ipv6prefix, int prefix6len) const struct in6_addr *ipv6prefix, int prefix6len, bool lw4o6)
{ {
struct blob_attr *d; struct blob_attr *d;
unsigned drem; unsigned drem;
@ -133,13 +134,17 @@ static void match_prefix(int *pdlen, struct in6_addr *pd, struct blob_attr *cur,
inet_pton(AF_INET6, blobmsg_get_string(ptb[PREFIX_ATTR_ADDRESS]), &prefix); inet_pton(AF_INET6, blobmsg_get_string(ptb[PREFIX_ATTR_ADDRESS]), &prefix);
// lw4over6 /128-address-as-PD matching madness workaround // lw4over6 /128-address-as-PD matching madness workaround
if (mask == 128) if (lw4o6 && mask == 128)
mask = 64; mask = 64;
if (*pdlen < mask && mask >= prefix6len && if (*pdlen < mask && mask >= prefix6len &&
!bmemcmp(&prefix, ipv6prefix, prefix6len)) { !bmemcmp(&prefix, ipv6prefix, prefix6len)) {
bmemcpy(pd, &prefix, mask); bmemcpy(pd, &prefix, mask);
*pdlen = mask; *pdlen = mask;
} else if (lw4o6 && *pdlen < prefix6len && mask < prefix6len &&
!bmemcmp(&prefix, ipv6prefix, mask)) {
bmemcpy(pd, ipv6prefix, prefix6len);
*pdlen = prefix6len;
} }
} }
} }
@ -237,7 +242,7 @@ int main(int argc, char *argv[])
ealen = intval; ealen = intval;
} else if (idx == OPT_PREFIX4LEN && (intval = strtoul(value, NULL, 0)) <= 32 && !errno) { } else if (idx == OPT_PREFIX4LEN && (intval = strtoul(value, NULL, 0)) <= 32 && !errno) {
prefix4len = intval; prefix4len = intval;
} else if (idx == OPT_PREFIX6LEN && (intval = strtoul(value, NULL, 0)) <= 112 && !errno) { } else if (idx == OPT_PREFIX6LEN && (intval = strtoul(value, NULL, 0)) <= 128 && !errno) {
prefix6len = intval; prefix6len = intval;
} else if (idx == OPT_IPV4PREFIX && inet_pton(AF_INET, value, &ipv4prefix) == 1) { } else if (idx == OPT_IPV4PREFIX && inet_pton(AF_INET, value, &ipv4prefix) == 1) {
// dummy // dummy
@ -289,10 +294,10 @@ int main(int argc, char *argv[])
blobmsg_get_string(tb[IFACE_ATTR_INTERFACE])))) blobmsg_get_string(tb[IFACE_ATTR_INTERFACE]))))
continue; continue;
match_prefix(&pdlen, &pd, tb[IFACE_ATTR_PREFIX], &ipv6prefix, prefix6len); match_prefix(&pdlen, &pd, tb[IFACE_ATTR_PREFIX], &ipv6prefix, prefix6len, lw4o6);
if (lw4o6) if (lw4o6)
match_prefix(&pdlen, &pd, tb[IFACE_ATTR_ADDRESS], &ipv6prefix, prefix6len); match_prefix(&pdlen, &pd, tb[IFACE_ATTR_ADDRESS], &ipv6prefix, prefix6len, lw4o6);
if (pdlen >= 0) { if (pdlen >= 0) {
iface = blobmsg_get_string(tb[IFACE_ATTR_INTERFACE]); iface = blobmsg_get_string(tb[IFACE_ATTR_INTERFACE]);