ks_time_t tyme;
uint8_t id[KS_DHT_NODEID_SIZE];
ks_dht_node_t *gptr; /* ptr to peer */
- enum ks_dht_nodetype_t type;
+ enum ks_dht_nodetype_t type;
+ enum ipfamily family;
uint8_t inuse;
uint8_t outstanding_pings;
uint8_t flags; /* active, suspect, expired */
uint8_t ks_dhtrt_load_query(ks_dhtrt_querynodes_t *query, ks_dhtrt_sortedxors_t *xort);
static
uint8_t ks_dhtrt_findclosest_bucketnodes(unsigned char *nodeid,
- enum ks_dht_nodetype_t type,
+ enum ks_dht_nodetype_t type,
+ enum ipfamily family,
ks_dhtrt_bucket_header_t *header,
ks_dhtrt_sortedxors_t *xors,
unsigned char *hixor,
/* step 1 - look at immediate bucket */
/* --------------------------------- */
- cnt = ks_dhtrt_findclosest_bucketnodes(query->nodeid.id, query->type, header, &xort0, initid ,max);
+ cnt = ks_dhtrt_findclosest_bucketnodes(query->nodeid.id, query->type, query->family, header, &xort0, initid ,max);
max -= cnt;
total += cnt;
}
}
- cnt = ks_dhtrt_findclosest_bucketnodes(query->nodeid.id, query->type, header, &xort1, initid ,max);
+ cnt = ks_dhtrt_findclosest_bucketnodes(query->nodeid.id, query->type, query->family, header, &xort1, initid ,max);
max -= cnt;
total += cnt;
prev->next = xortn;
prev = xortn;
- cnt += ks_dhtrt_findclosest_bucketnodes(query->nodeid.id, query->type, lheader, xortn, leftid ,max);
+ cnt += ks_dhtrt_findclosest_bucketnodes(query->nodeid.id, query->type, query->family,
+ lheader, xortn, leftid ,max);
max -= cnt;
#ifdef KS_DHT_DEBUGPRINTF_
printf(" stage3: seaching left bucket header %s yielded %d nodes, total=%d\n",
memset(xortn1, 0, sizeof(ks_dhtrt_sortedxors_t));
prev->next = xortn1;
prev = xortn1;
- cnt = ks_dhtrt_findclosest_bucketnodes(query->nodeid.id, query->type, rheader, xortn1, rightid , max);
+ cnt = ks_dhtrt_findclosest_bucketnodes(query->nodeid.id, query->type, query->family,
+ rheader, xortn1, rightid , max);
max -= cnt;
#ifdef KS_DHT_DEBUGPRINTF_
printf(" stage3: seaching right bucket header %s yielded %d nodes, total=%d\n",
if (ks_dhtrt_ismasked(source->entries[rix].id, left->mask)) {
/* move it to the left */
memcpy(dest->entries[lix].id, source->entries[rix].id, KS_DHT_NODEID_SIZE);
- dest->entries[lix].gptr = source->entries[rix].gptr;
+ dest->entries[lix].gptr = source->entries[rix].gptr;
+ dest->entries[lix].family = source->entries[rix].family;
+ dest->entries[lix].type = source->entries[rix].type;
dest->entries[lix].inuse = 1;
++lix;
++dest->count;
bucket->entries[free].inuse = 1;
bucket->entries[free].gptr = node;
bucket->entries[free].type = node->type;
+ bucket->entries[free].family = node->family;
bucket->entries[free].tyme = ks_time_now();
bucket->entries[free].flags &= DHTPEER_ACTIVE;
static
uint8_t ks_dhtrt_findclosest_bucketnodes(ks_dhtrt_nodeid_t id,
enum ks_dht_nodetype_t type,
+ enum ipfamily family,
ks_dhtrt_bucket_header_t *header,
ks_dhtrt_sortedxors_t *xors,
unsigned char *hixor, /*todo: remove */
uint8_t count = 0; /* count of nodes added this time */
xors->startix = KS_DHT_BUCKETSIZE;
xors->count = 0;
+ xors->bheader = header;
unsigned char xorvalue[KS_DHT_NODEID_SIZE];
/* just ugh! - there must be a better way to do this */
}
for (uint8_t ix=0; ix<KS_DHT_BUCKETSIZE; ++ix) {
- if ( bucket->entries[ix].inuse == 1 &&
- bucket->entries[ix].type & type &&
+ if ( bucket->entries[ix].inuse == 1 &&
+ (family == ifboth || bucket->entries[ix].family == family) &&
+ (bucket->entries[ix].type & type) &&
ks_dhtrt_isactive( &(bucket->entries[ix])) ) {
/* calculate xor value */