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).
This commit is contained in:
Martin Mares 1998-07-10 08:38:29 +00:00
parent 28a9a189d7
commit 786d0bb9e7
2 changed files with 18 additions and 1 deletions

View file

@ -43,11 +43,26 @@ ip_ntop(ip_addr a, char *b)
(x & 0xff)); (x & 0xff));
} }
char * char *
ip_ntox(ip_addr a, char *b) ip_ntox(ip_addr a, char *b)
{ {
return b + bsprintf(b, "%08x", _I(a)); 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 #endif

View file

@ -54,8 +54,10 @@ typedef u32 ip_addr;
#define ipa_ntoh(x) x = _MI(ntohl(_I(x))) #define ipa_ntoh(x) x = _MI(ntohl(_I(x)))
#define ipa_classify(x) ipv4_classify(_I(x)) #define ipa_classify(x) ipv4_classify(_I(x))
#define ipa_opposite(x) _MI(_I(x) ^ 1) #define ipa_opposite(x) _MI(_I(x) ^ 1)
#define ipa_class_mask(x) x = _MI(ipv4_class_mask(_I(x)))
int ipv4_classify(u32); int ipv4_classify(u32);
u32 ipv4_class_mask(u32);
/* FIXME: Is this hash function uniformly distributed over standard routing tables? */ /* FIXME: Is this hash function uniformly distributed over standard routing tables? */
static inline unsigned ipv4_hash(u32 a) static inline unsigned ipv4_hash(u32 a)