Fix bad state transition in the SDU reassembling process
authorManuel Requena <manuel.requena@cttc.es>
Tue, 14 Feb 2012 16:50:32 +0100
changeset 8638 5a6544286265
parent 8637 5d8be68292c0
child 8640 f03f7ae4da18
Fix bad state transition in the SDU reassembling process
src/lte/model/lte-rlc-um.cc
--- a/src/lte/model/lte-rlc-um.cc	Tue Feb 14 11:24:34 2012 +0100
+++ b/src/lte/model/lte-rlc-um.cc	Tue Feb 14 16:50:32 2012 +0100
@@ -671,7 +671,57 @@
                       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