// if we have something to discard
if (M_index != this_fragmentation->start_index)
{
- uint8_t end_found = 0;
// look for end of previous frame
// start at M-1, going backward
- for (end_index = (M_index + (MAXFRAGNUM-1)) & MAXFRAGNUM_MASK;
- end_index != this_fragmentation->start_index;
- end_index = (end_index + (MAXFRAGNUM-1)) & MAXFRAGNUM_MASK)
+ uint16_t index = M_index;
+ uint8_t end_or_hole_found = 0;
+
+ for (;;)
{
- fragmentt *this_frag = &this_fragmentation->frag[end_index];
- fragmentt *front_frag = &this_fragmentation->frag[(end_index+1)&MAXFRAGNUM_MASK];
- // before a MP_BEGIN, we must be a MP_END
- if (front_frag->length && (front_frag->flags & MP_BEGIN))
- {
- end_found = 1;
- break;
- }
- // we are a MP_END
- if (this_frag->length && (this_frag->flags & MP_END))
+ fragmentt *this_frag;
+
+ if (!end_or_hole_found)
{
- end_found = 1;
- break;
+ fragmentt *front_frag = &this_fragmentation->frag[index];
+
+ // before a MP_BEGIN, there must be a MP_END
+ if (front_frag->length && (front_frag->flags & MP_BEGIN))
+ end_or_hole_found = 1;
+
+ index = (index + (MAXFRAGNUM-1)) & MAXFRAGNUM_MASK;
+ this_frag = &this_fragmentation->frag[index];
+
+ // we are a hole or a MP_END
+ if (!this_frag->length || (this_frag->flags & MP_END))
+ end_or_hole_found = 1;
+
+ if (end_or_hole_found)
+ end_index = index;
}
- }
- // ok, we may not count it for found if end_index == this_fragmentation->start_index
- // but it complicates things too much and it will be discarded on next round anyway
- //clear length and flags of the discarded fragments
- if (end_found)
- {
- begin_index = this_fragmentation->start_index;
- while (begin_index != end_index)
+ if (end_or_hole_found)
{
- this_fragmentation->fragment[begin_index].flags = 0;
- this_fragmentation->fragment[begin_index].length = 0;
- begin_index = (begin_index + 1) & MAXFRAGNUM_MASK;
+ this_frag->flags = 0;
+ this_frag->length = 0;
}
- this_fragmentation->fragment[begin_index].flags = 0;
- this_fragmentation->fragment[begin_index].length = 0;
- this_fragmentation->start_index = (end_index + 1) & MAXFRAGNUM_MASK;
- this_fragmentation->start_seq = (this_fragmentation->fragment[end_index].seq + 1) & (this_bundle->max_seq-1);
+ if (index == this_fragmentation->start_index)
+ break;
}
+
+ this_fragmentation->start_index = (end_index + 1) & MAXFRAGNUM_MASK;
+ this_fragmentation->start_seq = (this_fragmentation->fragment[end_index].seq + 1) & (this_bundle->max_seq-1);
}
LOG(4, s, t, "MPPP after assembling: M index is =%d, start index is = %d, start seq=%d\n",M_index, this_fragmentation->start_index, this_fragmentation->start_seq);