1: /* hash table */
2:
3: #include <stdio.h>
4: #include <stdlib.h>
5: #include <sys/types.h>
6: #include <sys/socket.h>
7: #include <netinet/in_systm.h>
8: #include <netinet/in.h>
9: #include <arpa/inet.h>
10: #include "ns_hash.h"
11: #include "hash.h"
12: #include "iftop.h"
13:
14: #define hash_table_size 256
15:
16: int ns_hash_compare(void* a, void* b) {
17: struct in_addr* aa = (struct in_addr*)a;
18: struct in_addr* bb = (struct in_addr*)b;
19: return (aa->s_addr == bb->s_addr);
20: }
21:
22: int ns_hash_hash(void* key) {
23: int hash;
24: long addr;
25:
26: addr = (long)((struct in_addr*)key)->s_addr;
27:
28: hash = ((addr & 0x000000FF)
29: + (addr & 0x0000FF00 >> 8)
30: + (addr & 0x00FF0000 >> 16)
31: + (addr & 0xFF000000 >> 24)) % 0xFF;
32:
33: return hash;
34: }
35:
36: void* ns_hash_copy_key(void* orig) {
37: struct in_addr* copy;
38: copy = xmalloc(sizeof *copy);
39: *copy = *(struct in_addr*)orig;
40: return copy;
41: }
42:
43: void ns_hash_delete_key(void* key) {
44: free(key);
45: }
46:
47: /*
48: * Allocate and return a hash
49: */
50: hash_type* ns_hash_create() {
51: hash_type* hash_table;
52: hash_table = xcalloc(hash_table_size, sizeof *hash_table);
53: hash_table->size = hash_table_size;
54: hash_table->compare = &ns_hash_compare;
55: hash_table->hash = &ns_hash_hash;
56: hash_table->delete_key = &ns_hash_delete_key;
57: hash_table->copy_key = &ns_hash_copy_key;
58: hash_initialise(hash_table);
59: return hash_table;
60: }
61:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>