Handling finding of peer via swarm
This commit is contained in:
parent
dc546649fd
commit
e886fe3288
7 changed files with 82 additions and 13 deletions
|
@ -44,7 +44,7 @@ void libp2p_message_free(struct Libp2pMessage* in);
|
||||||
* @param in the struct to be protobuf'd
|
* @param in the struct to be protobuf'd
|
||||||
* @returns the size required
|
* @returns the size required
|
||||||
*/
|
*/
|
||||||
size_t libp2p_message_protobuf_encode_size(struct Libp2pMessage* in);
|
size_t libp2p_message_protobuf_encode_size(const struct Libp2pMessage* in);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encode a Message into a protobuf
|
* Encode a Message into a protobuf
|
||||||
|
@ -54,7 +54,17 @@ size_t libp2p_message_protobuf_encode_size(struct Libp2pMessage* in);
|
||||||
* @param bytes_written will hold the number of bytes written to buffer
|
* @param bytes_written will hold the number of bytes written to buffer
|
||||||
* @returns true(1) on success, otherwise false(0)
|
* @returns true(1) on success, otherwise false(0)
|
||||||
*/
|
*/
|
||||||
int libp2p_message_protobuf_encode(struct Libp2pMessage* in, unsigned char* buffer, size_t max_buffer_size, size_t* bytes_written);
|
int libp2p_message_protobuf_encode(const struct Libp2pMessage* in, unsigned char* buffer, size_t max_buffer_size, size_t* bytes_written);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a Libp2pMessage into protobuf format,
|
||||||
|
* allocating memory as needed
|
||||||
|
* @param in the Libp2pMessage to convert
|
||||||
|
* @param buffer where to store the protobuf
|
||||||
|
* @param buffer_size the size written into buffer
|
||||||
|
* @returns true(1) on success, otherwise false(0)
|
||||||
|
*/
|
||||||
|
int libp2p_message_protobuf_allocate_and_encode(const struct Libp2pMessage* in, unsigned char **buffer, size_t* buffer_size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* turn a protobuf back into a message
|
* turn a protobuf back into a message
|
||||||
|
|
|
@ -43,6 +43,16 @@ void libp2p_record_free(struct Libp2pRecord* in);
|
||||||
*/
|
*/
|
||||||
int libp2p_record_protobuf_encode(const struct Libp2pRecord* in, unsigned char* buffer, size_t max_buffer_size, size_t* bytes_written);
|
int libp2p_record_protobuf_encode(const struct Libp2pRecord* in, unsigned char* buffer, size_t max_buffer_size, size_t* bytes_written);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a Libp2pRecord into protobuf format, allocating
|
||||||
|
* memory as needed
|
||||||
|
* @param in the Libp2pRecord to convert
|
||||||
|
* @param buffer where to store the protobuf
|
||||||
|
* @param buffer_size the size of the allocated buffer
|
||||||
|
* @returns true(1) on success, otherwise false(0)
|
||||||
|
*/
|
||||||
|
int libp2p_record_protobuf_allocate_and_encode(const struct Libp2pRecord* in, unsigned char **buffer, size_t *buffer_size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates an estimate of the buffer size needed to encode the struct
|
* Generates an estimate of the buffer size needed to encode the struct
|
||||||
* @param in the Libp2pRecord that you want to encode
|
* @param in the Libp2pRecord that you want to encode
|
||||||
|
|
|
@ -31,8 +31,8 @@ int libp2p_net_multistream_close(void* stream_context) {
|
||||||
* @returns the number of bytes written
|
* @returns the number of bytes written
|
||||||
*/
|
*/
|
||||||
int libp2p_net_multistream_write(void* stream_context, const unsigned char* data, size_t data_length) {
|
int libp2p_net_multistream_write(void* stream_context, const unsigned char* data, size_t data_length) {
|
||||||
struct SessionContext* secure_context = (struct SessionContext*)stream_context;
|
struct SessionContext* session_context = (struct SessionContext*)stream_context;
|
||||||
struct Stream* stream = secure_context->insecure_stream;
|
struct Stream* stream = session_context->insecure_stream;
|
||||||
int num_bytes = 0;
|
int num_bytes = 0;
|
||||||
|
|
||||||
if (data_length > 0) { // only do this is if there is something to send
|
if (data_length > 0) { // only do this is if there is something to send
|
||||||
|
@ -58,8 +58,8 @@ int libp2p_net_multistream_write(void* stream_context, const unsigned char* data
|
||||||
* @returns number of bytes received
|
* @returns number of bytes received
|
||||||
*/
|
*/
|
||||||
int libp2p_net_multistream_read(void* stream_context, unsigned char** results, size_t* results_size) {
|
int libp2p_net_multistream_read(void* stream_context, unsigned char** results, size_t* results_size) {
|
||||||
struct SessionContext* secure_context = (struct SessionContext*)stream_context;
|
struct SessionContext* session_context = (struct SessionContext*)stream_context;
|
||||||
struct Stream* stream = secure_context->insecure_stream;
|
struct Stream* stream = session_context->insecure_stream;
|
||||||
int bytes = 0;
|
int bytes = 0;
|
||||||
size_t buffer_size = 65535;
|
size_t buffer_size = 65535;
|
||||||
char buffer[buffer_size];
|
char buffer[buffer_size];
|
||||||
|
|
|
@ -128,12 +128,13 @@ struct PeerEntry* libp2p_peerstore_get_peer_entry(struct Peerstore* peerstore, c
|
||||||
struct Libp2pLinkedList* current = peerstore->head_entry;
|
struct Libp2pLinkedList* current = peerstore->head_entry;
|
||||||
while(current != NULL) {
|
while(current != NULL) {
|
||||||
struct Libp2pPeer* peer = ((struct PeerEntry*)current->item)->peer;
|
struct Libp2pPeer* peer = ((struct PeerEntry*)current->item)->peer;
|
||||||
if (peer->id_size != peer_id_size)
|
if (peer->id_size == peer_id_size) {
|
||||||
continue;
|
|
||||||
if (memcmp(peer_id, peer->id, peer->id_size) == 0) {
|
if (memcmp(peer_id, peer->id, peer->id_size) == 0) {
|
||||||
return (struct PeerEntry*)current->item;
|
return (struct PeerEntry*)current->item;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
current = current->next;
|
||||||
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ void libp2p_message_free(struct Libp2pMessage* in) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t libp2p_message_protobuf_encode_size(struct Libp2pMessage* in) {
|
size_t libp2p_message_protobuf_encode_size(const struct Libp2pMessage* in) {
|
||||||
// message type
|
// message type
|
||||||
size_t retVal = 11;
|
size_t retVal = 11;
|
||||||
// clusterlevelraw
|
// clusterlevelraw
|
||||||
|
@ -77,7 +77,31 @@ size_t libp2p_message_protobuf_encode_size(struct Libp2pMessage* in) {
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
int libp2p_message_protobuf_encode(struct Libp2pMessage* in, unsigned char* buffer, size_t max_buffer_size, size_t* bytes_written) {
|
/**
|
||||||
|
* Convert a Libp2pMessage into protobuf format,
|
||||||
|
* allocating memory as needed
|
||||||
|
* @param in the Libp2pMessage to convert
|
||||||
|
* @param buffer where to store the protobuf
|
||||||
|
* @param buffer_size the size of the buffer
|
||||||
|
* @returns true(1) on success, otherwise false(0)
|
||||||
|
*/
|
||||||
|
int libp2p_message_protobuf_allocate_and_encode(const struct Libp2pMessage* in, unsigned char **buffer, size_t *buffer_size) {
|
||||||
|
*buffer_size = libp2p_message_protobuf_encode_size(in);
|
||||||
|
*buffer = malloc(*buffer_size);
|
||||||
|
if (*buffer == NULL) {
|
||||||
|
*buffer_size = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int retVal = libp2p_message_protobuf_encode(in, *buffer, *buffer_size, buffer_size);
|
||||||
|
if (retVal == 0) {
|
||||||
|
free(*buffer);
|
||||||
|
*buffer = NULL;
|
||||||
|
*buffer_size = 0;
|
||||||
|
}
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
int libp2p_message_protobuf_encode(const struct Libp2pMessage* in, unsigned char* buffer, size_t max_buffer_size, size_t* bytes_written) {
|
||||||
// data & data_size
|
// data & data_size
|
||||||
size_t bytes_used = 0;
|
size_t bytes_used = 0;
|
||||||
*bytes_written = 0;
|
*bytes_written = 0;
|
||||||
|
|
|
@ -50,6 +50,29 @@ void libp2p_record_free(struct Libp2pRecord* in) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Protobuf a record, allocating memory
|
||||||
|
* @param in the record to protobuf
|
||||||
|
* @param buffer where to put the results
|
||||||
|
* @param buffer_size the size of the results
|
||||||
|
* @returns true(1) on success, false(0) otherwise
|
||||||
|
*/
|
||||||
|
int libp2p_record_protobuf_allocate_and_encode(const struct Libp2pRecord* in, unsigned char** buffer, size_t* buffer_size) {
|
||||||
|
*buffer_size = libp2p_record_protobuf_encode_size(in);
|
||||||
|
*buffer = malloc(*buffer_size);
|
||||||
|
if (*buffer == NULL) {
|
||||||
|
*buffer_size = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int retVal = libp2p_record_protobuf_encode(in, *buffer, *buffer_size, buffer_size);
|
||||||
|
if (retVal == 0) {
|
||||||
|
free(*buffer);
|
||||||
|
*buffer = NULL;
|
||||||
|
*buffer_size = 0;
|
||||||
|
}
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a Libp2pRecord into protobuf format
|
* Convert a Libp2pRecord into protobuf format
|
||||||
* @param in the Libp2pRecord to convert
|
* @param in the Libp2pRecord to convert
|
||||||
|
|
|
@ -285,7 +285,8 @@ int libp2p_routing_dht_handle_find_node(struct SessionContext* session, struct L
|
||||||
// look through peer store
|
// look through peer store
|
||||||
struct Libp2pPeer* peer = libp2p_peerstore_get_peer(peerstore, message->key, message->key_size);
|
struct Libp2pPeer* peer = libp2p_peerstore_get_peer(peerstore, message->key, message->key_size);
|
||||||
if (peer != NULL) {
|
if (peer != NULL) {
|
||||||
message->closer_peer_head = peer->addr_head;
|
message->provider_peer_head = libp2p_utils_linked_list_new();
|
||||||
|
message->provider_peer_head->item = peer;
|
||||||
if (!libp2p_routing_dht_protobuf_message(message, result_buffer, result_buffer_size)) {
|
if (!libp2p_routing_dht_protobuf_message(message, result_buffer, result_buffer_size)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue