diff --git a/lib/src/upper/rlc_am_lte.cc b/lib/src/upper/rlc_am_lte.cc index a5f96fe29..e81cbab45 100644 --- a/lib/src/upper/rlc_am_lte.cc +++ b/lib/src/upper/rlc_am_lte.cc @@ -1715,14 +1715,22 @@ bool rlc_am_lte::rlc_am_lte_rx::add_segment_and_check(rlc_amd_rx_pdu_segments_t* // Check for complete uint32_t so = 0; std::list::iterator it, tmpit; - for (it = pdu->segments.begin(); it != pdu->segments.end(); it++) { + for (it = pdu->segments.begin(); it != pdu->segments.end(); /* Do not increment */) { // Check that there is no gap between last segment and current; overlap allowed if (so < it->header.so) { + // return return false; } - // Update segment offset it shall not go backwards - so = SRSLTE_MAX(so, it->header.so + it->buf->N_bytes); + // Check if segment is overlapped + if (it->header.so + it->buf->N_bytes <= so) { + // completely overlapped with previous segments, erase + it = pdu->segments.erase(it); // Returns next iterator + } else { + // Update segment offset it shall not go backwards + so = SRSLTE_MAX(so, it->header.so + it->buf->N_bytes); + it++; // Increments iterator + } } // Check for last segment flag available