2017-02-02 19:10:12 +00:00
|
|
|
#pragma once
|
|
|
|
|
2017-02-23 20:16:04 +00:00
|
|
|
#include "libp2p/net/stream.h"
|
2017-07-13 14:01:50 +00:00
|
|
|
#include "libp2p/conn/session.h"
|
2017-02-23 20:16:04 +00:00
|
|
|
|
2017-02-02 19:10:12 +00:00
|
|
|
/***
|
|
|
|
* An implementation of the libp2p multistream
|
2017-02-23 20:16:04 +00:00
|
|
|
*
|
|
|
|
* NOTE: This is a severe twist on (break from?) what is multistream. In the GO code,
|
|
|
|
* multistream does the initial connection, and has a list of protocols that
|
|
|
|
* do the work. Here, we've gotten rid of the protocols for now, in order to
|
|
|
|
* get things working. We're passing around DHT messages for now.
|
|
|
|
*
|
|
|
|
* So in short, much of this will change. But for now, think of it as a Proof of Concept.
|
2017-02-02 19:10:12 +00:00
|
|
|
*/
|
|
|
|
|
2017-08-31 21:40:35 +00:00
|
|
|
|
2017-09-04 16:01:17 +00:00
|
|
|
struct MultistreamContext {
|
|
|
|
struct Libp2pVector* handlers;
|
|
|
|
};
|
|
|
|
|
2017-08-31 21:40:35 +00:00
|
|
|
/***
|
|
|
|
* The handler to handle calls to the protocol
|
|
|
|
* @param stream_context the context
|
|
|
|
* @returns the protocol handler
|
|
|
|
*/
|
2017-09-04 16:01:17 +00:00
|
|
|
struct Libp2pProtocolHandler* libp2p_net_multistream_build_protocol_handler(void* handler_vector);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sends the protocol header to the remote
|
|
|
|
* @param context the context
|
|
|
|
* @returns true(1) on success, otherwise false(0)
|
|
|
|
*/
|
|
|
|
int libp2p_net_multistream_send_protocol(struct SessionContext *context);
|
|
|
|
|
2017-08-31 21:40:35 +00:00
|
|
|
|
2017-02-02 19:10:12 +00:00
|
|
|
/**
|
2017-02-23 20:16:04 +00:00
|
|
|
* Read from a multistream socket
|
2017-02-02 19:10:12 +00:00
|
|
|
* @param socket_fd the socket file descriptor
|
|
|
|
* @param data the data to send
|
|
|
|
* @param data_length the length of the data
|
2017-04-17 19:03:27 +00:00
|
|
|
* @param timeout_secs number of seconds before read gives up. Will return 0 data length.
|
2017-02-02 19:10:12 +00:00
|
|
|
* @returns the number of bytes written
|
|
|
|
*/
|
2017-04-17 19:03:27 +00:00
|
|
|
int libp2p_net_multistream_read(void* stream_context, unsigned char** data, size_t* data_length, int timeout_secs);
|
2017-02-02 19:10:12 +00:00
|
|
|
/**
|
2017-02-23 20:16:04 +00:00
|
|
|
* Write to an open multistream host
|
2017-02-02 19:10:12 +00:00
|
|
|
* @param socket_fd the socket file descriptor
|
|
|
|
* @param results where to put the results. NOTE: this memory is allocated
|
|
|
|
* @param results_size the size of the results in bytes
|
|
|
|
* @returns true(1) on success, otherwise false(0)
|
|
|
|
*/
|
2017-03-09 15:00:45 +00:00
|
|
|
int libp2p_net_multistream_write(void* stream_context, const unsigned char* data, size_t data_size);
|
2017-02-02 19:10:12 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Connect to a multistream host, and this includes the multistream handshaking.
|
|
|
|
* @param hostname the host
|
|
|
|
* @param port the port
|
2017-07-31 11:42:42 +00:00
|
|
|
* @returns the Stream struct, or NULL on error
|
2017-02-02 19:10:12 +00:00
|
|
|
*/
|
2017-02-23 20:16:04 +00:00
|
|
|
struct Stream* libp2p_net_multistream_connect(const char* hostname, int port);
|
2017-02-23 16:15:48 +00:00
|
|
|
|
2017-08-30 16:09:28 +00:00
|
|
|
/**
|
|
|
|
* Connect to a multistream host, and this includes the multistream handshaking.
|
|
|
|
* @param hostname the host
|
|
|
|
* @param port the port
|
|
|
|
* @param timeout_secs number of secs before timeout
|
|
|
|
* @returns the socket file descriptor of the connection, or -1 on error
|
|
|
|
*/
|
|
|
|
struct Stream* libp2p_net_multistream_connect_with_timeout(const char* hostname, int port, int timeout_secs);
|
|
|
|
|
2017-02-23 16:15:48 +00:00
|
|
|
/**
|
|
|
|
* Negotiate the multistream protocol by sending and receiving the protocol id. This is a server side function.
|
|
|
|
* Servers should send the protocol ID, and then expect it back.
|
2017-07-17 18:04:43 +00:00
|
|
|
* NOTE: the SessionContext should already contain the connected stream. If not, use
|
|
|
|
* libp2p_net_multistream_connect instead of this method.
|
|
|
|
*
|
2017-07-13 14:01:50 +00:00
|
|
|
* @param session the struct Session, which contains all the context info
|
2017-02-23 20:16:04 +00:00
|
|
|
* @returns true(1) on success, or false(0)
|
2017-02-23 16:15:48 +00:00
|
|
|
*/
|
2017-07-13 14:01:50 +00:00
|
|
|
int libp2p_net_multistream_negotiate(struct SessionContext* session);
|
2017-02-23 16:15:48 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Expect to read a message, and follow its instructions
|
|
|
|
* @param fd the socket file descriptor
|
|
|
|
* @returns true(1) on success, false(0) if not
|
|
|
|
*/
|
2017-08-30 16:09:28 +00:00
|
|
|
struct KademliaMessage* libp2p_net_multistream_get_message(struct Stream* stream);
|
2017-02-23 16:15:48 +00:00
|
|
|
|
2017-04-04 01:54:41 +00:00
|
|
|
struct Stream* libp2p_net_multistream_stream_new(int socket_fd, const char* ip, int port);
|
2017-02-23 16:15:48 +00:00
|
|
|
|
2017-02-23 20:16:04 +00:00
|
|
|
void libp2p_net_multistream_stream_free(struct Stream* stream);
|