Fix Serialization when list size=0 in rrcConnectionSetup, check rb1 set before sending setup complete.
authorLluis Parcerisa <parcerisa@gmail.com>
Wed, 05 Dec 2012 19:32:56 +0100
changeset 9486 36915221a849
parent 9483 b66b5d15e87f
child 9487 3810e0a1ca1d
Fix Serialization when list size=0 in rrcConnectionSetup, check rb1 set before sending setup complete.
src/lte/model/lte-rrc-header.cc
src/lte/model/lte-rrc-protocol-real.cc
--- a/src/lte/model/lte-rrc-header.cc	Wed Dec 05 17:19:28 2012 +0100
+++ b/src/lte/model/lte-rrc-header.cc	Wed Dec 05 19:32:56 2012 +0100
@@ -320,31 +320,44 @@
 void
 RrcAsn1Header::SerializeRadioResourceConfigDedicated (LteRrcSap::RadioResourceConfigDedicated radioResourceConfigDedicated) const
 {
+  bool isSrbToAddModListPresent = !radioResourceConfigDedicated.srbToAddModList.empty();
+  bool isDrbToAddModListPresent = !radioResourceConfigDedicated.drbToAddModList.empty();
+  bool isDrbToReleaseListPresent = !radioResourceConfigDedicated.drbToReleaseList.empty();
+  
   // 6 optional fields. Extension marker is present.
   std::bitset<6> optionalFieldsPresent = std::bitset<6> ();
-  optionalFieldsPresent.set (5,1);  // srb-ToAddModList present
-  optionalFieldsPresent.set (4,1);  // drb-ToAddModList present
-  optionalFieldsPresent.set (3,1);  // drb-ToReleaseList present
+  optionalFieldsPresent.set (5,isSrbToAddModListPresent);  // srb-ToAddModList present
+  optionalFieldsPresent.set (4,isDrbToAddModListPresent);  // drb-ToAddModList present
+  optionalFieldsPresent.set (3,isDrbToReleaseListPresent);  // drb-ToReleaseList present
   optionalFieldsPresent.set (2,0);  // mac-MainConfig not present
   optionalFieldsPresent.set (1,0);  // sps-Config not present
   optionalFieldsPresent.set (0,(radioResourceConfigDedicated.havePhysicalConfigDedicated) ? 1 : 0);
   SerializeSequence<6> (optionalFieldsPresent,true);
 
   // Serialize srbToAddModList
-  SerializeSrbToAddModList (radioResourceConfigDedicated.srbToAddModList);
+  if(isSrbToAddModListPresent)
+  {
+    SerializeSrbToAddModList (radioResourceConfigDedicated.srbToAddModList);
+  }
 
   // Serialize drbToAddModList
-  SerializeDrbToAddModList (radioResourceConfigDedicated.drbToAddModList);
-
+  if(isDrbToAddModListPresent)
+  {
+    SerializeDrbToAddModList (radioResourceConfigDedicated.drbToAddModList);
+  }
+  
   // Serialize drbToReleaseList
-  SerializeSequenceOf (radioResourceConfigDedicated.drbToReleaseList.size (),MAX_DRB,1);
-  std::list<uint8_t>::iterator it = radioResourceConfigDedicated.drbToReleaseList.begin ();
-  for (; it != radioResourceConfigDedicated.drbToReleaseList.end (); it++)
-    {
-      // DRB-Identity ::= INTEGER (1..32)
-      SerializeInteger (*it,1,32);
-    }
-
+  if(isDrbToReleaseListPresent)
+  {
+    SerializeSequenceOf (radioResourceConfigDedicated.drbToReleaseList.size (),MAX_DRB,1);
+    std::list<uint8_t>::iterator it = radioResourceConfigDedicated.drbToReleaseList.begin ();
+    for (; it != radioResourceConfigDedicated.drbToReleaseList.end (); it++)
+      {
+        // DRB-Identity ::= INTEGER (1..32)
+        SerializeInteger (*it,1,32);
+      }
+  }
+  
   if (radioResourceConfigDedicated.havePhysicalConfigDedicated)
     {
       SerializePhysicalConfigDedicated (radioResourceConfigDedicated.physicalConfigDedicated);
@@ -1586,6 +1599,8 @@
 
   SerializeDlCcchMessage(3);
 
+  SerializeInteger(15,0,15);
+  
   // Serialize RRCConnectionSetup sequence:
   // no default or optional fields. Extension marker not present.
   SerializeSequence (std::bitset<0> (),false);
@@ -1620,20 +1635,23 @@
 uint32_t
 RrcConnectionSetupHeader::Deserialize (Buffer::Iterator bIterator)
 {
-  // Deserialize RRCConnectionSetup sequence
+  int n;
+
   std::bitset<0> bitset0;
   std::bitset<1> bitset1;
   std::bitset<2> bitset2;
   
   bIterator = DeserializeDlCcchMessage(bIterator);
   
+  bIterator = DeserializeInteger(&n,0,15,bIterator);
+
+  // Deserialize RRCConnectionSetup sequence
   bIterator = DeserializeSequence (&bitset0,false,bIterator);
 
   // Deserialize rrc-TransactionIdentifier ::=INTEGER (0..3)
-  int n;
   bIterator = DeserializeInteger (&n,0,3,bIterator);
   rrcTransactionIdentifier = n;
-
+  
   // Deserialize criticalExtensions choice
   int criticalExtensionChoice;
   bIterator = DeserializeChoice (2,&criticalExtensionChoice,bIterator);
--- a/src/lte/model/lte-rrc-protocol-real.cc	Wed Dec 05 17:19:28 2012 +0100
+++ b/src/lte/model/lte-rrc-protocol-real.cc	Wed Dec 05 19:32:56 2012 +0100
@@ -178,7 +178,10 @@
   transmitPdcpSduParameters.rnti = m_rnti;
   transmitPdcpSduParameters.lcid = 1;
 
-  m_setupParameters.srb1SapProvider->TransmitPdcpSdu(transmitPdcpSduParameters);
+  if(m_setupParameters.srb1SapProvider)
+  {
+    m_setupParameters.srb1SapProvider->TransmitPdcpSdu(transmitPdcpSduParameters);
+  }
 }
 
 void 
@@ -294,8 +297,8 @@
 
   // Declare possible messages
   LteRrcSap::RrcConnectionReestablishment rrcConnectionReestablishmentMsg;
-  LteRrcSap::RrcConnectionSetup rrcConnectionSetupMsg;
-  
+  LteRrcSap::RrcConnectionSetup rrcConnectionSetupMsg;        
+
   // Deserialize packet and call member recv function with appropiate structure
   switch( rrcDlCcchMessage.GetMessageType() )
   {
@@ -574,12 +577,6 @@
   {
     m_setupUeParametersMap[rnti].srb0SapProvider->TransmitPdcpPdu(transmitPdcpPduParameters);
   }
-  
-  /*
-  Simulator::Schedule (RRC_REAL_MSG_DELAY, 
-		       &LteUeRrcSapProvider::RecvRrcConnectionSetup,
-		       GetUeRrcSapProvider (rnti), 
-		       msg);*/
 }
 
 void