blob: ece32f5a40637a232c6d1d8cd46a90d52baaccee [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 * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070019 *
20 */
21
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070022#include "ndn-face.h"
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070023
Alexander Afanasyev19426ef2011-11-23 20:55:28 -080024#include "ns3/packet.h"
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070025#include "ns3/log.h"
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070026#include "ns3/node.h"
Alexander Afanasyev7fd74f92011-08-25 19:40:17 -070027#include "ns3/assert.h"
Alexander Afanasyevcbe92ae2011-12-16 13:06:18 -080028#include "ns3/uinteger.h"
29#include "ns3/double.h"
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -080030#include "ns3/boolean.h"
Alexander Afanasyev4975f732011-12-20 17:52:19 -080031#include "ns3/simulator.h"
Alexander Afanasyev98d85e12012-08-09 10:06:05 -070032#include "ns3/random-variable.h"
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070033
Alexander Afanasyevde7601a2012-05-31 12:14:54 -070034// #include "ns3/weights-path-stretch-tag.h"
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -080035
Alexander Afanasyev23d2b542011-12-07 18:54:46 -080036#include <boost/ref.hpp>
37
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070038NS_LOG_COMPONENT_DEFINE ("ndn.Face");
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070039
40namespace ns3 {
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070041namespace ndn {
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070042
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070043NS_OBJECT_ENSURE_REGISTERED (Face);
Alexander Afanasyev30c33e32012-06-05 21:28:44 -070044
Alexander Afanasyevbdc0d982011-12-16 01:15:26 -080045TypeId
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070046Face::GetTypeId ()
Alexander Afanasyevbdc0d982011-12-16 01:15:26 -080047{
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070048 static TypeId tid = TypeId ("ns3::ndn::Face")
Alexander Afanasyevbdc0d982011-12-16 01:15:26 -080049 .SetParent<Object> ()
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070050 .SetGroupName ("Ndn")
51 .AddAttribute ("Id", "Face id (unique integer for the Ndn stack on this node)",
Alexander Afanasyevcbe92ae2011-12-16 13:06:18 -080052 TypeId::ATTR_GET, // allow only getting it.
53 UintegerValue (0),
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070054 MakeUintegerAccessor (&Face::m_id),
Alexander Afanasyevcbe92ae2011-12-16 13:06:18 -080055 MakeUintegerChecker<uint32_t> ())
56
57 .AddAttribute ("BucketMax", "Maximum size of leaky bucket",
58 DoubleValue (-1.0),
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070059 MakeDoubleAccessor (&Face::m_bucketMax),
Alexander Afanasyevcbe92ae2011-12-16 13:06:18 -080060 MakeDoubleChecker<double> ())
61 .AddAttribute ("BucketLeak", "Normalized bucket leak size",
62 DoubleValue (0.0),
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070063 MakeDoubleAccessor (&Face::m_bucketLeak),
Alexander Afanasyevcbe92ae2011-12-16 13:06:18 -080064 MakeDoubleChecker<double> ())
Alexander Afanasyev98d85e12012-08-09 10:06:05 -070065
66 .AddAttribute ("RandomizeLimitChecking", "Whether or not to randomize the limit checking procedure. false (persistent) by default",
67 BooleanValue (false),
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070068 MakeBooleanAccessor (&Face::m_randomizeLimitChecking),
Alexander Afanasyev98d85e12012-08-09 10:06:05 -070069 MakeBooleanChecker ())
Alexander Afanasyevcbe92ae2011-12-16 13:06:18 -080070
Alexander Afanasyevde7601a2012-05-31 12:14:54 -070071 // .AddAttribute ("MetricTagging", "Enable metric tagging (path-stretch calculation)",
72 // BooleanValue (false),
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070073 // MakeBooleanAccessor (&Face::m_enableMetricTagging),
Alexander Afanasyevde7601a2012-05-31 12:14:54 -070074 // MakeBooleanChecker ())
Alexander Afanasyev30c33e32012-06-05 21:28:44 -070075
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070076 .AddTraceSource ("NdnTx", "Transmitted packet trace",
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070077 MakeTraceSourceAccessor (&Face::m_txTrace))
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070078 .AddTraceSource ("NdnRx", "Received packet trace",
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070079 MakeTraceSourceAccessor (&Face::m_rxTrace))
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070080 .AddTraceSource ("NdnDrop", "Dropped packet trace",
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070081 MakeTraceSourceAccessor (&Face::m_dropTrace))
Alexander Afanasyevbdc0d982011-12-16 01:15:26 -080082 ;
83 return tid;
84}
85
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070086/**
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070087 * By default, Ndn face are created in the "down" state
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070088 * with no IP addresses. Before becoming useable, the user must
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070089 * invoke SetUp on them once an Ndn address and mask have been set.
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070090 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070091Face::Face (Ptr<Node> node)
Alexander Afanasyev19426ef2011-11-23 20:55:28 -080092 : m_node (node)
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070093 , m_protocolHandler (MakeNullCallback<void,const Ptr<Face>&,const Ptr<const Packet>&> ())
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -070094 , m_ifup (false)
95 , m_id ((uint32_t)-1)
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -080096 , m_metric (0)
Alexander Afanasyev30c33e32012-06-05 21:28:44 -070097 // , m_enableMetricTagging (false)
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070098{
99 NS_LOG_FUNCTION (this);
Alexander Afanasyev19426ef2011-11-23 20:55:28 -0800100
101 NS_ASSERT_MSG (node != 0, "node cannot be NULL. Check the code");
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700102}
103
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700104Face::~Face ()
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700105{
106 NS_LOG_FUNCTION_NOARGS ();
107}
108
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700109Face::Face (const Face &)
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700110{
111}
112
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700113Face& Face::operator= (const Face &)
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700114{
115 return *this;
116}
117
Alexander Afanasyeve9c9d722012-01-19 16:59:30 -0800118Ptr<Node>
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700119Face::GetNode () const
Alexander Afanasyeve9c9d722012-01-19 16:59:30 -0800120{
121 return m_node;
122}
123
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800124void
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700125Face::RegisterProtocolHandler (ProtocolHandler handler)
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700126{
Alexander Afanasyev19426ef2011-11-23 20:55:28 -0800127 NS_LOG_FUNCTION_NOARGS ();
128
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800129 m_protocolHandler = handler;
130}
131
132bool
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700133Face::Send (Ptr<Packet> packet)
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800134{
Alexander Afanasyev23d2b542011-12-07 18:54:46 -0800135 NS_LOG_FUNCTION (boost::cref (*this) << packet << packet->GetSize ());
Alexander Afanasyevd459ec32012-04-30 13:58:20 -0700136 NS_LOG_DEBUG (*packet);
Alexander Afanasyev19426ef2011-11-23 20:55:28 -0800137
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800138 if (!IsUp ())
Alexander Afanasyev30c33e32012-06-05 21:28:44 -0700139 {
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700140 m_dropTrace (packet);
Alexander Afanasyev30c33e32012-06-05 21:28:44 -0700141 return false;
142 }
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800143
Alexander Afanasyevde7601a2012-05-31 12:14:54 -0700144 // if (m_enableMetricTagging)
145 // {
146 // // update path information
147 // Ptr<const WeightsPathStretchTag> origTag = packet->RemovePacketTag<WeightsPathStretchTag> ();
148 // Ptr<WeightsPathStretchTag> tag;
149 // if (origTag == 0)
150 // {
151 // tag = CreateObject<WeightsPathStretchTag> (); // create a new tag
152 // }
153 // else
154 // {
155 // tag = CreateObject<WeightsPathStretchTag> (*origTag); // will update existing tag
156 // }
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -0800157
Alexander Afanasyevde7601a2012-05-31 12:14:54 -0700158 // tag->AddPathInfo (m_node, GetMetric ());
159 // packet->AddPacketTag (tag);
160 // }
Alexander Afanasyev30c33e32012-06-05 21:28:44 -0700161
Alexander Afanasyev1c0248b2012-07-24 15:59:50 -0700162 bool ok = SendImpl (packet);
163 if (ok)
164 {
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700165 m_txTrace (packet);
Alexander Afanasyev1c0248b2012-07-24 15:59:50 -0700166 return true;
167 }
168 else
169 {
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700170 m_dropTrace (packet);
Alexander Afanasyev1c0248b2012-07-24 15:59:50 -0700171 return false;
172 }
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800173}
174
175bool
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700176Face::Receive (const Ptr<const Packet> &packet)
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800177{
Alexander Afanasyev23d2b542011-12-07 18:54:46 -0800178 NS_LOG_FUNCTION (boost::cref (*this) << packet << packet->GetSize ());
Alexander Afanasyev19426ef2011-11-23 20:55:28 -0800179
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800180 if (!IsUp ())
Alexander Afanasyev30c33e32012-06-05 21:28:44 -0700181 {
182 // no tracing here. If we were off while receiving, we shouldn't even know that something was there
183 return false;
184 }
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800185
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700186 m_rxTrace (packet);
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800187 m_protocolHandler (this, packet);
Alexander Afanasyev19426ef2011-11-23 20:55:28 -0800188
189 return true;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700190}
191
Alexander Afanasyevcbe92ae2011-12-16 13:06:18 -0800192void
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700193Face::SetMetric (uint16_t metric)
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -0800194{
195 NS_LOG_FUNCTION (metric);
196 m_metric = metric;
197}
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700198
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -0800199uint16_t
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700200Face::GetMetric (void) const
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -0800201{
202 NS_LOG_FUNCTION_NOARGS ();
203 return m_metric;
204}
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700205
206/**
Alexander Afanasyev98256102011-08-14 01:00:02 -0700207 * These are face states and may be distinct from
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700208 * NetDevice states, such as found in real implementations
Alexander Afanasyev98256102011-08-14 01:00:02 -0700209 * (where the device may be down but face state is still up).
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700210 */
Alexander Afanasyev4975f732011-12-20 17:52:19 -0800211
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700212bool
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700213Face::IsUp (void) const
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700214{
215 NS_LOG_FUNCTION_NOARGS ();
216 return m_ifup;
217}
218
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700219void
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700220Face::SetUp (bool up/* = true*/)
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700221{
222 NS_LOG_FUNCTION_NOARGS ();
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800223 m_ifup = up;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700224}
225
Alexander Afanasyev56f79ea2011-08-17 23:54:27 -0700226bool
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700227Face::operator== (const Face &face) const
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700228{
Alexander Afanasyeva46844b2011-11-21 19:13:26 -0800229 NS_ASSERT_MSG (m_node->GetId () == face.m_node->GetId (),
230 "Faces of different nodes should not be compared to each other");
Alexander Afanasyev7fd74f92011-08-25 19:40:17 -0700231
232 return (m_id == face.m_id);
233}
234
235bool
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700236Face::operator< (const Face &face) const
Alexander Afanasyev7fd74f92011-08-25 19:40:17 -0700237{
Alexander Afanasyeva46844b2011-11-21 19:13:26 -0800238 NS_ASSERT_MSG (m_node->GetId () == face.m_node->GetId (),
239 "Faces of different nodes should not be compared to each other");
Alexander Afanasyev7fd74f92011-08-25 19:40:17 -0700240
241 return (m_id < face.m_id);
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700242}
243
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700244std::ostream&
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700245Face::Print (std::ostream &os) const
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700246{
247 os << "id=" << GetId ();
248 return os;
249}
250
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700251std::ostream&
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700252operator<< (std::ostream& os, const Face &face)
Alexander Afanasyev98256102011-08-14 01:00:02 -0700253{
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700254 face.Print (os);
Alexander Afanasyev98256102011-08-14 01:00:02 -0700255 return os;
256}
257
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700258} // namespace ndn
259} // namespace ns3
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700260