9#include "nr-pdcp-header.h"
10#include "nr-pdcp-sap.h"
11#include "nr-pdcp-tag.h"
14#include "ns3/simulator.h"
19NS_LOG_COMPONENT_DEFINE(
"NrPdcp");
22class NrPdcpSpecificNrRlcSapUser :
public NrRlcSapUser
30 NrPdcpSpecificNrRlcSapUser(NrPdcp* pdcp);
33 void ReceivePdcpPdu(Ptr<Packet> p)
override;
36 NrPdcpSpecificNrRlcSapUser();
40NrPdcpSpecificNrRlcSapUser::NrPdcpSpecificNrRlcSapUser(NrPdcp* pdcp)
45NrPdcpSpecificNrRlcSapUser::NrPdcpSpecificNrRlcSapUser()
50NrPdcpSpecificNrRlcSapUser::ReceivePdcpPdu(Ptr<Packet> p)
52 m_pdcp->DoReceivePdu(p);
57NS_OBJECT_ENSURE_REGISTERED(NrPdcp);
60 : m_pdcpSapUser(nullptr),
61 m_rlcSapProvider(nullptr),
64 m_txSequenceNumber(0),
67 NS_LOG_FUNCTION(
this);
68 m_pdcpSapProvider =
new NrPdcpSpecificNrPdcpSapProvider<NrPdcp>(
this);
69 m_rlcSapUser =
new NrPdcpSpecificNrRlcSapUser(
this);
74 NS_LOG_FUNCTION(
this);
80 static TypeId tid = TypeId(
"ns3::NrPdcp")
83 .AddTraceSource(
"TxPDU",
84 "PDU transmission notified to the RLC.",
85 MakeTraceSourceAccessor(&NrPdcp::m_txPdu),
86 "ns3::NrPdcp::PduTxTracedCallback")
87 .AddTraceSource(
"RxPDU",
89 MakeTraceSourceAccessor(&NrPdcp::m_rxPdu),
90 "ns3::NrPdcp::PduRxTracedCallback");
97 NS_LOG_FUNCTION(
this);
98 delete (m_pdcpSapProvider);
99 delete (m_rlcSapUser);
103NrPdcp::SetRnti(uint16_t rnti)
105 NS_LOG_FUNCTION(
this << (uint32_t)rnti);
110NrPdcp::SetLcId(uint8_t lcId)
112 NS_LOG_FUNCTION(
this << (uint32_t)lcId);
119 NS_LOG_FUNCTION(
this << s);
124NrPdcp::GetNrPdcpSapProvider()
126 NS_LOG_FUNCTION(
this);
127 return m_pdcpSapProvider;
133 NS_LOG_FUNCTION(
this << s);
134 m_rlcSapProvider = s;
138NrPdcp::GetNrRlcSapUser()
140 NS_LOG_FUNCTION(
this);
145NrPdcp::GetStatus()
const
148 s.
txSn = m_txSequenceNumber;
149 s.
rxSn = m_rxSequenceNumber;
156 m_txSequenceNumber = s.
txSn;
157 m_rxSequenceNumber = s.
rxSn;
165 NS_LOG_FUNCTION(
this << m_rnti <<
static_cast<uint16_t
>(m_lcid) << params.
pdcpSdu->GetSize());
166 Ptr<Packet> p = params.
pdcpSdu;
174 m_txSequenceNumber++;
175 if (m_txSequenceNumber > m_maxPdcpSn)
177 m_txSequenceNumber = 0;
180 pdcpHeader.
SetDcBit(NrPdcpHeader::DATA_PDU);
181 p->AddHeader(pdcpHeader);
182 p->AddByteTag(pdcpTag, 1, pdcpHeader.GetSerializedSize());
184 m_txPdu(m_rnti, m_lcid, p->GetSize());
187 txParams.
rnti = m_rnti;
188 txParams.
lcid = m_lcid;
191 NS_LOG_INFO(
"Transmitting PDCP PDU with header: " << pdcpHeader);
192 m_rlcSapProvider->TransmitPdcpPdu(txParams);
196NrPdcp::DoReceivePdu(Ptr<Packet> p)
198 NS_LOG_FUNCTION(
this << m_rnti << (uint32_t)m_lcid << p->GetSize());
203 p->FindFirstMatchingByteTag(pdcpTag);
205 m_rxPdu(m_rnti, m_lcid, p->GetSize(), delay.GetNanoSeconds());
208 p->RemoveHeader(pdcpHeader);
209 NS_LOG_LOGIC(
"PDCP header: " << pdcpHeader);
212 if (m_rxSequenceNumber > m_maxPdcpSn)
214 m_rxSequenceNumber = 0;
219 params.
rnti = m_rnti;
220 params.
lcid = m_lcid;
221 m_pdcpSapUser->ReceivePdcpSdu(params);
Time GetSenderTimestamp() const
uint16_t rxSn
RX sequence number.
uint16_t txSn
TX sequence number.