blob: f265262edc5f1c7c7b2f4564f9fa84dfc1d95886 [file] [log] [blame]
Alexander Afanasyevf4e24522013-06-24 14:11:57 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
2/*
3 * Copyright (c) 2013 University of California, Los Angeles
4 * Alexander Afanasyev
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation;
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 *
19 * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
20 */
21
Alexander Afanasyev0c395372014-12-20 15:54:02 -080022#include "ndn-ip-faces-helper.hpp"
23#include "ndn-ip-face-stack.hpp"
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070024
Alexander Afanasyev0c395372014-12-20 15:54:02 -080025#include "ns3/ndn-stack-helper.hpp"
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070026#include "ns3/node-container.h"
27#include "ns3/log.h"
28#include "ns3/simulator.h"
Alexander Afanasyev0c395372014-12-20 15:54:02 -080029#include "ndn-tcp-face.hpp"
30#include "ndn-udp-face.hpp"
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070031
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080032NS_LOG_COMPONENT_DEFINE("ndn.IpFacesHelper");
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070033
34using namespace std;
35
36namespace ns3 {
37namespace ndn {
38
39void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080040IpFacesHelper::Install(Ptr<Node> node)
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070041{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080042 Ptr<IpFaceStack> stack = CreateObject<IpFaceStack>();
43 node->AggregateObject(stack);
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070044}
45
46void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080047IpFacesHelper::Install(const NodeContainer& nodes)
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070048{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080049 for (NodeContainer::Iterator node = nodes.Begin(); node != nodes.End(); node++) {
50 Install(*node);
51 }
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070052}
53
54void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080055IpFacesHelper::InstallAll()
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070056{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080057 Install(NodeContainer::GetGlobal());
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070058}
59
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080060struct TcpPrefixRegistrator : SimpleRefCount<TcpPrefixRegistrator> {
61 TcpPrefixRegistrator(Ptr<Node> node, const std::string& prefix, int16_t metric)
62 : m_node(node)
63 , m_prefix(prefix)
64 , m_metric(metric)
Alexander Afanasyevaa84fae2013-07-27 12:01:37 -070065 {
66 }
67
68 void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080069 Run(Ptr<Face> face)
Alexander Afanasyevaa84fae2013-07-27 12:01:37 -070070 {
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080071 ndn::StackHelper::AddRoute(m_node, m_prefix, face, m_metric);
Alexander Afanasyevaa84fae2013-07-27 12:01:37 -070072 }
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080073
Alexander Afanasyevaa84fae2013-07-27 12:01:37 -070074private:
75 Ptr<Node> m_node;
76 std::string m_prefix;
77 int16_t m_metric;
78};
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070079
80static void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080081ScheduledCreateTcp(Ptr<Node> node, Ipv4Address address, const std::string& prefix, int16_t metric)
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070082{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080083 Ptr<IpFaceStack> stack = node->GetObject<IpFaceStack>();
84 NS_ASSERT_MSG(stack != 0, "ndn::IpFaceStack needs to be installed on the node");
Alexander Afanasyevd573af22013-07-27 12:57:08 -070085
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080086 Ptr<Face> face = stack->GetTcpFaceByAddress(address);
87 if (face == 0) {
88 Ptr<TcpPrefixRegistrator> registrator = Create<TcpPrefixRegistrator>(node, prefix, metric);
89 stack->CreateOrGetTcpFace(address, MakeCallback(&TcpPrefixRegistrator::Run, registrator));
90 }
91 else {
92 ndn::StackHelper::AddRoute(node, prefix, face, metric);
93 }
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070094}
95
96void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080097IpFacesHelper::CreateTcpFace(const Time& when, Ptr<Node> node, Ipv4Address address,
98 const std::string& prefix, int16_t metric /* = 1*/)
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070099{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800100 Simulator::ScheduleWithContext(node->GetId(), when, ScheduledCreateTcp, node, address, prefix,
101 metric);
Alexander Afanasyevf4e24522013-06-24 14:11:57 -0700102}
103
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700104static void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800105ScheduledCreateUdp(Ptr<Node> node, Ipv4Address address, const std::string& prefix, int16_t metric)
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700106{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800107 Ptr<IpFaceStack> stack = node->GetObject<IpFaceStack>();
108 NS_ASSERT_MSG(stack != 0, "ndn::IpFaceStack needs to be installed on the node");
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700109
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800110 Ptr<Face> face = stack->CreateOrGetUdpFace(address);
111 ndn::StackHelper::AddRoute(node, prefix, face, metric);
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700112}
113
114void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800115IpFacesHelper::CreateUdpFace(const Time& when, Ptr<Node> node, Ipv4Address address,
116 const std::string& prefix, int16_t metric /* = 1*/)
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700117{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800118 Simulator::ScheduleWithContext(node->GetId(), when, ScheduledCreateUdp, node, address, prefix,
119 metric);
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700120}
Alexander Afanasyevf4e24522013-06-24 14:11:57 -0700121
122} // namespace ndn
123} // namespace ns3