diff options
Diffstat (limited to 'lib/ipv4.h')
-rw-r--r-- | lib/ipv4.h | 34 |
1 files changed, 31 insertions, 3 deletions
@@ -11,6 +11,15 @@ #include <netinet/in.h> +#include "lib/bitops.h" + +#ifdef DEBUG + +/* + * Use the structural representation when you want to make sure + * nobody unauthorized attempts to handle ip_addr as number. + */ + typedef struct ipv4_addr { u32 addr; } ip_addr; @@ -18,18 +27,37 @@ typedef struct ipv4_addr { #define _I(x) (x).addr #define _MI(x) ((struct ip_addr) { x }) +#else + +typedef u32 ip_addr; + +#define _I(x) (x) +#define _MI(x) (x) + +#endif + #define IPA_NONE (_MI(0)) #define ipa_equal(x,y) (_I(x) == _I(y)) +#define ipa_nonzero(x) _I(x) #define ipa_and(x,y) _MI(_I(x) & _I(y)) #define ipa_or(x,y) _MI(_I(x) | _I(y)) #define ipa_not(x) _MI(~_I(x)) -#define ipa_mkmask(x) _MI(ipv4_mkmask(x)) -#define ipa_mklen(x) ipv4_mklen(_I(x)) +#define ipa_mkmask(x) _MI(u32_mkmask(x)) +#define ipa_mklen(x) u32_masklen(_I(x)) +#define ipa_hash(x) ipv4_hash(_I(x)) +#define ipa_hton(x) x = _MI(htonl(_I(x))) +#define ipa_ntoh(x) x = _MI(ntohl(_I(x))) +#define ipa_classify(x) ipv4_classify(_I(x)) unsigned ipv4_mklen(u32); u32 ipv4_mkmask(unsigned); +int ipv4_classify(u32); -/* ??? htonl and ntohl ??? */ +/* FIXME: Is this hash function uniformly distributed over standard routing tables? */ +static inline unsigned ipv4_hash(u32 a) +{ + return a ^ (a >> 16) ^ (a >> 24); +} #endif |