]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Implemented missing prefix manipulation functions
authorJan Moskyto Matejka <mq@ucw.cz>
Wed, 16 Dec 2015 09:43:58 +0000 (10:43 +0100)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Sun, 20 Dec 2015 11:53:40 +0000 (12:53 +0100)
lib/net.c

index e276599538b60e61d6b60482769e227b37307d24..56eb16fda1a5d861f10455936d44596211211fd5 100644 (file)
--- a/lib/net.c
+++ b/lib/net.c
@@ -96,6 +96,23 @@ net_validate(const net_addr *N)
   }
 }
 
+void
+net_normalize(net_addr *N)
+{
+  net_addr_union *n = (void *) N;
+
+  switch (n->n.type)
+  {
+  case NET_IP4:
+  case NET_VPN4:
+    return net_normalize_ip4(&n->ip4);
+
+  case NET_IP6:
+  case NET_VPN6:
+    return net_normalize_ip6(&n->ip6);
+  }
+}
+
 int
 net_classify(const net_addr *N)
 {
@@ -114,3 +131,31 @@ net_classify(const net_addr *N)
 
   return 0;
 }
+
+int
+ipa_in_netX(const ip_addr A, const net_addr *N)
+{
+  switch (N->type)
+  {
+  case NET_IP4:
+  case NET_VPN4:
+    if (!ipa_is_ip4(A)) return 0;
+    break;
+
+  case NET_IP6:
+  case NET_VPN6:
+    if (ipa_is_ip4(A)) return 0;
+    break;
+  }
+
+  return ipa_zero(ipa_and(ipa_xor(A, net_prefix(N)), ipa_mkmask(net_pxlen(N))));
+}
+
+int
+net_in_netX(const net_addr *A, const net_addr *N)
+{
+  if (A->type != N->type)
+    return 0;
+
+  return (net_pxlen(N) <= net_pxlen(A)) && ipa_in_netX(net_prefix(A), N);
+}