Beginnings of dialers and connections

This commit is contained in:
John Jones 2017-02-13 13:26:41 -05:00
parent 7b218a620a
commit 81263fc1a2
12 changed files with 216 additions and 7 deletions

View file

@ -2,7 +2,10 @@
DEBUG = true
export DEBUG
OBJS = crypto/*.o crypto/encoding/*.o \
OBJS = \
conn/*.o \
crypto/*.o \
crypto/encoding/*.o \
thirdparty/mbedtls/*.o \
hashmap/hashmap.o \
net/*.o \
@ -14,7 +17,8 @@ OBJS = crypto/*.o crypto/encoding/*.o \
link:
ar rcs libp2p.a $(OBJS)
compile:
compile:
cd conn; make all;
cd crypto; make all;
cd thirdparty; make all;
cd hashmap; make all;
@ -32,6 +36,7 @@ rebuild: clean all
all: test
clean:
cd conn; make clean;
cd crypto; make clean;
cd hashmap; make clean;
cd net; make clean;

14
conn/Makefile Normal file
View file

@ -0,0 +1,14 @@
CC = gcc
CFLAGS = -O0 -I../include -I../../c-protobuf -I../../c-multihash/include -I../../c-multiaddr/include -g3
LFLAGS =
DEPS =
OBJS = dialer.o transport_dialer.o connection.o
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
all: $(OBJS)
clean:
rm -f *.o

15
conn/connection.c Normal file
View file

@ -0,0 +1,15 @@
#include <stdlib.h>
#include "libp2p/conn/connection.h"
struct Connection* libp2p_conn_connection_open(struct TransportDialer* transport_dialer, struct maddr* multiaddress) {
struct Connection* out = NULL;
if (transport_dialer != NULL) {
out = (struct Connection*)malloc(sizeof(struct Connection));
if (out != NULL) {
//TODO implement this
}
}
return out;
}

View file

@ -1,3 +1,58 @@
#include <stdlib.h>
/**
* Functions for handling the local dialer
*/
#include "libp2p/conn/dialer.h"
#include "libp2p/conn/connection.h"
#include "libp2p/conn/transport_dialer.h"
#include "libp2p/crypto/key.h"
#include "libp2p/utils/linked_list.h"
/**
* Create a Dialer with the specified local information
*/
struct Dialer* libp2p_conn_dialer_new(char* peer_id, struct PrivateKey* private_key) {
struct Dialer* dialer = (struct Dialer*)malloc(sizeof(struct Dialer));
if (dialer != NULL) {
dialer->peer_id = peer_id;
dialer->private_key = private_key;
dialer->fallback_dialer = NULL;
dialer->transport_dialers = NULL;
}
return dialer;
}
/**
* free resources from the Dialer
*/
void libp2p_conn_dialer_free(struct Dialer* in) {
if (in != NULL) {
free(in->peer_id);
libp2p_crypto_private_key_free(in->private_key);
if (in->transport_dialers != NULL) {
struct Libp2pLinkedList* current = in->transport_dialers;
while(current != NULL) {
libp2p_conn_transport_dialer_free((struct TransportDialer*)current->item);
current = current->next;
}
}
if (in->fallback_dialer != NULL)
libp2p_conn_transport_dialer_free((struct TransportDialer*)in->fallback_dialer);
}
return;
}
/**
* Retrieve a Connection struct from the dialer
* @param dialer the dialer to use
* @param muiltiaddress who to connect to
* @returns a Connection, or NULL
*/
struct Connection* libp2p_conn_dialer_get_connection(struct Dialer* dialer, struct maddr* multiaddress) {
struct Connection* conn = libp2p_conn_transport_dialer_get(dialer->transport_dialers, multiaddress);
if (conn == NULL) {
conn = libp2p_conn_connection_open(dialer->fallback_dialer, multiaddress);
}
return conn;
}

37
conn/transport_dialer.c Normal file
View file

@ -0,0 +1,37 @@
#include <stdlib.h>
#include "libp2p/conn/transport_dialer.h"
struct TransportDialer* libp2p_conn_transport_dialer_new(struct maddr* multiaddr) {
struct TransportDialer* out = (struct TransportDialer*)malloc(sizeof(struct TransportDialer));
if (out != NULL) {
out->multiaddr = (struct maddr*)malloc(sizeof(struct maddr));
if (out->multiaddr == NULL) {
free(out);
return NULL;
}
out->multiaddr->bsize[0] = multiaddr->bsize[0];
memcpy(out->multiaddr->bytes, multiaddr->bytes, 400);
memcpy(out->multiaddr->string, multiaddr->string, 800);
}
return out;
}
/**
* free resources from a TransportDialer struct
* @param in the struct to be freed
*/
void libp2p_conn_transport_dialer_free(struct TransportDialer* in) {
free(in);
}
/**
* Given a list of dialers, find the appropriate dialer for this multiaddress
* @param transport_dialers a list of dialers
* @param multiaddr the address
* @returns a connection, or NULL if no appropriate dialer was found
*/
struct Connection* libp2p_conn_transport_dialer_get(struct Libp2pLinkedList* transport_dialers, struct maddr* multiaddr) {
//TODO: implement this method
return NULL;
}

View file

@ -0,0 +1,29 @@
/**
* Implements an interface to connect and talk to different nodes.
* A Dialer will connect, and return a Connection structure
*/
#include "libp2p/conn/transport_dialer.h"
#include "multiaddr/multiaddr.h"
struct Connection {
int socket_handle;
/**
* Read from the stream
* @param socket_handle the socket to read from
* @param in what was read in NOTE: this allocates memory
* @param in_size the number of bytes read in
* @returns 0 on success, otherwise an error code
*/
int (*read)(int socket_handle, char** in, size_t* in_size);
/**
* Write to the stream
* @param socket_handle the socket to write to
* @param out the bytes to write to the stream
* @param out_size the number of bytes to write
* @returns 0 on success, otherwise an error code
*/
int (*write)(int socket_handle, char* out, size_t* out_size);
};
struct Connection* libp2p_conn_connection_open(struct TransportDialer* transport_dialer, struct maddr* multiaddress);

View file

@ -1,9 +1,11 @@
/***
* A local dialer. Uses MultiAddr to figure out the best way to
* connect to a client.
* connect to a client, then returns an open Connection that can be
* closed, read from and written to.
*/
#include "libp2p/crypto/key.h"
#include "multiaddr/multiaddr.h"
struct Dialer {
/**
@ -16,9 +18,27 @@ struct Dialer {
* A linked list of transport dialers. A transport dialer can be selected
* based on the MultiAddr being dialed. Most common: TCP and UDP
*/
struct TransportDialer* transport_dialers;
struct Libp2pLinkedList* transport_dialers;
//TODO: See dial.go, need to implement Protector
struct TransportDialer* fallback_dialer; // the default dialer
struct TransportDialer* fallback_dialer; // the default dialer. NOTE: this should not be in the list of transport_dialers
};
/**
* Create a Dialer with the specified local information
*/
struct Dialer* libp2p_conn_dialer_new(char* peer_id, struct PrivateKey* private_key);
/**
* free resources from the Dialer
*/
void libp2p_conn_dialer_free(struct Dialer* in);
/**
* Retrieve a Connection struct from the dialer
* @param dialer the dialer to use
* @param muiltiaddress who to connect to
* @returns a Connection, or NULL
*/
struct Connection* libp2p_conn_dialer_get_connection(struct Dialer* dialer, struct maddr* multiaddress);

View file

@ -0,0 +1,13 @@
#pragma once
#include "multiaddr/multiaddr.h"
#include "libp2p/utils/linked_list.h"
struct TransportDialer {
struct maddr* multiaddr;
};
struct TransportDialer* libp2p_conn_transport_dialer_new(struct maddr* multiaddr);
void libp2p_conn_transport_dialer_free(struct TransportDialer* in);
struct Connection* libp2p_conn_transport_dialer_get(struct Libp2pLinkedList* transport_dialers, struct maddr* multiaddr);

View file

@ -0,0 +1,6 @@
#pragma once
struct Libp2pLinkedList {
void* item;
void* next;
};

View file

@ -1,5 +1,5 @@
CC = gcc
CFLAGS = -O0 -I../include -I. -I../../c-multihash/include
CFLAGS = -O0 -I../include -I. -I../../c-multihash/include -I../../c-multiaddr/include
ifdef DEBUG
CFLAGS += -g3

12
test/test_conn.h Normal file
View file

@ -0,0 +1,12 @@
#include <stdlib.h>
#include "libp2p/conn/dialer.h"
int test_dialer_new() {
struct PrivateKey* private_key = NULL;
struct Dialer* dialer = libp2p_conn_dialer_new("ABC", private_key);
if (dialer == NULL)
return 0;
libp2p_conn_dialer_free(dialer);
return 1;
}

View file

@ -8,6 +8,7 @@
#include "test_secio.h"
#include "test_mbedtls.h"
#include "test_multistream.h"
#include "test_conn.h"
const char* names[] = {
"test_public_der_to_private_der",
@ -34,7 +35,8 @@ const char* names[] = {
"test_secio_handshake",
"test_multistream_connect",
"test_multistream_get_list",
"test_ephemeral_key_generate"
"test_ephemeral_key_generate",
"test_dialer_new"
};
int (*funcs[])(void) = {
@ -63,6 +65,7 @@ int (*funcs[])(void) = {
test_multistream_connect,
test_multistream_get_list,
test_ephemeral_key_generate,
test_dialer_new
};
int testit(const char* name, int (*func)(void)) {