defragmentation.c   defragmentation.c 
skipping to change at line 358 skipping to change at line 358
{ {
x[i] = (double) i; x[i] = (double) i;
y[i] = (double) (first[i].time.abs_value - first[0].time.abs_value); y[i] = (double) (first[i].time.abs_value - first[0].time.abs_value);
} }
gsl_fit_mul (x, 1, y, 1, total, &c1, &cov11, &sumsq); gsl_fit_mul (x, 1, y, 1, total, &c1, &cov11, &sumsq);
c1 += sqrt (sumsq); /* add 1 std dev */ c1 += sqrt (sumsq); /* add 1 std dev */
ret.rel_value = (uint64_t) c1; ret.rel_value = (uint64_t) c1;
if (ret.rel_value == 0) if (ret.rel_value == 0)
ret = GNUNET_TIME_UNIT_MILLISECONDS; /* always at least 1 */ ret = GNUNET_TIME_UNIT_MILLISECONDS; /* always at least 1 */
return ret; return ret;
}; }
/** /**
* Discard the message context that was inactive for the longest time. * Discard the message context that was inactive for the longest time.
* *
* @param dc defragmentation context * @param dc defragmentation context
*/ */
static void static void
discard_oldest_mc (struct GNUNET_DEFRAGMENT_Context *dc) discard_oldest_mc (struct GNUNET_DEFRAGMENT_Context *dc)
{ {
struct MessageContext *old; struct MessageContext *old;
skipping to change at line 414 skipping to change at line 414
uint16_t msize; uint16_t msize;
uint16_t foff; uint16_t foff;
uint32_t fid; uint32_t fid;
char *mbuf; char *mbuf;
unsigned int bit; unsigned int bit;
struct GNUNET_TIME_Absolute now; struct GNUNET_TIME_Absolute now;
struct GNUNET_TIME_Relative delay; struct GNUNET_TIME_Relative delay;
unsigned int bc; unsigned int bc;
unsigned int b; unsigned int b;
unsigned int n; unsigned int n;
unsigned int num_fragments;
int duplicate; int duplicate;
int last;
if (ntohs (msg->size) < sizeof (struct FragmentHeader)) if (ntohs (msg->size) < sizeof (struct FragmentHeader))
{ {
GNUNET_break_op (0); GNUNET_break_op (0);
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
if (ntohs (msg->size) > dc->mtu) if (ntohs (msg->size) > dc->mtu)
{ {
GNUNET_break_op (0); GNUNET_break_op (0);
return GNUNET_SYSERR; return GNUNET_SYSERR;
skipping to change at line 446 skipping to change at line 448
{ {
GNUNET_break_op (0); GNUNET_break_op (0);
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
if (0 != (foff % (dc->mtu - sizeof (struct FragmentHeader)))) if (0 != (foff % (dc->mtu - sizeof (struct FragmentHeader))))
{ {
GNUNET_break_op (0); GNUNET_break_op (0);
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
GNUNET_STATISTICS_update (dc->stats, _("# fragments received"), 1, GNUNET _NO); GNUNET_STATISTICS_update (dc->stats, _("# fragments received"), 1, GNUNET _NO);
num_fragments = (ntohs (msg->size) + dc->mtu - sizeof (struct FragmentHea
der)-1) / (dc->mtu - sizeof (struct FragmentHeader));
last = 0;
for (mc = dc->head; NULL != mc; mc = mc->next)
if (mc->fragment_id > fid)
last++;
mc = dc->head; mc = dc->head;
while ((NULL != mc) && (fid != mc->fragment_id)) while ((NULL != mc) && (fid != mc->fragment_id))
mc = mc->next; mc = mc->next;
bit = foff / (dc->mtu - sizeof (struct FragmentHeader)); bit = foff / (dc->mtu - sizeof (struct FragmentHeader));
if (bit * (dc->mtu - sizeof (struct FragmentHeader)) + ntohs (msg->size) - if (bit * (dc->mtu - sizeof (struct FragmentHeader)) + ntohs (msg->size) -
sizeof (struct FragmentHeader) > msize) sizeof (struct FragmentHeader) > msize)
{ {
/* payload extends past total message size */ /* payload extends past total message size */
GNUNET_break_op (0); GNUNET_break_op (0);
return GNUNET_SYSERR; return GNUNET_SYSERR;
skipping to change at line 524 skipping to change at line 532
/* notify about complete message */ /* notify about complete message */
if ((duplicate == GNUNET_NO) && (0 == mc->bits)) if ((duplicate == GNUNET_NO) && (0 == mc->bits))
{ {
GNUNET_STATISTICS_update (dc->stats, _("# messages defragmented"), 1, GNUNET_STATISTICS_update (dc->stats, _("# messages defragmented"), 1,
GNUNET_NO); GNUNET_NO);
/* message complete, notify! */ /* message complete, notify! */
dc->proc (dc->cls, mc->msg); dc->proc (dc->cls, mc->msg);
} }
/* send ACK */ /* send ACK */
if (mc->frag_times_write_offset - mc->frag_times_start_offset > 1) if (mc->frag_times_write_offset - mc->frag_times_start_offset > 1)
{
dc->latency = estimate_latency (mc); dc->latency = estimate_latency (mc);
}
delay = GNUNET_TIME_relative_multiply (dc->latency, bc + 1); delay = GNUNET_TIME_relative_multiply (dc->latency, bc + 1);
if ((0 == mc->bits) || (GNUNET_YES == duplicate)) /* message complete if ( (last + fid == num_fragments) ||
or duplicate, ACK now! */ (0 == mc->bits) ||
(GNUNET_YES == duplicate))
{ {
/* message complete or duplicate or last missing fragment in
linear sequence; ACK now! */
delay = GNUNET_TIME_UNIT_ZERO; delay = GNUNET_TIME_UNIT_ZERO;
} }
if (GNUNET_SCHEDULER_NO_TASK != mc->ack_task) if (GNUNET_SCHEDULER_NO_TASK != mc->ack_task)
GNUNET_SCHEDULER_cancel (mc->ack_task); GNUNET_SCHEDULER_cancel (mc->ack_task);
mc->ack_task = GNUNET_SCHEDULER_add_delayed (delay, &send_ack, mc); mc->ack_task = GNUNET_SCHEDULER_add_delayed (delay, &send_ack, mc);
if (duplicate == GNUNET_YES) if (duplicate == GNUNET_YES)
return GNUNET_NO; return GNUNET_NO;
return GNUNET_YES; return GNUNET_YES;
} }
 End of changes. 8 change blocks. 
3 lines changed or deleted 17 lines changed or added

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/