diff options
author | Martin Mares <mj@ucw.cz> | 1998-07-10 10:38:29 +0200 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 1998-07-10 10:38:29 +0200 |
commit | 786d0bb9e7c5db5104e3fd0ff7fdfbd1e19844ea (patch) | |
tree | ed0caedabb17318a5d1207097eecbf34c65e8d10 | |
parent | 28a9a189d71ef3b05daa21d60277149edb8e98ad (diff) | |
download | bird-786d0bb9e7c5db5104e3fd0ff7fdfbd1e19844ea.tar bird-786d0bb9e7c5db5104e3fd0ff7fdfbd1e19844ea.zip |
Added ipa_class_mask() which guesses netmask for classful addressing.
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).
-rw-r--r-- | lib/ipv4.c | 17 | ||||
-rw-r--r-- | lib/ipv4.h | 2 |
2 files changed, 18 insertions, 1 deletions
@@ -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 @@ -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) |