X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fmesh%2Fgnunet-service-mesh_tunnel.c;h=231eeabebb97d1a2941b24bd6946ba7c020184d4;hb=1ef7f26b7579ae2a6256751a3f5ebfbf60afbb2f;hp=105317501f0a5fa3519c449d941c42e69392bbe5;hpb=a85261acba2c59241458bff597db815de85fa771;p=oweals%2Fgnunet.git diff --git a/src/mesh/gnunet-service-mesh_tunnel.c b/src/mesh/gnunet-service-mesh_tunnel.c index 105317501..231eeabeb 100644 --- a/src/mesh/gnunet-service-mesh_tunnel.c +++ b/src/mesh/gnunet-service-mesh_tunnel.c @@ -33,6 +33,9 @@ #define LOG(level, ...) GNUNET_log_from(level,"mesh-tun",__VA_ARGS__) +#define START_FUNCTION LOG(GNUNET_ERROR_TYPE_DEBUG, "%s start\n", __FUNCTION__) +#define END_FUNCTION LOG(GNUNET_ERROR_TYPE_DEBUG, "%s end\n", __FUNCTION__) + /******************************************************************************/ /******************************** STRUCTS **********************************/ @@ -371,6 +374,8 @@ handle_ch_create (struct MeshTunnel3 *t, const struct GNUNET_MESH_ChannelCreate *msg, int fwd) { + ; + struct MeshTChannel *tch; struct MeshChannel *ch; size_t size; @@ -392,12 +397,14 @@ handle_ch_create (struct MeshTunnel3 *t, } else { - ch = GMCH_handle_create (msg, fwd); + ch = GMCH_handle_create (t, msg, fwd); } tch = GNUNET_new (struct MeshTChannel); tch->ch = ch; GNUNET_CONTAINER_DLL_insert (t->channel_head, t->channel_tail, tch); + + ; } void @@ -467,7 +474,7 @@ handle_ch_destroy (struct MeshTunnel3 *t, * @param fwd Is this message fwd? */ static void -handle_GMT_decrypted (struct MeshTunnel3 *t, +handle_decrypted (struct MeshTunnel3 *t, const struct GNUNET_MessageHeader *msgh, int fwd) { @@ -525,7 +532,7 @@ handle_GMT_decrypted (struct MeshTunnel3 *t, * for every message. * * @param t Tunnel this message came on. - * @param msgh Encrypted message. + * @param msg Encrypted message. * @param fwd Is this message fwd? */ void @@ -544,7 +551,7 @@ GMT_handle_encrypted (struct MeshTunnel3 *t, while (off < payload_size) { msgh = (struct GNUNET_MessageHeader *) &cbuf[off]; - handle_GMT_decrypted (t, msgh, fwd); + handle_decrypted (t, msgh, fwd); off += ntohs (msgh->size); } } @@ -593,11 +600,12 @@ GMT_send_queued_data (struct MeshTunnel3 *t, int fwd) LOG (GNUNET_ERROR_TYPE_DEBUG, "GMT_send_queued_data on tunnel %s\n", - GMP_2s (t->peer)); + GMT_2s (t)); room = GMT_get_buffer (t, fwd); LOG (GNUNET_ERROR_TYPE_DEBUG, " buffer space: %u\n", room); for (tq = t->tq_head; NULL != tq && room > 0; tq = next) { + LOG (GNUNET_ERROR_TYPE_DEBUG, " data on channel %s\n", GMCH_2s (tq->ch)); next = tq->next; room--; GNUNET_CONTAINER_DLL_remove (t->tq_head, t->tq_tail, tq); @@ -606,6 +614,9 @@ GMT_send_queued_data (struct MeshTunnel3 *t, int fwd) GNUNET_free (tq); } + LOG (GNUNET_ERROR_TYPE_DEBUG, + "GMT_send_queued_data end\n", + GMP_2s (t->peer)); } @@ -620,6 +631,7 @@ void GMT_init (const struct GNUNET_CONFIGURATION_Handle *c, const struct GNUNET_CRYPTO_EddsaPrivateKey *key) { + LOG (GNUNET_ERROR_TYPE_DEBUG, "init\n"); if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number (c, "MESH", "DEFAULT_TTL", &default_ttl)) @@ -638,7 +650,6 @@ GMT_init (const struct GNUNET_CONFIGURATION_Handle *c, void GMT_shutdown (void) { - GNUNET_PEER_change_rc (myid, -1); } @@ -973,7 +984,7 @@ GMT_count_channels (struct MeshTunnel3 *t) for (count = 0, iter = t->channel_head; NULL != iter; - iter = iter->next, count++); + iter = iter->next, count++) /* skip */; return count; } @@ -997,10 +1008,13 @@ GMT_get_state (struct MeshTunnel3 *t) /** * Get the total buffer space for a tunnel. * + * If terminal, use the biggest channel buffer (or 64) if no channel exists. + * If not terminal, use the sum of all connection buffers. + * * @param t Tunnel. * @param fwd Is this for FWD traffic? * - * @return Buffer space offered by all connections in the tunnel. + * @return Buffer space offered by all entities (c/ch) in the tunnel. */ unsigned int GMT_get_buffer (struct MeshTunnel3 *t, int fwd) @@ -1019,7 +1033,7 @@ GMT_get_buffer (struct MeshTunnel3 *t, int fwd) if (NULL == t->channel_head) { - /* Probably getting buffer for a channel create. */ + /* Probably getting buffer for a channel create/handshake. */ return 64; } @@ -1087,28 +1101,94 @@ GMT_get_next_chid (struct MeshTunnel3 *t) } +/** + * Send ACK on one or more channels due to buffer in connections.. + * + * @param t Channel which has some free buffer space. + * @param fwd Is this for FWD traffic? (ACK goes to root) + */ +void +GMT_unchoke_channels (struct MeshTunnel3 *t, int fwd) +{ + struct MeshTChannel *iter; + unsigned int buffer; + unsigned int channels = GMT_count_channels (t); + unsigned int choked_n; + struct MeshChannel *choked[channels]; + + LOG (GNUNET_ERROR_TYPE_DEBUG, "GMT_unchoke_channels on %s\n", GMT_2s (t)); + + if (NULL == t) + { + GNUNET_break (0); + return; + } + + /* Get buffer space */ + buffer = GMT_get_buffer (t, fwd); + if (0 == buffer) + { + return; + } + + /* Count and remember choked channels */ + choked_n = 0; + for (iter = t->channel_head; NULL != iter; iter = iter->next) + { + if (GNUNET_NO == GMCH_get_allowed (iter->ch, fwd)) + { + choked[choked_n++] = iter->ch; + } + } + + /* Unchoke random channels */ + while (0 < buffer && 0 < choked_n) + { + unsigned int r = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, + choked_n); + GMCH_allow_client (choked[r], fwd); + choked_n--; + buffer--; + choked[r] = choked[choked_n]; + } +} + + /** * Send ACK on one or more connections due to buffer space to the client. * * Iterates all connections of the tunnel and sends ACKs appropriately. * - * @param ch Channel which has some free buffer space. + * @param t Tunnel. * @param fwd Is this in for FWD traffic? (ACK goes dest->root) */ -static void -GMT_send_acks (struct MeshTunnel3 *t, - unsigned int buffer, - int fwd) +void +GMT_send_acks (struct MeshTunnel3 *t, int fwd) { struct MeshTConnection *iter; uint32_t allowed; uint32_t to_allow; uint32_t allow_per_connection; unsigned int cs; + unsigned int buffer; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Tunnel send acks on %s:%X\n", - fwd ? "FWD" : "BCK", peer2s (ch->t->peer), ch->gid); + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Tunnel send %s ACKs on %s\n", + fwd ? "FWD" : "BCK", GMT_2s (t)); + + if (NULL == t) + { + GNUNET_break (0); + return; + } + if (NULL == t->channel_head || + GNUNET_NO == GMCH_is_origin (t->channel_head->ch, !fwd)) + { + GNUNET_break (0); + return; + } + + buffer = GMT_get_buffer (t, fwd); /* Count connections, how many messages are already allowed */ cs = GMT_count_connections (t); @@ -1125,7 +1205,7 @@ GMT_send_acks (struct MeshTunnel3 *t, } /* Authorize connections to send more data */ - to_allow = buffer - allowed; + to_allow = buffer; /* - allowed; */ for (iter = t->connection_head; NULL != iter && to_allow > 0; iter = iter->next) { @@ -1136,13 +1216,9 @@ GMT_send_acks (struct MeshTunnel3 *t, { continue; } - GMC_send_ack (iter->c, NULL, fwd); - connection_send_ack (iter, allow_per_connection, fwd); + GMC_allow (iter->c, buffer, fwd); } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Channel send connection %s ack on %s:%X\n", - fwd ? "FWD" : "BCK", peer2s (ch->t->peer), ch->gid); GNUNET_break (to_allow == 0); } @@ -1169,7 +1245,7 @@ GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message, uint64_t iv; uint16_t type; - LOG (GNUNET_ERROR_TYPE_DEBUG, "Send on Tunnel %s\n", GMP_2s (t->peer)); + LOG (GNUNET_ERROR_TYPE_DEBUG, "GMT Send on Tunnel %s\n", GMP_2s (t->peer)); iv = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_NONCE, UINT64_MAX); msg = (struct GNUNET_MESH_Encrypted *) cbuf; @@ -1186,10 +1262,10 @@ GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message, type = ntohs (message->type); switch (type) { - case GNUNET_MESSAGE_TYPE_MESH_FWD: - case GNUNET_MESSAGE_TYPE_MESH_BCK: + case GNUNET_MESSAGE_TYPE_MESH_DATA: case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_CREATE: case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_DESTROY: + case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_ACK: msg->cid = *GMC_get_id (c); msg->ttl = htonl (default_ttl); break;