]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Added ipa_class_mask() which guesses netmask for classful addressing.
authorMartin Mares <mj@ucw.cz>
Fri, 10 Jul 1998 08:38:29 +0000 (08:38 +0000)
committerMartin Mares <mj@ucw.cz>
Fri, 10 Jul 1998 08:38:29 +0000 (08:38 +0000)
For pure A/B/C class addresses it just returns the class netmask, for
subnets it tries to guess subnet mask. Please make sure the address
you pass to this function is really a valid host address (i.e., call
ipa_validate() first).

lib/ipv4.c
lib/ipv4.h

index 9aa79c26a708af227eefae9d381c9affb68e398f..5ec2ffb874abfaf7464af7deac1942ac0581a860 100644 (file)
@@ -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
index e38dce6b27ed65d871ff92b21669ca0037592836..a7715001a98f74d3374425f6a361526e5f93c6b4 100644 (file)
@@ -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)