policy.c: Implement IPv6 matching in match_addrpat.
authorMark Wooding <mdw@distorted.org.uk>
Wed, 17 Oct 2012 04:42:09 +0000 (05:42 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Thu, 18 Oct 2012 09:45:10 +0000 (10:45 +0100)
Missing piece.  Whoops.

policy.c

index 83db0a8..398cd23 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);
     }
-    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);
 }