OLD | NEW |
(Empty) | |
| 1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ |
| 2 /* |
| 3 * Copyright (c) 2011-2012 Centre Tecnologic de Telecomunicacions de Catalunya (
CTTC) |
| 4 * |
| 5 * This program is free software; you can redistribute it and/or modify |
| 6 * it under the terms of the GNU General Public License version 2 as |
| 7 * published by the Free Software Foundation; |
| 8 * |
| 9 * This program is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 * GNU General Public License for more details. |
| 13 * |
| 14 * You should have received a copy of the GNU General Public License |
| 15 * along with this program; if not, write to the Free Software |
| 16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 17 * |
| 18 * Author: Manuel Requena <manuel.requena@cttc.es> |
| 19 * Modified by: NIST |
| 20 */ |
| 21 |
| 22 #include "ns3/log.h" |
| 23 #include "ns3/simulator.h" |
| 24 |
| 25 #include "ns3/nist-lte-pdcp.h" |
| 26 #include "ns3/nist-lte-pdcp-header.h" |
| 27 #include "ns3/nist-lte-pdcp-sap.h" |
| 28 #include "ns3/nist-lte-pdcp-tag.h" |
| 29 |
| 30 namespace ns3 { |
| 31 |
| 32 NS_LOG_COMPONENT_DEFINE ("NistLtePdcp"); |
| 33 |
| 34 class NistLtePdcpSpecificLteRlcSapUser : public NistLteRlcSapUser |
| 35 { |
| 36 public: |
| 37 NistLtePdcpSpecificLteRlcSapUser (NistLtePdcp* pdcp); |
| 38 |
| 39 // Interface provided to lower RLC entity (implemented from NistLteRlcSapUser) |
| 40 virtual void ReceivePdcpPdu (Ptr<Packet> p); |
| 41 |
| 42 private: |
| 43 NistLtePdcpSpecificLteRlcSapUser (); |
| 44 NistLtePdcp* m_pdcp; |
| 45 }; |
| 46 |
| 47 NistLtePdcpSpecificLteRlcSapUser::NistLtePdcpSpecificLteRlcSapUser (NistLtePdcp*
pdcp) |
| 48 : m_pdcp (pdcp) |
| 49 { |
| 50 } |
| 51 |
| 52 NistLtePdcpSpecificLteRlcSapUser::NistLtePdcpSpecificLteRlcSapUser () |
| 53 { |
| 54 } |
| 55 |
| 56 void |
| 57 NistLtePdcpSpecificLteRlcSapUser::ReceivePdcpPdu (Ptr<Packet> p) |
| 58 { |
| 59 m_pdcp->DoReceivePdu (p); |
| 60 } |
| 61 |
| 62 /////////////////////////////////////// |
| 63 |
| 64 NS_OBJECT_ENSURE_REGISTERED (NistLtePdcp); |
| 65 |
| 66 NistLtePdcp::NistLtePdcp () |
| 67 : m_pdcpSapUser (0), |
| 68 m_rlcSapProvider (0), |
| 69 m_rnti (0), |
| 70 m_lcid (0), |
| 71 m_srcL2Id (0), |
| 72 m_dstL2Id (0), |
| 73 m_txSequenceNumber (0), |
| 74 m_rxSequenceNumber (0) |
| 75 { |
| 76 NS_LOG_FUNCTION (this); |
| 77 m_pdcpSapProvider = new NistLtePdcpSpecificLtePdcpSapProvider<NistLtePdcp> (th
is); |
| 78 m_rlcSapUser = new NistLtePdcpSpecificLteRlcSapUser (this); |
| 79 } |
| 80 |
| 81 NistLtePdcp::~NistLtePdcp () |
| 82 { |
| 83 NS_LOG_FUNCTION (this); |
| 84 } |
| 85 |
| 86 TypeId |
| 87 NistLtePdcp::GetTypeId (void) |
| 88 { |
| 89 static TypeId tid = TypeId ("ns3::NistLtePdcp") |
| 90 .SetParent<Object> () |
| 91 .AddTraceSource ("TxPDU", |
| 92 "PDU transmission notified to the RLC.", |
| 93 MakeTraceSourceAccessor (&NistLtePdcp::m_txPdu), |
| 94 "ns3::NistLtePdcp::PduTxTracedCallback") |
| 95 .AddTraceSource ("RxPDU", |
| 96 "PDU received.", |
| 97 MakeTraceSourceAccessor (&NistLtePdcp::m_rxPdu), |
| 98 "ns3::NistLtePdcp::PduRxTracedCallback") |
| 99 ; |
| 100 return tid; |
| 101 } |
| 102 |
| 103 void |
| 104 NistLtePdcp::DoDispose () |
| 105 { |
| 106 NS_LOG_FUNCTION (this); |
| 107 delete (m_pdcpSapProvider); |
| 108 delete (m_rlcSapUser); |
| 109 } |
| 110 |
| 111 |
| 112 void |
| 113 NistLtePdcp::SetRnti (uint16_t rnti) |
| 114 { |
| 115 NS_LOG_FUNCTION (this << (uint32_t) rnti); |
| 116 m_rnti = rnti; |
| 117 } |
| 118 |
| 119 void |
| 120 NistLtePdcp::SetLcId (uint8_t lcId) |
| 121 { |
| 122 NS_LOG_FUNCTION (this << (uint32_t) lcId); |
| 123 m_lcid = lcId; |
| 124 } |
| 125 |
| 126 void |
| 127 NistLtePdcp::SetSourceL2Id (uint32_t src) |
| 128 { |
| 129 NS_LOG_FUNCTION (this << src); |
| 130 m_srcL2Id = src; |
| 131 } |
| 132 |
| 133 void |
| 134 NistLtePdcp::SetDestinationL2Id (uint32_t dst) |
| 135 { |
| 136 NS_LOG_FUNCTION (this << dst); |
| 137 m_dstL2Id = dst; |
| 138 } |
| 139 |
| 140 void |
| 141 NistLtePdcp::SetNistLtePdcpSapUser (NistLtePdcpSapUser * s) |
| 142 { |
| 143 NS_LOG_FUNCTION (this << s); |
| 144 m_pdcpSapUser = s; |
| 145 } |
| 146 |
| 147 NistLtePdcpSapProvider* |
| 148 NistLtePdcp::GetNistLtePdcpSapProvider () |
| 149 { |
| 150 NS_LOG_FUNCTION (this); |
| 151 return m_pdcpSapProvider; |
| 152 } |
| 153 |
| 154 void |
| 155 NistLtePdcp::SetNistLteRlcSapProvider (NistLteRlcSapProvider * s) |
| 156 { |
| 157 NS_LOG_FUNCTION (this << s); |
| 158 m_rlcSapProvider = s; |
| 159 } |
| 160 |
| 161 NistLteRlcSapUser* |
| 162 NistLtePdcp::GetNistLteRlcSapUser () |
| 163 { |
| 164 NS_LOG_FUNCTION (this); |
| 165 return m_rlcSapUser; |
| 166 } |
| 167 |
| 168 NistLtePdcp::NistStatus· |
| 169 NistLtePdcp::GetNistStatus () |
| 170 { |
| 171 NistStatus s; |
| 172 s.txSn = m_txSequenceNumber; |
| 173 s.rxSn = m_rxSequenceNumber; |
| 174 return s; |
| 175 } |
| 176 |
| 177 void· |
| 178 NistLtePdcp::SetNistStatus (NistStatus s) |
| 179 { |
| 180 m_txSequenceNumber = s.txSn; |
| 181 m_rxSequenceNumber = s.rxSn; |
| 182 } |
| 183 |
| 184 //////////////////////////////////////// |
| 185 |
| 186 void |
| 187 NistLtePdcp::DoTransmitPdcpSdu (Ptr<Packet> p) |
| 188 { |
| 189 NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << p->GetSize ()); |
| 190 |
| 191 NistLtePdcpHeader pdcpHeader; |
| 192 pdcpHeader.SetSequenceNumber (m_txSequenceNumber); |
| 193 |
| 194 m_txSequenceNumber++; |
| 195 if (m_txSequenceNumber > m_maxPdcpSn) |
| 196 { |
| 197 m_txSequenceNumber = 0; |
| 198 } |
| 199 |
| 200 pdcpHeader.SetDcBit (NistLtePdcpHeader::DATA_PDU); |
| 201 |
| 202 NS_LOG_LOGIC ("PDCP header: " << pdcpHeader); |
| 203 p->AddHeader (pdcpHeader); |
| 204 |
| 205 // Sender timestamp |
| 206 NistPdcpTag pdcpTag (Simulator::Now ()); |
| 207 p->AddByteTag (pdcpTag); |
| 208 m_txPdu (m_rnti, m_lcid, p->GetSize ()); |
| 209 |
| 210 NistLteRlcSapProvider::NistTransmitPdcpPduParameters params; |
| 211 params.rnti = m_rnti; |
| 212 params.lcid = m_lcid; |
| 213 params.srcL2Id = m_srcL2Id; |
| 214 params.dstL2Id = m_dstL2Id; |
| 215 params.pdcpPdu = p; |
| 216 |
| 217 m_rlcSapProvider->TransmitPdcpPdu (params); |
| 218 } |
| 219 |
| 220 void |
| 221 NistLtePdcp::DoReceivePdu (Ptr<Packet> p) |
| 222 { |
| 223 NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << p->GetSize ()); |
| 224 |
| 225 // Receiver timestamp |
| 226 NistPdcpTag pdcpTag; |
| 227 Time delay; |
| 228 if (p->FindFirstMatchingByteTag (pdcpTag)) |
| 229 { |
| 230 delay = Simulator::Now() - pdcpTag.GetSenderTimestamp (); |
| 231 } |
| 232 m_rxPdu(m_rnti, m_lcid, p->GetSize (), delay.GetNanoSeconds ()); |
| 233 |
| 234 NistLtePdcpHeader pdcpHeader; |
| 235 p->RemoveHeader (pdcpHeader); |
| 236 NS_LOG_LOGIC ("PDCP header: " << pdcpHeader); |
| 237 |
| 238 m_rxSequenceNumber = pdcpHeader.GetSequenceNumber () + 1; |
| 239 if (m_rxSequenceNumber > m_maxPdcpSn) |
| 240 { |
| 241 m_rxSequenceNumber = 0; |
| 242 } |
| 243 |
| 244 NistLtePdcpSapUser::NistReceivePdcpSduParameters params; |
| 245 params.pdcpSdu = p; |
| 246 params.rnti = m_rnti; |
| 247 params.lcid = m_lcid; |
| 248 params.srcL2Id = m_srcL2Id; |
| 249 params.dstL2Id = m_dstL2Id; |
| 250 m_pdcpSapUser->ReceivePdcpSdu (params); |
| 251 } |
| 252 |
| 253 |
| 254 } // namespace ns3 |
OLD | NEW |