[PATCH] Lib: accept 240.0.0.0/4 as a valid range

Vincent Bernat vincent at bernat.ch
Mon Mar 14 10:02:25 CET 2022


240.0.0.0/4 is marked as reserved and considered invalid by BIRD. At
work, we are using this range internally since all RFC 1918 are full
and 100.64.0.0/10 is already used too. BIRD complains loudly for each
interface using this range.

This change makes it possible to use this range. I have used scope
"universe". But I would be happy with "site" too. While widely
discussed, I don't think 240/4 will become routable on the Internet
one day.

As a bonus, I added some comments and unrolled a condition for each
block. I also have added some hints for the compiler to avoid using
jumps in the hotpath (tested on Godbolt, see
https://godbolt.org/z/rGjz336K3).
---
 lib/ip.c        | 31 ++++++++++++-------------------
 sysdep/config.h |  5 +++++
 2 files changed, 17 insertions(+), 19 deletions(-)

diff --git a/lib/ip.c b/lib/ip.c
index fcc72cafb4de..8f0f32d25d61 100644
--- a/lib/ip.c
+++ b/lib/ip.c
@@ -80,30 +80,23 @@ ip6_masklen(ip6_addr *a)
 }
 
 int
-ip4_classify(ip4_addr ad)
+ip4_classify(u32 a)
 {
-  u32 a = _I(ad);
   u32 b = a >> 24U;
 
-  if (b && b <= 0xdf)
-  {
-    if (b == 0x7f)
-      return IADDR_HOST | SCOPE_HOST;
-    else if ((b == 0x0a) ||
-	     ((a & 0xffff0000) == 0xc0a80000) ||
-	     ((a & 0xfff00000) == 0xac100000))
-      return IADDR_HOST | SCOPE_SITE;
-    else
-      return IADDR_HOST | SCOPE_UNIVERSE;
-  }
-
-  if (b >= 0xe0 && b <= 0xef)
+  if (unlikely(b == 0x00))
+    return IADDR_INVALID;                   /* 0.0.0.0/8       This network */
+  if (unlikely(b == 0x7f))                  /* 127.0.0.0/8     Loopback */
+    return IADDR_HOST | SCOPE_HOST;
+  if ((b == 0x0a) ||                        /* 10.0.0.0/8      Private-use */
+      ((a & 0xffff0000) == 0xc0a80000) ||   /* 192.168.0.0/16  Private-use */
+      ((a & 0xfff00000) == 0xac100000))     /* 172.16.0.0/12   Private-use */
+    return IADDR_HOST | SCOPE_SITE;
+  if (unlikely(b >= 0xe0 && b <= 0xef))     /* 224.0.0.0/4     Multicast */
     return IADDR_MULTICAST | SCOPE_UNIVERSE;
-
-  if (a == 0xffffffff)
+  if (unlikely(a == 0xffffffff))            /* 255.255.255.255 Limited broadcast */
     return IADDR_BROADCAST | SCOPE_LINK;
-
-  return IADDR_INVALID;
+  return IADDR_HOST | SCOPE_UNIVERSE;
 }
 
 int
diff --git a/sysdep/config.h b/sysdep/config.h
index b0531844af9f..4d73543c3894 100644
--- a/sysdep/config.h
+++ b/sysdep/config.h
@@ -30,6 +30,11 @@
  */
 #include "sysdep/paths.h"
 
+/* Likely/unlikely macros */
+
+#define likely(x)   __builtin_expect((x),1)
+#define unlikely(x) __builtin_expect((x),0)
+
 /* Types */
 
 #include <stdint.h>
-- 
2.35.1



More information about the Bird-users mailing list