From 7b4c31bf6dff9d39f9af4851b74f5bf2545b5cec Mon Sep 17 00:00:00 2001 From: Bart Polot Date: Mon, 23 Jul 2012 17:35:55 +0000 Subject: [PATCH] - message format for flow control info --- src/mesh/gnunet-service-mesh.c | 27 ++++++++++++++----- src/mesh/mesh_protocol.h | 48 +++++++++++----------------------- 2 files changed, 36 insertions(+), 39 deletions(-) diff --git a/src/mesh/gnunet-service-mesh.c b/src/mesh/gnunet-service-mesh.c index 932fb3125..069893f13 100644 --- a/src/mesh/gnunet-service-mesh.c +++ b/src/mesh/gnunet-service-mesh.c @@ -313,16 +313,16 @@ struct MeshTunnel int speed_min; /** - * Is buffering allowed in the tunnel? + * Is the tunnel bufferless (minimum latency)? */ - int buffering; + int nobuffer; - /** + /** * Flag to signal the destruction of the tunnel. * If this is set GNUNET_YES the tunnel will be destroyed * when the queue is empty. */ - int destroy; + int destroy; /** * Last time the tunnel was used @@ -3265,6 +3265,7 @@ send_core_path_create (void *cls, size_t size, void *buf) struct MeshTunnel *t = info->t; struct MeshPeerPath *p = info->path; size_t size_needed; + uint32_t opt; int i; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "CREATE PATH sending...\n"); @@ -3282,6 +3283,12 @@ send_core_path_create (void *cls, size_t size, void *buf) msg->header.type = htons (GNUNET_MESSAGE_TYPE_MESH_PATH_CREATE); msg->tid = ntohl (t->id.tid); + if (GNUNET_YES == t->speed_min) + opt = MESH_TUNNEL_OPT_SPEED_MIN; + if (GNUNET_YES == t->nobuffer) + opt |= MESH_TUNNEL_OPT_NOBUFFER; + msg->opt = htonl(opt); + peer_ptr = (struct GNUNET_PeerIdentity *) &msg[1]; for (i = 0; i < p->length; i++) { @@ -3655,8 +3662,15 @@ handle_mesh_path_create (void *cls, const struct GNUNET_PeerIdentity *peer, t = tunnel_get (pi, tid); if (NULL == t) // FIXME only for INCOMING tunnels? { + uint32_t opt; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, " Creating tunnel\n"); t = tunnel_new (GNUNET_PEER_intern (pi), tid, NULL, 0); + opt = ntohl (msg->opt); + t->speed_min = (0 != (opt & MESH_TUNNEL_OPT_SPEED_MIN)) ? + GNUNET_YES : GNUNET_NO; + t->nobuffer = (0 != (opt & MESH_TUNNEL_OPT_NOBUFFER)) ? + GNUNET_YES : GNUNET_NO;; while (NULL != tunnel_get_incoming (next_local_tid)) next_local_tid = (next_local_tid + 1) | GNUNET_MESH_LOCAL_TUNNEL_ID_SERV; @@ -5191,14 +5205,15 @@ handle_local_tunnel_buffer (void *cls, struct GNUNET_SERVER_Client *client, switch (ntohs(message->type)) { case GNUNET_MESSAGE_TYPE_MESH_LOCAL_TUNNEL_BUFFER: - t->buffering = GNUNET_YES; + t->nobuffer = GNUNET_NO; break; case GNUNET_MESSAGE_TYPE_MESH_LOCAL_TUNNEL_NOBUFFER: - t->buffering = GNUNET_NO; + t->nobuffer = GNUNET_YES; break; default: GNUNET_break (0); } + GNUNET_SERVER_receive_done (client, GNUNET_OK); } diff --git a/src/mesh/mesh_protocol.h b/src/mesh/mesh_protocol.h index 21f64d3eb..37f2ffb72 100644 --- a/src/mesh/mesh_protocol.h +++ b/src/mesh/mesh_protocol.h @@ -35,6 +35,10 @@ extern "C" #endif #endif +#define MESH_TUNNEL_OPT_SPEED_MIN 0x1 +#define MESH_TUNNEL_OPT_NOBUFFER 0x2 + + /******************************************************************************/ /******************** MESH NETWORK MESSAGES **************************/ /******************************************************************************/ @@ -47,7 +51,7 @@ GNUNET_NETWORK_STRUCT_BEGIN struct GNUNET_MESH_ManipulatePath { /** - * Type: GNUNET_MESSAGE_TYPE_MESH_PATH_[CREATE|CHANGE|ADD|DEL] + * Type: GNUNET_MESSAGE_TYPE_MESH_PATH_[CREATE|CHANGE|ADD|DESTROY] * * Size: sizeof(struct GNUNET_MESH_ManipulatePath) + * path_length * sizeof (struct GNUNET_PeerIdentity) @@ -60,6 +64,16 @@ struct GNUNET_MESH_ManipulatePath */ uint32_t tid GNUNET_PACKED; + /** + * Tunnel options (MESH_TUNNEL_OPT_*). + */ + uint32_t opt GNUNET_PACKED; + + /** + * 64 bit alignment padding. + */ + uint32_t reserved GNUNET_PACKED; + /** * path_length structs defining the *whole* path from the origin [0] to the * final destination [path_length-1]. @@ -292,38 +306,6 @@ struct GNUNET_MESH_TunnelDestroy }; -/** - * Message for mesh flow control - */ -struct GNUNET_MESH_SpeedNotify -{ - /** - * Type: GNUNET_MESSAGE_TYPE_DATA_SPEED_NOTIFY - */ - struct GNUNET_MessageHeader header; - - /** - * TID of the tunnel - */ - uint32_t tid GNUNET_PACKED; - - /** - * OID of the tunnel - */ - struct GNUNET_PeerIdentity oid; - - /** - * Is the speed limited by the slowest peer?. - */ - int16_t speed_min; - - /** - * Is the buffering allowed?. - */ - int16_t buffering; - -}; - GNUNET_NETWORK_STRUCT_END #if 0 /* keep Emacsens' auto-indent happy */ -- 2.25.1