blob: 839613765c1e7a0a1bcdb0877a4988e21401ebe5 [file] [log] [blame]
Eric Newberrya98bf932015-09-21 00:58:47 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Eric Newberry41aba102017-11-01 16:42:13 -07002/*
Davide Pesavento2cae8ca2019-04-18 20:48:05 -04003 * Copyright (c) 2014-2019, Regents of the University of California,
Eric Newberrya98bf932015-09-21 00:58:47 -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#ifndef NFD_DAEMON_FACE_LINK_SERVICE_HPP
27#define NFD_DAEMON_FACE_LINK_SERVICE_HPP
28
Eric Newberrya98bf932015-09-21 00:58:47 -070029#include "face-log.hpp"
Eric Newberry41aba102017-11-01 16:42:13 -070030#include "transport.hpp"
Davide Pesavento2cae8ca2019-04-18 20:48:05 -040031#include "common/counter.hpp"
Eric Newberrya98bf932015-09-21 00:58:47 -070032
33namespace nfd {
34namespace face {
35
Junxiao Shicde37ad2015-12-24 01:02:05 -070036class Face;
Eric Newberrya98bf932015-09-21 00:58:47 -070037
Junxiao Shi57df2882015-11-11 06:12:35 -070038/** \brief counters provided by LinkService
39 * \note The type name 'LinkServiceCounters' is implementation detail.
40 * Use 'LinkService::Counters' in public API.
41 */
42class LinkServiceCounters
43{
44public:
45 /** \brief count of incoming Interests
46 */
47 PacketCounter nInInterests;
48
49 /** \brief count of outgoing Interests
50 */
51 PacketCounter nOutInterests;
52
Eric Newberry41aba102017-11-01 16:42:13 -070053 /** \brief count of Interests dropped by reliability system for exceeding allowed number of retx
54 */
55 PacketCounter nDroppedInterests;
56
57 /** \brief count of incoming Data packets
Junxiao Shi57df2882015-11-11 06:12:35 -070058 */
59 PacketCounter nInData;
60
Eric Newberry41aba102017-11-01 16:42:13 -070061 /** \brief count of outgoing Data packets
Junxiao Shi57df2882015-11-11 06:12:35 -070062 */
63 PacketCounter nOutData;
64
65 /** \brief count of incoming Nacks
66 */
67 PacketCounter nInNacks;
68
69 /** \brief count of outgoing Nacks
70 */
71 PacketCounter nOutNacks;
72};
73
Junxiao Shicde37ad2015-12-24 01:02:05 -070074/** \brief the upper part of a Face
75 * \sa Face
Eric Newberrya98bf932015-09-21 00:58:47 -070076 */
Junxiao Shi57df2882015-11-11 06:12:35 -070077class LinkService : protected virtual LinkServiceCounters, noncopyable
Eric Newberrya98bf932015-09-21 00:58:47 -070078{
79public:
Junxiao Shi57df2882015-11-11 06:12:35 -070080 /** \brief counters provided by LinkService
81 */
82 typedef LinkServiceCounters Counters;
83
84public:
Eric Newberrya98bf932015-09-21 00:58:47 -070085 LinkService();
86
87 virtual
88 ~LinkService();
89
90 /** \brief set Face and Transport for LinkService
91 * \pre setFaceAndTransport has not been called
92 */
93 void
Junxiao Shicde37ad2015-12-24 01:02:05 -070094 setFaceAndTransport(Face& face, Transport& transport);
Eric Newberrya98bf932015-09-21 00:58:47 -070095
96 /** \return Face to which this LinkService is attached
97 */
Junxiao Shicde37ad2015-12-24 01:02:05 -070098 const Face*
Eric Newberrya98bf932015-09-21 00:58:47 -070099 getFace() const;
100
101 /** \return Transport to which this LinkService is attached
102 */
103 const Transport*
104 getTransport() const;
105
106 /** \return Transport to which this LinkService is attached
107 */
108 Transport*
109 getTransport();
110
Junxiao Shi57df2882015-11-11 06:12:35 -0700111 virtual const Counters&
112 getCounters() const;
113
Eric Newberrya98bf932015-09-21 00:58:47 -0700114public: // upper interface to be used by forwarding
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400115 /** \brief Send Interest to \p endpoint
Eric Newberrya98bf932015-09-21 00:58:47 -0700116 * \pre setTransport has been called
117 */
118 void
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400119 sendInterest(const Interest& interest, const EndpointId& endpoint);
Eric Newberrya98bf932015-09-21 00:58:47 -0700120
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400121 /** \brief Send Data to \p endpoint
Eric Newberrya98bf932015-09-21 00:58:47 -0700122 * \pre setTransport has been called
123 */
124 void
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400125 sendData(const Data& data, const EndpointId& endpoint);
Eric Newberrya98bf932015-09-21 00:58:47 -0700126
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400127 /** \brief Send Nack to \p endpoint
Eric Newberrya98bf932015-09-21 00:58:47 -0700128 * \pre setTransport has been called
129 */
130 void
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400131 sendNack(const ndn::lp::Nack& nack, const EndpointId& endpoint);
Eric Newberrya98bf932015-09-21 00:58:47 -0700132
133 /** \brief signals on Interest received
134 */
ashiqopu075bb7d2019-03-10 01:38:21 +0000135 signal::Signal<LinkService, Interest, EndpointId> afterReceiveInterest;
Eric Newberrya98bf932015-09-21 00:58:47 -0700136
137 /** \brief signals on Data received
138 */
ashiqopu075bb7d2019-03-10 01:38:21 +0000139 signal::Signal<LinkService, Data, EndpointId> afterReceiveData;
Eric Newberrya98bf932015-09-21 00:58:47 -0700140
141 /** \brief signals on Nack received
142 */
ashiqopu075bb7d2019-03-10 01:38:21 +0000143 signal::Signal<LinkService, lp::Nack, EndpointId> afterReceiveNack;
Eric Newberrya98bf932015-09-21 00:58:47 -0700144
Eric Newberry41aba102017-11-01 16:42:13 -0700145 /** \brief signals on Interest dropped by reliability system for exceeding allowed number of retx
146 */
147 signal::Signal<LinkService, Interest> onDroppedInterest;
148
Junxiao Shi57df2882015-11-11 06:12:35 -0700149public: // lower interface to be invoked by Transport
150 /** \brief performs LinkService specific operations to receive a lower-layer packet
Eric Newberrya98bf932015-09-21 00:58:47 -0700151 */
Junxiao Shi57df2882015-11-11 06:12:35 -0700152 void
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400153 receivePacket(const Block& packet, const EndpointId& endpoint);
Eric Newberrya98bf932015-09-21 00:58:47 -0700154
155protected: // upper interface to be invoked in subclass (receive path termination)
156 /** \brief delivers received Interest to forwarding
157 */
158 void
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400159 receiveInterest(const Interest& interest, const EndpointId& endpoint);
Eric Newberrya98bf932015-09-21 00:58:47 -0700160
161 /** \brief delivers received Data to forwarding
162 */
163 void
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400164 receiveData(const Data& data, const EndpointId& endpoint);
Eric Newberrya98bf932015-09-21 00:58:47 -0700165
166 /** \brief delivers received Nack to forwarding
167 */
168 void
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400169 receiveNack(const lp::Nack& nack, const EndpointId& endpoint);
Eric Newberrya98bf932015-09-21 00:58:47 -0700170
Eric Newberrya98bf932015-09-21 00:58:47 -0700171protected: // lower interface to be invoked in subclass (send path termination)
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400172 /** \brief send a lower-layer packet via Transport to \p endpoint
Eric Newberrya98bf932015-09-21 00:58:47 -0700173 */
174 void
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400175 sendPacket(const Block& packet, const EndpointId& endpoint);
Eric Newberrya98bf932015-09-21 00:58:47 -0700176
Eric Newberry41aba102017-11-01 16:42:13 -0700177protected:
178 void
179 notifyDroppedInterest(const Interest& packet);
180
Junxiao Shi57df2882015-11-11 06:12:35 -0700181private: // upper interface to be overridden in subclass (send path entrypoint)
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400182 /** \brief performs LinkService specific operations to send an Interest to \p endpoint
Junxiao Shi57df2882015-11-11 06:12:35 -0700183 */
184 virtual void
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400185 doSendInterest(const Interest& interest, const EndpointId& endpoint) = 0;
Junxiao Shi57df2882015-11-11 06:12:35 -0700186
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400187 /** \brief performs LinkService specific operations to send a Data to \p endpoint
Junxiao Shi57df2882015-11-11 06:12:35 -0700188 */
189 virtual void
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400190 doSendData(const Data& data, const EndpointId& endpoint) = 0;
Junxiao Shi57df2882015-11-11 06:12:35 -0700191
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400192 /** \brief performs LinkService specific operations to send a Nack to \p endpoint
Junxiao Shi57df2882015-11-11 06:12:35 -0700193 */
194 virtual void
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400195 doSendNack(const lp::Nack& nack, const EndpointId& endpoint) = 0;
Junxiao Shi57df2882015-11-11 06:12:35 -0700196
Eric Newberrya98bf932015-09-21 00:58:47 -0700197private: // lower interface to be overridden in subclass
198 virtual void
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400199 doReceivePacket(const Block& packet, const EndpointId& endpoint) = 0;
Eric Newberrya98bf932015-09-21 00:58:47 -0700200
201private:
Junxiao Shicde37ad2015-12-24 01:02:05 -0700202 Face* m_face;
Eric Newberrya98bf932015-09-21 00:58:47 -0700203 Transport* m_transport;
Eric Newberrya98bf932015-09-21 00:58:47 -0700204};
205
Junxiao Shicde37ad2015-12-24 01:02:05 -0700206inline const Face*
Eric Newberrya98bf932015-09-21 00:58:47 -0700207LinkService::getFace() const
208{
209 return m_face;
210}
211
212inline const Transport*
213LinkService::getTransport() const
214{
215 return m_transport;
216}
217
218inline Transport*
219LinkService::getTransport()
220{
221 return m_transport;
222}
223
Junxiao Shi57df2882015-11-11 06:12:35 -0700224inline const LinkService::Counters&
225LinkService::getCounters() const
226{
227 return *this;
228}
229
Eric Newberrya98bf932015-09-21 00:58:47 -0700230inline void
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400231LinkService::receivePacket(const Block& packet, const EndpointId& endpoint)
Eric Newberrya98bf932015-09-21 00:58:47 -0700232{
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400233 doReceivePacket(packet, endpoint);
Eric Newberrya98bf932015-09-21 00:58:47 -0700234}
235
236inline void
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400237LinkService::sendPacket(const Block& packet, const EndpointId& endpoint)
Eric Newberrya98bf932015-09-21 00:58:47 -0700238{
Davide Pesaventob3a23ca2019-05-04 20:40:21 -0400239 m_transport->send(packet, endpoint);
Eric Newberrya98bf932015-09-21 00:58:47 -0700240}
241
242std::ostream&
243operator<<(std::ostream& os, const FaceLogHelper<LinkService>& flh);
244
245template<typename T>
246typename std::enable_if<std::is_base_of<LinkService, T>::value &&
247 !std::is_same<LinkService, T>::value, std::ostream&>::type
248operator<<(std::ostream& os, const FaceLogHelper<T>& flh)
249{
250 return os << FaceLogHelper<LinkService>(flh.obj);
251}
252
253} // namespace face
254} // namespace nfd
255
256#endif // NFD_DAEMON_FACE_LINK_SERVICE_HPP