summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/ipv4.c17
-rw-r--r--lib/ipv4.h2
2 files changed, 18 insertions, 1 deletions
diff --git a/lib/ipv4.c b/lib/ipv4.c
index 9aa79c26..5ec2ffb8 100644
--- a/lib/ipv4.c
+++ b/lib/ipv4.c
@@ -43,11 +43,26 @@ ip_ntop(ip_addr a, char *b)
(x & 0xff));
}
-
char *
ip_ntox(ip_addr a, char *b)
{
return b + bsprintf(b, "%08x", _I(a));
}
+u32
+ipv4_class_mask(u32 a)
+{
+ u32 m;
+
+ if (a < 0x80000000)
+ m = 0xff000000;
+ if (a < 0xc0000000)
+ m = 0xffff0000;
+ else
+ m = 0xffffff00;
+ while (a & ~m)
+ m |= m >> 1;
+ return m;
+}
+
#endif
diff --git a/lib/ipv4.h b/lib/ipv4.h
index e38dce6b..a7715001 100644
--- a/lib/ipv4.h
+++ b/lib/ipv4.h
@@ -54,8 +54,10 @@ typedef u32 ip_addr;
#define ipa_ntoh(x) x = _MI(ntohl(_I(x)))
#define ipa_classify(x) ipv4_classify(_I(x))
#define ipa_opposite(x) _MI(_I(x) ^ 1)
+#define ipa_class_mask(x) x = _MI(ipv4_class_mask(_I(x)))
int ipv4_classify(u32);
+u32 ipv4_class_mask(u32);
/* FIXME: Is this hash function uniformly distributed over standard routing tables? */
static inline unsigned ipv4_hash(u32 a)