blob: 97c75f95c64b9cdecff33145356010dd1c99ce06 [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 Afanasyev4aac5572012-08-09 10:49:55 -070021#ifndef NDN_FACE_H
22#define NDN_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 Afanasyevcf6dc922012-08-10 16:55:27 -070028#include "ns3/object.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 Afanasyevcf6dc922012-08-10 16:55:27 -070031#include "ns3/traced-callback.h"
Alexander Afanasyevea9b3e62012-08-13 19:02:54 -070032#include "ns3/ndn-limits.h"
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070033
34namespace ns3 {
35
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070036class Packet;
37class Node;
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070038
39namespace ndn {
40
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070041/**
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070042 * \ingroup ndn
43 * \defgroup ndn-face Faces
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -070044 */
45/**
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070046 * \ingroup ndn-face
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070047 * \brief Virtual class defining NDN face
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070048 *
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070049 * This class defines basic functionality of NDN face. Face is core
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070050 * component responsible for actual delivery of data packet to and
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070051 * from NDN stack
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070052 *
Alexander Afanasyevc57a8772013-03-16 11:55:20 -070053 * \see ndn::AppFace, ndn::NetDeviceFace
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070054 */
Alexander Afanasyevcf6dc922012-08-10 16:55:27 -070055class Face :
56 public Object
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070057{
58public:
Alexander Afanasyevbdc0d982011-12-16 01:15:26 -080059 static TypeId
60 GetTypeId ();
Alexander Afanasyevdd9fa4f2013-05-15 16:35:04 -070061
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070062 /**
Alexander Afanasyevc57a8772013-03-16 11:55:20 -070063 * \brief NDN protocol handler
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070064 *
65 * \param face Face from which packet has been received
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080066 * \param packet Original packet
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070067 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070068 typedef Callback<void,const Ptr<Face>&,const Ptr<const Packet>& > ProtocolHandler;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070069
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070070 /**
71 * \brief Default constructor
72 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070073 Face (Ptr<Node> node);
74 virtual ~Face();
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070075
Alexander Afanasyevb4fee8b2012-06-06 12:54:26 -070076 /**
77 * @brief Get node to which this face is associated
78 */
Alexander Afanasyeve9c9d722012-01-19 16:59:30 -080079 Ptr<Node>
80 GetNode () const;
81
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070082 ////////////////////////////////////////////////////////////////////
Alexander Afanasyevdd9fa4f2013-05-15 16:35:04 -070083
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070084 /**
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070085 * \brief Register callback to call when new packet arrives on the face
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070086 *
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070087 * This method should call protocol-dependent registration function
88 */
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080089 virtual void
90 RegisterProtocolHandler (ProtocolHandler handler);
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070091
92 /**
Alexander Afanasyev19426ef2011-11-23 20:55:28 -080093 * \brief Send packet on a face
Alexander Afanasyevab1d5602011-08-17 19:17:18 -070094 *
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080095 * This method will be called by lower layers to send data to device or application
96 *
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080097 * \param p smart pointer to a packet to send
98 *
Alexander Afanasyev19426ef2011-11-23 20:55:28 -080099 * @return false if either limit is reached
Alexander Afanasyevdd9fa4f2013-05-15 16:35:04 -0700100 */
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800101 bool
Alexander Afanasyev19426ef2011-11-23 20:55:28 -0800102 Send (Ptr<Packet> p);
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800103
104 /**
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700105 * \brief Receive packet from application or another node and forward it to the Ndn stack
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800106 *
107 * \todo The only reason for this call is to handle tracing, if requested
Alexander Afanasyevab1d5602011-08-17 19:17:18 -0700108 */
Alexander Afanasyev19426ef2011-11-23 20:55:28 -0800109 bool
110 Receive (const Ptr<const Packet> &p);
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800111 ////////////////////////////////////////////////////////////////////
Alexander Afanasyevab1d5602011-08-17 19:17:18 -0700112
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -0800113 /**
Alexander Afanasyev042b4a72012-11-09 17:47:48 -0800114 * \brief Assign routing/forwarding metric with face
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -0800115 *
116 * \param metric configured routing metric (cost) of this face
117 */
Alexander Afanasyevdd9fa4f2013-05-15 16:35:04 -0700118 virtual void
119 SetMetric (uint16_t metric);
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700120
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -0800121 /**
122 * \brief Get routing/forwarding metric assigned to the face
123 *
124 * \returns configured routing/forwarding metric (cost) of this face
125 */
Alexander Afanasyevdd9fa4f2013-05-15 16:35:04 -0700126 virtual uint16_t
127 GetMetric (void) const;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700128
129 /**
Alexander Afanasyevab1d5602011-08-17 19:17:18 -0700130 * These are face states and may be distinct from actual lower-layer
131 * device states, such as found in real implementations (where the
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700132 * device may be down but ndn face state is still up).
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700133 */
Alexander Afanasyevdd9fa4f2013-05-15 16:35:04 -0700134
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700135 /**
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800136 * \brief Enable or disable this face
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700137 */
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800138 virtual void
139 SetUp (bool up = true);
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700140
141 /**
Alexander Afanasyevab1d5602011-08-17 19:17:18 -0700142 * \brief Returns true if this face is enabled, false otherwise.
143 */
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800144 virtual bool
145 IsUp () const;
Alexander Afanasyevb4fee8b2012-06-06 12:54:26 -0700146
147 /**
Alexander Afanasyevdd9fa4f2013-05-15 16:35:04 -0700148 * @brief Get face flags
149 *
150 * Face flags may indicate various properties of the face. For example, if the face is an application face,
151 * than the returned flags have Face::APPLICATION bit set.
152 *
153 * @see ndn::Face::Flags for the list of currently defined face flags
154 */
155 inline uint32_t
156 GetFlags () const;
157
158 /**
159 * @brief List of currently defined face flags
160 */
161 enum Flags
162 {
163 APPLICATION = 1 ///< @brief An application face
164 };
165
166 /**
Alexander Afanasyevb4fee8b2012-06-06 12:54:26 -0700167 * @brief Print information about the face into the stream
168 * @param os stream to write information to
169 */
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700170 virtual std::ostream&
171 Print (std::ostream &os) const;
172
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700173 /**
Alexander Afanasyevc57a8772013-03-16 11:55:20 -0700174 * \brief Set face Id
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700175 *
176 * Id is purely informative and should not be used for any other purpose
177 *
178 * \param id id to set
179 */
180 inline void
181 SetId (uint32_t id);
182
183 /**
Alexander Afanasyevc57a8772013-03-16 11:55:20 -0700184 * \brief Get face Id
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700185 *
186 * Id is purely informative and should not be used for any other purpose
187 *
188 * \returns id id to set
189 */
190 inline uint32_t
191 GetId () const;
192
Alexander Afanasyev7fd74f92011-08-25 19:40:17 -0700193 /**
194 * \brief Compare two faces. Only two faces on the same node could be compared.
195 *
196 * Internal index is used for comparison.
197 */
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700198 bool
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700199 operator== (const Face &face) const;
Alexander Afanasyev7fd74f92011-08-25 19:40:17 -0700200
201 /**
202 * \brief Compare two faces. Only two faces on the same node could be compared.
203 *
204 * Internal index is used for comparison.
205 */
Alexander Afanasyev0845c092012-07-13 17:45:33 -0700206 inline bool
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700207 operator!= (const Face &face) const;
Alexander Afanasyevdd9fa4f2013-05-15 16:35:04 -0700208
Alexander Afanasyev0845c092012-07-13 17:45:33 -0700209 /**
210 * \brief Compare two faces. Only two faces on the same node could be compared.
211 *
212 * Internal index is used for comparison.
213 */
Alexander Afanasyev7fd74f92011-08-25 19:40:17 -0700214 bool
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700215 operator< (const Face &face) const;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700216
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800217protected:
218 /**
219 * \brief Send packet on a face (actual implementation)
220 *
221 * \param p smart pointer to a packet to send
222 */
Alexander Afanasyev1c0248b2012-07-24 15:59:50 -0700223 virtual bool
Alexander Afanasyevdd9fa4f2013-05-15 16:35:04 -0700224 SendImpl (Ptr<Packet> p) = 0;
225
226 void
227 SetFlags (uint32_t flags);
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800228
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700229private:
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700230 Face (const Face &); ///< \brief Disabled copy constructor
231 Face& operator= (const Face &); ///< \brief Disabled copy operator
Alexander Afanasyevdd9fa4f2013-05-15 16:35:04 -0700232
Alexander Afanasyevab1d5602011-08-17 19:17:18 -0700233protected:
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700234 Ptr<Node> m_node; ///< \brief Smart pointer to Node
Alexander Afanasyevdd9fa4f2013-05-15 16:35:04 -0700235
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700236private:
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700237 ProtocolHandler m_protocolHandler; ///< Callback via which packets are getting send to Ndn stack
Alexander Afanasyevdd9fa4f2013-05-15 16:35:04 -0700238 bool m_ifup; ///< \brief flag indicating that the interface is UP
Alexander Afanasyevc57a8772013-03-16 11:55:20 -0700239 uint32_t m_id; ///< \brief id of the interface in NDN stack (per-node uniqueness)
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -0800240 uint32_t m_metric; ///< \brief metric of the face
Alexander Afanasyevdd9fa4f2013-05-15 16:35:04 -0700241 uint32_t m_flags;
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -0800242
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700243 TracedCallback<Ptr<const Packet> > m_txTrace;
244 TracedCallback<Ptr<const Packet> > m_rxTrace;
245 TracedCallback<Ptr<const Packet> > m_dropTrace;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700246};
247
Alexander Afanasyevdd9fa4f2013-05-15 16:35:04 -0700248std::ostream&
249operator<< (std::ostream& os, const Face &face);
250
251inline uint32_t
252Face::GetFlags () const
253{
254 return m_flags;
255}
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700256
Alexander Afanasyev78cf0c92011-09-01 19:57:14 -0700257inline bool
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700258operator < (const Ptr<Face> &lhs, const Ptr<Face> &rhs)
Alexander Afanasyev78cf0c92011-09-01 19:57:14 -0700259{
260 return *lhs < *rhs;
261}
262
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700263void
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700264Face::SetId (uint32_t id)
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700265{
266 m_id = id;
267}
268
269uint32_t
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700270Face::GetId () const
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700271{
272 return m_id;
273}
Alexander Afanasyev98256102011-08-14 01:00:02 -0700274
Alexander Afanasyev0845c092012-07-13 17:45:33 -0700275inline bool
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700276Face::operator!= (const Face &face) const
Alexander Afanasyev0845c092012-07-13 17:45:33 -0700277{
278 return !(*this == face);
279}
280
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700281} // namespace ndn
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700282} // namespace ns3
283
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700284#endif // NDN_FACE_H