diff --git a/include/libp2p/peer/peerstore.h b/include/libp2p/peer/peerstore.h index 71ef1d8..4f0d4d4 100644 --- a/include/libp2p/peer/peerstore.h +++ b/include/libp2p/peer/peerstore.h @@ -79,6 +79,13 @@ struct PeerEntry* libp2p_peerstore_get_peer_entry(struct Peerstore* peerstore, c */ struct Libp2pPeer* libp2p_peerstore_get_peer(struct Peerstore* peerstore, const unsigned char* peer_id, size_t peer_id_size); +/** + * Retrieves the local peer, which is always the first in the collection + * @param peerstore the peerstore + * @returns the first Libp2pPeer in the collection + */ +struct Libp2pPeer* libp2p_peerstore_get_local_peer(struct Peerstore* peerstore); + /** * Look for this peer in the peerstore. If it is found, return a reference to that object. * If it is not found, add it, and return a reference to the new copy diff --git a/peer/peerstore.c b/peer/peerstore.c index 9c94072..8a199bf 100644 --- a/peer/peerstore.c +++ b/peer/peerstore.c @@ -187,6 +187,20 @@ struct Libp2pPeer* libp2p_peerstore_get_peer(struct Peerstore* peerstore, const return entry->peer; } +/** + * Retrieves the local peer, which is always the first in the collection + * @param peerstore the peerstore + * @returns the first Libp2pPeer in the collection + */ +struct Libp2pPeer* libp2p_peerstore_get_local_peer(struct Peerstore* peerstore) { + struct Libp2pPeer* retVal = NULL; + if (peerstore != NULL && peerstore->head_entry != NULL && peerstore->head_entry->item != NULL) { + struct PeerEntry* entry = peerstore->head_entry->item; + retVal = entry->peer; + } + return retVal; +} + /*** * Look for a peer by id. If not found, add it to the peerstore * @param peerstore the Peerstore diff --git a/routing/dht_protocol.c b/routing/dht_protocol.c index c83c12e..fb878f8 100644 --- a/routing/dht_protocol.c +++ b/routing/dht_protocol.c @@ -33,7 +33,7 @@ int libp2p_routing_dht_shutdown(void* context) { } int libp2p_routing_dht_handle_msg(const uint8_t* incoming, size_t incoming_size, struct SessionContext* session_context, void* context) { - libp2p_logger_debug("dht_routing", "Handling incoming dht routing request.\n"); + libp2p_logger_debug("dht_protocol", "Handling incoming dht routing request.\n"); struct DhtContext* ctx = (struct DhtContext*)context; if (!libp2p_routing_dht_handshake(session_context)) return -1; @@ -147,15 +147,14 @@ int libp2p_routing_dht_handle_get_providers(struct SessionContext* session, stru // Can I provide it locally? unsigned char buf[65535]; - size_t buf_size = 0; + size_t buf_size = 65535; if (session->datastore->datastore_get(message->key, message->key_size, &buf[0], buf_size, &buf_size, session->datastore)) { // we can provide this hash from our datastore + libp2p_logger_debug("dht_protocol", "I can provide myself as a provider for this key.\n"); message->provider_peer_head = libp2p_utils_linked_list_new(); - struct Libp2pPeer* local_peer = (struct Libp2pPeer*)peerstore->head_entry->item; - message->provider_peer_head->item = local_peer; - } - // Can I provide it because someone announced it earlier? - if (libp2p_providerstore_get(providerstore, (unsigned char*)message->key, message->key_size, &peer_id, &peer_id_size)) { + message->provider_peer_head->item = libp2p_peer_copy(libp2p_peerstore_get_local_peer(peerstore)); + } else if (libp2p_providerstore_get(providerstore, (unsigned char*)message->key, message->key_size, &peer_id, &peer_id_size)) { + // Can I provide it because someone announced it earlier? libp2p_logger_debug("dht_protocol", "I can provide a provider for this key.\n"); // we have a peer id, convert it to a peer object struct Libp2pPeer* peer = libp2p_peerstore_get_peer(peerstore, peer_id, peer_id_size); @@ -163,7 +162,7 @@ int libp2p_routing_dht_handle_get_providers(struct SessionContext* session, stru // add it to the message if (message->provider_peer_head == NULL) { message->provider_peer_head = libp2p_utils_linked_list_new(); - message->provider_peer_head->item = peer; + message->provider_peer_head->item = libp2p_peer_copy(peer); } else { struct Libp2pLinkedList* current = message->provider_peer_head; // find the last one in the list