Annotation of embedaddon/iftop/addr_hash.c, revision 1.1.1.2
1.1 misho 1: /* hash table */
2:
3: #include <stdio.h>
4: #include <stdlib.h>
1.1.1.2 ! misho 5: #include <string.h>
1.1 misho 6: #include "addr_hash.h"
7: #include "hash.h"
8: #include "iftop.h"
9:
10: #define hash_table_size 256
11:
12: int compare(void* a, void* b) {
13: addr_pair* aa = (addr_pair*)a;
14: addr_pair* bb = (addr_pair*)b;
1.1.1.2 ! misho 15:
! 16: if (aa->af != bb->af)
! 17: return 0;
! 18:
! 19: if (aa->af == AF_INET6) {
! 20: return (IN6_ARE_ADDR_EQUAL(&aa->src6, &bb->src6)
! 21: && aa->src_port == bb->src_port
! 22: && IN6_ARE_ADDR_EQUAL(&aa->dst6, &bb->dst6)
! 23: && aa->dst_port == bb->dst_port
! 24: && aa->protocol == bb->protocol);
! 25: }
! 26:
! 27: /* AF_INET or unknown. */
1.1 misho 28: return (aa->src.s_addr == bb->src.s_addr
29: && aa->src_port == bb->src_port
30: && aa->dst.s_addr == bb->dst.s_addr
31: && aa->dst_port == bb->dst_port
32: && aa->protocol == bb->protocol);
33: }
34:
1.1.1.2 ! misho 35: static int __inline__ hash_uint32(uint32_t n) {
! 36: return ((n & 0x000000FF)
! 37: + ((n & 0x0000FF00) >> 8)
! 38: + ((n & 0x00FF0000) >> 16)
! 39: + ((n & 0xFF000000) >> 24));
! 40: }
! 41:
1.1 misho 42: int hash(void* key) {
43: int hash;
44: addr_pair* ap = (addr_pair*)key;
45:
1.1.1.2 ! misho 46: if (ap->af == AF_INET6) {
! 47: uint32_t* addr6 = (uint32_t*)ap->src6.s6_addr;
! 48:
! 49: hash = ( hash_uint32(addr6[0])
! 50: + hash_uint32(addr6[1])
! 51: + hash_uint32(addr6[2])
! 52: + hash_uint32(addr6[3])
! 53: + ap->src_port) % 0xFF;
! 54:
! 55: addr6 = (uint32_t*)ap->dst6.s6_addr;
! 56: hash = ( hash + hash_uint32(addr6[0])
! 57: + hash_uint32(addr6[1])
! 58: + hash_uint32(addr6[2])
! 59: + hash_uint32(addr6[3])
! 60: + ap->dst_port) % 0xFF;
! 61: } else {
! 62: in_addr_t addr = ap->src.s_addr;
! 63:
! 64: hash = ( hash_uint32(addr)
! 65: + ap->src_port) % 0xFF;
! 66:
! 67: addr = ap->dst.s_addr;
! 68: hash = ( hash + hash_uint32(addr)
! 69: + ap->dst_port) % 0xFF;
! 70: }
1.1 misho 71:
72: return hash;
73: }
74:
75: void* copy_key(void* orig) {
76: addr_pair* copy;
77: copy = xmalloc(sizeof *copy);
78: *copy = *(addr_pair*)orig;
79: return copy;
80: }
81:
82: void delete_key(void* key) {
83: free(key);
84: }
85:
86: /*
87: * Allocate and return a hash
88: */
89: hash_type* addr_hash_create() {
90: hash_type* hash_table;
91: hash_table = xcalloc(hash_table_size, sizeof *hash_table);
92: hash_table->size = hash_table_size;
93: hash_table->compare = &compare;
94: hash_table->hash = &hash;
95: hash_table->delete_key = &delete_key;
96: hash_table->copy_key = ©_key;
97: hash_initialise(hash_table);
98: return hash_table;
99: }
100:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>