more debugging

This commit is contained in:
jmjatlanta 2017-09-28 13:21:07 -05:00
parent 9f55b14f3c
commit bf1f900716
5 changed files with 84 additions and 19 deletions

View file

@ -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

View file

@ -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)

View file

@ -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) {

View file

@ -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))

View file

@ -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