gnunet-svn
[Top][All Lists]
Advanced

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

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


From: grothoff
Subject: [GNUnet-SVN] r1793 - GNUnet/src/server
Date: Sat, 20 Aug 2005 11:45:04 -0700 (PDT)

Author: grothoff
Date: 2005-08-20 11:45:03 -0700 (Sat, 20 Aug 2005)
New Revision: 1793

Modified:
   GNUnet/src/server/connection.c
Log:
fixing mantis 889

Modified: GNUnet/src/server/connection.c
===================================================================
--- GNUnet/src/server/connection.c      2005-08-20 18:18:27 UTC (rev 1792)
+++ GNUnet/src/server/connection.c      2005-08-20 18:45:03 UTC (rev 1793)
@@ -1222,6 +1222,8 @@
   SendEntry * entry;
   int i;
   int ret;
+  int j;
+  int changed;
       
   if (be->session.tsession == NULL) {
     be->session.tsession
@@ -1233,31 +1235,39 @@
       = transport->getMTU(be->session.tsession->ttype);
     if (be->session.mtu > 0) {
       /* MTU change may require new fragmentation! */
-      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_PACKET_HEADER)) {
-         entries[i] = entries[--ret];
-         fragmentation->fragment(&be->session.sender,
-                                 be->session.mtu - sizeof(P2P_PACKET_HEADER),
-                                 entry->pri,
-                                 entry->transmissionTime,
-                                 entry->len,
-                                 entry->callback,
-                                 entry->closure);
-         FREE(entry);
-       }
-       i++;
-      } 
-      if (ret != be->sendBufferSize)
-       GROW(be->sendBuffer,
-            be->sendBufferSize,
-            ret);
-    }
-  }
+      changed = YES;
+      while (changed) {
+       entries = be->sendBuffer;
+       i = 0;
+       ret = be->sendBufferSize;
+       while (i < ret) {
+         entry = entries[i];
+         if (entry->len > be->session.mtu - sizeof(P2P_PACKET_HEADER)) {
+           ret--;
+           for (j=i;j<ret;j++) 
+             entries[j] = entries[j+1]; /* preserve ordering */
+           GROW(be->sendBuffer,
+                be->sendBufferSize,
+                ret);      
+           /* calling fragment will change be->sendBuffer;
+              thus we need to restart from the beginning afterwards... */
+           fragmentation->fragment(&be->session.sender,
+                                   be->session.mtu - sizeof(P2P_PACKET_HEADER),
+                                   entry->pri,
+                                   entry->transmissionTime,
+                                   entry->len,
+                                   entry->callback,
+                                   entry->closure);
+           FREE(entry);
+           changed = YES;
+           break;
+         } else {
+           i++;
+         }
+       } /* for all i (until change) */
+      } /* while changed */
+    } /* if MTU changed */
+  } /* if need to reconnect */
   return OK;
 }
 





reply via email to

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