blob: 1119ba83b954a53a70ec1ebe89428d657ad5a55a [file] [log] [blame]
Alexander Afanasyevc74a6022011-08-15 20:01:35 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
Alexander Afanasyev08d984e2011-08-13 19:20:22 -07002/*
Ilya Moiseenko956d0542012-01-02 15:26:40 -08003 * Copyright (c) 2011 University of California, Los Angeles
Alexander Afanasyev08d984e2011-08-13 19:20:22 -07004 *
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 *
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -070018 * Authors: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070019 */
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -070020
Alexander Afanasyev98256102011-08-14 01:00:02 -070021#ifndef CCNX_FACE_H
22#define CCNX_FACE_H
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070023
Alexander Afanasyev98256102011-08-14 01:00:02 -070024#include <ostream>
Alexander Afanasyev19426ef2011-11-23 20:55:28 -080025#include <algorithm>
Alexander Afanasyev98256102011-08-14 01:00:02 -070026
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070027#include "ns3/ptr.h"
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080028#include "ns3/ccnx.h"
Alexander Afanasyev19426ef2011-11-23 20:55:28 -080029#include "ns3/nstime.h"
Alexander Afanasyev7f3e49e2012-04-30 00:17:07 -070030#include "ns3/type-id.h"
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070031
32namespace ns3 {
33
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070034class Packet;
35class Node;
Alexander Afanasyev0ab833e2011-08-18 15:49:13 -070036
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070037/**
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070038 * \ingroup ccnx
Alexander Afanasyev0ab833e2011-08-18 15:49:13 -070039 * \defgroup ccnx-face Faces
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -070040 */
41/**
42 * \ingroup ccnx-face
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070043 * \brief Virtual class defining CCNx face
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070044 *
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070045 * This class defines basic functionality of CCNx face. Face is core
46 * component responsible for actual delivery of data packet to and
47 * from CCNx stack
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070048 *
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070049 * \see CcnxLocalFace, CcnxNetDeviceFace, CcnxIpv4Face, CcnxUdpFace
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070050 */
Alexander Afanasyevbdc0d982011-12-16 01:15:26 -080051class CcnxFace : public Object
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070052{
53public:
Alexander Afanasyevbdc0d982011-12-16 01:15:26 -080054 static TypeId
55 GetTypeId ();
56
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070057 /**
Alexander Afanasyevbdc0d982011-12-16 01:15:26 -080058 * \brief Ccnx protocol handler
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070059 *
60 * \param face Face from which packet has been received
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080061 * \param packet Original packet
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070062 */
Alexander Afanasyev0ab833e2011-08-18 15:49:13 -070063 typedef Callback<void,const Ptr<CcnxFace>&,const Ptr<const Packet>& > ProtocolHandler;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070064
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070065 /**
66 * \brief Default constructor
67 */
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080068 CcnxFace (Ptr<Node> node);
Alexander Afanasyev98256102011-08-14 01:00:02 -070069 virtual ~CcnxFace();
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070070
Alexander Afanasyevb4fee8b2012-06-06 12:54:26 -070071 /**
72 * @brief Get node to which this face is associated
73 */
Alexander Afanasyeve9c9d722012-01-19 16:59:30 -080074 Ptr<Node>
75 GetNode () const;
76
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070077 ////////////////////////////////////////////////////////////////////
78
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070079 /**
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070080 * \brief Register callback to call when new packet arrives on the face
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070081 *
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070082 * This method should call protocol-dependent registration function
83 */
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080084 virtual void
85 RegisterProtocolHandler (ProtocolHandler handler);
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070086
87 /**
Alexander Afanasyev19426ef2011-11-23 20:55:28 -080088 * @brief Check if Interest limit is reached
89 *
90 * Side effect: if limit is not yet reached, the number of outstanding packets will be increased
91 *
92 * @returns true if Interest limit is not yet reached
93 */
94 bool
95 IsBelowLimit ();
96
97 /**
98 * \brief Send packet on a face
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070099 *
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800100 * This method will be called by lower layers to send data to device or application
101 *
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800102 * \param p smart pointer to a packet to send
103 *
Alexander Afanasyev19426ef2011-11-23 20:55:28 -0800104 * @return false if either limit is reached
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800105 */
106 bool
Alexander Afanasyev19426ef2011-11-23 20:55:28 -0800107 Send (Ptr<Packet> p);
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800108
109 /**
110 * \brief Receive packet from application or another node and forward it to the CCNx stack
111 *
112 * \todo The only reason for this call is to handle tracing, if requested
Alexander Afanasyevab1d5602011-08-17 19:17:18 -0700113 */
Alexander Afanasyev19426ef2011-11-23 20:55:28 -0800114 bool
115 Receive (const Ptr<const Packet> &p);
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800116 ////////////////////////////////////////////////////////////////////
Alexander Afanasyevab1d5602011-08-17 19:17:18 -0700117
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -0800118 /**
119 * \Brief Assign routing/forwarding metric with face
120 *
121 * \param metric configured routing metric (cost) of this face
122 */
123 virtual void SetMetric (uint16_t metric);
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700124
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -0800125 /**
126 * \brief Get routing/forwarding metric assigned to the face
127 *
128 * \returns configured routing/forwarding metric (cost) of this face
129 */
130 virtual uint16_t GetMetric (void) const;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700131
132 /**
Alexander Afanasyevab1d5602011-08-17 19:17:18 -0700133 * These are face states and may be distinct from actual lower-layer
134 * device states, such as found in real implementations (where the
135 * device may be down but ccnx face state is still up).
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700136 */
Alexander Afanasyevab1d5602011-08-17 19:17:18 -0700137
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700138 /**
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800139 * \brief Enable or disable this face
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700140 */
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800141 virtual void
142 SetUp (bool up = true);
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700143
144 /**
Alexander Afanasyevab1d5602011-08-17 19:17:18 -0700145 * \brief Returns true if this face is enabled, false otherwise.
146 */
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800147 virtual bool
148 IsUp () const;
Alexander Afanasyevb4fee8b2012-06-06 12:54:26 -0700149
150 /**
151 * @brief Print information about the face into the stream
152 * @param os stream to write information to
153 */
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700154 virtual std::ostream&
155 Print (std::ostream &os) const;
156
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700157 /**
158 * \brief Set node Id
159 *
160 * Id is purely informative and should not be used for any other purpose
161 *
162 * \param id id to set
163 */
164 inline void
165 SetId (uint32_t id);
166
167 /**
168 * \brief Get node Id
169 *
170 * Id is purely informative and should not be used for any other purpose
171 *
172 * \returns id id to set
173 */
174 inline uint32_t
175 GetId () const;
176
Alexander Afanasyev7fd74f92011-08-25 19:40:17 -0700177 /**
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800178 * @brief Set maximum value for Interest allowance
179 *
180 * @param bucket maximum value for Interest allowance. If < 0, then limit will be disabled
181 */
Alexander Afanasyevc39f0b42011-11-28 12:51:12 -0800182 void
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800183 SetBucketMax (double bucket);
184
185 /**
Alexander Afanasyev11453142011-11-25 16:13:33 -0800186 * @brief Set a normalized value (one second) for Interest allowance bucket leak
187 */
Alexander Afanasyevc39f0b42011-11-28 12:51:12 -0800188 void
Alexander Afanasyev11453142011-11-25 16:13:33 -0800189 SetBucketLeak (double leak);
190
191 /**
Alexander Afanasyev4975f732011-12-20 17:52:19 -0800192 * @brief Leak the Interest allowance bucket by (1/interval) * m_bucketMax amount,
193 * where interval is time between two consecutive calls of LeakBucket
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800194 */
Alexander Afanasyevb5703a92011-11-25 16:46:15 -0800195 void
Alexander Afanasyev4975f732011-12-20 17:52:19 -0800196 LeakBucket ();
Alexander Afanasyev9d313d42011-11-25 13:36:15 -0800197
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800198 /**
Alexander Afanasyev7fd74f92011-08-25 19:40:17 -0700199 * \brief Compare two faces. Only two faces on the same node could be compared.
200 *
201 * Internal index is used for comparison.
202 */
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700203 bool
204 operator== (const CcnxFace &face) const;
Alexander Afanasyev7fd74f92011-08-25 19:40:17 -0700205
206 /**
207 * \brief Compare two faces. Only two faces on the same node could be compared.
208 *
209 * Internal index is used for comparison.
210 */
Alexander Afanasyev0845c092012-07-13 17:45:33 -0700211 inline bool
212 operator!= (const CcnxFace &face) const;
213
214 /**
215 * \brief Compare two faces. Only two faces on the same node could be compared.
216 *
217 * Internal index is used for comparison.
218 */
Alexander Afanasyev7fd74f92011-08-25 19:40:17 -0700219 bool
220 operator< (const CcnxFace &face) const;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700221
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800222protected:
223 /**
224 * \brief Send packet on a face (actual implementation)
225 *
226 * \param p smart pointer to a packet to send
227 */
228 virtual void
229 SendImpl (Ptr<Packet> p) = 0;
230
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700231private:
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700232 CcnxFace (const CcnxFace &); ///< \brief Disabled copy constructor
233 CcnxFace& operator= (const CcnxFace &); ///< \brief Disabled copy operator
Alexander Afanasyevab1d5602011-08-17 19:17:18 -0700234
235protected:
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700236 // uint16_t m_metric; ///< \brief Routing/forwarding metric
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700237 Ptr<Node> m_node; ///< \brief Smart pointer to Node
Alexander Afanasyeva46844b2011-11-21 19:13:26 -0800238
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800239 double m_bucket; ///< \brief Value representing current size of the Interest allowance for this face
240 double m_bucketMax; ///< \brief Maximum Interest allowance for this face
241 double m_bucketLeak; ///< \brief Normalized amount that should be leaked every second
242
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700243private:
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800244 ProtocolHandler m_protocolHandler; ///< Callback via which packets are getting send to CCNx stack
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700245 bool m_ifup; ///< \brief flag indicating that the interface is UP
Alexander Afanasyev4975f732011-12-20 17:52:19 -0800246 uint32_t m_id; ///< \brief id of the interface in CCNx stack (per-node uniqueness)
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -0800247 Time m_lastLeakTime;
248 uint32_t m_metric; ///< \brief metric of the face
249
Alexander Afanasyev30c33e32012-06-05 21:28:44 -0700250 // bool m_enableMetricTagging;
251
252 TracedCallback<Ptr<const Packet> > m_ccnxTxTrace;
253 TracedCallback<Ptr<const Packet> > m_ccnxRxTrace;
254 TracedCallback<Ptr<const Packet> > m_ccnxDropTrace;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700255};
256
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700257std::ostream& operator<< (std::ostream& os, const CcnxFace &face);
258
Alexander Afanasyev78cf0c92011-09-01 19:57:14 -0700259inline bool
260operator < (const Ptr<CcnxFace> &lhs, const Ptr<CcnxFace> &rhs)
261{
262 return *lhs < *rhs;
263}
264
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700265void
266CcnxFace::SetId (uint32_t id)
267{
268 m_id = id;
269}
270
271uint32_t
272CcnxFace::GetId () const
273{
274 return m_id;
275}
Alexander Afanasyev98256102011-08-14 01:00:02 -0700276
Alexander Afanasyev0845c092012-07-13 17:45:33 -0700277inline bool
278CcnxFace::operator!= (const CcnxFace &face) const
279{
280 return !(*this == face);
281}
282
283
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700284} // namespace ns3
285
Alexander Afanasyev98256102011-08-14 01:00:02 -0700286#endif //CCNX_FACE_H