Bug-fix LteEnbMac and LteUeMac on HARQ packets buffer in managing several LCs
authorMarco Miozzo <marco.miozzo@cttc.es>
Fri, 14 Dec 2012 09:33:46 +0100
changeset 9535 999521532532
parent 9527 10c1b7340221
child 9536 da6e0a3c432b
Bug-fix LteEnbMac and LteUeMac on HARQ packets buffer in managing several LCs
src/lte/model/lte-enb-mac.cc
src/lte/model/lte-enb-mac.h
src/lte/model/lte-enb-phy.cc
src/lte/model/lte-ue-mac.cc
src/lte/model/lte-ue-mac.h
src/lte/test/lte-test-mimo.cc
--- a/src/lte/model/lte-enb-mac.cc	Thu Dec 13 15:07:02 2012 +0100
+++ b/src/lte/model/lte-enb-mac.cc	Fri Dec 14 09:33:46 2012 +0100
@@ -751,10 +751,20 @@
   m_cschedSapProvider->CschedUeConfigReq (params);
 
   // Create DL trasmission HARQ buffers
-  std::vector < Ptr<Packet> > dlHarqLayer0pkt;
+  std::vector < Ptr<PacketBurst> > dlHarqLayer0pkt;
   dlHarqLayer0pkt.resize (8);
-  std::vector < Ptr<Packet> > dlHarqLayer1pkt;
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      Ptr<PacketBurst> pb = CreateObject <PacketBurst> ();
+      dlHarqLayer0pkt.at (i) = pb;
+    }
+  std::vector < Ptr<PacketBurst> > dlHarqLayer1pkt;
   dlHarqLayer1pkt.resize (8);
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      Ptr<PacketBurst> pb = CreateObject <PacketBurst> ();
+      dlHarqLayer1pkt.at (i) = pb;
+    }
   DlHarqProcessesBuffer_t buf;
   buf.push_back (dlHarqLayer0pkt);
   buf.push_back (dlHarqLayer1pkt);
@@ -909,8 +919,9 @@
   std::map <uint16_t, DlHarqProcessesBuffer_t>::iterator it =  m_miDlHarqProcessesPackets.find (params.rnti);
   NS_ASSERT (it!=m_miDlHarqProcessesPackets.end ());
   NS_LOG_DEBUG (this << " LAYER " <<(uint16_t)tag.GetLayer () << " HARQ ID " << (uint16_t)params.harqProcessId);
-//   NS_ASSERT ((*it).second.at (params.layer).at (params.harqProcessId) == 0);
-  (*it).second.at (params.layer).at (params.harqProcessId) = params.pdu;//->Copy ();
+  
+  //(*it).second.at (params.layer).at (params.harqProcessId) = params.pdu;//->Copy ();
+  (*it).second.at (params.layer).at (params.harqProcessId)->AddPacket (params.pdu);
   m_enbPhySapProvider->SendMacPdu (params.pdu);
 }
 
@@ -970,8 +981,12 @@
                       // HARQ retransmission -> retrieve TB from HARQ buffer
                       std::map <uint16_t, DlHarqProcessesBuffer_t>::iterator it = m_miDlHarqProcessesPackets.find (ind.m_buildDataList.at (i).m_rnti);
                       NS_ASSERT(it!=m_miDlHarqProcessesPackets.end());
-                      Ptr<Packet> pkt = (*it).second.at (k).at ( ind.m_buildDataList.at (i).m_dci.m_harqProcess)->Copy ();
-                      m_enbPhySapProvider->SendMacPdu (pkt);
+                      Ptr<PacketBurst> pb = (*it).second.at (k).at ( ind.m_buildDataList.at (i).m_dci.m_harqProcess);
+                      for (std::list<Ptr<Packet> >::const_iterator j = pb->Begin (); j != pb->End (); ++j)
+                        {
+                          Ptr<Packet> pkt = (*j)->Copy ();
+                          m_enbPhySapProvider->SendMacPdu (pkt);
+                        }
                     }
                 }
             }
@@ -1136,7 +1151,8 @@
       if (params.m_harqStatus.at (layer)==DlInfoListElement_s::ACK)
         {
           // discard buffer
-          (*it).second.at (layer).at (params.m_harqProcessId) = 0;
+          Ptr<PacketBurst> emptyBuf = CreateObject <PacketBurst> ();
+          (*it).second.at (layer).at (params.m_harqProcessId) = emptyBuf;
           NS_LOG_DEBUG (this << " HARQ-ACK UE " << params.m_rnti << " harqId " << (uint16_t)params.m_harqProcessId << " layer " << (uint16_t)layer);
         }
       else if (params.m_harqStatus.at (layer)==DlInfoListElement_s::NACK)
--- a/src/lte/model/lte-enb-mac.h	Thu Dec 13 15:07:02 2012 +0100
+++ b/src/lte/model/lte-enb-mac.h	Fri Dec 14 09:33:46 2012 +0100
@@ -34,6 +34,7 @@
 #include "ns3/traced-value.h"
 #include "ns3/trace-source-accessor.h"
 #include <ns3/packet.h>
+#include <ns3/packet-burst.h>
 
 namespace ns3 {
 
@@ -41,7 +42,7 @@
 class UlCqiLteControlMessage;
 class PdcchMapLteControlMessage;
 
-typedef std::vector <std::vector < Ptr<Packet> > > DlHarqProcessesBuffer_t;
+typedef std::vector <std::vector < Ptr<PacketBurst> > > DlHarqProcessesBuffer_t;
 
 /**
  * This class implements the MAC layer of the eNodeB device
--- a/src/lte/model/lte-enb-phy.cc	Thu Dec 13 15:07:02 2012 +0100
+++ b/src/lte/model/lte-enb-phy.cc	Fri Dec 14 09:33:46 2012 +0100
@@ -931,6 +931,7 @@
 LteEnbPhy::ReceiveLteUlHarqFeedback (UlInfoListElement_s mes)
 {
   NS_LOG_FUNCTION (this);
+  // forward to scheduler
   m_enbPhySapUser->UlInfoListElementHarqFeeback (mes);
 }
 
--- a/src/lte/model/lte-ue-mac.cc	Thu Dec 13 15:07:02 2012 +0100
+++ b/src/lte/model/lte-ue-mac.cc	Fri Dec 14 09:33:46 2012 +0100
@@ -212,6 +212,13 @@
 {
   NS_LOG_FUNCTION (this);
   m_miUlHarqProcessesPacket.resize (HARQ_PERIOD);
+  for (uint8_t i = 0; i < m_miUlHarqProcessesPacket.size (); i++)
+    {
+      Ptr<PacketBurst> pb = CreateObject <PacketBurst> ();
+      m_miUlHarqProcessesPacket.at (i) = pb;
+    }
+  m_miUlHarqProcessesPacketTimer.resize (HARQ_PERIOD, 0);
+   
   m_macSapProvider = new UeMemberLteMacSapProvider (this);
   m_cmacSapProvider = new UeMemberLteUeCmacSapProvider (this);
   m_uePhySapUser = new UeMemberLteUePhySapUser (this);
@@ -276,7 +283,8 @@
   LteRadioBearerTag tag (params.rnti, params.lcid, 0 /* UE works in SISO mode*/);
   params.pdu->AddPacketTag (tag);
   // store pdu in HARQ buffer
-  m_miUlHarqProcessesPacket.at (m_harqProcessId) = params.pdu;//->Copy ();
+  m_miUlHarqProcessesPacket.at (m_harqProcessId)->AddPacket (params.pdu);
+  m_miUlHarqProcessesPacketTimer.at (m_harqProcessId) = HARQ_PERIOD;
   m_uePhySapProvider->SendMacPdu (params.pdu);
 }
 
@@ -600,9 +608,13 @@
         {
           // HARQ retransmission -> retrieve data from HARQ buffer
           NS_LOG_DEBUG (this << " UE MAC RETX HARQ " << (uint16_t)m_harqProcessId);
-          Ptr<Packet> pkt = m_miUlHarqProcessesPacket.at (m_harqProcessId);
-          m_uePhySapProvider->SendMacPdu (pkt);
-          
+          Ptr<PacketBurst> pb = m_miUlHarqProcessesPacket.at (m_harqProcessId);
+          for (std::list<Ptr<Packet> >::const_iterator j = pb->Begin (); j != pb->End (); ++j)
+            {
+              Ptr<Packet> pkt = (*j)->Copy ();
+              m_uePhySapProvider->SendMacPdu (pkt);
+            }
+          m_miUlHarqProcessesPacketTimer.at (m_harqProcessId) = HARQ_PERIOD;          
         }
 
     }
@@ -636,6 +648,30 @@
     }
 }
 
+void
+LteUeMac::RefreshHarqProcessesPacketBuffer (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  for (uint16_t i = 0; i < m_miUlHarqProcessesPacketTimer.size (); i++)
+    {
+      if (m_miUlHarqProcessesPacketTimer.at (i) == 0)
+        {
+          if (m_miUlHarqProcessesPacket.at (i)->GetSize () > 0)
+            {
+              // timer expired: drop packets in buffer for this process
+              NS_LOG_INFO (this << " HARQ Proc Id " << i << " packets buffer expired");
+              Ptr<PacketBurst> emptyPb = CreateObject <PacketBurst> ();
+              m_miUlHarqProcessesPacket.at (i) = emptyPb;
+            }
+        }
+      else
+        {
+          m_miUlHarqProcessesPacketTimer.at (i)--;
+        }
+    }
+}
+
 
 void
 LteUeMac::DoSubframeIndication (uint32_t frameNo, uint32_t subframeNo)
@@ -643,6 +679,7 @@
   NS_LOG_FUNCTION (this);
   m_frameNo = frameNo;
   m_subframeNo = subframeNo;
+  RefreshHarqProcessesPacketBuffer ();
   if ((Simulator::Now () >= m_bsrLast + m_bsrPeriodicity) && (m_freshUlBsr==true))
     {
       SendReportBufferStatus ();
--- a/src/lte/model/lte-ue-mac.h	Thu Dec 13 15:07:02 2012 +0100
+++ b/src/lte/model/lte-ue-mac.h	Fri Dec 14 09:33:46 2012 +0100
@@ -33,6 +33,7 @@
 #include <ns3/event-id.h>
 #include <vector>
 #include <ns3/packet.h>
+#include <ns3/packet-burst.h>
 
 
 namespace ns3 {
@@ -110,6 +111,7 @@
   void RecvRaResponse (BuildRarListElement_s raResponse);
   void RaResponseTimeout (bool contention);
   void SendReportBufferStatus (void);
+  void RefreshHarqProcessesPacketBuffer (void);
 
 private:
 
@@ -138,7 +140,8 @@
   bool m_freshUlBsr; // true when a BSR has been received in the last TTI
 
   uint8_t m_harqProcessId;
-  std::vector < Ptr<Packet> > m_miUlHarqProcessesPacket; // Packets under trasmission of the UL HARQ processes
+  std::vector < Ptr<PacketBurst> > m_miUlHarqProcessesPacket; // Packets under trasmission of the UL HARQ processes
+  std::vector < uint8_t > m_miUlHarqProcessesPacketTimer; // timer for packet life in the buffer
 
   uint16_t m_rnti;
 
--- a/src/lte/test/lte-test-mimo.cc	Thu Dec 13 15:07:02 2012 +0100
+++ b/src/lte/test/lte-test-mimo.cc	Fri Dec 14 09:33:46 2012 +0100
@@ -126,7 +126,7 @@
   lteHelper->SetPathlossModelAttribute ("ShadowSigmaIndoor", DoubleValue (0.0));
   lteHelper->SetPathlossModelAttribute ("ShadowSigmaExtWalls", DoubleValue (0.0));
   
-  lteHelper->EnableLogComponents ();
+//   lteHelper->EnableLogComponents ();
 
   // Create Nodes: eNodeB and UE
   NodeContainer enbNodes;