--- 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;