Skip to content

Commit

Permalink
lte: Add struct for the parameters of TxOpportunity and ReceivePdu
Browse files Browse the repository at this point in the history
  • Loading branch information
ZorazeAli committed Oct 2, 2018
1 parent 72d87c5 commit b9b0e8c
Show file tree
Hide file tree
Showing 17 changed files with 263 additions and 201 deletions.
12 changes: 6 additions & 6 deletions src/lte/model/lte-ccm-mac-sap.h
Expand Up @@ -134,8 +134,8 @@ class MemberLteCcmMacSapUser : public LteCcmMacSapUser
virtual void UlReceiveMacCe (MacCeListElement_s bsr, uint8_t componentCarrierId);
virtual void NotifyPrbOccupancy (double prbOccupancy, uint8_t componentCarrierId);
// inherited from LteMacSapUser
virtual void NotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId, uint8_t componentCarrierId, uint16_t rnti, uint8_t lcid);
virtual void ReceivePdu (Ptr<Packet> p, uint16_t rnti, uint8_t lcid);
virtual void NotifyTxOpportunity (LteMacSapUser::TxOpportunityParameters txOpParams);
virtual void ReceivePdu (LteMacSapUser::ReceivePduParameters rxPduParams);
virtual void NotifyHarqDeliveryFailure ();


Expand All @@ -162,15 +162,15 @@ void MemberLteCcmMacSapUser<C>::NotifyPrbOccupancy (double prbOccupancy, uint8_t
}

template <class C>
void MemberLteCcmMacSapUser<C>::NotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId, uint8_t componentCarrierId, uint16_t rnti, uint8_t lcid)
void MemberLteCcmMacSapUser<C>::NotifyTxOpportunity (LteMacSapUser::TxOpportunityParameters txOpParams)
{
m_owner->DoNotifyTxOpportunity (bytes, layer, harqId, componentCarrierId, rnti, lcid);
m_owner->DoNotifyTxOpportunity (txOpParams);
}

template <class C>
void MemberLteCcmMacSapUser<C>::ReceivePdu (Ptr<Packet> p, uint16_t rnti, uint8_t lcid)
void MemberLteCcmMacSapUser<C>::ReceivePdu (LteMacSapUser::ReceivePduParameters rxPduParams)
{
m_owner->DoReceivePdu (p, rnti, lcid);
m_owner->DoReceivePdu (rxPduParams);
}

template <class C>
Expand Down
16 changes: 14 additions & 2 deletions src/lte/model/lte-enb-mac.cc
Expand Up @@ -765,10 +765,15 @@ LteEnbMac::DoReceivePhyPdu (Ptr<Packet> p)
std::map<uint8_t, LteMacSapUser*>::iterator lcidIt = rntiIt->second.find (lcid);
//NS_ASSERT_MSG (lcidIt != rntiIt->second.end (), "could not find LCID" << lcid);

LteMacSapUser::ReceivePduParameters rxPduParams;
rxPduParams.p = p;
rxPduParams.rnti = rnti;
rxPduParams.lcid = lcid;

//Receive PDU only if LCID is found
if (lcidIt != rntiIt->second.end ())
{
(*lcidIt).second->ReceivePdu (p, rnti, lcid);
(*lcidIt).second->ReceivePdu (rxPduParams);
}
}

Expand Down Expand Up @@ -1023,6 +1028,7 @@ LteEnbMac::DoSchedDlConfigInd (FfMacSchedSapUser::SchedDlConfigIndParameters ind
// Create DL PHY PDU
Ptr<PacketBurst> pb = CreateObject<PacketBurst> ();
std::map <LteFlowId_t, LteMacSapUser* >::iterator it;
LteMacSapUser::TxOpportunityParameters txOpParams;

for (unsigned int i = 0; i < ind.m_buildDataList.size (); i++)
{
Expand Down Expand Up @@ -1054,7 +1060,13 @@ LteEnbMac::DoSchedDlConfigInd (FfMacSchedSapUser::SchedDlConfigIndParameters ind
std::map<uint8_t, LteMacSapUser*>::iterator lcidIt = rntiIt->second.find (lcid);
NS_ASSERT_MSG (lcidIt != rntiIt->second.end (), "could not find LCID" << (uint32_t)lcid<<" carrier id:"<<(uint16_t)m_componentCarrierId);
NS_LOG_DEBUG (this << " rnti= " << rnti << " lcid= " << (uint32_t) lcid << " layer= " << k);
(*lcidIt).second->NotifyTxOpportunity (ind.m_buildDataList.at (i).m_rlcPduList.at (j).at (k).m_size, k, ind.m_buildDataList.at (i).m_dci.m_harqProcess, m_componentCarrierId, rnti, lcid);
txOpParams.bytes = ind.m_buildDataList.at (i).m_rlcPduList.at (j).at (k).m_size;
txOpParams.layer = k;
txOpParams.harqId = ind.m_buildDataList.at (i).m_dci.m_harqProcess;
txOpParams.componentCarrierId = m_componentCarrierId;
txOpParams.rnti = rnti;
txOpParams.lcid = lcid;
(*lcidIt).second->NotifyTxOpportunity (txOpParams);
}
else
{
Expand Down
39 changes: 27 additions & 12 deletions src/lte/model/lte-mac-sap.h
Expand Up @@ -96,18 +96,26 @@ class LteMacSapUser
{
public:
virtual ~LteMacSapUser ();
/**
* Parameters for LteMacSapUser::NotifyTxOpportunity
*
*/
struct TxOpportunityParameters
{
uint32_t bytes; /**< the number of bytes to transmit */
uint8_t layer; /**< the layer of transmission (MIMO) */
uint8_t harqId; /**< the HARQ ID */
uint8_t componentCarrierId; /**< the component carrier id */
uint16_t rnti; /**< the C-RNTI identifying the UE */
uint8_t lcid; /**< the logical channel id */
};
/**
* Called by the MAC to notify the RLC that the scheduler granted a
* transmission opportunity to this RLC instance.
*
* \param bytes the number of bytes to transmit
* \param layer the layer of transmission (MIMO)
* \param harqId the HARQ ID
* \param componentCarrierId component carrier ID
* \param rnti the RNTI
* \param lcid the LCID
* \param params the TxOpportunityParameters
*/
virtual void NotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId, uint8_t componentCarrierId, uint16_t rnti, uint8_t lcid) = 0;
virtual void NotifyTxOpportunity (TxOpportunityParameters params) = 0;

/**
* Called by the MAC to notify the RLC that an HARQ process related
Expand All @@ -117,15 +125,22 @@ class LteMacSapUser
*/
virtual void NotifyHarqDeliveryFailure () = 0;


/**
* Parameters for LteMacSapUser::ReceivePdu
*
*/
struct ReceivePduParameters
{
Ptr<Packet> p; /**< the RLC PDU to be received */
uint16_t rnti; /**< the C-RNTI identifying the UE */
uint8_t lcid; /**< the logical channel id */
};
/**
* Called by the MAC to notify the RLC of the reception of a new PDU
*
* \param p the packet
* \param rnti the RNTI
* \param lcid the LCID
* \param params the ReceivePduParameters
*/
virtual void ReceivePdu (Ptr<Packet> p, uint16_t rnti, uint8_t lcid) = 0;
virtual void ReceivePdu (ReceivePduParameters params) = 0;

};

Expand Down
62 changes: 31 additions & 31 deletions src/lte/model/lte-rlc-am.cc
Expand Up @@ -186,27 +186,27 @@ LteRlcAm::DoTransmitPdcpPdu (Ptr<Packet> p)
*/

void
LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId, uint8_t componentCarrierId, uint16_t rnti, uint8_t lcid)
LteRlcAm::DoNotifyTxOpportunity (LteMacSapUser::TxOpportunityParameters txOpParams)
{
NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << bytes);
NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << txOpParams.bytes);

if (bytes < 4)
if (txOpParams.bytes < 4)
{
// Stingy MAC: In general, we need more bytes.
// There are a more restrictive test for each particular case
NS_LOG_LOGIC ("TxOpportunity (size = " << bytes << ") too small");
NS_ASSERT_MSG (false, "TxOpportunity (size = " << bytes << ") too small.\n"
NS_LOG_LOGIC ("TxOpportunity (size = " << txOpParams.bytes << ") too small");
NS_ASSERT_MSG (false, "TxOpportunity (size = " << txOpParams.bytes << ") too small.\n"
<< "Your MAC scheduler is assigned too few resource blocks.");
return;
}

if ( m_statusPduRequested && ! m_statusProhibitTimer.IsRunning () )
{
if (bytes < m_statusPduBufferSize)
if (txOpParams.bytes < m_statusPduBufferSize)
{
// Stingy MAC: We need more bytes for the STATUS PDU
NS_LOG_LOGIC ("TxOpportunity (size = " << bytes << ") too small for the STATUS PDU (size = " << m_statusPduBufferSize << ")");
NS_ASSERT_MSG (false, "TxOpportunity (size = " << bytes << ") too small for the STATUS PDU (size = " << m_statusPduBufferSize << ")\n"
NS_LOG_LOGIC ("TxOpportunity (size = " << txOpParams.bytes << ") too small for the STATUS PDU (size = " << m_statusPduBufferSize << ")");
NS_ASSERT_MSG (false, "TxOpportunity (size = " << txOpParams.bytes << ") too small for the STATUS PDU (size = " << m_statusPduBufferSize << ")\n"
<< "Your MAC scheduler is assigned too few resource blocks.");
return;
}
Expand All @@ -224,7 +224,7 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId,
for (sn = m_vrR; sn < m_vrMs; sn++)
{
NS_LOG_LOGIC ("SN = " << sn);
if (!rlcAmHeader.OneMoreNackWouldFitIn (bytes))
if (!rlcAmHeader.OneMoreNackWouldFitIn (txOpParams.bytes))
{
NS_LOG_LOGIC ("Can't fit more NACKs in STATUS PDU");
break;
Expand Down Expand Up @@ -267,9 +267,9 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId,
params.pdu = packet;
params.rnti = m_rnti;
params.lcid = m_lcid;
params.layer = layer;
params.harqProcessId = harqId;
params.componentCarrierId = componentCarrierId;
params.layer = txOpParams.layer;
params.harqProcessId = txOpParams.harqId;
params.componentCarrierId = txOpParams.componentCarrierId;

m_macSapProvider->TransmitPdu (params);

Expand All @@ -296,7 +296,7 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId,

Ptr<Packet> packet = m_retxBuffer.at (seqNumberValue).m_pdu->Copy ();

if (( packet->GetSize () <= bytes )
if (( packet->GetSize () <= txOpParams.bytes )
|| m_txOpportunityForRetxAlwaysBigEnough)
{
// According to 5.2.1, the data field is left as is, but we rebuild the header
Expand Down Expand Up @@ -353,9 +353,9 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId,
params.pdu = packet;
params.rnti = m_rnti;
params.lcid = m_lcid;
params.layer = layer;
params.harqProcessId = harqId;
params.componentCarrierId = componentCarrierId;
params.layer = txOpParams.layer;
params.harqProcessId = txOpParams.harqId;
params.componentCarrierId = txOpParams.componentCarrierId;

m_macSapProvider->TransmitPdu (params);

Expand All @@ -381,7 +381,7 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId,
}
else
{
NS_LOG_LOGIC ("TxOpportunity (size = " << bytes << ") too small for retransmission of the packet (size = " << packet->GetSize () << ")");
NS_LOG_LOGIC ("TxOpportunity (size = " << txOpParams.bytes << ") too small for retransmission of the packet (size = " << packet->GetSize () << ")");
NS_LOG_LOGIC ("Waiting for bigger TxOpportunity");
return;
}
Expand All @@ -391,11 +391,11 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId,
}
else if ( m_txonBufferSize > 0 )
{
if (bytes < 7)
if (txOpParams.bytes < 7)
{
// Stingy MAC: We need more bytes for new DATA PDUs.
NS_LOG_LOGIC ("TxOpportunity (size = " << bytes << ") too small for DATA PDU");
NS_ASSERT_MSG (false, "TxOpportunity (size = " << bytes << ") too small for DATA PDU\n"
NS_LOG_LOGIC ("TxOpportunity (size = " << txOpParams.bytes << ") too small for DATA PDU");
NS_ASSERT_MSG (false, "TxOpportunity (size = " << txOpParams.bytes << ") too small for DATA PDU\n"
<< "Your MAC scheduler is assigned too few resource blocks.");
return;
}
Expand Down Expand Up @@ -426,7 +426,7 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId,
rlcAmHeader.SetDataPdu ();

// Build Data field
uint32_t nextSegmentSize = bytes - 4;
uint32_t nextSegmentSize = txOpParams.bytes - 4;
uint32_t nextSegmentId = 1;
uint32_t dataFieldTotalSize = 0;
uint32_t dataFieldAddedSize = 0;
Expand Down Expand Up @@ -734,9 +734,9 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId,
params.pdu = packet;
params.rnti = m_rnti;
params.lcid = m_lcid;
params.layer = layer;
params.harqProcessId = harqId;
params.componentCarrierId = componentCarrierId;
params.layer = txOpParams.layer;
params.harqProcessId = txOpParams.harqId;
params.componentCarrierId = txOpParams.componentCarrierId;

m_macSapProvider->TransmitPdu (params);
}
Expand All @@ -749,21 +749,21 @@ LteRlcAm::DoNotifyHarqDeliveryFailure ()


void
LteRlcAm::DoReceivePdu (Ptr<Packet> p, uint16_t rnti, uint8_t lcid)
LteRlcAm::DoReceivePdu (LteMacSapUser::ReceivePduParameters rxPduParams)
{
NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << p->GetSize ());
NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << rxPduParams.p->GetSize ());

// Receiver timestamp
RlcTag rlcTag;
Time delay;
NS_ASSERT_MSG (p->PeekPacketTag (rlcTag), "RlcTag is missing");
p->RemovePacketTag (rlcTag);
NS_ASSERT_MSG (rxPduParams.p->PeekPacketTag (rlcTag), "RlcTag is missing");
rxPduParams.p->RemovePacketTag (rlcTag);
delay = Simulator::Now() - rlcTag.GetSenderTimestamp ();
m_rxPdu (m_rnti, m_lcid, p->GetSize (), delay.GetNanoSeconds ());
m_rxPdu (m_rnti, m_lcid, rxPduParams.p->GetSize (), delay.GetNanoSeconds ());

// Get RLC header parameters
LteRlcAmHeader rlcAmHeader;
p->PeekHeader (rlcAmHeader);
rxPduParams.p->PeekHeader (rlcAmHeader);
NS_LOG_LOGIC ("RLC header: " << rlcAmHeader);

if ( rlcAmHeader.IsDataPdu () )
Expand Down Expand Up @@ -889,7 +889,7 @@ LteRlcAm::DoReceivePdu (Ptr<Packet> p, uint16_t rnti, uint8_t lcid)
else
{
NS_LOG_LOGIC ("Place PDU in the reception buffer ( SN = " << seqNumber << " )");
m_rxonBuffer[ seqNumber.GetValue () ].m_byteSegments.push_back (p);
m_rxonBuffer[ seqNumber.GetValue () ].m_byteSegments.push_back (rxPduParams.p);
m_rxonBuffer[ seqNumber.GetValue () ].m_pduComplete = true;
}

Expand Down
13 changes: 4 additions & 9 deletions src/lte/model/lte-rlc-am.h
Expand Up @@ -55,19 +55,14 @@ class LteRlcAm : public LteRlc
/**
* MAC SAP
*
* \param bytes number of bytes
* \param layer
* \param harqId HARQ ID
* \param componentCarrierId component carrier ID
* \param rnti the RNTI
* \param lcid the LCID
*/
virtual void DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId, uint8_t componentCarrierId, uint16_t rnti, uint8_t lcid);
* \param txOpParams the LteMacSapUser::TxOpportunityParameters
*/
virtual void DoNotifyTxOpportunity (LteMacSapUser::TxOpportunityParameters txOpParams);
/**
* Notify HARQ delivery failure
*/
virtual void DoNotifyHarqDeliveryFailure ();
virtual void DoReceivePdu (Ptr<Packet> p, uint16_t rnti, uint8_t lcid);
virtual void DoReceivePdu (LteMacSapUser::ReceivePduParameters rxPduParams);

private:
/**
Expand Down
26 changes: 13 additions & 13 deletions src/lte/model/lte-rlc-tm.cc
Expand Up @@ -111,9 +111,9 @@ LteRlcTm::DoTransmitPdcpPdu (Ptr<Packet> p)
*/

void
LteRlcTm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId, uint8_t componentCarrierId, uint16_t rnti, uint8_t lcid)
LteRlcTm::DoNotifyTxOpportunity (LteMacSapUser::TxOpportunityParameters txOpParams)
{
NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << bytes << (uint32_t) layer << (uint32_t) harqId);
NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << txOpParams.bytes << (uint32_t) txOpParams.layer << (uint32_t) txOpParams.harqId);

// 5.1.1.1 Transmit operations
// 5.1.1.1.1 General
Expand All @@ -129,9 +129,9 @@ LteRlcTm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId,

Ptr<Packet> packet = (*(m_txBuffer.begin ()))->Copy ();

if (bytes < packet->GetSize ())
if (txOpParams.bytes < packet->GetSize ())
{
NS_LOG_WARN ("TX opportunity too small = " << bytes << " (PDU size: " << packet->GetSize () << ")");
NS_LOG_WARN ("TX opportunity too small = " << txOpParams.bytes << " (PDU size: " << packet->GetSize () << ")");
return;
}

Expand All @@ -148,9 +148,9 @@ LteRlcTm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId,
params.pdu = packet;
params.rnti = m_rnti;
params.lcid = m_lcid;
params.layer = layer;
params.harqProcessId = harqId;
params.componentCarrierId = componentCarrierId;
params.layer = txOpParams.layer;
params.harqProcessId = txOpParams.harqId;
params.componentCarrierId = txOpParams.componentCarrierId;

m_macSapProvider->TransmitPdu (params);

Expand All @@ -168,24 +168,24 @@ LteRlcTm::DoNotifyHarqDeliveryFailure ()
}

void
LteRlcTm::DoReceivePdu (Ptr<Packet> p, uint16_t rnti, uint8_t lcid)
LteRlcTm::DoReceivePdu (LteMacSapUser::ReceivePduParameters rxPduParams)
{
NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << p->GetSize ());
NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << rxPduParams.p->GetSize ());

// Receiver timestamp
RlcTag rlcTag;
Time delay;
NS_ASSERT_MSG (p->PeekPacketTag (rlcTag), "RlcTag is missing");
p->RemovePacketTag (rlcTag);
NS_ASSERT_MSG (rxPduParams.p->PeekPacketTag (rlcTag), "RlcTag is missing");
rxPduParams.p->RemovePacketTag (rlcTag);
delay = Simulator::Now() - rlcTag.GetSenderTimestamp ();
m_rxPdu (m_rnti, m_lcid, p->GetSize (), delay.GetNanoSeconds ());
m_rxPdu (m_rnti, m_lcid, rxPduParams.p->GetSize (), delay.GetNanoSeconds ());

// 5.1.1.2 Receive operations
// 5.1.1.2.1 General
// When receiving a new TMD PDU from lower layer, the receiving TM RLC entity shall:
// - deliver the TMD PDU without any modification to upper layer.

m_rlcSapUser->ReceivePdcpPdu (p);
m_rlcSapUser->ReceivePdcpPdu (rxPduParams.p);
}


Expand Down

0 comments on commit b9b0e8c

Please sign in to comment.