#ifndef _NET_TOEPLITZ2_H_
#define _NET_TOEPLITZ2_H_
#ifndef _KERNEL
#error "kernel only header file"
#endif
#define TOEPLITZ_KEYSEED_CNT 2
extern uint32_t toeplitz_cache[TOEPLITZ_KEYSEED_CNT][256];
static __inline uint32_t
toeplitz_rawhash_addrport(in_addr_t _faddr, in_addr_t _laddr,
in_port_t _fport, in_port_t _lport)
{
uint32_t _res;
_res = toeplitz_cache[0][_faddr & 0xff];
_res ^= toeplitz_cache[0][(_faddr >> 16) & 0xff];
_res ^= toeplitz_cache[0][_laddr & 0xff];
_res ^= toeplitz_cache[0][(_laddr >> 16) & 0xff];
_res ^= toeplitz_cache[0][_fport & 0xff];
_res ^= toeplitz_cache[0][_lport & 0xff];
_res ^= toeplitz_cache[1][(_faddr >> 8) & 0xff];
_res ^= toeplitz_cache[1][(_faddr >> 24) & 0xff];
_res ^= toeplitz_cache[1][(_laddr >> 8) & 0xff];
_res ^= toeplitz_cache[1][(_laddr >> 24) & 0xff];
_res ^= toeplitz_cache[1][(_fport >> 8) & 0xff];
_res ^= toeplitz_cache[1][(_lport >> 8) & 0xff];
return _res;
}
static __inline uint32_t
toeplitz_rawhash_addr(in_addr_t _faddr, in_addr_t _laddr)
{
uint32_t _res;
_res = toeplitz_cache[0][_faddr & 0xff];
_res ^= toeplitz_cache[0][(_faddr >> 16) & 0xff];
_res ^= toeplitz_cache[0][_laddr & 0xff];
_res ^= toeplitz_cache[0][(_laddr >> 16) & 0xff];
_res ^= toeplitz_cache[1][(_faddr >> 8) & 0xff];
_res ^= toeplitz_cache[1][(_faddr >> 24) & 0xff];
_res ^= toeplitz_cache[1][(_laddr >> 8) & 0xff];
_res ^= toeplitz_cache[1][(_laddr >> 24) & 0xff];
return _res;
}
static __inline int
toeplitz_hash(uint32_t _rawhash)
{
return (_rawhash & 0xffff);
}
static __inline uint32_t
toeplitz_piecemeal_addr(in_addr_t _faddr)
{
uint32_t _res;
_res = toeplitz_cache[0][_faddr & 0xff];
_res ^= toeplitz_cache[0][(_faddr >> 16) & 0xff];
_res ^= toeplitz_cache[1][(_faddr >> 8) & 0xff];
_res ^= toeplitz_cache[1][(_faddr >> 24) & 0xff];
return _res;
}
static __inline uint32_t
toeplitz_piecemeal_port(in_port_t _fport)
{
uint32_t _res;
_res = toeplitz_cache[0][_fport & 0xff];
_res ^= toeplitz_cache[1][(_fport >> 8) & 0xff];
return _res;
}
#endif