2017-10-11 16:23:25 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "libp2p/net/protocol.h"
|
2017-10-23 23:03:38 +00:00
|
|
|
#include "libp2p/net/stream.h"
|
2017-11-06 18:36:11 +00:00
|
|
|
#include "libp2p/yamux/stream.h"
|
2017-10-23 23:03:38 +00:00
|
|
|
|
|
|
|
/***
|
|
|
|
* Declarations for the Yamux protocol
|
|
|
|
*/
|
2017-10-11 16:23:25 +00:00
|
|
|
|
2017-11-02 19:45:17 +00:00
|
|
|
static const int yamux_default_timeout = 10;
|
|
|
|
|
2017-11-06 18:36:11 +00:00
|
|
|
static const char YAMUX_CONTEXT = 'Y';
|
|
|
|
static const char YAMUX_CHANNEL_CONTEXT = 'C';
|
|
|
|
|
2017-11-02 19:45:17 +00:00
|
|
|
/***
|
|
|
|
* Context struct for Yamux
|
|
|
|
*/
|
|
|
|
struct YamuxContext {
|
2017-11-06 18:36:11 +00:00
|
|
|
char type;
|
2017-11-02 19:45:17 +00:00
|
|
|
struct Stream* stream;
|
|
|
|
struct yamux_session* session;
|
2017-11-06 12:27:03 +00:00
|
|
|
struct Libp2pVector* channels;
|
2017-11-02 19:45:17 +00:00
|
|
|
};
|
|
|
|
|
2017-11-06 18:36:11 +00:00
|
|
|
struct YamuxChannelContext {
|
|
|
|
char type;
|
|
|
|
struct YamuxContext* yamux_context;
|
2017-11-08 15:51:43 +00:00
|
|
|
// this stream
|
2017-11-06 21:38:55 +00:00
|
|
|
struct Stream* stream;
|
2017-11-08 15:51:43 +00:00
|
|
|
// the child protocol's stream
|
|
|
|
struct Stream* child_stream;
|
2017-11-06 21:38:55 +00:00
|
|
|
// the channel number
|
|
|
|
int channel;
|
|
|
|
// the window size for this channel
|
|
|
|
int window_size;
|
|
|
|
// the state of the connection
|
|
|
|
int state;
|
|
|
|
// whether or not the connection is closed
|
|
|
|
int closed;
|
2017-11-06 18:36:11 +00:00
|
|
|
};
|
|
|
|
|
2017-10-11 16:23:25 +00:00
|
|
|
/**
|
|
|
|
* Build a handler that can handle the yamux protocol
|
|
|
|
*/
|
2017-11-08 15:51:43 +00:00
|
|
|
struct Libp2pProtocolHandler* libp2p_yamux_build_protocol_handler();
|
2017-10-12 15:12:22 +00:00
|
|
|
/***
|
|
|
|
* Send the yamux protocol out the default stream
|
|
|
|
* NOTE: if we initiate the connection, we should expect the same back
|
2017-11-08 15:51:43 +00:00
|
|
|
* @param stream the stream
|
2017-10-12 15:12:22 +00:00
|
|
|
* @returns true(1) on success, false(0) otherwise
|
|
|
|
*/
|
2017-11-08 15:51:43 +00:00
|
|
|
int yamux_send_protocol(struct Stream* stream);
|
2017-10-12 17:37:40 +00:00
|
|
|
|
|
|
|
/***
|
|
|
|
* Check to see if the reply is the yamux protocol header we expect
|
|
|
|
* NOTE: if we initiate the connection, we should expect the same back
|
|
|
|
* @param context the SessionContext
|
|
|
|
* @returns true(1) on success, false(0) otherwise
|
|
|
|
*/
|
2017-11-06 21:38:55 +00:00
|
|
|
int yamux_receive_protocol(struct YamuxContext* context);
|
2017-10-23 23:03:38 +00:00
|
|
|
|
|
|
|
struct Stream* libp2p_yamux_stream_new(struct Stream* parent_stream);
|
2017-11-06 12:27:03 +00:00
|
|
|
|
2017-11-06 18:36:11 +00:00
|
|
|
void libp2p_yamux_stream_free(struct Stream* stream);
|
|
|
|
|
2017-11-06 12:27:03 +00:00
|
|
|
/****
|
|
|
|
* Add a stream "channel" to the yamux handler
|
|
|
|
* @param ctx the context
|
|
|
|
* @param stream the stream to add
|
|
|
|
* @returns true(1) on success, false(0) otherwise
|
|
|
|
*/
|
|
|
|
int libp2p_yamux_stream_add(struct YamuxContext* ctx, struct Stream* stream);
|
2017-11-06 18:36:11 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a stream that has a "YamuxChannelContext" related to this yamux protocol
|
|
|
|
* @param parent_stream the parent yamux stream
|
|
|
|
* @returns a new Stream that is a YamuxChannelContext
|
|
|
|
*/
|
|
|
|
struct Stream* libp2p_yamux_channel_new(struct Stream* parent_stream);
|
2017-11-06 21:38:55 +00:00
|
|
|
|
|
|
|
void libp2p_yamux_channel_free(struct YamuxChannelContext* ctx);
|