dht->recv_buffer_length = 0;
- dht->transactionid_next = rand() % 0xFFFF;
+ dht->transactionid_next = 1; //rand();
ks_hash_create(&dht->transactions_hash, KS_HASH_MODE_INT, KS_HASH_FLAG_RWLOCK, dht->pool);
return KS_STATUS_SUCCESS;
{
struct bencode *r;
ks_dht2_transaction_t *transaction;
+ uint32_t *tid;
uint32_t transactionid;
- uint16_t *tid;
ks_status_t ret = KS_STATUS_FAIL;
ks_assert(dht);
message->args = r;
- tid = (uint16_t *)message->transactionid;
- transactionid = ntohs(*tid);
+ tid = (uint32_t *)message->transactionid;
+ transactionid = ntohl(*tid);
transaction = ks_hash_search(dht->transactions_hash, (void *)&transactionid, KS_READLOCKED);
ks_hash_read_unlock(dht->transactions_hash);
return KS_STATUS_FAIL;
}
- //ks_log(KS_LOG_DEBUG, "Message query ping id is '%s'\n", id->id);
ks_log(KS_LOG_DEBUG, "Message query ping is valid\n");
ret = ks_dht2_send_response_ping(dht, raddr, message->transactionid, message->transactionid_length);
ks_assert(raddr);
ks_assert(message);
+ ks_log(KS_LOG_DEBUG, "Message response ping is reached\n");
+
return KS_STATUS_SUCCESS;
}
goto done;
}
- // @todo transaction expiration and raddr
-
- // @todo transactions_hash mutex?
- ks_hash_insert(dht->transactions_hash, (void *)&transactionid, transaction);
-
+ // @todo transaction expiration and raddr for validation
+
+ ks_hash_insert(dht->transactions_hash, (void *)&transaction->transactionid, transaction);
+
// @note a joins response.data and will be freed with it
ben_dict_set(a, ben_blob("id", 2), ben_blob(dht->nodeid.id, KS_DHT_NODEID_LENGTH));
- ks_log(KS_LOG_DEBUG, "Sending message query ping\n");
+ ks_log(KS_LOG_DEBUG, "Sending message query ping with transaction id %d\n", transactionid);
ret = ks_dht2_send(dht, raddr, &query);
done:
struct ks_dht2_transaction_s {
ks_pool_t *pool;
- uint16_t transactionid;
+ uint32_t transactionid;
ks_dht2_message_callback_t callback;
// @todo expiration data
};
uint8_t recv_buffer[KS_DHT_RECV_BUFFER_SIZE];
ks_size_t recv_buffer_length;
- uint16_t transactionid_next;
+ uint32_t transactionid_next;
ks_hash_t *transactions_hash;
};
KS_DECLARE(ks_status_t) ks_dht2_message_parse(ks_dht2_message_t *message, const uint8_t *buffer, ks_size_t buffer_length);
KS_DECLARE(ks_status_t) ks_dht2_message_query(ks_dht2_message_t *message,
- uint16_t transactionid,
+ uint32_t transactionid,
const char *query,
struct bencode **args);
KS_DECLARE(ks_status_t) ks_dht2_message_response(ks_dht2_message_t *message,
KS_DECLARE(ks_status_t) ks_dht2_transaction_free(ks_dht2_transaction_t *transaction);
KS_DECLARE(ks_status_t) ks_dht2_transaction_init(ks_dht2_transaction_t *transaction,
- uint16_t transactionid,
+ uint32_t transactionid,
ks_dht2_message_callback_t callback);
KS_DECLARE(ks_status_t) ks_dht2_transaction_deinit(ks_dht2_transaction_t *transaction);
*
*/
KS_DECLARE(ks_status_t) ks_dht2_message_query(ks_dht2_message_t *message,
- uint16_t transactionid,
+ uint32_t transactionid,
const char *query,
struct bencode **args)
{
struct bencode *a;
- uint16_t tid;
-
+ uint32_t tid;
+
ks_assert(message);
ks_assert(query);
- tid = htons(transactionid);
+ tid = htonl(transactionid);
- ben_dict_set(message->data, ben_blob("t", 1), ben_blob((uint8_t *)&tid, 2));
+ ben_dict_set(message->data, ben_blob("t", 1), ben_blob((uint8_t *)&tid, sizeof(uint32_t)));
ben_dict_set(message->data, ben_blob("y", 1), ben_blob("q", 1));
ben_dict_set(message->data, ben_blob("q", 1), ben_blob(query, strlen(query)));
*
*/
KS_DECLARE(ks_status_t) ks_dht2_transaction_init(ks_dht2_transaction_t *transaction,
- uint16_t transactionid,
+ uint32_t transactionid,
ks_dht2_message_callback_t callback)
{
ks_assert(transaction);
ok(err == KS_STATUS_SUCCESS);
- buflen = strlen(TEST_DHT1_PROCESS_QUERY_PING_BUFFER);
- memcpy(dht1->recv_buffer, TEST_DHT1_PROCESS_QUERY_PING_BUFFER, buflen);
- dht1->recv_buffer_length = buflen;
+ //buflen = strlen(TEST_DHT1_PROCESS_QUERY_PING_BUFFER);
+ //memcpy(dht1->recv_buffer, TEST_DHT1_PROCESS_QUERY_PING_BUFFER, buflen);
+ //dht1->recv_buffer_length = buflen;
- err = ks_dht2_process(dht1, &raddr);
+ //err = ks_dht2_process(dht1, &raddr);
+ //ok(err == KS_STATUS_SUCCESS);
+
+ err = ks_dht2_send_query_ping(dht1, &raddr);
ok(err == KS_STATUS_SUCCESS);
err = ks_dht2_pulse(&dht2, 1000);
ok(err == KS_STATUS_SUCCESS);
+ err = ks_dht2_pulse(dht1, 1000);
+ ok(err == KS_STATUS_SUCCESS);
+
diag("Cleanup\n");
/* Cleanup and shutdown */