From f33389256380d17cd8a14dd237f83c9b3fcc0938 Mon Sep 17 00:00:00 2001 From: Manuel Requena Date: Tue, 14 Feb 2012 16:50:32 +0100 Subject: [PATCH] Fix bad state transition in the SDU reassembling process --- src/lte/model/lte-rlc-um.cc | 50 +++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/lte/model/lte-rlc-um.cc b/src/lte/model/lte-rlc-um.cc index d336ac360..17757a125 100644 --- a/src/lte/model/lte-rlc-um.cc +++ b/src/lte/model/lte-rlc-um.cc @@ -671,7 +671,57 @@ LteRlcUm::ReassembleAndDeliver (Ptr packet) break; case (LteRlcHeader::NO_FIRST_BYTE | LteRlcHeader::LAST_BYTE): + m_reassemblingState = WAITING_S0_FULL; + + /** + * Discard SI or SN + */ + m_sdusBuffer.pop_front (); + + /** + * Deliver zero, one or multiple PDUs + */ + while ( ! m_sdusBuffer.empty () ) + { + m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ()); + m_sdusBuffer.pop_front (); + } + break; + case (LteRlcHeader::NO_FIRST_BYTE | LteRlcHeader::NO_LAST_BYTE): + if ( m_sdusBuffer.size () == 1 ) + { + m_reassemblingState = WAITING_S0_FULL; + } + else + { + m_reassemblingState = WAITING_SI_SF; + } + + /** + * Discard SI or SN + */ + m_sdusBuffer.pop_front (); + + if ( m_sdusBuffer.size () > 0 ) + { + /** + * Deliver zero, one or multiple PDUs + */ + while ( m_sdusBuffer.size () > 1 ) + { + m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ()); + m_sdusBuffer.pop_front (); + } + + /** + * Keep S0 + */ + m_keepS0 = m_sdusBuffer.front (); + m_sdusBuffer.pop_front (); + } + break; + default: /** * ERROR: Transition not possible