dht.h (3060B)
1 /* 2 * Copy me if you can. 3 * by 20h 4 */ 5 6 #ifndef __DHT_H__ 7 #define __DHT_H__ 8 9 /* 10 * List functions. Most of them aren't needed, but provided. 11 */ 12 13 #define fordhtlist(list, elem) for (dhtlistelem_t *elem = (list)->first; elem;\ 14 elem = elem->next) 15 16 #define forodhtlist(list, elem) for (elem = (list)->first; elem;\ 17 elem = elem->next) 18 19 typedef struct dhtnode_t dhtnode_t; 20 21 typedef struct dhtlistelem_t dhtlistelem_t; 22 struct dhtlistelem_t { 23 dhtlistelem_t *next; 24 dhtlistelem_t *prev; 25 26 dhtnode_t *node; 27 }; 28 29 typedef struct dhtlist_t dhtlist_t; 30 struct dhtlist_t { 31 dhtlistelem_t *first; 32 dhtlistelem_t *last; 33 int len; 34 }; 35 36 dhtlistelem_t *dhtlistelem_set(dhtlistelem_t *elem, dhtnode_t *node); 37 dhtlistelem_t *dhtlistelem_new(dhtnode_t *node); 38 void dhtlistelem_free(dhtlistelem_t *elem); 39 40 dhtlist_t *dhtlist_new(void); 41 void dhtlist_free(dhtlist_t *dhtlist); 42 dhtlistelem_t *dhtlist_addelem(dhtlist_t *dhtlist, dhtlistelem_t *elem); 43 dhtlistelem_t *dhtlist_add(dhtlist_t *dhtlist, dhtnode_t *node); 44 dhtlistelem_t *dhtlist_push(dhtlist_t *dhtlist, dhtnode_t *node); 45 void dhtlist_delelemlinks(dhtlist_t *dhtlist, dhtlistelem_t *elem); 46 void dhtlist_delelem(dhtlist_t *dhtlist, dhtlistelem_t *elem); 47 dhtlistelem_t *dhtlist_insert(dhtlist_t *dhtlist, dhtlistelem_t *elem, int idx); 48 dhtlistelem_t *dhtlist_move(dhtlist_t *dhtlist, dhtlistelem_t *elem, int idx); 49 void dhtlist_print(dhtlist_t *dhtlist); 50 51 /* 52 * DHT functions. 53 */ 54 #define IDLENGTH 20 55 56 struct dhtnode_t { 57 char id[IDLENGTH]; 58 char *addr; 59 }; 60 61 typedef struct dhtrouting_t dhtrouting_t; 62 struct dhtrouting_t { 63 dhtnode_t *node; 64 dhtlist_t *buckets[IDLENGTH * 8]; 65 }; 66 67 typedef struct dht_t dht_t; 68 struct dht_t { 69 dhtrouting_t *routing; 70 }; 71 72 /* 73 * These functions are used for handling the dhtnodes, which is simply 74 * the ID of the specific host. 75 */ 76 dhtnode_t *dhtnode_mkid(dhtnode_t *node); 77 dhtnode_t *dhtnode_setid(dhtnode_t *node, char id[IDLENGTH]); 78 dhtnode_t *dhtnode_setaddr(dhtnode_t *node, char *addr); 79 dhtnode_t *dhtnode_new(void); 80 void dhtnode_free(dhtnode_t *node); 81 82 /* 83 * These are internal functions for the dhtnode. 84 */ 85 void dhtnode_print(dhtnode_t *node); 86 int dhtnode_cmp(dhtnode_t *node1, dhtnode_t *node2); 87 dhtnode_t *dhtnode_xor(dhtnode_t *node1, dhtnode_t *node2); 88 int dhtnode_prefixlen(dhtnode_t *node); 89 90 /* 91 * These are internal routing functions. 92 */ 93 dhtrouting_t *dhtrouting_new(dhtnode_t *node); 94 void dhtrouting_free(dhtrouting_t *route); 95 dhtrouting_t *dhtrouting_update(dhtrouting_t *route, dhtnode_t *node); 96 dhtlist_t *dhtrouting_findclosest(dhtrouting_t *route, dhtnode_t *target, 97 int max); 98 99 /* 100 * These are the high-level functions for dht handling. 101 */ 102 dht_t *dht_new(char *network); /* network is a unique identifier */ 103 void dht_free(dht_t *dht); 104 105 /* 106 * This function will return a list of nodes, with a maximum of max entries, 107 * which are close to the target node and known by you. 108 */ 109 dhtlist_t *dht_find(dht_t *dht, dhtnode_t *target, int max); 110 111 /* 112 * When a new node appears, add it to your internal routing buckets. 113 */ 114 dht_t *dht_update(dht_t *dht, dhtnode_t *node); 115 116 #endif 117