-added stream listen success callback
authorSree Harsha Totakura <totakura@in.tum.de>
Thu, 21 Jun 2012 14:42:54 +0000 (14:42 +0000)
committerSree Harsha Totakura <totakura@in.tum.de>
Thu, 21 Jun 2012 14:42:54 +0000 (14:42 +0000)
src/include/gnunet_stream_lib.h
src/stream/stream_api.c
src/stream/test_stream_2peers.c
src/stream/test_stream_2peers_halfclose.c
src/stream/test_stream_big.c
src/stream/test_stream_local.c
src/stream/test_stream_local.conf
src/stream/test_stream_sequence_wraparound.c

index c8a207d59b63f9c5c61d9546ec0dfe48047ce0c6..fd44ccfa0a9b970afcd313407cd4f315eac9af59 100644 (file)
@@ -85,6 +85,13 @@ typedef void (*GNUNET_STREAM_OpenCallback) (void *cls,
                                            struct GNUNET_STREAM_Socket *socket);
 
 
+/**
+ * Callback for signalling stream listen success; See
+ * GNUNET_STREAM_OPTION_SIGNAL_LISTEN_SUCCESS
+ */
+typedef void (*GNUNET_STREAM_ListenSuccessCallback) (void);
+
+
 /**
  * Options for the stream.
  */
@@ -112,9 +119,17 @@ enum GNUNET_STREAM_Option
     GNUNET_STREAM_OPTION_TESTING_SET_WRITE_SEQUENCE_NUMBER,
 
     /**
-     * Listen socket timeout in milliseconds
+     * Listen socket timeout in milliseconds given as uint32_t
+     */
+    GNUNET_STREAM_OPTION_LISTEN_TIMEOUT,
+
+    /**
+     * Option to register a callback when stream listening is
+     * successfull. Takes parameter of the form
+     * GNUNET_STREAM_ListenSuccessCallback. The callback is only called if
+     * listen is successful
      */
-    GNUNET_STREAM_OPTION_LISTEN_TIMEOUT
+    GNUNET_STREAM_OPTION_SIGNAL_LISTEN_SUCCESS
   };
 
 
index cd89a1de3ec8a3f48b00c3d7f363a2cd8801c546..f042ccc938b0293a5454d55deb0073edddb2d49c 100644 (file)
@@ -388,6 +388,11 @@ struct GNUNET_STREAM_ListenSocket
    */
   struct GNUNET_LOCKMANAGER_LockingRequest *locking_request;
 
+  /**
+   * Callback to call after acquring a lock and listening
+   */
+  GNUNET_STREAM_ListenSuccessCallback listen_ok_cb;
+
   /**
    * The callback function which is called after successful opening socket
    */
@@ -2873,6 +2878,10 @@ lock_status_change_cb (void *cls, const char *domain, uint32_t lock,
                                            server_message_handlers,
                                            ports);
       GNUNET_assert (NULL != lsocket->mesh);
+      if (NULL != lsocket->listen_ok_cb)
+      {
+        (void) lsocket->listen_ok_cb ();
+      }
     }
   }
   if (GNUNET_LOCKMANAGER_RELEASE == status)
@@ -2939,6 +2948,9 @@ GNUNET_STREAM_open (const struct GNUNET_CONFIGURATION_Handle *cfg,
     case GNUNET_STREAM_OPTION_LISTEN_TIMEOUT:
       GNUNET_break (0);          /* Option irrelevant in STREAM_open */
       break;
+    case GNUNET_STREAM_OPTION_SIGNAL_LISTEN_SUCCESS:
+      GNUNET_break (0);          /* Option irrelevant in STREAM_open */
+      break;
     case GNUNET_STREAM_OPTION_END:
       break;
     }
@@ -3200,7 +3212,8 @@ GNUNET_STREAM_listen (const struct GNUNET_CONFIGURATION_Handle *cfg,
   lsocket->retransmit_timeout = 
     GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, default_timeout);
   lsocket->testing_active = GNUNET_NO;
-  listen_timeout = TIME_REL_SECS (60); /* A minute for listen timeout */
+  lsocket->listen_ok_cb = NULL;
+  listen_timeout = TIME_REL_SECS (60); /* A minute for listen timeout */  
   va_start (vargs, listen_cb_cls);
   do {
     option = va_arg (vargs, enum GNUNET_STREAM_Option);
@@ -3219,6 +3232,10 @@ GNUNET_STREAM_listen (const struct GNUNET_CONFIGURATION_Handle *cfg,
       listen_timeout = GNUNET_TIME_relative_multiply
         (GNUNET_TIME_UNIT_MILLISECONDS, va_arg (vargs, uint32_t));
       break;
+    case GNUNET_STREAM_OPTION_SIGNAL_LISTEN_SUCCESS:
+      lsocket->listen_ok_cb = va_arg (vargs,
+                                      GNUNET_STREAM_ListenSuccessCallback);
+      break;
     case GNUNET_STREAM_OPTION_END:
       break;
     }
index ecb4b848cb1de2edffb51249f4cb808b5cefe327..4313f646b2f6e0b8c949a0711c8a01dd52f43faf 100644 (file)
@@ -436,15 +436,11 @@ stream_listen_cb (void *cls,
 
 
 /**
- * Task for connecting the peer to stream as client
- *
- * @param cls PeerData
- * @param tc the TaskContext
+ * Listen success callback; connects a peer to stream as client
  */
 static void
-stream_connect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+stream_connect (void)
 {
-  /* Connect to stream library */
   peer1.socket = GNUNET_STREAM_open (d1->cfg,
                                      &d2->id,         /* Null for local peer? */
                                      10,           /* App port */
@@ -494,13 +490,15 @@ peergroup_ready (void *cls, const char *emsg)
               GNUNET_i2s (&peer2.our_id),
               GNUNET_i2s (&d2->id));
 
-  peer2_listen_socket = GNUNET_STREAM_listen (d2->cfg,
-                                              10, /* App port */
-                                              &stream_listen_cb,
-                                              NULL,
-                                              GNUNET_STREAM_OPTION_END);
+  peer2_listen_socket = 
+    GNUNET_STREAM_listen (d2->cfg,
+                          10, /* App port */
+                          &stream_listen_cb,
+                          NULL,
+                          GNUNET_STREAM_OPTION_SIGNAL_LISTEN_SUCCESS,
+                          &stream_connect,
+                          GNUNET_STREAM_OPTION_END);
   GNUNET_assert (NULL != peer2_listen_socket);
-  GNUNET_SCHEDULER_add_delayed (TIME_REL_SECS(2), &stream_connect, NULL);
 }
 
 
index 0e78dec200def4a7603c9218d7fe7d5d072b3632..8de758ea0c696fcf917fa5796386f7668533347f 100644 (file)
@@ -662,13 +662,10 @@ stream_listen_cb (void *cls,
 
 
 /**
- * Task for connecting the peer to stream as client
- *
- * @param cls PeerData
- * @param tc the TaskContext
+ * Listen success callback; connects a peer to stream as client
  */
 static void
-stream_connect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+stream_connect (void)
 {
   /* Connect to stream library */
   peer1.socket = GNUNET_STREAM_open (d1->cfg,
@@ -720,12 +717,15 @@ peergroup_ready (void *cls, const char *emsg)
               GNUNET_i2s (&peer2.our_id),
               GNUNET_i2s (&d2->id));
 
-  peer2_listen_socket = GNUNET_STREAM_listen (d2->cfg,
-                                              10, /* App port */
-                                              &stream_listen_cb,
-                                              NULL);
+  peer2_listen_socket = 
+    GNUNET_STREAM_listen (d2->cfg,
+                          10, /* App port */
+                          &stream_listen_cb,
+                          NULL,
+                          GNUNET_STREAM_OPTION_SIGNAL_LISTEN_SUCCESS,
+                          &stream_connect,
+                          GNUNET_STREAM_OPTION_END);
   GNUNET_assert (NULL != peer2_listen_socket);
-  GNUNET_SCHEDULER_add_delayed (TIME_REL_SECS(2), &stream_connect, NULL);
 }
 
 
index dff5cc0a669c4cb51b8ed3a5e695f53d174558eb..119028807c4b8bd11a6f917d652c8ad279f2e770 100644 (file)
@@ -324,15 +324,12 @@ stream_listen_cb (void *cls,
 
 
 /**
- * Task for connecting the peer to stream as client
- *
- * @param cls PeerData
- * @param tc the TaskContext
+ * Listen success callback; connects a peer to stream as client
  */
 static void
-stream_connect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+stream_connect (void)
 {
-  struct PeerData *peer = cls;
+  struct PeerData *peer = &peer1;
 
   /* Connect to stream */
   peer->socket = GNUNET_STREAM_open (config,
@@ -360,20 +357,22 @@ run (void *cls,
   struct GNUNET_PeerIdentity self;
   
   GNUNET_TESTING_peer_get_identity (peer, &self);
-  config = cfg;
+  config = cfg;  
+  peer2_listen_socket = 
+    GNUNET_STREAM_listen (config,
+                          10, /* App port */
+                          &stream_listen_cb,
+                          NULL,
+                          GNUNET_STREAM_OPTION_SIGNAL_LISTEN_SUCCESS,
+                          &stream_connect,
+                          GNUNET_STREAM_OPTION_END);
+  GNUNET_assert (NULL != peer2_listen_socket);
+  peer1.self = self;
+  peer2.self = self;
   abort_task =
     GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
                                   (GNUNET_TIME_UNIT_SECONDS, 60), &do_abort,
                                   NULL);
-  peer2_listen_socket = GNUNET_STREAM_listen (config,
-                                              10, /* App port */
-                                              &stream_listen_cb,
-                                              NULL,
-                                              GNUNET_STREAM_OPTION_END);
-  GNUNET_assert (NULL != peer2_listen_socket);
-  peer1.self = self;
-  peer2.self = self;
-  GNUNET_SCHEDULER_add_delayed (TIME_REL_SECS(2), &stream_connect, &peer1);
 }
 
 /**
index e660d77d728ca7015b428208d341cdf5a738f1cc..af1b8ff84de1f0ba5dff62d14e7b70a51732be63 100644 (file)
@@ -335,19 +335,12 @@ stream_listen_cb (void *cls,
 
 
 /**
- * Task for connecting the peer to stream as client
- *
- * @param cls PeerData
- * @param tc the TaskContext
+ * Listen success callback; connects a peer to stream as client
  */
 static void
-stream_connect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+stream_connect (void)
 {
-  struct PeerData *peer = cls;
-
-  GNUNET_assert (&peer1 == peer);
-  /* Connect to stream library */
-  peer->socket = GNUNET_STREAM_open (config,
+  peer1.socket = GNUNET_STREAM_open (config,
                                      &self_id,
                                      10,           /* App port */
                                      &stream_open_cb,
@@ -368,13 +361,15 @@ run (void *cls,
   config = cfg;
   self = peer;
   GNUNET_TESTING_peer_get_identity (peer, &self_id);
-  peer2_listen_socket = GNUNET_STREAM_listen (config,
-                                              10, /* App port */
-                                              &stream_listen_cb,
-                                              &peer2,
-                                              GNUNET_STREAM_OPTION_END);
+  peer2_listen_socket = 
+    GNUNET_STREAM_listen (config,
+                          10, /* App port */
+                          &stream_listen_cb,
+                          &peer2,
+                          GNUNET_STREAM_OPTION_SIGNAL_LISTEN_SUCCESS,
+                          &stream_connect,
+                          GNUNET_STREAM_OPTION_END);
   GNUNET_assert (NULL != peer2_listen_socket);
-  GNUNET_SCHEDULER_add_delayed (TIME_REL_SECS(2), &stream_connect, &peer1);  
   abort_task =
     GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
                                   (GNUNET_TIME_UNIT_SECONDS, 30), &do_abort,
index 90ddf41c62816c781013dae4e663e263aeb48305..09929ca277294d7bbaba17cef0f614f3dcb96396 100644 (file)
@@ -2,6 +2,7 @@
 AUTOSTART = NO
 ACCEPT_FROM = 127.0.0.1;
 HOSTNAME = localhost
+PORT = 12101
 
 [fs]
 AUTOSTART = NO
index ffd2eb5fb43d7d9612329c0c8e2429493dc8059b..3ea6596bd51af4cbbc95dfc8c609c395ecd22be1 100644 (file)
@@ -313,28 +313,22 @@ stream_listen_cb (void *cls,
 
 
 /**
- * Task for connecting the peer to stream as client
- *
- * @param cls PeerData
- * @param tc the TaskContext
+ * Listen success callback; connects a peer to stream as client
  */
 static void
-stream_connect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+stream_connect (void)
 {
-  struct PeerData *peer = cls;
-
-  GNUNET_assert (&peer1 == peer);
-  /* Connect to stream */
-  peer->socket = GNUNET_STREAM_open (config,
-                                     &self_id,         /* Null for local peer? */
-                                     10,           /* App port */
-                                     &stream_open_cb,
-                                     &peer1,
-                                     GNUNET_STREAM_OPTION_TESTING_SET_WRITE_SEQUENCE_NUMBER,
-                                     UINT32_MAX - GNUNET_CRYPTO_random_u32
-                                     (GNUNET_CRYPTO_QUALITY_WEAK, 64),
-                                     GNUNET_STREAM_OPTION_END);
-  GNUNET_assert (NULL != peer->socket);
+  peer1.socket = 
+    GNUNET_STREAM_open (config,
+                        &self_id,         /* Null for local peer? */
+                        10,           /* App port */
+                        &stream_open_cb,
+                        &peer1,
+                        GNUNET_STREAM_OPTION_TESTING_SET_WRITE_SEQUENCE_NUMBER,
+                        UINT32_MAX - GNUNET_CRYPTO_random_u32
+                        (GNUNET_CRYPTO_QUALITY_WEAK, 64),
+                        GNUNET_STREAM_OPTION_END);
+  GNUNET_assert (NULL != peer1.socket);
 }
 
 
@@ -349,15 +343,17 @@ run (void *cls,
   config = cfg;
   self = peer;
   (void) GNUNET_TESTING_peer_get_identity (peer, &self_id);
-  peer2_listen_socket = GNUNET_STREAM_listen (config,
-                                              10, /* App port */
-                                              &stream_listen_cb,
-                                              NULL,
-                                              GNUNET_STREAM_OPTION_LISTEN_TIMEOUT,
-                                              30 * 1000,
-                                              GNUNET_STREAM_OPTION_END);
+  peer2_listen_socket = 
+    GNUNET_STREAM_listen (config,
+                          10, /* App port */
+                          &stream_listen_cb,
+                          NULL,
+                          GNUNET_STREAM_OPTION_LISTEN_TIMEOUT,
+                          60 * 1000,
+                          GNUNET_STREAM_OPTION_SIGNAL_LISTEN_SUCCESS,
+                          &stream_connect,
+                          GNUNET_STREAM_OPTION_END);
   GNUNET_assert (NULL != peer2_listen_socket);
-  GNUNET_SCHEDULER_add_delayed (TIME_REL_SECS(10), &stream_connect, &peer1);
   abort_task =
     GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
                                   (GNUNET_TIME_UNIT_SECONDS, 100), &do_abort,