diff options
author | Sree Harsha Totakura <totakura@in.tum.de> | 2012-06-28 22:59:51 +0000 |
---|---|---|
committer | Sree Harsha Totakura <totakura@in.tum.de> | 2012-06-28 22:59:51 +0000 |
commit | bf760b3f47cae6c7d5a0e9cf4f617f0595515273 (patch) | |
tree | 992f2b02319659093e2519956cbc6d20442b5eba /src/stream | |
parent | b20a41aaa09caa197e789584e5ad2b0f29b143f1 (diff) | |
download | gnunet-bf760b3f47cae6c7d5a0e9cf4f617f0595515273.tar.gz gnunet-bf760b3f47cae6c7d5a0e9cf4f617f0595515273.zip |
-control retransmission handling
Diffstat (limited to 'src/stream')
-rw-r--r-- | src/stream/stream_api.c | 107 |
1 files changed, 61 insertions, 46 deletions
diff --git a/src/stream/stream_api.c b/src/stream/stream_api.c index 168929b01..595bf7a6c 100644 --- a/src/stream/stream_api.c +++ b/src/stream/stream_api.c | |||
@@ -42,9 +42,21 @@ | |||
42 | #include "gnunet_stream_lib.h" | 42 | #include "gnunet_stream_lib.h" |
43 | #include "stream_protocol.h" | 43 | #include "stream_protocol.h" |
44 | 44 | ||
45 | /** | ||
46 | * Generic logging shorthand | ||
47 | */ | ||
45 | #define LOG(kind,...) \ | 48 | #define LOG(kind,...) \ |
46 | GNUNET_log_from (kind, "stream-api", __VA_ARGS__) | 49 | GNUNET_log_from (kind, "stream-api", __VA_ARGS__) |
47 | 50 | ||
51 | /** | ||
52 | * Debug logging shorthand | ||
53 | */ | ||
54 | #define LOG_DEBUG(...) \ | ||
55 | LOG (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__) | ||
56 | |||
57 | /** | ||
58 | * Time in relative seconds shorthand | ||
59 | */ | ||
48 | #define TIME_REL_SECS(sec) \ | 60 | #define TIME_REL_SECS(sec) \ |
49 | GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, sec) | 61 | GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, sec) |
50 | 62 | ||
@@ -1462,10 +1474,9 @@ generate_hello_ack (struct GNUNET_STREAM_Socket *socket, | |||
1462 | else | 1474 | else |
1463 | socket->write_sequence_number = | 1475 | socket->write_sequence_number = |
1464 | GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX); | 1476 | GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX); |
1465 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 1477 | LOG_DEBUG ("%s: write sequence number %u\n", |
1466 | "%s: write sequence number %u\n", | 1478 | GNUNET_i2s (&socket->other_peer), |
1467 | GNUNET_i2s (&socket->other_peer), | 1479 | (unsigned int) socket->write_sequence_number); |
1468 | (unsigned int) socket->write_sequence_number); | ||
1469 | } | 1480 | } |
1470 | msg = GNUNET_malloc (sizeof (struct GNUNET_STREAM_HelloAckMessage)); | 1481 | msg = GNUNET_malloc (sizeof (struct GNUNET_STREAM_HelloAckMessage)); |
1471 | msg->header.header.size = | 1482 | msg->header.header.size = |
@@ -1493,6 +1504,8 @@ control_retransmission_task (void *cls, | |||
1493 | if (GNUNET_SCHEDULER_REASON_SHUTDOWN == tc->reason) | 1504 | if (GNUNET_SCHEDULER_REASON_SHUTDOWN == tc->reason) |
1494 | return; | 1505 | return; |
1495 | socket->control_retransmission_task_id = GNUNET_SCHEDULER_NO_TASK; | 1506 | socket->control_retransmission_task_id = GNUNET_SCHEDULER_NO_TASK; |
1507 | LOG_DEBUG ("%s: Retransmitting a control message\n", | ||
1508 | GNUNET_i2s (&socket->other_peer)); | ||
1496 | switch (socket->status) | 1509 | switch (socket->status) |
1497 | { | 1510 | { |
1498 | case STATE_INIT: | 1511 | case STATE_INIT: |
@@ -1508,13 +1521,20 @@ control_retransmission_task (void *cls, | |||
1508 | queue_message (socket, | 1521 | queue_message (socket, |
1509 | (struct GNUNET_STREAM_MessageHeader *) | 1522 | (struct GNUNET_STREAM_MessageHeader *) |
1510 | generate_hello_ack (socket, GNUNET_NO), NULL, NULL); | 1523 | generate_hello_ack (socket, GNUNET_NO), NULL, NULL); |
1524 | socket->control_retransmission_task_id = | ||
1525 | GNUNET_SCHEDULER_add_delayed (socket->retransmit_timeout, | ||
1526 | &control_retransmission_task, socket); | ||
1511 | break; | 1527 | break; |
1528 | case STATE_ESTABLISHED: | ||
1529 | if (NULL == socket->lsocket) | ||
1530 | queue_message (socket, | ||
1531 | (struct GNUNET_STREAM_MessageHeader *) | ||
1532 | generate_hello_ack (socket, GNUNET_NO), NULL, NULL); | ||
1533 | else | ||
1534 | GNUNET_break (0); | ||
1512 | default: | 1535 | default: |
1513 | GNUNET_break (0); | 1536 | GNUNET_break (0); |
1514 | } | 1537 | } |
1515 | socket->control_retransmission_task_id = | ||
1516 | GNUNET_SCHEDULER_add_delayed (socket->retransmit_timeout, | ||
1517 | &control_retransmission_task, socket); | ||
1518 | } | 1538 | } |
1519 | 1539 | ||
1520 | 1540 | ||
@@ -1574,20 +1594,20 @@ client_handle_hello_ack (void *cls, | |||
1574 | NULL); | 1594 | NULL); |
1575 | return GNUNET_OK; | 1595 | return GNUNET_OK; |
1576 | case STATE_ESTABLISHED: | 1596 | case STATE_ESTABLISHED: |
1577 | case STATE_RECEIVE_CLOSE_WAIT: | ||
1578 | // call statistics (# ACKs ignored++) | 1597 | // call statistics (# ACKs ignored++) |
1598 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == | ||
1599 | socket->control_retransmission_task_id); | ||
1600 | socket->control_retransmission_task_id = | ||
1601 | GNUNET_SCHEDULER_add_now (&control_retransmission_task, socket); | ||
1579 | return GNUNET_OK; | 1602 | return GNUNET_OK; |
1580 | case STATE_INIT: | ||
1581 | default: | 1603 | default: |
1582 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 1604 | LOG_DEBUG ("%s: Server %s sent HELLO_ACK when in state %d\n", |
1583 | "%s: Server %s sent HELLO_ACK when in state %d\n", | 1605 | GNUNET_i2s (&socket->other_peer), |
1584 | GNUNET_i2s (&socket->other_peer), | 1606 | GNUNET_i2s (&socket->other_peer), |
1585 | GNUNET_i2s (&socket->other_peer), | 1607 | socket->state); |
1586 | socket->state); | ||
1587 | socket->state = STATE_CLOSED; // introduce STATE_ERROR? | 1608 | socket->state = STATE_CLOSED; // introduce STATE_ERROR? |
1588 | return GNUNET_SYSERR; | 1609 | return GNUNET_SYSERR; |
1589 | } | 1610 | } |
1590 | |||
1591 | } | 1611 | } |
1592 | 1612 | ||
1593 | 1613 | ||
@@ -2149,40 +2169,38 @@ server_handle_hello (void *cls, | |||
2149 | &socket->other_peer, | 2169 | &socket->other_peer, |
2150 | sizeof (struct GNUNET_PeerIdentity))) | 2170 | sizeof (struct GNUNET_PeerIdentity))) |
2151 | { | 2171 | { |
2152 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 2172 | LOG_DEBUG ("%s: Received HELLO from non-confirming peer\n", |
2153 | "%s: Received HELLO from non-confirming peer\n", | 2173 | GNUNET_i2s (&socket->other_peer)); |
2154 | GNUNET_i2s (&socket->other_peer)); | ||
2155 | return GNUNET_YES; | 2174 | return GNUNET_YES; |
2156 | } | 2175 | } |
2157 | |||
2158 | GNUNET_assert (GNUNET_MESSAGE_TYPE_STREAM_HELLO == ntohs (message->type)); | 2176 | GNUNET_assert (GNUNET_MESSAGE_TYPE_STREAM_HELLO == ntohs (message->type)); |
2159 | GNUNET_assert (socket->tunnel == tunnel); | 2177 | GNUNET_assert (socket->tunnel == tunnel); |
2160 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 2178 | LOG_DEBUG ("%s: Received HELLO from %s\n", GNUNET_i2s (&socket->other_peer), |
2161 | "%s: Received HELLO from %s\n", | 2179 | GNUNET_i2s (&socket->other_peer)); |
2162 | GNUNET_i2s (&socket->other_peer), | ||
2163 | GNUNET_i2s (&socket->other_peer)); | ||
2164 | |||
2165 | switch (socket->status) | 2180 | switch (socket->status) |
2166 | { | 2181 | { |
2167 | case STATE_INIT: | 2182 | case STATE_INIT: |
2168 | reply = generate_hello_ack (socket, GNUNET_YES); | 2183 | reply = generate_hello_ack (socket, GNUNET_YES); |
2169 | queue_message (socket, | 2184 | queue_message (socket, &reply->header, &set_state_hello_wait, NULL); |
2170 | &reply->header, | 2185 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == |
2171 | &set_state_hello_wait, | 2186 | socket->control_retransmission_task_id); |
2172 | NULL); | 2187 | socket->control_retransmission_task_id = |
2188 | GNUNET_SCHEDULER_add_delayed (socket->retransmit_timeout, | ||
2189 | &control_retransmission_task, socket); | ||
2190 | break; | ||
2191 | case STATE_HELLO_WAIT: | ||
2192 | /* Perhaps our HELLO_ACK was lost */ | ||
2193 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK != | ||
2194 | socket->control_retransmission_task_id); | ||
2195 | GNUNET_SCHEDULER_cancel (socket->control_retransmission_task_id); | ||
2196 | socket->control_retransmission_task_id = | ||
2197 | GNUNET_SCHEDULER_add_now (&control_retransmission_task, socket); | ||
2173 | break; | 2198 | break; |
2174 | default: | 2199 | default: |
2175 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 2200 | LOG_DEBUG( "%s: Client sent HELLO when in state %d\n", |
2176 | "%s: Client sent HELLO when in state %d\n", | 2201 | GNUNET_i2s (&socket->other_peer), socket->state); |
2177 | GNUNET_i2s (&socket->other_peer), | ||
2178 | socket->state); | ||
2179 | /* FIXME: Send RESET? */ | 2202 | /* FIXME: Send RESET? */ |
2180 | } | 2203 | } |
2181 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == | ||
2182 | socket->control_retransmission_task_id); | ||
2183 | socket->control_retransmission_task_id = | ||
2184 | GNUNET_SCHEDULER_add_delayed (socket->retransmit_timeout, | ||
2185 | &control_retransmission_task, socket); | ||
2186 | return GNUNET_OK; | 2204 | return GNUNET_OK; |
2187 | } | 2205 | } |
2188 | 2206 | ||
@@ -2214,8 +2232,9 @@ server_handle_hello_ack (void *cls, | |||
2214 | ntohs (message->type)); | 2232 | ntohs (message->type)); |
2215 | GNUNET_assert (socket->tunnel == tunnel); | 2233 | GNUNET_assert (socket->tunnel == tunnel); |
2216 | ack_message = (struct GNUNET_STREAM_HelloAckMessage *) message; | 2234 | ack_message = (struct GNUNET_STREAM_HelloAckMessage *) message; |
2217 | if (STATE_HELLO_WAIT == socket->state) | 2235 | switch (socket->state) |
2218 | { | 2236 | { |
2237 | case STATE_HELLO_WAIT: | ||
2219 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 2238 | LOG (GNUNET_ERROR_TYPE_DEBUG, |
2220 | "%s: Received HELLO_ACK from %s\n", | 2239 | "%s: Received HELLO_ACK from %s\n", |
2221 | GNUNET_i2s (&socket->other_peer), | 2240 | GNUNET_i2s (&socket->other_peer), |
@@ -2227,15 +2246,11 @@ server_handle_hello_ack (void *cls, | |||
2227 | (unsigned int) socket->read_sequence_number); | 2246 | (unsigned int) socket->read_sequence_number); |
2228 | socket->receiver_window_available = | 2247 | socket->receiver_window_available = |
2229 | ntohl (ack_message->receiver_window_size); | 2248 | ntohl (ack_message->receiver_window_size); |
2230 | /* Attain ESTABLISHED state */ | ||
2231 | set_state_established (NULL, socket); | 2249 | set_state_established (NULL, socket); |
2232 | } | 2250 | break; |
2233 | else | 2251 | default: |
2234 | { | ||
2235 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 2252 | LOG (GNUNET_ERROR_TYPE_DEBUG, |
2236 | "Client sent HELLO_ACK when in state %d\n", socket->state); | 2253 | "Client sent HELLO_ACK when in state %d\n", socket->state); |
2237 | /* FIXME: Send RESET? */ | ||
2238 | |||
2239 | } | 2254 | } |
2240 | return GNUNET_OK; | 2255 | return GNUNET_OK; |
2241 | } | 2256 | } |