diff --git a/lib/src/upper/rlc_am.cc b/lib/src/upper/rlc_am.cc index 26f42af84..72fbbde17 100644 --- a/lib/src/upper/rlc_am.cc +++ b/lib/src/upper/rlc_am.cc @@ -1221,15 +1221,22 @@ void rlc_am::print_rx_segments() bool rlc_am::add_segment_and_check(rlc_amd_rx_pdu_segments_t *pdu, rlc_amd_rx_pdu_t *segment) { - // Ordered insert - std::list::iterator tmpit; - std::list::iterator it = pdu->segments.begin(); - while(it != pdu->segments.end() && it->header.so < segment->header.so) - it++; - pdu->segments.insert(it, *segment); + // Check segment offset + uint32_t n = 0; + if(!pdu->segments.empty()) { + rlc_amd_rx_pdu_t &back = pdu->segments.back(); + n = back.header.so + back.buf->N_bytes; + } + if(segment->header.so != n) { + pool->deallocate(segment->buf); + return false; + } else { + pdu->segments.push_back(*segment); + } // Check for complete uint32_t so = 0; + std::list::iterator it, tmpit; for(it = pdu->segments.begin(); it != pdu->segments.end(); it++) { if(so != it->header.so) return false; diff --git a/lib/test/upper/rlc_am_stress_test.cc b/lib/test/upper/rlc_am_stress_test.cc index 548feb818..cfed3d6e7 100644 --- a/lib/test/upper/rlc_am_stress_test.cc +++ b/lib/test/upper/rlc_am_stress_test.cc @@ -82,7 +82,7 @@ private: if(((float)rand()/RAND_MAX > fail_rate) && read>0) { rlc2->write_pdu(1, pdu->msg, opp_size); } - usleep(1000); + usleep(100); } running = false; } @@ -187,7 +187,7 @@ private: pdu->N_bytes = 1500; pdu->msg[0] = sn++; rlc->write_sdu(1, pdu); - usleep(1000); + usleep(100); } running = false; } @@ -207,7 +207,7 @@ void stress_test() log1.set_hex_limit(-1); log2.set_hex_limit(-1); - float fail_rate = 0.1; + float fail_rate = 0.01; rlc rlc1; rlc rlc2;