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 */ 20 21 #ifndef LTE_PDCP_H 22 #define LTE_PDCP_H 23 24 #include "ns3/traced-value.h" 25 #include "ns3/trace-source-accessor.h" 26 27 #include "ns3/object.h" 28 29 #include "ns3/lte-pdcp-sap.h" 30 #include "ns3/lte-rlc-sap.h" 31 32 namespace ns3 { 33 34 /** 35 * LTE PDCP entity, see 3GPP TS 36.323 36 */ 37 class LtePdcp : public Object // SimpleRefCount<LtePdcp> 38 { 39 /// allow LtePdcpSpecificLteRlcSapUser class friend access 40 friend class LtePdcpSpecificLteRlcSapUser; 41 /// allow LtePdcpSpecificLtePdcpSapProvider<LtePdcp> class friend access 42 friend class LtePdcpSpecificLtePdcpSapProvider<LtePdcp>; 43 public: 44 LtePdcp (); 45 virtual ~LtePdcp (); 46 /** 47 * \brief Get the type ID. 48 * \return the object TypeId 49 */ 50 static TypeId GetTypeId (void); 51 virtual void DoDispose (); 52 53 /** 54 * 55 * 56 * \param rnti 57 */ 58 void SetRnti (uint16_t rnti); 59 60 /** 61 * 62 * 63 * \param lcId 64 */ 65 void SetLcId (uint8_t lcId); 66 67 /** 68 * 69 * 70 * \param s the PDCP SAP user to be used by this LTE_PDCP 71 */ 72 void SetLtePdcpSapUser (LtePdcpSapUser * s); 73 74 /** 75 * 76 * 77 * \return the PDCP SAP Provider interface offered to the RRC by this LTE_PDCP 78 */ 79 LtePdcpSapProvider* GetLtePdcpSapProvider (); 80 81 /** 82 * 83 * 84 * \param s the RLC SAP Provider to be used by this LTE_PDCP 85 */ 86 void SetLteRlcSapProvider (LteRlcSapProvider * s); 87 88 /** 89 * 90 * 91 * \return the RLC SAP User interface offered to the RLC by this LTE_PDCP 92 */ 93 LteRlcSapUser* GetLteRlcSapUser (); 94 95 /// maximum PDCP SN 96 static const uint16_t MAX_PDCP_SN = 4096; 97 98 /** 99 * Status variables of the PDCP 100 */ 101 struct Status 102 { 103 uint16_t txSn; ///< TX sequence number 104 uint16_t rxSn; ///< RX sequence number 105 }; 106 107 /** 108 * 109 * \return the current status of the PDCP 110 */ 111 Status GetStatus (); 112 113 /** 114 * Set the status of the PDCP 115 * 116 * \param s 117 */ 118 void SetStatus (Status s); 119 120 /** 121 * TracedCallback for PDU transmission event. 122 * 123 * \param [in] rnti The C-RNTI identifying the UE. 124 * \param [in] lcid The logical channel id corresponding to 125 * the sending RLC instance. 126 * \param [in] size Packet size. 127 */ 128 typedef void (* PduTxTracedCallback) 129 (uint16_t rnti, uint8_t lcid, uint32_t size); 130 131 /** 132 * TracedCallback signature for PDU receive event. 133 * 134 * \param [in] rnti The C-RNTI identifying the UE. 135 * \param [in] lcid The logical channel id corresponding to 136 * the sending RLC instance. 137 * \param [in] size Packet size. 138 * \param [in] delay Delay since packet sent, in ns.. 139 */ 140 typedef void (* PduRxTracedCallback) 141 (const uint16_t rnti, const uint8_t lcid, 142 const uint32_t size, const uint64_t delay); 143 144 protected: 145 /** 146 * Interface provided to upper RRC entity 147 * 148 * \param params the TransmitPdcpSduParameters 149 */ 150 virtual void DoTransmitPdcpSdu (LtePdcpSapProvider::TransmitPdcpSduParameters params); 151 152 LtePdcpSapUser* m_pdcpSapUser; ///< PDCP SAP user 153 LtePdcpSapProvider* m_pdcpSapProvider; ///< PDCP SAP provider 154 155 /** 156 * Interface provided to lower RLC entity 157 * 158 * \param p packet 159 */ 160 virtual void DoReceivePdu (Ptr<Packet> p); 161 162 LteRlcSapUser* m_rlcSapUser; ///< RLC SAP user 163 LteRlcSapProvider* m_rlcSapProvider; ///< RLC SAP provider 164 165 uint16_t m_rnti; ///< RNTI 166 uint8_t m_lcid; ///< LCID 167 168 /** 169 * Used to inform of a PDU delivery to the RLC SAP provider. 170 * The parameters are RNTI, LCID and bytes delivered 171 */ 172 TracedCallback<uint16_t, uint8_t, uint32_t> m_txPdu; 173 /** 174 * Used to inform of a PDU reception from the RLC SAP user. 175 * The parameters are RNTI, LCID, bytes delivered and delivery delay in nanoseconds. 176 */ 177 TracedCallback<uint16_t, uint8_t, uint32_t, uint64_t> m_rxPdu; 178 179 private: 180 /** 181 * State variables. See section 7.1 in TS 36.323 182 */ 183 uint16_t m_txSequenceNumber; 184 /** 185 * State variables. See section 7.1 in TS 36.323 186 */ 187 uint16_t m_rxSequenceNumber; 188 189 /** 190 * Constants. See section 7.2 in TS 36.323 191 */ 192 static const uint16_t m_maxPdcpSn = 4095; 193 194 }; 195 196 197 } // namespace ns3 198 199 #endif // LTE_PDCP_H 200