aboutsummaryrefslogtreecommitdiff
path: root/src/transport/plugin_transport_udp.c
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2013-09-16 16:31:25 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2013-09-16 16:31:25 +0000
commit5fd4317460e74a023998bca6e1b2edec532f1eba (patch)
treea19add1d2f7b00e2665fcf3432fdbcd4e82d6630 /src/transport/plugin_transport_udp.c
parent6ea3d4aca0abfd35bfba6759c1655cbac057b68f (diff)
downloadgnunet-5fd4317460e74a023998bca6e1b2edec532f1eba.tar.gz
gnunet-5fd4317460e74a023998bca6e1b2edec532f1eba.zip
fix: upd has to use the session with fragmentation context when receiving ACKs
Diffstat (limited to 'src/transport/plugin_transport_udp.c')
-rw-r--r--src/transport/plugin_transport_udp.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/transport/plugin_transport_udp.c b/src/transport/plugin_transport_udp.c
index 25760255b..bc64fd5d2 100644
--- a/src/transport/plugin_transport_udp.c
+++ b/src/transport/plugin_transport_udp.c
@@ -2126,11 +2126,13 @@ fragment_msg_proc (void *cls, const struct GNUNET_MessageHeader *msg)
2126 2126
2127struct LookupContext 2127struct LookupContext
2128{ 2128{
2129 const struct sockaddr * addr;
2130
2131 struct Session *res; 2129 struct Session *res;
2132 2130
2131 const struct sockaddr * addr;
2132
2133 size_t addrlen; 2133 size_t addrlen;
2134
2135 int must_have_frag_ctx;
2134}; 2136};
2135 2137
2136 2138
@@ -2140,11 +2142,21 @@ lookup_session_by_addr_it (void *cls, const struct GNUNET_HashCode * key, void *
2140 struct LookupContext *l_ctx = cls; 2142 struct LookupContext *l_ctx = cls;
2141 struct Session * s = value; 2143 struct Session * s = value;
2142 2144
2145 if ((GNUNET_YES == l_ctx->must_have_frag_ctx) && (NULL == s->frag_ctx))
2146 return GNUNET_YES;
2147
2148 /*
2149 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Comparing session: have %s %s %p<-> want %s\n",
2150 GNUNET_a2s(s->sock_addr, s->addrlen),
2151 (GNUNET_YES == s->inbound) ? "inbound" : "outbound",
2152 s->frag_ctx,
2153 GNUNET_a2s(l_ctx->addr, l_ctx->addrlen));
2154 */
2143 if ((s->addrlen == l_ctx->addrlen) && 2155 if ((s->addrlen == l_ctx->addrlen) &&
2144 (0 == memcmp (s->sock_addr, l_ctx->addr, s->addrlen))) 2156 (0 == memcmp (s->sock_addr, l_ctx->addr, s->addrlen)))
2145 { 2157 {
2146 l_ctx->res = s; 2158 l_ctx->res = s;
2147 return GNUNET_NO; 2159 return GNUNET_YES;
2148 } 2160 }
2149 return GNUNET_YES; 2161 return GNUNET_YES;
2150} 2162}
@@ -2171,6 +2183,7 @@ ack_proc (void *cls, uint32_t id, const struct GNUNET_MessageHeader *msg)
2171 l_ctx.addr = rc->src_addr; 2183 l_ctx.addr = rc->src_addr;
2172 l_ctx.addrlen = rc->addr_len; 2184 l_ctx.addrlen = rc->addr_len;
2173 l_ctx.res = NULL; 2185 l_ctx.res = NULL;
2186 l_ctx.must_have_frag_ctx = GNUNET_NO;
2174 GNUNET_CONTAINER_multihashmap_iterate (rc->plugin->sessions, 2187 GNUNET_CONTAINER_multihashmap_iterate (rc->plugin->sessions,
2175 &lookup_session_by_addr_it, 2188 &lookup_session_by_addr_it,
2176 &l_ctx); 2189 &l_ctx);
@@ -2245,16 +2258,17 @@ read_process_ack (struct Plugin *plugin,
2245 l_ctx.addr = (const struct sockaddr *) addr; 2258 l_ctx.addr = (const struct sockaddr *) addr;
2246 l_ctx.addrlen = fromlen; 2259 l_ctx.addrlen = fromlen;
2247 l_ctx.res = NULL; 2260 l_ctx.res = NULL;
2261 l_ctx.must_have_frag_ctx = GNUNET_YES;
2248 GNUNET_CONTAINER_multihashmap_iterate (plugin->sessions, 2262 GNUNET_CONTAINER_multihashmap_iterate (plugin->sessions,
2249 &lookup_session_by_addr_it, 2263 &lookup_session_by_addr_it,
2250 &l_ctx); 2264 &l_ctx);
2251 s = l_ctx.res; 2265 s = l_ctx.res;
2252
2253 if ((NULL == s) || (NULL == s->frag_ctx)) 2266 if ((NULL == s) || (NULL == s->frag_ctx))
2254 { 2267 {
2255 return; 2268 return;
2256 } 2269 }
2257 2270
2271
2258 flow_delay.rel_value_us = (uint64_t) ntohl (udp_ack->delay); 2272 flow_delay.rel_value_us = (uint64_t) ntohl (udp_ack->delay);
2259 LOG (GNUNET_ERROR_TYPE_DEBUG, 2273 LOG (GNUNET_ERROR_TYPE_DEBUG,
2260 "We received a sending delay of %s\n", 2274 "We received a sending delay of %s\n",