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