gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r1553 - GNUnet/src/server


From: grothoff
Subject: [GNUnet-SVN] r1553 - GNUnet/src/server
Date: Fri, 15 Jul 2005 10:15:51 -0700 (PDT)

Author: grothoff
Date: 2005-07-15 10:15:47 -0700 (Fri, 15 Jul 2005)
New Revision: 1553

Modified:
   GNUnet/src/server/connection.c
Log:
fix

Modified: GNUnet/src/server/connection.c
===================================================================
--- GNUnet/src/server/connection.c      2005-07-15 15:57:20 UTC (rev 1552)
+++ GNUnet/src/server/connection.c      2005-07-15 17:15:47 UTC (rev 1553)
@@ -840,6 +840,7 @@
   P2P_Message * p2pHdr;
   int priority;
   int * perm;
+  char * tmpMsg;
   char * plaintextMsg;
   void * encryptedMsg;
   cron_t expired;
@@ -879,7 +880,38 @@
     }
     be->session.mtu
       = transport->getMTU(be->session.tsession->ttype);
+    if (be->session.mtu > 0) {
+      /* MTU change may require new fragmentation! */
+      SendEntry ** entries;
+      SendEntry * entry;
+      
+      entries = be->sendBuffer;
+      i = 0;
+      ret = be->sendBufferSize;
+      /* assumes entries are sorted by priority! */
+      while (i < ret) {
+       entry = entries[i];
+       if (entry->len > be->session.mtu - sizeof(P2P_Message)) {
+         entries[i] = entries[--ret];
+         fragmentation->fragment(&be->session.sender,
+                                 be->session.mtu - sizeof(P2P_Message),
+                                 entry->pri,
+                                 entry->transmissionTime,
+                                 entry->len,
+                                 entry->callback,
+                                 entry->closure);
+         FREE(entry);
+       }
+       i++;
+      } 
+      if (ret != be->sendBufferSize)
+       GROW(be->sendBuffer,
+            be->sendBufferSize,
+            ret);
+    }
   }
+  if (be->sendBufferSize == 0)
+    return; /* nothing to send */
 
 
   if (be->session.mtu == 0) {
@@ -938,6 +970,11 @@
       }
       i++;
     }
+    if ( (i == 0) &&
+        (entries[i]->len <= be->available_send_window) )
+      return; /* always wait for the highest-priority
+                message (otherwise large messages may
+                starve! */
     while ( (i < be->sendBufferSize) &&
            (be->available_send_window > totalMessageSize) ) {
       if ( (entries[i]->len + totalMessageSize <=
@@ -964,7 +1001,7 @@
           ((totalMessageSize / sizeof(P2P_Message)) < 4) &&
           (randomi(16) != 0) ) ) {
       /* randomization necessary to ensure we eventually send
-        the message if there is nothing else to do! */
+        a small message if there is nothing else to do! */
       be->inSendBuffer = NO;
       return;
     }
@@ -1087,49 +1124,26 @@
     return; /* deferr further */
   }
 
-  /* build message (start with sequence number) */
   GNUNET_ASSERT(totalMessageSize > sizeof(P2P_Message));
-  plaintextMsg = MALLOC(totalMessageSize);
-  p2pHdr = (P2P_Message*) plaintextMsg;
-  p2pHdr->timeStamp
-    = htonl(TIME(NULL));
-  p2pHdr->sequenceNumber
-    = htonl(be->lastSequenceNumberSend);
-  p2pHdr->bandwidth
-    = htonl(be->idealized_limit);
-  p = sizeof(P2P_Message);
 
   /* first, trigger callbacks on selected entries */
   for (i=0;i<be->sendBufferSize;i++) {
     SendEntry * entry = be->sendBuffer[i];
+    tmpMsg = MALLOC(entry->len);
 
     if ( (entry->knapsackSolution == YES) &&
         (entry->callback != NULL) ) {
-      if (OK == entry->callback(&plaintextMsg[p],
+      if (OK == entry->callback(tmpMsg,
                                entry->closure,
                                entry->len)) {
        entry->callback = NULL;
-       entry->closure = MALLOC(entry->len);
-       memcpy(entry->closure,
-              &plaintextMsg[p],
-              entry->len);
+       entry->closure = tmpMsg;
       } else {
-       /* should not happen if everything went well,
-          add random padding instead */
-       p2p_HEADER * part;
-       
-       part = (p2p_HEADER *) &plaintextMsg[p];
-       part->size
-         = htons(entry->len);
-       part->type
-         = htons(p2p_PROTO_NOISE);
-       for (i=p+sizeof(p2p_HEADER);i<entry->len+p;i++)
-         plaintextMsg[p] = (char) rand();
+       FREE(tmpMsg);
        entry->callback = NULL;
        entry->closure = NULL;
-       if (stats != NULL)
-         stats->change(stat_noise_sent,
-                       entry->len);
+       FREE(entry);
+       be->sendBuffer[i] = NULL;
       }
     }
   }
@@ -1163,9 +1177,22 @@
     }
   }
 
+  /* build message (start with sequence number) */
+  plaintextMsg = MALLOC(totalMessageSize);
+  p2pHdr = (P2P_Message*) plaintextMsg;
+  p2pHdr->timeStamp
+    = htonl(TIME(NULL));
+  p2pHdr->sequenceNumber
+    = htonl(be->lastSequenceNumberSend);
+  p2pHdr->bandwidth
+    = htonl(be->idealized_limit);
+  p = sizeof(P2P_Message);
+
   for (i=0;i<be->sendBufferSize;i++) {
     SendEntry * entry = be->sendBuffer[perm[i]];
-
+    
+    if (entry == NULL)
+      continue;
     if (entry->knapsackSolution == YES) {
       GNUNET_ASSERT(entry->callback == NULL);
       memcpy(&plaintextMsg[p],
@@ -1205,6 +1232,7 @@
     }
   }
   FREE(perm);
+  perm = NULL;
 
   /* still room left? try callbacks! */
   pos = scl_nextHead;
@@ -1877,6 +1905,7 @@
        }
       }
       FREE(perm);
+      perm = NULL;
 
       if ( (schedulableBandwidth > 0) &&
           (activePeerCount > 0) ) {
@@ -1887,6 +1916,7 @@
            += (unsigned int) (schedulableBandwidth/activePeerCount);   
        schedulableBandwidth = 0;
        FREE(perm);
+       perm = NULL;
       }
       break;
     } /* didAssign == NO? */





reply via email to

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