aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2017-01-29 18:43:35 +0100
committerChristian Grothoff <christian@grothoff.org>2017-01-29 18:43:35 +0100
commit81f9e9e971e615e9f1f18d1509168b56bb7360c0 (patch)
tree84bf2b1e3240ee9190bf1ea7f2dfca63c19dafe1
parentdc430a9d23f8fd76f700d6836d4f4748429d70cd (diff)
introduce buffering options on the route level
-rw-r--r--src/cadet/cadet_protocol.h7
-rw-r--r--src/cadet/gnunet-service-cadet-new_connection.c15
-rw-r--r--src/cadet/gnunet-service-cadet-new_connection.h4
-rw-r--r--src/cadet/gnunet-service-cadet-new_core.c10
-rw-r--r--src/cadet/gnunet-service-cadet-new_tunnels.c4
-rw-r--r--src/cadet/gnunet-service-cadet-new_tunnels.h2
-rw-r--r--src/cadet/gnunet-service-cadet_connection.c2
7 files changed, 41 insertions, 3 deletions
diff --git a/src/cadet/cadet_protocol.h b/src/cadet/cadet_protocol.h
index e2d6f9d0bf..d2426addbd 100644
--- a/src/cadet/cadet_protocol.h
+++ b/src/cadet/cadet_protocol.h
@@ -67,9 +67,12 @@ struct GNUNET_CADET_ConnectionCreateMessage
struct GNUNET_MessageHeader header;
/**
- * For alignment.
+ * Connection options in network byte order.
+ * #GNUNET_CADET_OPTION_DEFAULT for buffered;
+ * #GNUNET_CADET_OPTION_NOBUFFER for unbuffered.
+ * Other flags are ignored and should not be set at this level.
*/
- uint32_t reserved GNUNET_PACKED;
+ uint32_t options GNUNET_PACKED;
/**
* ID of the connection
diff --git a/src/cadet/gnunet-service-cadet-new_connection.c b/src/cadet/gnunet-service-cadet-new_connection.c
index fdc6de620a..13d4c4a0c7 100644
--- a/src/cadet/gnunet-service-cadet-new_connection.c
+++ b/src/cadet/gnunet-service-cadet-new_connection.c
@@ -146,6 +146,11 @@ struct CadetConnection
enum CadetConnectionState state;
/**
+ * Options for the route, control buffering.
+ */
+ enum GNUNET_CADET_ChannelOption options;
+
+ /**
* Offset of our @e destination in @e path.
*/
unsigned int off;
@@ -490,6 +495,7 @@ send_create (void *cls)
env = GNUNET_MQ_msg_extra (create_msg,
(1 + path_length) * sizeof (struct GNUNET_PeerIdentity),
GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE);
+ create_msg->options = htonl ((uint32_t) cc->options);
create_msg->cid = cc->cid;
pids = (struct GNUNET_PeerIdentity *) &create_msg[1];
pids[0] = my_full_id;
@@ -666,6 +672,7 @@ manage_first_hop_mq (void *cls,
*
* @param destination where to go
* @param path which path to take (may not be the full path)
+ * @param options options for the connection
* @param ct which tunnel uses this connection
* @param init_state initial state for the connection
* @param ready_cb function to call when ready to transmit
@@ -675,6 +682,7 @@ manage_first_hop_mq (void *cls,
static struct CadetConnection *
connection_create (struct CadetPeer *destination,
struct CadetPeerPath *path,
+ enum GNUNET_CADET_ChannelOption options,
struct CadetTConnection *ct,
const struct GNUNET_CADET_ConnectionTunnelIdentifier *cid,
enum CadetConnectionState init_state,
@@ -689,6 +697,7 @@ connection_create (struct CadetPeer *destination,
destination);
GNUNET_assert (UINT_MAX > off);
cc = GNUNET_new (struct CadetConnection);
+ cc->options = options;
cc->state = init_state;
cc->ct = ct;
cc->cid = *cid;
@@ -729,6 +738,7 @@ connection_create (struct CadetPeer *destination,
*
* @param destination where to go
* @param path which path to take (may not be the full path)
+ * @param options options for the connection
* @param ct which tunnel uses this connection
* @param ready_cb function to call when ready to transmit
* @param ready_cb_cls closure for @a cb
@@ -738,6 +748,7 @@ connection_create (struct CadetPeer *destination,
struct CadetConnection *
GCC_create_inbound (struct CadetPeer *destination,
struct CadetPeerPath *path,
+ enum GNUNET_CADET_ChannelOption options,
struct CadetTConnection *ct,
const struct GNUNET_CADET_ConnectionTunnelIdentifier *cid,
GCC_ReadyCallback ready_cb,
@@ -793,6 +804,7 @@ GCC_create_inbound (struct CadetPeer *destination,
return connection_create (destination,
path,
+ options,
ct,
cid,
CADET_CONNECTION_CREATE_RECEIVED,
@@ -807,6 +819,7 @@ GCC_create_inbound (struct CadetPeer *destination,
*
* @param destination where to go
* @param path which path to take (may not be the full path)
+ * @param options options for the connection
* @param ct tunnel that uses the connection
* @param ready_cb function to call when ready to transmit
* @param ready_cb_cls closure for @a cb
@@ -815,6 +828,7 @@ GCC_create_inbound (struct CadetPeer *destination,
struct CadetConnection *
GCC_create (struct CadetPeer *destination,
struct CadetPeerPath *path,
+ enum GNUNET_CADET_ChannelOption options,
struct CadetTConnection *ct,
GCC_ReadyCallback ready_cb,
void *ready_cb_cls)
@@ -826,6 +840,7 @@ GCC_create (struct CadetPeer *destination,
sizeof (cid));
return connection_create (destination,
path,
+ options,
ct,
&cid,
CADET_CONNECTION_NEW,
diff --git a/src/cadet/gnunet-service-cadet-new_connection.h b/src/cadet/gnunet-service-cadet-new_connection.h
index cea1e8024c..1302b0060a 100644
--- a/src/cadet/gnunet-service-cadet-new_connection.h
+++ b/src/cadet/gnunet-service-cadet-new_connection.h
@@ -75,6 +75,7 @@ GCC_destroy_without_tunnel (struct CadetConnection *cc);
*
* @param destination where to go
* @param path which path to take (may not be the full path)
+ * @param options options for the connection
* @param ct which tunnel uses this connection
* @param ready_cb function to call when ready to transmit
* @param ready_cb_cls closure for @a cb
@@ -83,6 +84,7 @@ GCC_destroy_without_tunnel (struct CadetConnection *cc);
struct CadetConnection *
GCC_create (struct CadetPeer *destination,
struct CadetPeerPath *path,
+ enum GNUNET_CADET_ChannelOption options,
struct CadetTConnection *ct,
GCC_ReadyCallback ready_cb,
void *ready_cb_cls);
@@ -95,6 +97,7 @@ GCC_create (struct CadetPeer *destination,
*
* @param destination where to go
* @param path which path to take (may not be the full path)
+ * @param options options for the connection
* @param ct which tunnel uses this connection
* @param ready_cb function to call when ready to transmit
* @param ready_cb_cls closure for @a cb
@@ -104,6 +107,7 @@ GCC_create (struct CadetPeer *destination,
struct CadetConnection *
GCC_create_inbound (struct CadetPeer *destination,
struct CadetPeerPath *path,
+ enum GNUNET_CADET_ChannelOption options,
struct CadetTConnection *ct,
const struct GNUNET_CADET_ConnectionTunnelIdentifier *cid,
GCC_ReadyCallback ready_cb,
diff --git a/src/cadet/gnunet-service-cadet-new_core.c b/src/cadet/gnunet-service-cadet-new_core.c
index 25ffcb3cee..75a94119ca 100644
--- a/src/cadet/gnunet-service-cadet-new_core.c
+++ b/src/cadet/gnunet-service-cadet-new_core.c
@@ -28,6 +28,7 @@
*
* TODO:
* - properly implement GLOBAL message buffer, instead of per-route buffers
+ * - do NOT use buffering if the route options say no buffer!
* - Optimization: given BROKEN messages, destroy paths (?)
*/
#include "platform.h"
@@ -128,6 +129,11 @@ struct CadetRoute
* Position of this route in the #route_heap.
*/
struct GNUNET_CONTAINER_HeapNode *hn;
+
+ /**
+ * Options for the route, control buffering.
+ */
+ enum GNUNET_CADET_ChannelOption options;
};
@@ -521,7 +527,9 @@ handle_connection_create (void *cls,
uint16_t size = ntohs (msg->header.size) - sizeof (*msg);
unsigned int path_length;
unsigned int off;
+ enum GNUNET_CADET_ChannelOption options;
+ options = (enum GNUNET_CADET_ChannelOption) ntohl (msg->options);
path_length = size / sizeof (struct GNUNET_PeerIdentity);
/* Initiator is at offset 0. */
for (off=1;off<path_length;off++)
@@ -585,6 +593,7 @@ handle_connection_create (void *cls,
GCT_add_inbound_connection (GCP_get_tunnel (origin,
GNUNET_YES),
&msg->cid,
+ (enum GNUNET_CADET_ChannelOption) ntohl (msg->options),
path))
{
/* Send back BROKEN: duplicate connection on the same path,
@@ -639,6 +648,7 @@ handle_connection_create (void *cls,
GNUNET_i2s (&pids[off + 1]),
off + 1);
route = GNUNET_new (struct CadetRoute);
+ route->options = options;
route->cid = msg->cid;
route->last_use = GNUNET_TIME_absolute_get ();
dir_init (&route->prev,
diff --git a/src/cadet/gnunet-service-cadet-new_tunnels.c b/src/cadet/gnunet-service-cadet-new_tunnels.c
index 3c0271c712..e41164220c 100644
--- a/src/cadet/gnunet-service-cadet-new_tunnels.c
+++ b/src/cadet/gnunet-service-cadet-new_tunnels.c
@@ -2444,6 +2444,7 @@ consider_path_cb (void *cls,
ct->t = t;
ct->cc = GCC_create (t->destination,
path,
+ GNUNET_CADET_OPTION_DEFAULT, /* FIXME: set based on what channels want/need! */
ct,
&connection_ready_cb,
ct);
@@ -2888,6 +2889,7 @@ GCT_create_tunnel (struct CadetPeer *destination)
*
* @param t a tunnel
* @param cid connection identifer to use for the connection
+ * @param options options for the connection
* @param path path to use for the connection
* @return #GNUNET_OK on success,
* #GNUNET_SYSERR on failure (duplicate connection)
@@ -2895,6 +2897,7 @@ GCT_create_tunnel (struct CadetPeer *destination)
int
GCT_add_inbound_connection (struct CadetTunnel *t,
const struct GNUNET_CADET_ConnectionTunnelIdentifier *cid,
+ enum GNUNET_CADET_ChannelOption options,
struct CadetPeerPath *path)
{
struct CadetTConnection *ct;
@@ -2904,6 +2907,7 @@ GCT_add_inbound_connection (struct CadetTunnel *t,
ct->t = t;
ct->cc = GCC_create_inbound (t->destination,
path,
+ options,
ct,
cid,
&connection_ready_cb,
diff --git a/src/cadet/gnunet-service-cadet-new_tunnels.h b/src/cadet/gnunet-service-cadet-new_tunnels.h
index d18abeb3c2..f8613d2360 100644
--- a/src/cadet/gnunet-service-cadet-new_tunnels.h
+++ b/src/cadet/gnunet-service-cadet-new_tunnels.h
@@ -119,6 +119,7 @@ GCT_destroy_tunnel_now (struct CadetTunnel *t);
*
* @param t a tunnel
* @param cid connection identifer to use for the connection
+ * @param options options for the connection
* @param path path to use for the connection
* @return #GNUNET_OK on success,
* #GNUNET_SYSERR on failure (duplicate connection)
@@ -126,6 +127,7 @@ GCT_destroy_tunnel_now (struct CadetTunnel *t);
int
GCT_add_inbound_connection (struct CadetTunnel *t,
const struct GNUNET_CADET_ConnectionTunnelIdentifier *cid,
+ enum GNUNET_CADET_ChannelOption options,
struct CadetPeerPath *path);
diff --git a/src/cadet/gnunet-service-cadet_connection.c b/src/cadet/gnunet-service-cadet_connection.c
index af27647b35..2d5087f817 100644
--- a/src/cadet/gnunet-service-cadet_connection.c
+++ b/src/cadet/gnunet-service-cadet_connection.c
@@ -3425,7 +3425,7 @@ GCC_send_create (struct CadetConnection *c)
msg = (struct GNUNET_CADET_ConnectionCreateMessage *) cbuf;
msg->header.size = htons (size);
msg->header.type = htons (GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE);
- msg->reserved = htonl (0);
+ msg->options = htonl (0);
msg->cid = *GCC_get_id (c);
peers = (struct GNUNET_PeerIdentity *) &msg[1];
for (int i = 0; i < c->path->length; i++)