gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r22370 - gnunet/src/stream


From: gnunet
Subject: [GNUnet-SVN] r22370 - gnunet/src/stream
Date: Fri, 29 Jun 2012 00:59:51 +0200

Author: harsha
Date: 2012-06-29 00:59:51 +0200 (Fri, 29 Jun 2012)
New Revision: 22370

Modified:
   gnunet/src/stream/stream_api.c
Log:
-control retransmission handling

Modified: gnunet/src/stream/stream_api.c
===================================================================
--- gnunet/src/stream/stream_api.c      2012-06-28 20:58:15 UTC (rev 22369)
+++ gnunet/src/stream/stream_api.c      2012-06-28 22:59:51 UTC (rev 22370)
@@ -42,9 +42,21 @@
 #include "gnunet_stream_lib.h"
 #include "stream_protocol.h"
 
+/**
+ * Generic logging shorthand
+ */
 #define LOG(kind,...)                                   \
   GNUNET_log_from (kind, "stream-api", __VA_ARGS__)
 
+/**
+ * Debug logging shorthand
+ */
+#define LOG_DEBUG(...)                          \
+  LOG (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
+
+/**
+ * Time in relative seconds shorthand
+ */
 #define TIME_REL_SECS(sec) \
   GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, sec)
 
@@ -1462,10 +1474,9 @@
     else
       socket->write_sequence_number = 
         GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX);
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "%s: write sequence number %u\n",
-         GNUNET_i2s (&socket->other_peer),
-         (unsigned int) socket->write_sequence_number);
+    LOG_DEBUG ("%s: write sequence number %u\n",
+               GNUNET_i2s (&socket->other_peer),
+               (unsigned int) socket->write_sequence_number);
   }
   msg = GNUNET_malloc (sizeof (struct GNUNET_STREAM_HelloAckMessage));
   msg->header.header.size = 
@@ -1493,6 +1504,8 @@
   if (GNUNET_SCHEDULER_REASON_SHUTDOWN == tc->reason)
     return;
   socket->control_retransmission_task_id = GNUNET_SCHEDULER_NO_TASK;
+  LOG_DEBUG ("%s: Retransmitting a control message\n",
+                 GNUNET_i2s (&socket->other_peer));
   switch (socket->status)
   {
   case STATE_INIT:    
@@ -1508,13 +1521,20 @@
       queue_message (socket,
                      (struct GNUNET_STREAM_MessageHeader *)
                      generate_hello_ack (socket, GNUNET_NO), NULL, NULL);
+    socket->control_retransmission_task_id =
+    GNUNET_SCHEDULER_add_delayed (socket->retransmit_timeout,
+                                  &control_retransmission_task, socket);
     break;
+  case STATE_ESTABLISHED:
+    if (NULL == socket->lsocket)
+      queue_message (socket,
+                     (struct GNUNET_STREAM_MessageHeader *)
+                     generate_hello_ack (socket, GNUNET_NO), NULL, NULL);
+    else
+      GNUNET_break (0);
   default:
     GNUNET_break (0);
-  }
-  socket->control_retransmission_task_id =
-    GNUNET_SCHEDULER_add_delayed (socket->retransmit_timeout,
-                                  &control_retransmission_task, socket);
+  }  
 }
 
 
@@ -1574,20 +1594,20 @@
                    NULL);    
     return GNUNET_OK;
   case STATE_ESTABLISHED:
-  case STATE_RECEIVE_CLOSE_WAIT:
     // call statistics (# ACKs ignored++)
+    GNUNET_assert (GNUNET_SCHEDULER_NO_TASK ==
+                   socket->control_retransmission_task_id);
+    socket->control_retransmission_task_id =
+      GNUNET_SCHEDULER_add_now (&control_retransmission_task, socket);
     return GNUNET_OK;
-  case STATE_INIT:
   default:
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "%s: Server %s sent HELLO_ACK when in state %d\n", 
-         GNUNET_i2s (&socket->other_peer),
-         GNUNET_i2s (&socket->other_peer),
-         socket->state);
+    LOG_DEBUG ("%s: Server %s sent HELLO_ACK when in state %d\n", 
+               GNUNET_i2s (&socket->other_peer),
+               GNUNET_i2s (&socket->other_peer),
+               socket->state);
     socket->state = STATE_CLOSED; // introduce STATE_ERROR?
     return GNUNET_SYSERR;
   }
-
 }
 
 
@@ -2149,40 +2169,38 @@
                    &socket->other_peer,
                    sizeof (struct GNUNET_PeerIdentity)))
   {
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "%s: Received HELLO from non-confirming peer\n",
-         GNUNET_i2s (&socket->other_peer));
+    LOG_DEBUG ("%s: Received HELLO from non-confirming peer\n",
+               GNUNET_i2s (&socket->other_peer));
     return GNUNET_YES;
   }
-
   GNUNET_assert (GNUNET_MESSAGE_TYPE_STREAM_HELLO == ntohs (message->type));
   GNUNET_assert (socket->tunnel == tunnel);
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "%s: Received HELLO from %s\n", 
-       GNUNET_i2s (&socket->other_peer),
-       GNUNET_i2s (&socket->other_peer));
-
+  LOG_DEBUG ("%s: Received HELLO from %s\n", GNUNET_i2s (&socket->other_peer),
+             GNUNET_i2s (&socket->other_peer));
   switch (socket->status)
   {
   case STATE_INIT:
     reply = generate_hello_ack (socket, GNUNET_YES);
-    queue_message (socket, 
-                   &reply->header,
-                   &set_state_hello_wait, 
-                   NULL);
+    queue_message (socket, &reply->header, &set_state_hello_wait, NULL);
+    GNUNET_assert (GNUNET_SCHEDULER_NO_TASK ==
+                   socket->control_retransmission_task_id);
+    socket->control_retransmission_task_id =
+      GNUNET_SCHEDULER_add_delayed (socket->retransmit_timeout,
+                                    &control_retransmission_task, socket);
     break;
+  case STATE_HELLO_WAIT:
+    /* Perhaps our HELLO_ACK was lost */
+    GNUNET_assert (GNUNET_SCHEDULER_NO_TASK != 
+                   socket->control_retransmission_task_id);
+    GNUNET_SCHEDULER_cancel (socket->control_retransmission_task_id);
+    socket->control_retransmission_task_id =
+      GNUNET_SCHEDULER_add_now (&control_retransmission_task, socket);
+    break;
   default:
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "%s: Client sent HELLO when in state %d\n", 
-         GNUNET_i2s (&socket->other_peer),
-         socket->state);
+    LOG_DEBUG( "%s: Client sent HELLO when in state %d\n",
+               GNUNET_i2s (&socket->other_peer), socket->state);
     /* FIXME: Send RESET? */
   }
-  GNUNET_assert (GNUNET_SCHEDULER_NO_TASK ==
-                 socket->control_retransmission_task_id);
-  socket->control_retransmission_task_id =
-    GNUNET_SCHEDULER_add_delayed (socket->retransmit_timeout,
-                                  &control_retransmission_task, socket);
   return GNUNET_OK;
 }
 
@@ -2214,8 +2232,9 @@
                  ntohs (message->type));
   GNUNET_assert (socket->tunnel == tunnel);
   ack_message = (struct GNUNET_STREAM_HelloAckMessage *) message;
-  if (STATE_HELLO_WAIT == socket->state)
+  switch (socket->state)  
   {
+  case STATE_HELLO_WAIT:
     LOG (GNUNET_ERROR_TYPE_DEBUG,
          "%s: Received HELLO_ACK from %s\n",
          GNUNET_i2s (&socket->other_peer),
@@ -2227,15 +2246,11 @@
          (unsigned int) socket->read_sequence_number);
     socket->receiver_window_available = 
       ntohl (ack_message->receiver_window_size);
-    /* Attain ESTABLISHED state */
     set_state_established (NULL, socket);
-  }
-  else
-  {
+    break;
+  default:
     LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "Client sent HELLO_ACK when in state %d\n", socket->state);
-    /* FIXME: Send RESET? */
-      
+         "Client sent HELLO_ACK when in state %d\n", socket->state);    
   }
   return GNUNET_OK;
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]