libdht

A simple helper library for distributed hash tables.
git clone git://r-36.net/libdht
Log | Files | Refs | README | LICENSE

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