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