blob: 5b82c205459412be384d705b9196912063dac90d [file] [log] [blame]
Junxiao Shi6535f1e2015-10-08 13:02:18 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Yanbiao Li32dab972016-11-27 12:26:09 +08003 * Copyright (c) 2014-2017, Regents of the University of California,
Junxiao Shi6535f1e2015-10-08 13:02:18 -07004 * 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);
Junxiao Shi5b8a2b22015-10-22 17:20:44 -070043 this->setMtu(MTU_UNLIMITED);
Junxiao Shi6535f1e2015-10-08 13:02:18 -070044
45 NFD_LOG_FACE_INFO("Creating transport");
46}
47
48void
Junxiao Shi6535f1e2015-10-08 13:02:18 -070049InternalForwarderTransport::receiveFromLink(const Block& packet)
50{
51 NFD_LOG_FACE_TRACE(__func__);
52
53 Packet p;
54 p.packet = packet;
55 this->receive(std::move(p));
56}
57
58void
59InternalForwarderTransport::doSend(Packet&& packet)
60{
61 NFD_LOG_FACE_TRACE(__func__);
62
63 this->emitSignal(afterSend, packet.packet);
64}
65
66void
67InternalForwarderTransport::doClose()
68{
69 NFD_LOG_FACE_TRACE(__func__);
70
71 this->setState(TransportState::CLOSED);
72}
73
74NFD_LOG_INCLASS_DEFINE(InternalClientTransport, "InternalClientTransport");
75
76static void
77asyncReceive(InternalTransportBase* recipient, const Block& packet)
78{
79 getGlobalIoService().post([packet, recipient] {
80 recipient->receiveFromLink(packet);
81 });
82}
83
84void
85InternalClientTransport::connectToForwarder(InternalForwarderTransport* forwarderTransport)
86{
87 NFD_LOG_DEBUG(__func__ << " " << forwarderTransport);
88
89 m_fwToClientTransmitConn.disconnect();
90 m_clientToFwTransmitConn.disconnect();
91 m_fwTransportStateConn.disconnect();
92
93 if (forwarderTransport != nullptr) {
94 m_fwToClientTransmitConn = forwarderTransport->afterSend.connect(bind(&asyncReceive, this, _1));
95 m_clientToFwTransmitConn = this->afterSend.connect(bind(&asyncReceive, forwarderTransport, _1));
96 m_fwTransportStateConn = forwarderTransport->afterStateChange.connect(
97 [this] (TransportState oldState, TransportState newState) {
98 if (newState == TransportState::CLOSED) {
99 this->connectToForwarder(nullptr);
100 }
101 });
102 }
103}
104
105void
106InternalClientTransport::receiveFromLink(const Block& packet)
107{
108 if (m_receiveCallback) {
109 m_receiveCallback(packet);
110 }
111}
112
113void
114InternalClientTransport::send(const Block& wire)
115{
116 this->emitSignal(afterSend, wire);
117}
118
119void
120InternalClientTransport::send(const Block& header, const Block& payload)
121{
122 ndn::EncodingBuffer encoder(header.size() + payload.size(), header.size() + payload.size());
123 encoder.appendByteArray(header.wire(), header.size());
124 encoder.appendByteArray(payload.wire(), payload.size());
125
126 this->send(encoder.block());
127}
128
129} // namespace face
130} // namespace nfd