blob: 3481b9474a51a2d3735b500c7a32921b2c25e7ef [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) 2011 University of California, Los Angeles
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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
19 */
20
Alexander Afanasyev0c395372014-12-20 15:54:02 -080021#include "ndn-ip-face-stack.hpp"
22#include "ndn-tcp-face.hpp"
23#include "ndn-udp-face.hpp"
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070024
Alexander Afanasyev0c395372014-12-20 15:54:02 -080025#include "ns3/ndn-l3-protocol.hpp"
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070026
27#include "ns3/log.h"
28#include "ns3/assert.h"
29#include "ns3/packet.h"
Alexander Afanasyevaa84fae2013-07-27 12:01:37 -070030#include "ns3/boolean.h"
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070031
32#include "ns3/socket.h"
33#include "ns3/tcp-socket-factory.h"
Alexander Afanasyevd573af22013-07-27 12:57:08 -070034#include "ns3/udp-socket-factory.h"
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070035#include "ns3/simulator.h"
36
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080037NS_LOG_COMPONENT_DEFINE("ndn.IpFaceStack");
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070038
39namespace ns3 {
40namespace ndn {
Alexander Afanasyevd573af22013-07-27 12:57:08 -070041
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080042NS_OBJECT_ENSURE_REGISTERED(IpFaceStack);
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070043
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080044const Callback<void, Ptr<Face>> IpFaceStack::NULL_CREATE_CALLBACK =
45 MakeNullCallback<void, Ptr<Face>>();
Alexander Afanasyevd573af22013-07-27 12:57:08 -070046
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070047TypeId
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080048IpFaceStack::GetTypeId(void)
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070049{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080050 static TypeId tid =
51 TypeId("ns3::ndn::IpFaceStack")
52 .SetGroupName("Ndn")
53 .SetParent<Object>()
54 .AddConstructor<IpFaceStack>()
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070055
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080056 .AddAttribute("EnableTCP", "Enable ability to create TCP faces", BooleanValue(true),
57 MakeBooleanAccessor(&IpFaceStack::m_enableTcp), MakeBooleanChecker())
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070058
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080059 .AddAttribute("EnableUDP", "Enable ability to create UDP faces", BooleanValue(true),
60 MakeBooleanAccessor(&IpFaceStack::m_enableUdp), MakeBooleanChecker());
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070061 return tid;
62}
Alexander Afanasyevd573af22013-07-27 12:57:08 -070063
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080064IpFaceStack::IpFaceStack()
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070065{
66}
Alexander Afanasyevd573af22013-07-27 12:57:08 -070067
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080068IpFaceStack::~IpFaceStack()
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070069{
70}
71
72void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080073IpFaceStack::NotifyNewAggregate()
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070074{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080075 if (m_node == 0) {
76 m_node = GetObject<Node>();
77 if (m_node != 0) {
78 Simulator::ScheduleWithContext(m_node->GetId(), Seconds(0.1), &IpFaceStack::StartServer,
79 this);
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070080 }
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080081 }
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070082}
83
84// Application Methods
Alexander Afanasyevd573af22013-07-27 12:57:08 -070085void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080086IpFaceStack::StartServer() // Called at time specified by Start
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070087{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080088 NS_LOG_FUNCTION(this);
Alexander Afanasyevd573af22013-07-27 12:57:08 -070089
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080090 if (m_enableTcp) {
91 m_tcpServer = Socket::CreateSocket(m_node, TcpSocketFactory::GetTypeId());
Alexander Afanasyevd573af22013-07-27 12:57:08 -070092
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080093 m_tcpServer->Bind(InetSocketAddress(Ipv4Address::GetAny(), L3Protocol::IP_STACK_PORT));
94 m_tcpServer->Listen();
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070095
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080096 m_tcpServer->SetAcceptCallback(MakeCallback(&IpFaceStack::OnTcpConnectionRequest, this),
97 MakeCallback(&IpFaceStack::OnTcpConnectionAccept, this));
98 }
Alexander Afanasyevf4e24522013-06-24 14:11:57 -070099
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800100 if (m_enableUdp) {
101 m_udpServer = Socket::CreateSocket(m_node, UdpSocketFactory::GetTypeId());
102 m_udpServer->Bind(InetSocketAddress(Ipv4Address::GetAny(), L3Protocol::IP_STACK_PORT));
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700103
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800104 m_udpServer->SetRecvCallback(MakeCallback(&IpFaceStack::OnUdpPacket, this));
105 }
Alexander Afanasyevf4e24522013-06-24 14:11:57 -0700106}
107
108bool
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800109IpFaceStack::OnTcpConnectionRequest(Ptr<Socket> sock, const Address& addr)
Alexander Afanasyevf4e24522013-06-24 14:11:57 -0700110{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800111 NS_LOG_FUNCTION(this << sock << InetSocketAddress::ConvertFrom(addr));
Alexander Afanasyevf4e24522013-06-24 14:11:57 -0700112 return true; // accept all connections from anybody
113}
114
115void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800116IpFaceStack::OnTcpConnectionAccept(Ptr<Socket> socket, const Address& addr)
Alexander Afanasyevf4e24522013-06-24 14:11:57 -0700117{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800118 NS_LOG_FUNCTION(this << socket << InetSocketAddress::ConvertFrom(addr));
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700119
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800120 Ptr<L3Protocol> ndn = m_node->GetObject<L3Protocol>();
121 Ptr<TcpFace> face =
122 CreateObject<TcpFace>(m_node, socket, InetSocketAddress::ConvertFrom(addr).GetIpv4());
Alexander Afanasyevf4e24522013-06-24 14:11:57 -0700123
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800124 ndn->AddFace(face);
125 face->SetUp(true);
Alexander Afanasyevf4e24522013-06-24 14:11:57 -0700126
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800127 socket->SetCloseCallbacks(MakeCallback(&TcpFace::OnTcpConnectionClosed, face),
128 MakeCallback(&TcpFace::OnTcpConnectionClosed, face));
Alexander Afanasyevf4e24522013-06-24 14:11:57 -0700129}
130
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700131void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800132IpFaceStack::OnUdpPacket(Ptr<Socket> socket)
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700133{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800134 NS_LOG_FUNCTION(this << socket);
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700135
136 Ptr<Packet> packet;
137 Address from;
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800138 while ((packet = socket->RecvFrom(from))) {
139 Ptr<UdpFace> face = CreateOrGetUdpFace(InetSocketAddress::ConvertFrom(from).GetIpv4());
140 face->ReceiveFromUdp(packet);
141 }
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700142}
143
144Ptr<TcpFace>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800145IpFaceStack::GetTcpFaceByAddress(const Ipv4Address& address)
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700146{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800147 TcpFaceMap::iterator i = m_tcpFaceMap.find(address);
148 if (i != m_tcpFaceMap.end())
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700149 return i->second;
150 else
151 return 0;
152}
153
154void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800155IpFaceStack::DestroyTcpFace(Ptr<TcpFace> face)
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700156{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800157 m_tcpFaceMap.erase(face->GetAddress());
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700158}
159
160Ptr<UdpFace>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800161IpFaceStack::GetUdpFaceByAddress(const Ipv4Address& address)
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700162{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800163 UdpFaceMap::iterator i = m_udpFaceMap.find(address);
164 if (i != m_udpFaceMap.end())
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700165 return i->second;
166 else
167 return 0;
168}
169
170Ptr<TcpFace>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800171IpFaceStack::CreateOrGetTcpFace(Ipv4Address address, Callback<void, Ptr<Face>> onCreate)
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700172{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800173 NS_LOG_FUNCTION(address);
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700174
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800175 TcpFaceMap::iterator i = m_tcpFaceMap.find(address);
176 if (i != m_tcpFaceMap.end())
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700177 return i->second;
178
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800179 Ptr<Socket> socket = Socket::CreateSocket(m_node, TcpSocketFactory::GetTypeId());
180 Ptr<TcpFace> face = CreateObject<TcpFace>(m_node, socket, address);
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700181
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800182 face->SetCreateCallback(onCreate);
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700183
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800184 socket->SetConnectCallback(MakeCallback(&TcpFace::OnConnect, face),
185 MakeNullCallback<void, Ptr<Socket>>());
186 socket->Connect(InetSocketAddress(address, L3Protocol::IP_STACK_PORT));
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700187
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800188 m_tcpFaceMap.insert(std::make_pair(address, face));
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700189
190 return face;
191}
192
193Ptr<UdpFace>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800194IpFaceStack::CreateOrGetUdpFace(Ipv4Address address)
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700195{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800196 NS_LOG_FUNCTION(address);
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700197
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800198 UdpFaceMap::iterator i = m_udpFaceMap.find(address);
199 if (i != m_udpFaceMap.end())
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700200 return i->second;
201
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800202 Ptr<Socket> socket = Socket::CreateSocket(m_node, UdpSocketFactory::GetTypeId());
203 socket->Bind(InetSocketAddress(Ipv4Address::GetAny(),
204 L3Protocol::IP_STACK_PORT)); // not sure if it going to work...
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700205 // socket->Bind ();
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800206 socket->Connect(InetSocketAddress(address, L3Protocol::IP_STACK_PORT));
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700207
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800208 Ptr<UdpFace> face = CreateObject<UdpFace>(m_node, socket, address);
209 Ptr<L3Protocol> ndn = m_node->GetObject<L3Protocol>();
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700210
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800211 ndn->AddFace(face);
212 face->SetUp(true);
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700213
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800214 m_udpFaceMap.insert(std::make_pair(address, face));
Alexander Afanasyevd573af22013-07-27 12:57:08 -0700215 return face;
216}
217
Alexander Afanasyevf4e24522013-06-24 14:11:57 -0700218} // namespace ndn
219} // namespace ns3