Cleaned code around peerstore, providerstore, and networking
This commit is contained in:
parent
0a6b4b621c
commit
12f15c4231
12 changed files with 124 additions and 19 deletions
|
@ -53,6 +53,6 @@ int libp2p_net_multistream_negotiate(struct Stream* stream);
|
||||||
*/
|
*/
|
||||||
struct Libp2pMessage* libp2p_net_multistream_get_message(struct Stream* stream);
|
struct Libp2pMessage* libp2p_net_multistream_get_message(struct Stream* stream);
|
||||||
|
|
||||||
struct Stream* libp2p_net_multistream_stream_new(int socket_fd);
|
struct Stream* libp2p_net_multistream_stream_new(int socket_fd, const char* ip, int port);
|
||||||
|
|
||||||
void libp2p_net_multistream_stream_free(struct Stream* stream);
|
void libp2p_net_multistream_stream_free(struct Stream* stream);
|
||||||
|
|
|
@ -8,6 +8,7 @@ struct Stream {
|
||||||
* A generic socket descriptor
|
* A generic socket descriptor
|
||||||
*/
|
*/
|
||||||
void* socket_descriptor;
|
void* socket_descriptor;
|
||||||
|
struct MultiAddress *address;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads from the stream
|
* Reads from the stream
|
||||||
|
|
|
@ -51,3 +51,11 @@ void libp2p_logger_debug(const char* area, const char* format, ...);
|
||||||
*/
|
*/
|
||||||
void libp2p_logger_error(const char* area, const char* format, ...);
|
void libp2p_logger_error(const char* area, const char* format, ...);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log an info message to the console
|
||||||
|
* @param area the class it is coming from
|
||||||
|
* @param format the logging string
|
||||||
|
* @param ... params
|
||||||
|
*/
|
||||||
|
void libp2p_logger_info(const char* area, const char* format, ...);
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CFLAGS = -O0 -Wall -I../include -I../../c-protobuf
|
CFLAGS = -O0 -Wall -I../include -I../../c-protobuf -I../../c-multiaddr/include
|
||||||
|
|
||||||
ifdef DEBUG
|
ifdef DEBUG
|
||||||
CFLAGS += -g3
|
CFLAGS += -g3
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "libp2p/secio/secio.h"
|
#include "libp2p/secio/secio.h"
|
||||||
#include "varint.h"
|
#include "varint.h"
|
||||||
#include "libp2p/net/multistream.h"
|
#include "libp2p/net/multistream.h"
|
||||||
|
#include "multiaddr/multiaddr.h"
|
||||||
|
|
||||||
/***
|
/***
|
||||||
* An implementation of the libp2p multistream
|
* An implementation of the libp2p multistream
|
||||||
|
@ -131,7 +132,7 @@ struct Stream* libp2p_net_multistream_connect(const char* hostname, int port) {
|
||||||
// send the multistream handshake
|
// send the multistream handshake
|
||||||
char* protocol_buffer = "/multistream/1.0.0\n";
|
char* protocol_buffer = "/multistream/1.0.0\n";
|
||||||
|
|
||||||
stream = libp2p_net_multistream_stream_new(socket);
|
stream = libp2p_net_multistream_stream_new(socket, hostname, port);
|
||||||
if (stream == NULL)
|
if (stream == NULL)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
|
@ -221,11 +222,19 @@ void libp2p_net_multistream_stream_free(struct Stream* stream) {
|
||||||
if (stream != NULL) {
|
if (stream != NULL) {
|
||||||
if (stream->socket_descriptor != NULL)
|
if (stream->socket_descriptor != NULL)
|
||||||
free(stream->socket_descriptor);
|
free(stream->socket_descriptor);
|
||||||
|
if (stream->address != NULL)
|
||||||
|
multiaddress_free(stream->address);
|
||||||
free(stream);
|
free(stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Stream* libp2p_net_multistream_stream_new(int socket_fd) {
|
/**
|
||||||
|
* Create a new MultiStream structure
|
||||||
|
* @param socket_fd the file descriptor
|
||||||
|
* @param ip the IP address
|
||||||
|
* @param port the port
|
||||||
|
*/
|
||||||
|
struct Stream* libp2p_net_multistream_stream_new(int socket_fd, const char* ip, int port) {
|
||||||
struct Stream* out = (struct Stream*)malloc(sizeof(struct Stream));
|
struct Stream* out = (struct Stream*)malloc(sizeof(struct Stream));
|
||||||
if (out != NULL) {
|
if (out != NULL) {
|
||||||
out->socket_descriptor = malloc(sizeof(int));
|
out->socket_descriptor = malloc(sizeof(int));
|
||||||
|
@ -238,6 +247,9 @@ struct Stream* libp2p_net_multistream_stream_new(int socket_fd) {
|
||||||
out->close = libp2p_net_multistream_close;
|
out->close = libp2p_net_multistream_close;
|
||||||
out->read = libp2p_net_multistream_read;
|
out->read = libp2p_net_multistream_read;
|
||||||
out->write = libp2p_net_multistream_write;
|
out->write = libp2p_net_multistream_write;
|
||||||
|
char str[strlen(ip) + 50];
|
||||||
|
sprintf(str, "/ip4/%s/tcp/%d", ip, port);
|
||||||
|
out->address = multiaddress_new_from_string(str);
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
38
net/socket.c
38
net/socket.c
|
@ -9,12 +9,12 @@
|
||||||
|
|
||||||
#include "libp2p/net/p2pnet.h"
|
#include "libp2p/net/p2pnet.h"
|
||||||
|
|
||||||
/* associate an IP address with an port to a socket.
|
/**
|
||||||
* first param is the socket file description
|
* associate an IP address with an port to a socket.
|
||||||
* second is an array of four bytes IP address
|
* @param s the socket file descriptor
|
||||||
* in binary format, this function return 0 on sucess
|
* @param ip an array of four bytes IP address in binary format
|
||||||
* or -1 on error setting errno apropriated.
|
* @returns 0 on sucess or -1 on error setting errno apropriated.
|
||||||
*/
|
**/
|
||||||
int socket_bind4(int s, uint32_t ip, uint16_t port)
|
int socket_bind4(int s, uint32_t ip, uint16_t port)
|
||||||
{
|
{
|
||||||
struct sockaddr_in sa;
|
struct sockaddr_in sa;
|
||||||
|
@ -27,7 +27,12 @@ int socket_bind4(int s, uint32_t ip, uint16_t port)
|
||||||
return bind(s, (struct sockaddr *) &sa, sizeof sa);
|
return bind(s, (struct sockaddr *) &sa, sizeof sa);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Same as socket_bind4(), but set SO_REUSEADDR before
|
/**
|
||||||
|
* Same as socket_bind4(), but set SO_REUSEADDR before
|
||||||
|
* @param s the socket file descriptor
|
||||||
|
* @param ip the ip address to use
|
||||||
|
* @param port the port to use
|
||||||
|
* @returns something...
|
||||||
*/
|
*/
|
||||||
int socket_bind4_reuse(int s, uint32_t ip, uint16_t port)
|
int socket_bind4_reuse(int s, uint32_t ip, uint16_t port)
|
||||||
{
|
{
|
||||||
|
@ -54,16 +59,24 @@ int socket_accept4(int s, uint32_t *ip, uint16_t *port)
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* retrieve local ip and port information from a socket.
|
/**
|
||||||
|
* retrieve local ip and port information from a socket.
|
||||||
|
* @param s the file descriptor
|
||||||
|
* @param ip the IP address
|
||||||
|
* @param port the port
|
||||||
|
* @returns 0 on success, -1 on error
|
||||||
*/
|
*/
|
||||||
int socket_local4(int s, uint32_t *ip, uint16_t *port)
|
int socket_local4(int s, uint32_t *ip, uint16_t *port)
|
||||||
{
|
{
|
||||||
struct sockaddr_in sa;
|
struct sockaddr_in sa;
|
||||||
socklen_t dummy = sizeof sa;
|
socklen_t dummy = sizeof sa;
|
||||||
|
|
||||||
if (getsockname(s, (struct sockaddr *) &sa, &dummy) == -1) return -1;
|
if (getsockname(s, (struct sockaddr *) &sa, &dummy) == -1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
*ip = sa.sin_addr.s_addr;
|
*ip = sa.sin_addr.s_addr;
|
||||||
*port = ntohs(sa.sin_port);
|
*port = ntohs(sa.sin_port);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,7 +99,12 @@ int socket_connect4(int s, uint32_t ip, uint16_t port)
|
||||||
return connect(s, (struct sockaddr *) &sa, sizeof sa);
|
return connect(s, (struct sockaddr *) &sa, sizeof sa);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* bind and listen to a socket.
|
/**
|
||||||
|
* bind and listen to a socket.
|
||||||
|
* @param s socket file descriptor
|
||||||
|
* @param localip the ip address
|
||||||
|
* @param localport the port
|
||||||
|
* @returns the socket file descriptor
|
||||||
*/
|
*/
|
||||||
int socket_listen(int s, uint32_t *localip, uint16_t *localport)
|
int socket_listen(int s, uint32_t *localip, uint16_t *localport)
|
||||||
{
|
{
|
||||||
|
|
10
net/tcp.c
10
net/tcp.c
|
@ -3,13 +3,17 @@
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include "libp2p/net/p2pnet.h"
|
#include "libp2p/net/p2pnet.h"
|
||||||
|
|
||||||
/* Create a TCP socket.
|
/**
|
||||||
|
* Methods for tcp sockets
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a TCP socket.
|
||||||
|
* @returns the socket descriptor returned by socket()
|
||||||
*/
|
*/
|
||||||
int socket_tcp4(void)
|
int socket_tcp4(void)
|
||||||
{
|
{
|
||||||
int s;
|
int s;
|
||||||
|
|
||||||
s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
|
s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||||
if (s == -1) return -1;
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "libp2p/peer/peerstore.h"
|
#include "libp2p/peer/peerstore.h"
|
||||||
|
#include "libp2p/utils/logger.h"
|
||||||
|
|
||||||
struct PeerEntry* libp2p_peer_entry_new() {
|
struct PeerEntry* libp2p_peer_entry_new() {
|
||||||
struct PeerEntry* out = (struct PeerEntry*)malloc(sizeof(struct PeerEntry));
|
struct PeerEntry* out = (struct PeerEntry*)malloc(sizeof(struct PeerEntry));
|
||||||
|
@ -95,6 +96,11 @@ int libp2p_peerstore_add_peer_entry(struct Peerstore* peerstore, struct PeerEntr
|
||||||
* @returns true(1) on success, otherwise false
|
* @returns true(1) on success, otherwise false
|
||||||
*/
|
*/
|
||||||
int libp2p_peerstore_add_peer(struct Peerstore* peerstore, struct Libp2pPeer* peer) {
|
int libp2p_peerstore_add_peer(struct Peerstore* peerstore, struct Libp2pPeer* peer) {
|
||||||
|
char peer_id[peer->id_size + 1];
|
||||||
|
memcpy(peer_id, peer->id, peer->id_size);
|
||||||
|
peer_id[peer->id_size] = 0;
|
||||||
|
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);
|
||||||
struct PeerEntry* peer_entry = libp2p_peer_entry_new();
|
struct PeerEntry* peer_entry = libp2p_peer_entry_new();
|
||||||
if (peer_entry == NULL) {
|
if (peer_entry == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "libp2p/utils/vector.h"
|
#include "libp2p/utils/vector.h"
|
||||||
|
#include "libp2p/utils/logger.h"
|
||||||
|
|
||||||
struct ProviderEntry {
|
struct ProviderEntry {
|
||||||
unsigned char* hash;
|
unsigned char* hash;
|
||||||
|
@ -43,6 +44,13 @@ void libp2p_providerstore_free(struct ProviderStore* in) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int libp2p_providerstore_add(struct ProviderStore* store, unsigned char* hash, int hash_size, unsigned char* peer_id, int peer_id_size) {
|
int libp2p_providerstore_add(struct ProviderStore* store, unsigned char* hash, int hash_size, unsigned char* peer_id, int peer_id_size) {
|
||||||
|
char hash_str[hash_size + 1];
|
||||||
|
memcpy(hash_str, hash, hash_size);
|
||||||
|
hash_str[hash_size] = 0;
|
||||||
|
char peer_str[peer_id_size + 1];
|
||||||
|
memcpy(peer_str, peer_id, peer_id_size);
|
||||||
|
peer_str[peer_id_size] = 0;
|
||||||
|
libp2p_logger_debug("providerstore", "Adding hash %s to providerstore. It can be retrieved from %s", hash_str, peer_str);
|
||||||
struct ProviderEntry* entry = (struct ProviderEntry*)malloc(sizeof(struct ProviderEntry));
|
struct ProviderEntry* entry = (struct ProviderEntry*)malloc(sizeof(struct ProviderEntry));
|
||||||
entry->hash = malloc(hash_size);
|
entry->hash = malloc(hash_size);
|
||||||
memcpy(entry->hash, hash, hash_size);
|
memcpy(entry->hash, hash, hash_size);
|
||||||
|
|
|
@ -107,6 +107,25 @@ int libp2p_routing_dht_handle_get_providers(struct SessionContext* session, stru
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* helper method to get ip multiaddress from peer's linked list
|
||||||
|
* @param head linked list of multiaddresses
|
||||||
|
* @returns the IP multiaddress in the list, or NULL if none found
|
||||||
|
*/
|
||||||
|
struct MultiAddress* libp2p_routing_dht_find_peer_ip_multiaddress(struct Libp2pLinkedList* head) {
|
||||||
|
struct MultiAddress* out = NULL;
|
||||||
|
struct Libp2pLinkedList* current = head;
|
||||||
|
while (current != NULL) {
|
||||||
|
out = (struct MultiAddress*)current->item;
|
||||||
|
if (multiaddress_is_ip(out))
|
||||||
|
break;
|
||||||
|
current = current->next;
|
||||||
|
}
|
||||||
|
if (current == NULL)
|
||||||
|
out = NULL;
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
/***
|
/***
|
||||||
* Remote peer has announced that he can provide a key
|
* Remote peer has announced that he can provide a key
|
||||||
* @param session session context
|
* @param session session context
|
||||||
|
@ -130,12 +149,28 @@ int libp2p_routing_dht_handle_add_provider(struct SessionContext* session, struc
|
||||||
&& message->key != NULL && message->key_size > 0)
|
&& message->key != NULL && message->key_size > 0)
|
||||||
*/
|
*/
|
||||||
struct Libp2pLinkedList* current = message->provider_peer_head;
|
struct Libp2pLinkedList* current = message->provider_peer_head;
|
||||||
while(current != NULL) {
|
// there should only be 1 when adding a provider
|
||||||
|
if (current != NULL) {
|
||||||
struct Libp2pPeer* peer = (struct Libp2pPeer*)current->item;
|
struct Libp2pPeer* peer = (struct Libp2pPeer*)current->item;
|
||||||
|
struct MultiAddress *peer_ma = libp2p_routing_dht_find_peer_ip_multiaddress(peer->addr_head);
|
||||||
|
// add what we know to be the ip for this peer
|
||||||
|
char *ip;
|
||||||
|
char new_string[255];
|
||||||
|
multiaddress_get_ip_address(session->default_stream->address, &ip);
|
||||||
|
int port = multiaddress_get_ip_port(peer_ma);
|
||||||
|
sprintf(new_string, "/ip4/%s/tcp/%d", ip, port);
|
||||||
|
struct MultiAddress* new_ma = multiaddress_new_from_string(new_string);
|
||||||
|
// set it as the first in the list
|
||||||
|
struct Libp2pLinkedList* new_head = libp2p_utils_linked_list_new();
|
||||||
|
new_head->item = new_ma;
|
||||||
|
new_head->next = peer->addr_head;
|
||||||
|
peer->addr_head = new_head;
|
||||||
|
// now add the peer to the peerstore
|
||||||
if (!libp2p_peerstore_add_peer(peerstore, peer))
|
if (!libp2p_peerstore_add_peer(peerstore, peer))
|
||||||
goto exit;
|
goto exit;
|
||||||
if (!libp2p_providerstore_add(providerstore, message->key, message->key_size, peer->id, peer->id_size))
|
if (!libp2p_providerstore_add(providerstore, message->key, message->key_size, peer->id, peer->id_size))
|
||||||
goto exit;
|
goto exit;
|
||||||
|
current = current->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
*result_buffer_size = libp2p_message_protobuf_encode_size(message);
|
*result_buffer_size = libp2p_message_protobuf_encode_size(message);
|
||||||
|
|
|
@ -919,7 +919,7 @@ int libp2p_secio_handshake(struct SessionContext* local_session, struct RsaPriva
|
||||||
}
|
}
|
||||||
|
|
||||||
// set up the secure stream in the struct
|
// set up the secure stream in the struct
|
||||||
local_session->secure_stream = libp2p_net_multistream_stream_new(*((int*)local_session->insecure_stream->socket_descriptor));
|
local_session->secure_stream = local_session->insecure_stream;
|
||||||
local_session->secure_stream->read = libp2p_secio_encrypted_read;
|
local_session->secure_stream->read = libp2p_secio_encrypted_read;
|
||||||
local_session->secure_stream->write = libp2p_secio_encrypted_write;
|
local_session->secure_stream->write = libp2p_secio_encrypted_write;
|
||||||
// set secure as default
|
// set secure as default
|
||||||
|
|
|
@ -119,3 +119,16 @@ void libp2p_logger_error(const char* area, const char* format, ...) {
|
||||||
libp2p_logger_vlog(area, LOGLEVEL_ERROR, format, argptr);
|
libp2p_logger_vlog(area, LOGLEVEL_ERROR, format, argptr);
|
||||||
va_end(argptr);
|
va_end(argptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log an info message to the console
|
||||||
|
* @param area the class it is coming from
|
||||||
|
* @param format the logging string
|
||||||
|
* @param ... params
|
||||||
|
*/
|
||||||
|
void libp2p_logger_info(const char* area, const char* format, ...) {
|
||||||
|
va_list argptr;
|
||||||
|
va_start(argptr, format);
|
||||||
|
libp2p_logger_vlog(area, LOGLEVEL_INFO, format, argptr);
|
||||||
|
va_end(argptr);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue