Removing all the tests for the bluetooth transport plugin.
[oweals/gnunet.git] / src / transport / plugin_transport_udp.c
index cb95a5a00023dbbaa7b69fc4b7bb0cf56b19eb86..bc64fd5d25b43004920515b6f3e951530168ccbb 100644 (file)
@@ -78,25 +78,25 @@ static struct PrettyPrinterContext *ppc_dll_tail;
  */
 struct PrettyPrinterContext
 {
-       /**
-        * DLL
-        */
-       struct PrettyPrinterContext *next;
-
-       /**
-        * DLL
-        */
-       struct PrettyPrinterContext *prev;
-
-       /**
-        * Timeout task
-        */
-       GNUNET_SCHEDULER_TaskIdentifier timeout_task;
-
-       /**
-        * Resolver handle
-        */
-       struct GNUNET_RESOLVER_RequestHandle *resolver_handle;
+  /**
+   * DLL
+   */
+  struct PrettyPrinterContext *next;
+  
+  /**
+   * DLL
+   */
+  struct PrettyPrinterContext *prev;
+
+  /**
+   * Timeout task
+   */
+  GNUNET_SCHEDULER_TaskIdentifier timeout_task;
+
+  /**
+   * Resolver handle
+   */
+  struct GNUNET_RESOLVER_RequestHandle *resolver_handle;
 
   /**
    * Function to call with the result.
@@ -192,6 +192,7 @@ struct SessionCompareContext
 {
   struct Session *res;
   const struct GNUNET_HELLO_Address *addr;
+  int inbound;
 };
 
 
@@ -464,22 +465,23 @@ udp_plugin_select_v6 (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc);
 
 
 /**
- * Start session timeout
+ * Cancel timeout
  */
 static void
-start_session_timeout (struct Session *s);
+stop_session_timeout (struct Session *s)
+{
+  GNUNET_assert (NULL != s);
 
-/**
- * Increment session timeout due to activity
- */
-static void
-reschedule_session_timeout (struct Session *s);
+  if (GNUNET_SCHEDULER_NO_TASK != s->timeout_task)
+  {
+    GNUNET_SCHEDULER_cancel (s->timeout_task);
+    s->timeout_task = GNUNET_SCHEDULER_NO_TASK;
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Timeout stopped for session %p canceled\n",
+                s);
+  }
+}
 
-/**
- * Cancel timeout
- */
-static void
-stop_session_timeout (struct Session *s);
 
 /**
  * (re)schedule select tasks for this plugin.
@@ -558,8 +560,7 @@ udp_address_to_string (void *cls, const void *addr, size_t addrlen)
   uint16_t port;
   uint32_t options;
 
-  options = 0;
-  if (addrlen == sizeof (struct IPv6UdpAddress))
+  if ((NULL != addr) && (addrlen == sizeof (struct IPv6UdpAddress)))
   {
     t6 = addr;
     af = AF_INET6;
@@ -568,7 +569,7 @@ udp_address_to_string (void *cls, const void *addr, size_t addrlen)
     memcpy (&a6, &t6->ipv6_addr, sizeof (a6));
     sb = &a6;
   }
-  else if (addrlen == sizeof (struct IPv4UdpAddress))
+  else if ((NULL != addr) && (addrlen == sizeof (struct IPv4UdpAddress)))
   {
     t4 = addr;
     af = AF_INET;
@@ -578,17 +579,18 @@ udp_address_to_string (void *cls, const void *addr, size_t addrlen)
     sb = &a4;
   }
   else if (addrlen == 0)
-       {
-               GNUNET_snprintf (rbuf, sizeof (rbuf), "%s", TRANSPORT_SESSION_INBOUND_STRING);
-               return rbuf;
-       }
+  {
+    GNUNET_snprintf (rbuf, sizeof (rbuf), "%s", TRANSPORT_SESSION_INBOUND_STRING);
+    return rbuf;
+  }
   else
   {
     return NULL;
   }
   inet_ntop (af, sb, buf, INET6_ADDRSTRLEN);
 
-  GNUNET_snprintf (rbuf, sizeof (rbuf), (af == AF_INET6) ? "%s.%u.[%s]:%u" : "%s.%u.%s:%u",
+  GNUNET_snprintf (rbuf, sizeof (rbuf), 
+                  (af == AF_INET6) ? "%s.%u.[%s]:%u" : "%s.%u.%s:%u",
                    PLUGIN_NAME, options, buf, port);
   return rbuf;
 }
@@ -620,7 +622,7 @@ udp_string_to_address (void *cls, const char *addr, uint16_t addrlen,
   address = NULL;
   plugin = NULL;
   optionstr = NULL;
-  options = 0;
+
   if ((NULL == addr) || (addrlen == 0))
   {
     GNUNET_break (0);
@@ -701,7 +703,7 @@ udp_string_to_address (void *cls, const char *addr, uint16_t addrlen,
 }
 
 
-void
+static void
 ppc_cancel_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
        struct PrettyPrinterContext *ppc = cls;
@@ -793,7 +795,6 @@ udp_plugin_address_pretty_printer (void *cls, const char *type,
   uint16_t port;
   uint32_t options;
 
-  options = 0;
   if (addrlen == sizeof (struct IPv6UdpAddress))
   {
     u6 = addr;
@@ -1140,6 +1141,7 @@ dequeue (struct Plugin *plugin, struct UDP_MessageWrapper * udpw)
                                  plugin->ipv6_queue_tail, udpw);
 }
 
+
 static void
 fragmented_message_done (struct UDP_FragmentationContext *fc, int result)
 {
@@ -1148,7 +1150,10 @@ fragmented_message_done (struct UDP_FragmentationContext *fc, int result)
   struct UDP_MessageWrapper dummy;
   struct Session *s = fc->session;
 
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "%p : Fragmented message removed with result %s\n", fc, (result == GNUNET_SYSERR) ? "FAIL" : "SUCCESS");
+  LOG (GNUNET_ERROR_TYPE_DEBUG, 
+       "%p : Fragmented message removed with result %s\n",
+       fc,
+       (result == GNUNET_SYSERR) ? "FAIL" : "SUCCESS");
   
   /* Call continuation for fragmented message */
   memset (&dummy, 0, sizeof (dummy));
@@ -1250,7 +1255,6 @@ disconnect_session (struct Session *s)
       call_continuation(udpw, GNUNET_SYSERR);
       GNUNET_free (udpw);
     }
-    udpw = next;
   }
   plugin->env->session_end (plugin->env->cls, &s->target, s);
 
@@ -1377,25 +1381,6 @@ reschedule_session_timeout (struct Session *s)
 }
 
 
-/**
- * Cancel timeout
- */
-static void
-stop_session_timeout (struct Session *s)
-{
-  GNUNET_assert (NULL != s);
-
-  if (GNUNET_SCHEDULER_NO_TASK != s->timeout_task)
-  {
-    GNUNET_SCHEDULER_cancel (s->timeout_task);
-    s->timeout_task = GNUNET_SCHEDULER_NO_TASK;
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Timeout stopped for session %p canceled\n",
-                s);
-  }
-}
-
-
 static struct Session *
 create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target,
                 const void *addr, size_t addrlen,
@@ -1408,6 +1393,12 @@ create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target,
   struct sockaddr_in6 *v6;
   size_t len;
 
+  if (NULL == addr)
+  {
+       GNUNET_break (0);
+       return NULL;
+  }
+
   switch (addrlen)
   {
   case sizeof (struct IPv4UdpAddress):
@@ -1441,8 +1432,7 @@ create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target,
       return NULL;
     }
     t6 = addr;
-    s =
-        GNUNET_malloc (sizeof (struct Session) + sizeof (struct sockaddr_in6));
+    s = GNUNET_malloc (sizeof (struct Session) + sizeof (struct sockaddr_in6));
     len = sizeof (struct sockaddr_in6);
     v6 = (struct sockaddr_in6 *) &s[1];
     v6->sin6_family = AF_INET6;
@@ -1485,14 +1475,19 @@ session_cmp_it (void *cls,
 
   socklen_t s_addrlen = s->addrlen;
 
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "Comparing  address %s <-> %s\n",
-      udp_address_to_string (NULL, (void *) address->address, address->address_length),
-      GNUNET_a2s (s->sock_addr, s->addrlen));
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Comparing address %s <-> %s\n",
+       udp_address_to_string (NULL, (void *) address->address, 
+                             address->address_length),
+       GNUNET_a2s (s->sock_addr, s->addrlen));
+  if (s->inbound != cctx->inbound)
+    return GNUNET_YES;
   if ((address->address_length == sizeof (struct IPv4UdpAddress)) &&
       (s_addrlen == sizeof (struct sockaddr_in)))
   {
     struct IPv4UdpAddress * u4 = NULL;
     u4 = (struct IPv4UdpAddress *) address->address;
+    GNUNET_assert (NULL != u4);
     const struct sockaddr_in *s4 = (const struct sockaddr_in *) s->sock_addr;
     if ((0 == memcmp ((const void *) &u4->ipv4_addr,(const void *) &s4->sin_addr, sizeof (struct in_addr))) &&
         (u4->u4_port == s4->sin_port))
@@ -1507,6 +1502,7 @@ session_cmp_it (void *cls,
   {
     struct IPv6UdpAddress * u6 = NULL;
     u6 = (struct IPv6UdpAddress *) address->address;
+    GNUNET_assert (NULL != u6);
     const struct sockaddr_in6 *s6 = (const struct sockaddr_in6 *) s->sock_addr;
     if ((0 == memcmp (&u6->ipv6_addr, &s6->sin6_addr, sizeof (struct in6_addr))) &&
         (u6->u6_port == s6->sin6_port))
@@ -1540,11 +1536,13 @@ udp_get_network (void *cls,
  *
  * @param cls the plugin
  * @param address the address
+ * @param inbound look for inbound session
  * @return the session or NULL of max connections exceeded
  */
 static struct Session *
 udp_plugin_lookup_session (void *cls,
-                 const struct GNUNET_HELLO_Address *address)
+                          const struct GNUNET_HELLO_Address *address,
+                          int inbound)
 {
   struct Plugin * plugin = cls;
   struct IPv6UdpAddress * udp_a6;
@@ -1588,6 +1586,7 @@ udp_plugin_lookup_session (void *cls,
   struct SessionCompareContext cctx;
   cctx.addr = address;
   cctx.res = NULL;
+  cctx.inbound = inbound;
   LOG (GNUNET_ERROR_TYPE_DEBUG,
        "Looking for existing session for peer `%s' `%s' \n", 
        GNUNET_i2s (&address->peer), 
@@ -1601,22 +1600,25 @@ udp_plugin_lookup_session (void *cls,
   return NULL;
 }
 
+
 static struct Session *
 udp_plugin_create_session (void *cls,
-                  const struct GNUNET_HELLO_Address *address)
+                          const struct GNUNET_HELLO_Address *address,
+                          int inbound)
 {
-  struct Session * s = NULL;
+  struct Session *s;
 
-  /* otherwise create new */
   s = create_session (plugin,
-      &address->peer,
-      address->address,
-      address->address_length,
-      NULL, NULL);
+                     &address->peer,
+                     address->address,
+                     address->address_length,
+                     NULL, NULL);
   if (NULL == s)
-       return NULL; /* protocol not supported or address invalid */
+    return NULL; /* protocol not supported or address invalid */
+  s->inbound = inbound;
   LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Creating new session %p for peer `%s' address `%s'\n",
+       "Creating new %s session %p for peer `%s' address `%s'\n",
+       (GNUNET_YES == s->inbound) ? "inbound" : "outbound",
        s,
        GNUNET_i2s(&address->peer),
        udp_address_to_string(NULL,address->address,address->address_length));
@@ -1633,7 +1635,6 @@ udp_plugin_create_session (void *cls,
 }
 
 
-
 /**
  * Creates a new outbound session the transport service will use to send data to the
  * peer
@@ -1644,24 +1645,23 @@ udp_plugin_create_session (void *cls,
  */
 static struct Session *
 udp_plugin_get_session (void *cls,
-                  const struct GNUNET_HELLO_Address *address)
+                       const struct GNUNET_HELLO_Address *address)
 {
-  struct Session * s = NULL;
+  struct Session *s;
 
   if (NULL == address)
   {
-       GNUNET_break (0);
-       return NULL;
+    GNUNET_break (0);
+    return NULL;
   }
   if ((address->address_length != sizeof (struct IPv4UdpAddress)) &&
-               (address->address_length != sizeof (struct IPv6UdpAddress)))
-               return NULL;
+      (address->address_length != sizeof (struct IPv6UdpAddress)))
+    return NULL;
 
   /* otherwise create new */
-  if (NULL != (s = udp_plugin_lookup_session(cls, address)))
-       return s;
-  else
-       return udp_plugin_create_session (cls, address);
+  if (NULL != (s = udp_plugin_lookup_session (cls, address, GNUNET_NO)))
+    return s;
+  return udp_plugin_create_session (cls, address, GNUNET_NO);
 }
 
 
@@ -1706,6 +1706,7 @@ send_next_fragment (void *cls,
                    int result, size_t payload, size_t physical)
 {
   struct UDP_MessageWrapper *udpw = cls;
+
   GNUNET_FRAGMENT_context_transmission_done (udpw->frag_ctx->frag);  
 }
 
@@ -2045,14 +2046,13 @@ process_udp_message (struct Plugin *plugin, const struct UDPMessage *msg,
        GNUNET_a2s (sender_addr, sender_addr_len));
 
   struct GNUNET_HELLO_Address * address = GNUNET_HELLO_address_allocate(&msg->sender, "udp", arg, args);
-  if (NULL == (s = udp_plugin_lookup_session (plugin, address)))
+  if (NULL == (s = udp_plugin_lookup_session (plugin, address, GNUNET_YES)))
   {
-               s = udp_plugin_create_session(plugin, address);
-               s->inbound = GNUNET_YES;
-         plugin->env->session_start (NULL, &address->peer, PLUGIN_NAME,
-                       (GNUNET_YES == s->inbound) ? NULL : address->address,
-                       (GNUNET_YES == s->inbound) ? 0 : address->address_length,
-                 s, NULL, 0);
+    s = udp_plugin_create_session (plugin, address, GNUNET_YES);
+    plugin->env->session_start (NULL, &address->peer, PLUGIN_NAME,
+                  (GNUNET_YES == s->inbound) ? NULL : address->address,
+                  (GNUNET_YES == s->inbound) ? 0 : address->address_length,
+            s, NULL, 0);
   }
   GNUNET_free (address);
 
@@ -2126,11 +2126,13 @@ fragment_msg_proc (void *cls, const struct GNUNET_MessageHeader *msg)
 
 struct LookupContext
 {
-  const struct sockaddr * addr;
-
   struct Session *res;
 
+  const struct sockaddr * addr;
+
   size_t addrlen;
+
+  int must_have_frag_ctx;
 };
 
 
@@ -2140,11 +2142,21 @@ lookup_session_by_addr_it (void *cls, const struct GNUNET_HashCode * key, void *
   struct LookupContext *l_ctx = cls;
   struct Session * s = value;
 
+  if ((GNUNET_YES == l_ctx->must_have_frag_ctx) && (NULL == s->frag_ctx))
+    return GNUNET_YES;
+
+  /*
+  GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Comparing session: have %s %s %p<-> want %s\n",
+      GNUNET_a2s(s->sock_addr, s->addrlen),
+      (GNUNET_YES == s->inbound) ? "inbound" : "outbound",
+      s->frag_ctx,
+      GNUNET_a2s(l_ctx->addr, l_ctx->addrlen));
+   */
   if ((s->addrlen == l_ctx->addrlen) &&
       (0 == memcmp (s->sock_addr, l_ctx->addr, s->addrlen)))
   {
     l_ctx->res = s;
-    return GNUNET_NO;
+    return GNUNET_YES;
   }
   return GNUNET_YES;
 }
@@ -2171,6 +2183,7 @@ ack_proc (void *cls, uint32_t id, const struct GNUNET_MessageHeader *msg)
   l_ctx.addr = rc->src_addr;
   l_ctx.addrlen = rc->addr_len;
   l_ctx.res = NULL;
+  l_ctx.must_have_frag_ctx = GNUNET_NO;
   GNUNET_CONTAINER_multihashmap_iterate (rc->plugin->sessions,
       &lookup_session_by_addr_it,
       &l_ctx);
@@ -2245,16 +2258,17 @@ read_process_ack (struct Plugin *plugin,
   l_ctx.addr = (const struct sockaddr *) addr;
   l_ctx.addrlen = fromlen;
   l_ctx.res = NULL;
+  l_ctx.must_have_frag_ctx = GNUNET_YES;
   GNUNET_CONTAINER_multihashmap_iterate (plugin->sessions,
                                         &lookup_session_by_addr_it,
                                         &l_ctx);
   s = l_ctx.res;
-
   if ((NULL == s) || (NULL == s->frag_ctx))
   {
     return;
   }
 
+
   flow_delay.rel_value_us = (uint64_t) ntohl (udp_ack->delay);
   LOG (GNUNET_ERROR_TYPE_DEBUG, 
        "We received a sending delay of %s\n",
@@ -2455,6 +2469,7 @@ udp_select_read (struct Plugin *plugin, struct GNUNET_NETWORK_Handle *rsock)
   }
 }
 
+
 static struct UDP_MessageWrapper *
 remove_timeout_messages_and_select (struct UDP_MessageWrapper *head,
                                     struct GNUNET_NETWORK_Handle *sock)
@@ -2622,6 +2637,7 @@ analyze_send_error (struct Plugin *plugin,
  }
 }
 
+
 static size_t
 udp_select_send (struct Plugin *plugin, struct GNUNET_NETWORK_Handle *sock)
 {