5G-LENA nr-v3.3-159-ga6832aa7
The 5G/NR module for the ns-3 simulator
Loading...
Searching...
No Matches
nr-pdcp.cc
1// Copyright (c) 2011-2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
2//
3// SPDX-License-Identifier: GPL-2.0-only
4//
5// Author: Manuel Requena <manuel.requena@cttc.es>
6
7#include "nr-pdcp.h"
8
9#include "nr-pdcp-header.h"
10#include "nr-pdcp-sap.h"
11#include "nr-pdcp-tag.h"
12
13#include "ns3/log.h"
14#include "ns3/simulator.h"
15
16namespace ns3
17{
18
19NS_LOG_COMPONENT_DEFINE("NrPdcp");
20
22class NrPdcpSpecificNrRlcSapUser : public NrRlcSapUser
23{
24 public:
30 NrPdcpSpecificNrRlcSapUser(NrPdcp* pdcp);
31
32 // Interface provided to lower RLC entity (implemented from NrRlcSapUser)
33 void ReceivePdcpPdu(Ptr<Packet> p) override;
34
35 private:
36 NrPdcpSpecificNrRlcSapUser();
37 NrPdcp* m_pdcp;
38};
39
40NrPdcpSpecificNrRlcSapUser::NrPdcpSpecificNrRlcSapUser(NrPdcp* pdcp)
41 : m_pdcp(pdcp)
42{
43}
44
45NrPdcpSpecificNrRlcSapUser::NrPdcpSpecificNrRlcSapUser()
46{
47}
48
49void
50NrPdcpSpecificNrRlcSapUser::ReceivePdcpPdu(Ptr<Packet> p)
51{
52 m_pdcp->DoReceivePdu(p);
53}
54
56
57NS_OBJECT_ENSURE_REGISTERED(NrPdcp);
58
59NrPdcp::NrPdcp()
60 : m_pdcpSapUser(nullptr),
61 m_rlcSapProvider(nullptr),
62 m_rnti(0),
63 m_lcid(0),
64 m_txSequenceNumber(0),
65 m_rxSequenceNumber(0)
66{
67 NS_LOG_FUNCTION(this);
68 m_pdcpSapProvider = new NrPdcpSpecificNrPdcpSapProvider<NrPdcp>(this);
69 m_rlcSapUser = new NrPdcpSpecificNrRlcSapUser(this);
70}
71
72NrPdcp::~NrPdcp()
73{
74 NS_LOG_FUNCTION(this);
75}
76
77TypeId
78NrPdcp::GetTypeId()
79{
80 static TypeId tid = TypeId("ns3::NrPdcp")
81 .SetParent<Object>()
82 .SetGroupName("Nr")
83 .AddTraceSource("TxPDU",
84 "PDU transmission notified to the RLC.",
85 MakeTraceSourceAccessor(&NrPdcp::m_txPdu),
86 "ns3::NrPdcp::PduTxTracedCallback")
87 .AddTraceSource("RxPDU",
88 "PDU received.",
89 MakeTraceSourceAccessor(&NrPdcp::m_rxPdu),
90 "ns3::NrPdcp::PduRxTracedCallback");
91 return tid;
92}
93
94void
95NrPdcp::DoDispose()
96{
97 NS_LOG_FUNCTION(this);
98 delete (m_pdcpSapProvider);
99 delete (m_rlcSapUser);
100}
101
102void
103NrPdcp::SetRnti(uint16_t rnti)
104{
105 NS_LOG_FUNCTION(this << (uint32_t)rnti);
106 m_rnti = rnti;
107}
108
109void
110NrPdcp::SetLcId(uint8_t lcId)
111{
112 NS_LOG_FUNCTION(this << (uint32_t)lcId);
113 m_lcid = lcId;
114}
115
116void
117NrPdcp::SetNrPdcpSapUser(NrPdcpSapUser* s)
118{
119 NS_LOG_FUNCTION(this << s);
120 m_pdcpSapUser = s;
121}
122
124NrPdcp::GetNrPdcpSapProvider()
125{
126 NS_LOG_FUNCTION(this);
127 return m_pdcpSapProvider;
128}
129
130void
131NrPdcp::SetNrRlcSapProvider(NrRlcSapProvider* s)
132{
133 NS_LOG_FUNCTION(this << s);
134 m_rlcSapProvider = s;
135}
136
138NrPdcp::GetNrRlcSapUser()
139{
140 NS_LOG_FUNCTION(this);
141 return m_rlcSapUser;
142}
143
145NrPdcp::GetStatus() const
146{
147 Status s;
148 s.txSn = m_txSequenceNumber;
149 s.rxSn = m_rxSequenceNumber;
150 return s;
151}
152
153void
154NrPdcp::SetStatus(Status s)
155{
156 m_txSequenceNumber = s.txSn;
157 m_rxSequenceNumber = s.rxSn;
158}
159
161
162void
163NrPdcp::DoTransmitPdcpSdu(NrPdcpSapProvider::TransmitPdcpSduParameters params)
164{
165 NS_LOG_FUNCTION(this << m_rnti << static_cast<uint16_t>(m_lcid) << params.pdcpSdu->GetSize());
166 Ptr<Packet> p = params.pdcpSdu;
167
168 // Sender timestamp
169 NrPdcpTag pdcpTag(Simulator::Now());
170
171 NrPdcpHeader pdcpHeader;
172 pdcpHeader.SetSequenceNumber(m_txSequenceNumber);
173
174 m_txSequenceNumber++;
175 if (m_txSequenceNumber > m_maxPdcpSn)
176 {
177 m_txSequenceNumber = 0;
178 }
179
180 pdcpHeader.SetDcBit(NrPdcpHeader::DATA_PDU);
181 p->AddHeader(pdcpHeader);
182 p->AddByteTag(pdcpTag, 1, pdcpHeader.GetSerializedSize());
183
184 m_txPdu(m_rnti, m_lcid, p->GetSize());
185
187 txParams.rnti = m_rnti;
188 txParams.lcid = m_lcid;
189 txParams.pdcpPdu = p;
190
191 NS_LOG_INFO("Transmitting PDCP PDU with header: " << pdcpHeader);
192 m_rlcSapProvider->TransmitPdcpPdu(txParams);
193}
194
195void
196NrPdcp::DoReceivePdu(Ptr<Packet> p)
197{
198 NS_LOG_FUNCTION(this << m_rnti << (uint32_t)m_lcid << p->GetSize());
199
200 // Receiver timestamp
201 NrPdcpTag pdcpTag;
202 Time delay;
203 p->FindFirstMatchingByteTag(pdcpTag);
204 delay = Simulator::Now() - pdcpTag.GetSenderTimestamp();
205 m_rxPdu(m_rnti, m_lcid, p->GetSize(), delay.GetNanoSeconds());
206
207 NrPdcpHeader pdcpHeader;
208 p->RemoveHeader(pdcpHeader);
209 NS_LOG_LOGIC("PDCP header: " << pdcpHeader);
210
211 m_rxSequenceNumber = pdcpHeader.GetSequenceNumber() + 1;
212 if (m_rxSequenceNumber > m_maxPdcpSn)
213 {
214 m_rxSequenceNumber = 0;
215 }
216
218 params.pdcpSdu = p;
219 params.rnti = m_rnti;
220 params.lcid = m_lcid;
221 m_pdcpSapUser->ReceivePdcpSdu(params);
222}
223
224} // namespace ns3
The packet header for the Packet Data Convergence Protocol (PDCP) packets.
void SetSequenceNumber(uint16_t sequenceNumber)
Set sequence number.
uint16_t GetSequenceNumber() const
Get sequence number.
void SetDcBit(uint8_t dcBit)
Set DC bit.
Time GetSenderTimestamp() const
uint16_t rxSn
RX sequence number.
Definition nr-pdcp.h:91
uint16_t txSn
TX sequence number.
Definition nr-pdcp.h:90