diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2013-09-16 16:31:25 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2013-09-16 16:31:25 +0000 |
commit | 5fd4317460e74a023998bca6e1b2edec532f1eba (patch) | |
tree | a19add1d2f7b00e2665fcf3432fdbcd4e82d6630 /src/transport/plugin_transport_udp.c | |
parent | 6ea3d4aca0abfd35bfba6759c1655cbac057b68f (diff) | |
download | gnunet-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.c | 22 |
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 | ||
2127 | struct LookupContext | 2127 | struct 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", |