[Top][All Lists]
[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? */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r1553 - GNUnet/src/server,
grothoff <=