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/ |