aboutsummaryrefslogtreecommitdiff
path: root/src/stream
diff options
context:
space:
mode:
authorSree Harsha Totakura <totakura@in.tum.de>2012-06-28 22:59:51 +0000
committerSree Harsha Totakura <totakura@in.tum.de>2012-06-28 22:59:51 +0000
commitbf760b3f47cae6c7d5a0e9cf4f617f0595515273 (patch)
tree992f2b02319659093e2519956cbc6d20442b5eba /src/stream
parentb20a41aaa09caa197e789584e5ad2b0f29b143f1 (diff)
downloadgnunet-bf760b3f47cae6c7d5a0e9cf4f617f0595515273.tar.gz
gnunet-bf760b3f47cae6c7d5a0e9cf4f617f0595515273.zip
-control retransmission handling
Diffstat (limited to 'src/stream')
-rw-r--r--src/stream/stream_api.c107
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}