version 1.1, 2012/02/21 16:57:34
|
version 1.1.1.2, 2016/10/18 14:04:50
|
Line 2
|
Line 2
|
|
|
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
|
#include <string.h> |
#include "addr_hash.h" |
#include "addr_hash.h" |
#include "hash.h" |
#include "hash.h" |
#include "iftop.h" |
#include "iftop.h" |
Line 11
|
Line 12
|
int compare(void* a, void* b) { |
int compare(void* a, void* b) { |
addr_pair* aa = (addr_pair*)a; |
addr_pair* aa = (addr_pair*)a; |
addr_pair* bb = (addr_pair*)b; |
addr_pair* bb = (addr_pair*)b; |
|
|
|
if (aa->af != bb->af) |
|
return 0; |
|
|
|
if (aa->af == AF_INET6) { |
|
return (IN6_ARE_ADDR_EQUAL(&aa->src6, &bb->src6) |
|
&& aa->src_port == bb->src_port |
|
&& IN6_ARE_ADDR_EQUAL(&aa->dst6, &bb->dst6) |
|
&& aa->dst_port == bb->dst_port |
|
&& aa->protocol == bb->protocol); |
|
} |
|
|
|
/* AF_INET or unknown. */ |
return (aa->src.s_addr == bb->src.s_addr |
return (aa->src.s_addr == bb->src.s_addr |
&& aa->src_port == bb->src_port |
&& aa->src_port == bb->src_port |
&& aa->dst.s_addr == bb->dst.s_addr |
&& aa->dst.s_addr == bb->dst.s_addr |
Line 18 int compare(void* a, void* b) {
|
Line 32 int compare(void* a, void* b) {
|
&& aa->protocol == bb->protocol); |
&& aa->protocol == bb->protocol); |
} |
} |
|
|
|
static int __inline__ hash_uint32(uint32_t n) { |
|
return ((n & 0x000000FF) |
|
+ ((n & 0x0000FF00) >> 8) |
|
+ ((n & 0x00FF0000) >> 16) |
|
+ ((n & 0xFF000000) >> 24)); |
|
} |
|
|
int hash(void* key) { |
int hash(void* key) { |
int hash; |
int hash; |
long addr; |
|
addr_pair* ap = (addr_pair*)key; |
addr_pair* ap = (addr_pair*)key; |
|
|
addr = (long)ap->src.s_addr; |
|
|
|
hash = ((addr & 0x000000FF) | if (ap->af == AF_INET6) { |
+ (addr & 0x0000FF00 >> 8) | uint32_t* addr6 = (uint32_t*)ap->src6.s6_addr; |
+ (addr & 0x00FF0000 >> 16) | |
+ (addr & 0xFF000000 >> 24) | |
+ ap->src_port) % 0xFF; | |
|
|
addr = (long)ap->dst.s_addr; | hash = ( hash_uint32(addr6[0]) |
hash = ( hash + (addr & 0x000000FF) | + hash_uint32(addr6[1]) |
+ (addr & 0x0000FF00 >> 8) | + hash_uint32(addr6[2]) |
+ (addr & 0x00FF0000 >> 16) | + hash_uint32(addr6[3]) |
+ (addr & 0xFF000000 >> 24) | + ap->src_port) % 0xFF; |
+ ap->dst_port) % 0xFF; | |
| addr6 = (uint32_t*)ap->dst6.s6_addr; |
| hash = ( hash + hash_uint32(addr6[0]) |
| + hash_uint32(addr6[1]) |
| + hash_uint32(addr6[2]) |
| + hash_uint32(addr6[3]) |
| + ap->dst_port) % 0xFF; |
| } else { |
| in_addr_t addr = ap->src.s_addr; |
| |
| hash = ( hash_uint32(addr) |
| + ap->src_port) % 0xFF; |
| |
| addr = ap->dst.s_addr; |
| hash = ( hash + hash_uint32(addr) |
| + ap->dst_port) % 0xFF; |
| } |
|
|
return hash; |
return hash; |
} |
} |