more debugging
This commit is contained in:
parent
9f55b14f3c
commit
bf1f900716
5 changed files with 84 additions and 19 deletions
|
@ -94,7 +94,7 @@ int libp2p_peer_matches_id(struct Libp2pPeer* in, const unsigned char* peer_id,
|
||||||
* @param in the peer object
|
* @param in the peer object
|
||||||
* @returns the peer id as a null terminated string
|
* @returns the peer id as a null terminated string
|
||||||
*/
|
*/
|
||||||
char* libp2p_peer_id_to_string(struct Libp2pPeer* in);
|
char* libp2p_peer_id_to_string(const struct Libp2pPeer* in);
|
||||||
|
|
||||||
/***
|
/***
|
||||||
* Determine if we are currently connected to this peer
|
* Determine if we are currently connected to this peer
|
||||||
|
|
36
peer/peer.c
36
peer/peer.c
|
@ -167,14 +167,18 @@ struct Libp2pPeer* libp2p_peer_copy(const struct Libp2pPeer* in) {
|
||||||
struct Libp2pLinkedList* current_out = NULL;
|
struct Libp2pLinkedList* current_out = NULL;
|
||||||
while (current_in != NULL) {
|
while (current_in != NULL) {
|
||||||
struct MultiAddress* addr = (struct MultiAddress*)current_in->item;
|
struct MultiAddress* addr = (struct MultiAddress*)current_in->item;
|
||||||
struct Libp2pLinkedList* copy_item = libp2p_utils_linked_list_new();
|
if (addr == NULL) {
|
||||||
copy_item->item = multiaddress_copy(addr);
|
libp2p_logger_error("peer", "Attempted to copy MultiAddress, but current item is NULL.\n");
|
||||||
if (out->addr_head == NULL) {
|
|
||||||
out->addr_head = copy_item;
|
|
||||||
} else {
|
} else {
|
||||||
current_out->next = copy_item;
|
struct Libp2pLinkedList* copy_item = libp2p_utils_linked_list_new();
|
||||||
|
copy_item->item = multiaddress_copy(addr);
|
||||||
|
if (out->addr_head == NULL) {
|
||||||
|
out->addr_head = copy_item;
|
||||||
|
} else {
|
||||||
|
current_out->next = copy_item;
|
||||||
|
}
|
||||||
|
current_out = copy_item;
|
||||||
}
|
}
|
||||||
current_out = copy_item;
|
|
||||||
current_in = current_in->next;
|
current_in = current_in->next;
|
||||||
}
|
}
|
||||||
out->sessionContext = in->sessionContext;
|
out->sessionContext = in->sessionContext;
|
||||||
|
@ -202,7 +206,7 @@ static char string_retval[100];
|
||||||
* @param in the peer object
|
* @param in the peer object
|
||||||
* @returns the peer id as a null terminated string
|
* @returns the peer id as a null terminated string
|
||||||
*/
|
*/
|
||||||
char* libp2p_peer_id_to_string(struct Libp2pPeer* in) {
|
char* libp2p_peer_id_to_string(const struct Libp2pPeer* in) {
|
||||||
memcpy(string_retval, in->id, in->id_size);
|
memcpy(string_retval, in->id, in->id_size);
|
||||||
string_retval[in->id_size] = 0;
|
string_retval[in->id_size] = 0;
|
||||||
return string_retval;
|
return string_retval;
|
||||||
|
@ -232,7 +236,11 @@ size_t libp2p_peer_protobuf_encode_size(struct Libp2pPeer* in) {
|
||||||
while (current != NULL) {
|
while (current != NULL) {
|
||||||
// find the length of the MultiAddress converted into bytes
|
// find the length of the MultiAddress converted into bytes
|
||||||
struct MultiAddress* data = (struct MultiAddress*)current->item;
|
struct MultiAddress* data = (struct MultiAddress*)current->item;
|
||||||
sz += 11 + data->bsize;
|
if (data == NULL) {
|
||||||
|
libp2p_logger_error("peer", "encode_size: Attempted to get MultiAddress, but item was NULL.\n");
|
||||||
|
} else {
|
||||||
|
sz += 11 + data->bsize;
|
||||||
|
}
|
||||||
current = current->next;
|
current = current->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -253,10 +261,14 @@ int libp2p_peer_protobuf_encode(struct Libp2pPeer* in, unsigned char* buffer, si
|
||||||
struct Libp2pLinkedList* current = in->addr_head;
|
struct Libp2pLinkedList* current = in->addr_head;
|
||||||
while (current != NULL) {
|
while (current != NULL) {
|
||||||
struct MultiAddress* data = (struct MultiAddress*)current->item;
|
struct MultiAddress* data = (struct MultiAddress*)current->item;
|
||||||
retVal = protobuf_encode_length_delimited(2, WIRETYPE_LENGTH_DELIMITED, (char*)data->bytes, data->bsize, &buffer[*bytes_written], max_buffer_size - *bytes_written, &bytes_used);
|
if (data == NULL) {
|
||||||
if (retVal == 0)
|
libp2p_logger_error("peer", "encode: Attempted to get multiaddress, but item was NULL.\n");
|
||||||
return 0;
|
} else {
|
||||||
*bytes_written += bytes_used;
|
retVal = protobuf_encode_length_delimited(2, WIRETYPE_LENGTH_DELIMITED, (char*)data->bytes, data->bsize, &buffer[*bytes_written], max_buffer_size - *bytes_written, &bytes_used);
|
||||||
|
if (retVal == 0)
|
||||||
|
return 0;
|
||||||
|
*bytes_written += bytes_used;
|
||||||
|
}
|
||||||
current = current->next;
|
current = current->next;
|
||||||
}
|
}
|
||||||
// field 3 (varint)
|
// field 3 (varint)
|
||||||
|
|
|
@ -109,6 +109,40 @@ int libp2p_peerstore_add_peer_entry(struct Peerstore* peerstore, struct PeerEntr
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int libp2p_peerstore_update_addresses(struct Libp2pPeer* existing, const struct Libp2pPeer* incoming) {
|
||||||
|
struct Libp2pLinkedList* incoming_list_pos = incoming->addr_head;
|
||||||
|
while (incoming_list_pos != NULL) {
|
||||||
|
if (incoming_list_pos->item == NULL) {
|
||||||
|
libp2p_logger_error("peerstore", "update_addresses: incoming address list has null item.\n");
|
||||||
|
} else {
|
||||||
|
struct MultiAddress* incoming_ma = (struct MultiAddress*) incoming_list_pos->item;
|
||||||
|
// see if we have this multiaddress already
|
||||||
|
struct Libp2pLinkedList* existing_list_pos = existing->addr_head;
|
||||||
|
while (existing_list_pos != NULL) {
|
||||||
|
if (multiaddress_compare(incoming_ma, (struct MultiAddress*)existing_list_pos->item) == 0) {
|
||||||
|
// we found a match
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
existing_list_pos = existing_list_pos->next;
|
||||||
|
}
|
||||||
|
if (existing_list_pos == NULL) {
|
||||||
|
// we didnt find a match. Add this multiaddress to the top of the existing peer's list
|
||||||
|
struct MultiAddress* ma_copy = multiaddress_copy(incoming_ma);
|
||||||
|
if (ma_copy == NULL) {
|
||||||
|
libp2p_logger_error("peerstore", "Attempted copy of multiaddress, but was null.");
|
||||||
|
} else {
|
||||||
|
struct Libp2pLinkedList* new_ma = libp2p_utils_linked_list_new();
|
||||||
|
new_ma->item = multiaddress_copy(incoming_list_pos->item);
|
||||||
|
new_ma->next = existing->addr_head;
|
||||||
|
existing->addr_head = new_ma;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
incoming_list_pos = incoming_list_pos->next;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/***
|
/***
|
||||||
* Add a peer to the peerstore
|
* Add a peer to the peerstore
|
||||||
* @param peerstore the peerstore to add the entry to
|
* @param peerstore the peerstore to add the entry to
|
||||||
|
@ -123,15 +157,19 @@ int libp2p_peerstore_add_peer(struct Peerstore* peerstore, const struct Libp2pPe
|
||||||
ma_string = ((struct MultiAddress*)peer->addr_head->item)->string;
|
ma_string = ((struct MultiAddress*)peer->addr_head->item)->string;
|
||||||
}
|
}
|
||||||
// first check to see if it exists. If it does, return TRUE
|
// first check to see if it exists. If it does, return TRUE
|
||||||
if (libp2p_peerstore_get_peer_entry(peerstore, (unsigned char*)peer->id, peer->id_size) != NULL) {
|
struct PeerEntry* peer_entry = libp2p_peerstore_get_peer_entry(peerstore, (unsigned char*)peer->id, peer->id_size);
|
||||||
libp2p_logger_debug("peerstore", "Attempted to add %s to peerstore, but already there.\n", ma_string);
|
if (peer_entry != NULL) {
|
||||||
|
libp2p_logger_debug("peerstore", "Attempted to add %s to peerstore, but already there. Checking if we need to update addresses.\n", ma_string);
|
||||||
|
libp2p_peerstore_update_addresses(peer_entry->peer, peer);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (peer->id_size > 0) {
|
if (peer->id_size > 0) {
|
||||||
if (peer->addr_head != NULL) {
|
if (peer->addr_head != NULL && peer->addr_head->item != NULL) {
|
||||||
char* address = ((struct MultiAddress*)peer->addr_head->item)->string;
|
char* address = ((struct MultiAddress*)peer->addr_head->item)->string;
|
||||||
libp2p_logger_debug("peerstore", "Adding peer %s with address %s to peer store\n", peer->id, address);
|
libp2p_logger_debug("peerstore", "Adding peer %s with address %s to peer store\n", libp2p_peer_id_to_string(peer), address);
|
||||||
|
} else {
|
||||||
|
libp2p_logger_debug("peerstore", "Adding peer %s with no addresses to peer store.\n", libp2p_peer_id_to_string(peer));
|
||||||
}
|
}
|
||||||
struct PeerEntry* peer_entry = libp2p_peer_entry_new();
|
struct PeerEntry* peer_entry = libp2p_peer_entry_new();
|
||||||
if (peer_entry == NULL) {
|
if (peer_entry == NULL) {
|
||||||
|
|
|
@ -157,15 +157,16 @@ int libp2p_routing_dht_handle_get_providers(struct SessionContext* session, stru
|
||||||
message->provider_peer_head->item = libp2p_peer_copy(libp2p_peerstore_get_local_peer(peerstore));
|
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)) {
|
} 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?
|
// 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
|
// we have a peer id, convert it to a peer object
|
||||||
struct Libp2pPeer* peer = libp2p_peerstore_get_peer(peerstore, peer_id, peer_id_size);
|
struct Libp2pPeer* peer = libp2p_peerstore_get_peer(peerstore, peer_id, peer_id_size);
|
||||||
if (peer != NULL) {
|
if (peer != NULL) {
|
||||||
|
libp2p_logger_debug("dht_protocol", "I can provide a provider for this key, because %s says he has it.\n", libp2p_peer_id_to_string(peer));
|
||||||
// add it to the message
|
// add it to the message
|
||||||
if (message->provider_peer_head == NULL) {
|
if (message->provider_peer_head == NULL) {
|
||||||
message->provider_peer_head = libp2p_utils_linked_list_new();
|
message->provider_peer_head = libp2p_utils_linked_list_new();
|
||||||
message->provider_peer_head->item = libp2p_peer_copy(peer);
|
message->provider_peer_head->item = libp2p_peer_copy(peer);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
struct Libp2pLinkedList* current = message->provider_peer_head;
|
struct Libp2pLinkedList* current = message->provider_peer_head;
|
||||||
// find the last one in the list
|
// find the last one in the list
|
||||||
while (current->next != NULL) {
|
while (current->next != NULL) {
|
||||||
|
@ -196,7 +197,7 @@ int libp2p_routing_dht_handle_get_providers(struct SessionContext* session, stru
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
if (message->provider_peer_head != NULL) {
|
if (message->provider_peer_head != NULL) {
|
||||||
libp2p_logger_debug("dht_protocol", "GetProviders: We have a peer. Sending it back\n");
|
libp2p_logger_debug("dht_protocol", "GetProviders: We have a peer. Sending it back.");
|
||||||
// protobuf it and send it back
|
// protobuf it and send it back
|
||||||
if (!libp2p_routing_dht_protobuf_message(message, results, results_size)) {
|
if (!libp2p_routing_dht_protobuf_message(message, results, results_size)) {
|
||||||
libp2p_logger_error("dht_protocol", "GetProviders: Error protobufing results\n");
|
libp2p_logger_error("dht_protocol", "GetProviders: Error protobufing results\n");
|
||||||
|
@ -268,6 +269,7 @@ int libp2p_routing_dht_handle_add_provider(struct SessionContext* session, struc
|
||||||
}
|
}
|
||||||
|
|
||||||
// add what we know to be the ip for this peer
|
// add what we know to be the ip for this peer
|
||||||
|
/*
|
||||||
char *ip;
|
char *ip;
|
||||||
char new_string[255];
|
char new_string[255];
|
||||||
multiaddress_get_ip_address(session->default_stream->address, &ip);
|
multiaddress_get_ip_address(session->default_stream->address, &ip);
|
||||||
|
@ -286,6 +288,7 @@ int libp2p_routing_dht_handle_add_provider(struct SessionContext* session, struc
|
||||||
new_head->item = new_ma;
|
new_head->item = new_ma;
|
||||||
new_head->next = peer->addr_head;
|
new_head->next = peer->addr_head;
|
||||||
peer->addr_head = new_head;
|
peer->addr_head = new_head;
|
||||||
|
*/
|
||||||
// now add the peer to the peerstore
|
// now add the peer to the peerstore
|
||||||
libp2p_logger_debug("dht_protocol", "About to add peer %s to peerstore\n", peer_ma->string);
|
libp2p_logger_debug("dht_protocol", "About to add peer %s to peerstore\n", peer_ma->string);
|
||||||
if (!libp2p_peerstore_add_peer(peerstore, peer))
|
if (!libp2p_peerstore_add_peer(peerstore, peer))
|
||||||
|
|
|
@ -980,6 +980,18 @@ int libp2p_secio_handshake(struct SessionContext* local_session, const struct Rs
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
remote_peer->sessionContext = local_session;
|
remote_peer->sessionContext = local_session;
|
||||||
|
// add a multiaddress to the peer (if we have what we need)
|
||||||
|
char url[100];
|
||||||
|
sprintf(url, "/ip4/%s/tcp/%d/ipfs/%s", local_session->host, local_session->port, libp2p_peer_id_to_string(remote_peer));
|
||||||
|
struct MultiAddress* ma = multiaddress_new_from_string(url);
|
||||||
|
if (ma == NULL) {
|
||||||
|
libp2p_logger_error("secio", "Unable to generate MultiAddress from [%s].\n", url);
|
||||||
|
} else {
|
||||||
|
libp2p_logger_debug("secio", "Adding %s to peer %s.\n", url, libp2p_peer_id_to_string(remote_peer));
|
||||||
|
struct Libp2pLinkedList* ma_ll = libp2p_utils_linked_list_new();
|
||||||
|
ma_ll->item = ma;
|
||||||
|
remote_peer->addr_head = ma_ll;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (remote_peer->sessionContext != local_session) {
|
if (remote_peer->sessionContext != local_session) {
|
||||||
// clean up old session context
|
// clean up old session context
|
||||||
|
|
Loading…
Reference in a new issue