tracker->timeout.tv_usec = p->ts.tv_usec;
Frag *prev = NULL, *next = NULL;
- int overlap = 0;
+ bool overlap = false;
ltrim = 0;
if (!RB_EMPTY(&tracker->fragment_tree)) {
if (prev->skip) {
goto next;
}
+ if (frag_offset < prev->offset + prev->data_len && prev->offset < frag_end) {
+ overlap = true;
+ }
switch (tracker->policy) {
case DEFRAG_POLICY_BSD:
if (frag_offset < prev->offset + prev->data_len) {
if (frag_offset >= prev->offset) {
ltrim = prev->offset + prev->data_len - frag_offset;
- overlap++;
}
if ((next != NULL) && (frag_end > next->offset)) {
next->ltrim = frag_end - next->offset;
- overlap++;
}
if ((frag_offset < prev->offset) &&
(frag_end >= prev->offset + prev->data_len)) {
prev->skip = 1;
- overlap++;
}
goto insert;
}
if (prev->offset + prev->ltrim < frag_offset + ltrim &&
prev->offset + prev->data_len > frag_offset + ltrim) {
ltrim += prev->offset + prev->data_len - frag_offset;
- overlap++;
}
/* Check if new fragment overlaps the beginning of
if (frag_offset + ltrim < prev->offset + prev->ltrim &&
frag_end > prev->offset + prev->ltrim) {
prev->ltrim += frag_end - (prev->offset + prev->ltrim);
- overlap++;
goto insert;
}
/* If new fragment fits inside a previous fragment, drop it. */
if (frag_offset + ltrim >= prev->offset + ltrim &&
frag_end <= prev->offset + prev->data_len) {
- overlap++;
goto done;
}
if (frag_offset + ltrim < prev->offset + ltrim &&
frag_end > prev->offset + prev->data_len) {
prev->skip = 1;
- overlap++;
goto insert;
}
if (frag_offset + ltrim > prev->offset + prev->ltrim &&
frag_offset + ltrim < prev->offset + prev->data_len) {
ltrim += prev->offset + prev->data_len - frag_offset;
- overlap++;
goto insert;
}
if (frag_offset + ltrim == prev->offset + ltrim &&
frag_end > prev->offset + prev->data_len) {
ltrim += prev->offset + prev->data_len - frag_offset;
- overlap++;
goto insert;
}
break;
if (frag_offset < prev->offset + prev->data_len) {
if (frag_offset >= prev->offset) {
ltrim = prev->offset + prev->data_len - frag_offset;
- overlap++;
}
if ((frag_offset < prev->offset) &&
(frag_end >= prev->offset + prev->data_len)) {
prev->skip = 1;
- overlap++;
}
goto insert;
}
case DEFRAG_POLICY_FIRST:
if ((frag_offset >= prev->offset) &&
(frag_end <= prev->offset + prev->data_len)) {
- overlap++;
goto done;
}
if (frag_offset < prev->offset) {
}
if (frag_offset < prev->offset + prev->data_len) {
ltrim = prev->offset + prev->data_len - frag_offset;
- overlap++;
goto insert;
}
break;
if (frag_offset <= prev->offset) {
if (frag_end > prev->offset) {
prev->ltrim = frag_end - prev->offset;
- overlap++;
}
goto insert;
}