From 78b2bd33b538dc5e2efd4b0e7a927c0878b42cb1 Mon Sep 17 00:00:00 2001 From: Bart Polot Date: Mon, 21 Jul 2014 00:15:14 +0000 Subject: [PATCH] - don't re-encrypt data queued in a broken connection --- src/cadet/gnunet-service-cadet_connection.c | 14 +++++------ src/cadet/gnunet-service-cadet_tunnel.c | 26 +++++++++++++++++++++ src/cadet/gnunet-service-cadet_tunnel.h | 11 +++++++++ 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/cadet/gnunet-service-cadet_connection.c b/src/cadet/gnunet-service-cadet_connection.c index 005e1cb8d..102f7edac 100644 --- a/src/cadet/gnunet-service-cadet_connection.c +++ b/src/cadet/gnunet-service-cadet_connection.c @@ -1839,9 +1839,7 @@ GCC_handle_broken (void* cls, * is popped! Do not use 'c' after the call. */ while (NULL != (out_msg = GCP_connection_pop (neighbor, c))) { - GNUNET_assert (NULL == - GCT_send_prebuilt_message (out_msg, t, NULL, GNUNET_YES, - NULL, NULL)); + GCT_resend_message (out_msg, t); pending_msgs--; } @@ -3000,9 +2998,8 @@ GCC_send_prebuilt_message (const struct GNUNET_MessageHeader *message, GNUNET_STATISTICS_update (stats, "# messages dropped (buffer full)", 1, GNUNET_NO); GNUNET_break (0); - LOG (GNUNET_ERROR_TYPE_DEBUG, - "queue full: %u/%u\n", - fc->queue_n, fc->queue_max); + LOG (GNUNET_ERROR_TYPE_DEBUG, "queue full: %u/%u\n", + fc->queue_n, fc->queue_max); if (GNUNET_MESSAGE_TYPE_CADET_ENCRYPTED == type) { fc->queue_n--; @@ -3011,7 +3008,8 @@ GCC_send_prebuilt_message (const struct GNUNET_MessageHeader *message, return NULL; /* Drop this message */ } - LOG (GNUNET_ERROR_TYPE_DEBUG, " C_P+ %p %u\n", c, c->pending_messages); + LOG (GNUNET_ERROR_TYPE_DEBUG, " C_P+ %s %u\n", + GCC_2s (c), c->pending_messages); c->pending_messages++; q = GNUNET_new (struct CadetConnectionQueue); @@ -3020,7 +3018,7 @@ GCC_send_prebuilt_message (const struct GNUNET_MessageHeader *message, size, c, fwd, &conn_message_sent, q); if (NULL == q->q) { - LOG (GNUNET_ERROR_TYPE_DEBUG, "WARNING dropping msg on %s\n", GCC_2s (c)); + LOG (GNUNET_ERROR_TYPE_DEBUG, "dropping msg on %s, NULL q\n", GCC_2s (c)); GNUNET_free (data); GNUNET_free (q); return NULL; diff --git a/src/cadet/gnunet-service-cadet_tunnel.c b/src/cadet/gnunet-service-cadet_tunnel.c index 1fb5e539c..fffdb9102 100644 --- a/src/cadet/gnunet-service-cadet_tunnel.c +++ b/src/cadet/gnunet-service-cadet_tunnel.c @@ -3039,6 +3039,32 @@ GCT_send_prebuilt_message (const struct GNUNET_MessageHeader *message, return send_prebuilt_message (message, t, c, force, cont, cont_cls, NULL); } +/** + * Sends an already built and encrypted message on a tunnel, choosing the best + * connection. Useful for re-queueing messages queued on a destroyed connection. + * + * @param message Message to send. Function modifies it. + * @param t Tunnel on which this message is transmitted. + */ +void +GCT_resend_message (const struct GNUNET_MessageHeader *message, + struct CadetTunnel *t) +{ + struct CadetConnection *c; + int fwd; + + c = tunnel_get_connection (t); + if (NULL == c) + { + /* TODO queue in tunnel, marked as encrypted */ + LOG (GNUNET_ERROR_TYPE_DEBUG, "No connection available, dropping.\n"); + return; + } + fwd = GCC_is_origin (c, GNUNET_YES); + GNUNET_break (NULL == GCC_send_prebuilt_message (message, 0, 0, c, fwd, + GNUNET_YES, NULL, NULL)); +} + /** * Is the tunnel directed towards the local peer? diff --git a/src/cadet/gnunet-service-cadet_tunnel.h b/src/cadet/gnunet-service-cadet_tunnel.h index 3013254e9..f94153258 100644 --- a/src/cadet/gnunet-service-cadet_tunnel.h +++ b/src/cadet/gnunet-service-cadet_tunnel.h @@ -439,6 +439,17 @@ GCT_send_prebuilt_message (const struct GNUNET_MessageHeader *message, struct CadetTunnel *t, struct CadetConnection *c, int force, GCT_sent cont, void *cont_cls); +/** + * Sends an already built and encrypted message on a tunnel, choosing the best + * connection. Useful for re-queueing messages queued on a destroyed connection. + * + * @param message Message to send. Function modifies it. + * @param t Tunnel on which this message is transmitted. + */ +void +GCT_resend_message (const struct GNUNET_MessageHeader *message, + struct CadetTunnel *t); + /** * Is the tunnel directed towards the local peer? * -- 2.25.1