gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r19580 - gnunet/src/transport


From: gnunet
Subject: [GNUnet-SVN] r19580 - gnunet/src/transport
Date: Tue, 31 Jan 2012 18:53:30 +0100

Author: wachs
Date: 2012-01-31 18:53:30 +0100 (Tue, 31 Jan 2012)
New Revision: 19580

Modified:
   gnunet/src/transport/plugin_transport_udp_new.c
Log:
- changes


Modified: gnunet/src/transport/plugin_transport_udp_new.c
===================================================================
--- gnunet/src/transport/plugin_transport_udp_new.c     2012-01-31 16:58:37 UTC 
(rev 19579)
+++ gnunet/src/transport/plugin_transport_udp_new.c     2012-01-31 17:53:30 UTC 
(rev 19580)
@@ -104,6 +104,10 @@
    */
   struct GNUNET_TIME_Absolute flow_delay_from_other_peer;
 
+  struct GNUNET_TIME_Relative flow_delay_for_other_peer;
+
+  struct GNUNET_ATS_Information ats;
+
   struct FragmentationContext * head;
   struct FragmentationContext * tail;
 };
@@ -238,7 +242,7 @@
   struct Session *session;
   struct UDPMessageWrapper *prev;
   struct UDPMessageWrapper *next;
-  struct UDPMessage *udp;
+  char *udp;
   size_t msg_size;
 
   struct GNUNET_TIME_Absolute timeout;
@@ -585,7 +589,6 @@
   struct sockaddr_in *v4;
   struct sockaddr_in6 *v6;
   size_t len;
-  struct GNUNET_ATS_Information ats;
 
   switch (addrlen)
   {
@@ -604,7 +607,7 @@
 #endif
     v4->sin_port = t4->u4_port;
     v4->sin_addr.s_addr = t4->ipv4_addr;
-    ats = plugin->env->get_address_type (plugin->env->cls, (const struct 
sockaddr *) v4, sizeof (struct sockaddr_in));
+    s->ats = plugin->env->get_address_type (plugin->env->cls, (const struct 
sockaddr *) v4, sizeof (struct sockaddr_in));
     break;
   case sizeof (struct IPv6UdpAddress):
     if (NULL == plugin->sockv6)
@@ -622,7 +625,7 @@
 #endif
     v6->sin6_port = t6->u6_port;
     v6->sin6_addr = t6->ipv6_addr;
-    ats = plugin->env->get_address_type (plugin->env->cls, (const struct 
sockaddr *) v6, sizeof (struct sockaddr_in6));
+    s->ats = plugin->env->get_address_type (plugin->env->cls, (const struct 
sockaddr *) v6, sizeof (struct sockaddr_in6));
     break;
   default:
     /* Must have a valid address to send to */
@@ -775,7 +778,7 @@
 
   udpw = GNUNET_malloc (sizeof (struct UDPMessageWrapper) + msg_len);
   udpw->session = frag_ctx->session;
-  udpw->udp = (struct UDPMessage *) &udpw[1];
+  udpw->udp = (char *) &udpw[1];
 
   udpw->msg_size = msg_len;
   udpw->cont = frag_ctx->cont;
@@ -862,7 +865,7 @@
   {
     udpw = GNUNET_malloc (sizeof (struct UDPMessageWrapper) + mlen);
     udpw->session = s;
-    udpw->udp = (struct UDPMessage *) &udpw[1];
+    udpw->udp = (char *) &udpw[1];
     udpw->msg_size = mlen;
     udpw->timeout = GNUNET_TIME_absolute_add(GNUNET_TIME_absolute_get(), to);
     udpw->cont = cont;
@@ -870,7 +873,7 @@
     udpw->frag = NULL;
 
     memcpy (udpw->udp, udp, sizeof (struct UDPMessage));
-    memcpy (&udpw->udp[1], msgbuf, msgbuf_size);
+    memcpy (&udpw->udp[sizeof (struct UDPMessage)], msgbuf, msgbuf_size);
 
     GNUNET_CONTAINER_DLL_insert(plugin->msg_head, plugin->msg_tail, udpw);
   }
@@ -999,20 +1002,21 @@
   struct GNUNET_ATS_Information ats[2];
   struct GNUNET_TIME_Relative delay;
 
+  GNUNET_assert (si->session != NULL);
   /* setup ATS */
   ats[0].type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE);
   ats[0].value = htonl (1);
-  ats[1].type = htonl (GNUNET_ATS_NETWORK_TYPE);
-  ats[1].value = htonl (GNUNET_ATS_COST_WAN);
-  //GNUNET_break (ntohl(si->session->ats_address_network_type) != 
GNUNET_ATS_NET_UNSPECIFIED);
+  ats[1] = si->session->ats;
+  GNUNET_break (ntohl(ats[1].value) != GNUNET_ATS_NET_UNSPECIFIED);
+
   delay = plugin->env->receive (plugin->env->cls,
                 &si->sender,
                 hdr,
                 (const struct GNUNET_ATS_Information *) &ats, 2,
-                NULL,
+                si->session,
                 si->arg,
                 si->args);
-  //si->session->flow_delay_for_other_peer = delay;
+  si->session->flow_delay_for_other_peer = delay;
 }
 
 
@@ -1030,6 +1034,7 @@
                      socklen_t sender_addr_len)
 {
   struct SourceInformation si;
+  struct Session * s = NULL;
   struct IPv4UdpAddress u4;
   struct IPv6UdpAddress u6;
   struct GNUNET_ATS_Information ats;
@@ -1078,7 +1083,12 @@
        GNUNET_a2s (sender_addr, sender_addr_len));
 #endif
 
+  struct GNUNET_HELLO_Address * address = 
GNUNET_HELLO_address_allocate(&msg->sender, "udp", arg, args);
+  s = udp_plugin_get_session(plugin, address);
+  GNUNET_free (address);
+
   /* iterate over all embedded messages */
+  si.session = s;
   si.sender = msg->sender;
   si.arg = arg;
   si.args = args;
@@ -1141,6 +1151,29 @@
                        rc->src_addr, rc->addr_len);
 }
 
+struct LookupContext
+{
+  struct DefragContext *rc;
+  struct Session *res;
+};
+
+static int
+lookup_session_by_addr_it (void *cls, const GNUNET_HashCode * key, void *value)
+{
+  struct LookupContext *l_ctx = cls;
+  struct Session * s = value;
+
+  if ((s->addrlen == l_ctx->rc->addr_len) &&
+      (0 == memcmp (s->sock_addr, l_ctx->rc->src_addr, s->addrlen)))
+  {
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+         "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY \n");
+    l_ctx->res = s;
+    return GNUNET_NO;
+  }
+  return GNUNET_YES;
+}
+
 /**
  * Transmit an acknowledgement.
  *
@@ -1151,17 +1184,22 @@
 static void
 ack_proc (void *cls, uint32_t id, const struct GNUNET_MessageHeader *msg)
 {
-#if 0
   struct DefragContext *rc = cls;
 
   size_t msize = sizeof (struct UDP_ACK_Message) + ntohs (msg->size);
-  char buf[msize];
   struct UDP_ACK_Message *udp_ack;
   uint32_t delay = 0;
-
+  struct UDPMessageWrapper *udpw;
   struct Session *s;
 
-  s = find_inbound_session_by_addr (rc->plugin, rc->src_addr, rc->addr_len);
+  struct LookupContext l_ctx;
+  l_ctx.rc = rc;
+  l_ctx.res = NULL;
+  GNUNET_CONTAINER_multihashmap_get_multiple(rc->plugin->sessions,
+      &rc->id.hashPubKey,
+      &lookup_session_by_addr_it,
+      &l_ctx);
+  s = l_ctx.res;
   if (s != NULL)
   {
     if (s->flow_delay_for_other_peer.rel_value <= UINT32_MAX)
@@ -1180,14 +1218,23 @@
                                                                      
sockaddr_in6)),
        delay);
 #endif
-  udp_ack = (struct UDP_ACK_Message *) buf;
+  udpw = GNUNET_malloc (sizeof (struct UDPMessageWrapper) + msize);
+  udpw->cont = NULL;
+  udpw->cont_cls = NULL;
+  udpw->frag = NULL;
+  udpw->msg_size = msize;
+  udpw->session = s;
+  udpw->timeout = GNUNET_TIME_absolute_get_forever();
+  udpw->udp = (char *)&udpw[1];
+
+  udp_ack = (struct UDP_ACK_Message *) udpw->udp;
   udp_ack->header.size = htons ((uint16_t) msize);
   udp_ack->header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_UDP_ACK);
   udp_ack->delay = htonl (delay);
   udp_ack->sender = *rc->plugin->env->my_identity;
   memcpy (&udp_ack[1], msg, ntohs (msg->size));
-  (void) udp_send (rc->plugin, rc->src_addr, &udp_ack->header);
-#endif
+
+  GNUNET_CONTAINER_DLL_insert(rc->plugin->msg_head, rc->plugin->msg_tail, 
udpw);
 }
 
 
@@ -1790,6 +1837,22 @@
   return api;
 }
 
+int heap_cleanup_iterator (void *cls,
+                          struct GNUNET_CONTAINER_HeapNode *
+                          node, void *element,
+                          GNUNET_CONTAINER_HeapCostType
+                          cost)
+{
+  struct DefragContext * d_ctx = element;
+
+  GNUNET_CONTAINER_heap_remove_node (node);
+  GNUNET_DEFRAGMENT_context_destroy(d_ctx->defrag);
+  GNUNET_free (d_ctx);
+
+  return GNUNET_YES;
+}
+
+
 /**
  * The exported method. Makes the core api available via a global and
  * returns the udp transport API.
@@ -1828,6 +1891,8 @@
 
   if (plugin->defrag_ctxs != NULL)
   {
+    GNUNET_CONTAINER_heap_iterate(plugin->defrag_ctxs,
+        heap_cleanup_iterator, NULL);
     GNUNET_CONTAINER_heap_destroy(plugin->defrag_ctxs);
     plugin->defrag_ctxs = NULL;
   }




reply via email to

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