blob: d9dc238cfc007cbdeab2308071c76cd7c7bdcc10 [file] [log] [blame]
Junxiao Shi6535f1e2015-10-08 13:02:18 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2014-2015, Regents of the University of California,
4 * Arizona Board of Regents,
5 * Colorado State University,
6 * University Pierre & Marie Curie, Sorbonne University,
7 * Washington University in St. Louis,
8 * Beijing Institute of Technology,
9 * The University of Memphis.
10 *
11 * This file is part of NFD (Named Data Networking Forwarding Daemon).
12 * See AUTHORS.md for complete list of NFD authors and contributors.
13 *
14 * NFD is free software: you can redistribute it and/or modify it under the terms
15 * of the GNU General Public License as published by the Free Software Foundation,
16 * either version 3 of the License, or (at your option) any later version.
17 *
18 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20 * PURPOSE. See the GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along with
23 * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
24 */
25
26#include "internal-transport.hpp"
27#include "core/global-io.hpp"
28
29namespace nfd {
30namespace face {
31
32NFD_LOG_INCLASS_DEFINE(InternalForwarderTransport, "InternalForwarderTransport");
33
34InternalForwarderTransport::InternalForwarderTransport(
35 const FaceUri& localUri, const FaceUri& remoteUri,
36 ndn::nfd::FaceScope scope, ndn::nfd::LinkType linkType)
37{
38 this->setLocalUri(localUri);
39 this->setRemoteUri(remoteUri);
40 this->setScope(scope);
41 this->setPersistency(ndn::nfd::FACE_PERSISTENCY_PERMANENT);
42 this->setLinkType(linkType);
43
44 NFD_LOG_FACE_INFO("Creating transport");
45}
46
47void
48InternalForwarderTransport::receiveFromLink(const Block& packet)
49{
50 NFD_LOG_FACE_TRACE(__func__);
51
52 Packet p;
53 p.packet = packet;
54 this->receive(std::move(p));
55}
56
57void
58InternalForwarderTransport::doSend(Packet&& packet)
59{
60 NFD_LOG_FACE_TRACE(__func__);
61
62 this->emitSignal(afterSend, packet.packet);
63}
64
65void
66InternalForwarderTransport::doClose()
67{
68 NFD_LOG_FACE_TRACE(__func__);
69
70 this->setState(TransportState::CLOSED);
71}
72
73NFD_LOG_INCLASS_DEFINE(InternalClientTransport, "InternalClientTransport");
74
75static void
76asyncReceive(InternalTransportBase* recipient, const Block& packet)
77{
78 getGlobalIoService().post([packet, recipient] {
79 recipient->receiveFromLink(packet);
80 });
81}
82
83void
84InternalClientTransport::connectToForwarder(InternalForwarderTransport* forwarderTransport)
85{
86 NFD_LOG_DEBUG(__func__ << " " << forwarderTransport);
87
88 m_fwToClientTransmitConn.disconnect();
89 m_clientToFwTransmitConn.disconnect();
90 m_fwTransportStateConn.disconnect();
91
92 if (forwarderTransport != nullptr) {
93 m_fwToClientTransmitConn = forwarderTransport->afterSend.connect(bind(&asyncReceive, this, _1));
94 m_clientToFwTransmitConn = this->afterSend.connect(bind(&asyncReceive, forwarderTransport, _1));
95 m_fwTransportStateConn = forwarderTransport->afterStateChange.connect(
96 [this] (TransportState oldState, TransportState newState) {
97 if (newState == TransportState::CLOSED) {
98 this->connectToForwarder(nullptr);
99 }
100 });
101 }
102}
103
104void
105InternalClientTransport::receiveFromLink(const Block& packet)
106{
107 if (m_receiveCallback) {
108 m_receiveCallback(packet);
109 }
110}
111
112void
113InternalClientTransport::send(const Block& wire)
114{
115 this->emitSignal(afterSend, wire);
116}
117
118void
119InternalClientTransport::send(const Block& header, const Block& payload)
120{
121 ndn::EncodingBuffer encoder(header.size() + payload.size(), header.size() + payload.size());
122 encoder.appendByteArray(header.wire(), header.size());
123 encoder.appendByteArray(payload.wire(), payload.size());
124
125 this->send(encoder.block());
126}
127
128} // namespace face
129} // namespace nfd