chiark
/
gitweb
/
~mdw
/
yaid
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
9da480b
)
policy.c: Implement IPv6 matching in match_addrpat.
author
Mark Wooding
<mdw@distorted.org.uk>
Wed, 17 Oct 2012 04:42:09 +0000
(
05:42
+0100)
committer
Mark Wooding
<mdw@distorted.org.uk>
Thu, 18 Oct 2012 09:45:10 +0000
(10:45 +0100)
Missing piece. Whoops.
policy.c
patch
|
blob
|
blame
|
history
diff --git
a/policy.c
b/policy.c
index 83db0a8ba4f5cf061e51a7e2dd0fe362b5f6de62..398cd237d172e21065d37a088614c9d13aca013a 100644
(file)
--- a/
policy.c
+++ b/
policy.c
@@
-116,8
+116,16
@@
static int match_addrpat(int af, const struct addrpat *ap,
unsigned mask = htonl((MASK32 << (32 - ap->len)) & MASK32);
return (((ap->addr.ipv4.s_addr ^ a->ipv4.s_addr) & mask) == 0);
}
unsigned mask = htonl((MASK32 << (32 - ap->len)) & MASK32);
return (((ap->addr.ipv4.s_addr ^ a->ipv4.s_addr) & mask) == 0);
}
- case AF_INET6:
- abort();
+ case AF_INET6: {
+ unsigned i, m, n = ap->len;
+ for (i = 0; n >= 8; i++, n -= 8) {
+ if (ap->addr.ipv6.s6_addr[i] != a->ipv6.s6_addr[i])
+ return (0);
+ }
+ if (!n) return (1);
+ m = (MASK8 << (8 - n)) & MASK8;
+ return (((ap->addr.ipv6.s6_addr[i] ^ a->ipv6.s6_addr[i]) & m) == 0);
+ }
}
return (0);
}
}
return (0);
}