blob: 08ed9e1df1526d33470796e3fccdbf2aac1208af [file] [log] [blame]
Eric Newberrya98bf932015-09-21 00:58:47 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Davide Pesaventob84bd3a2016-04-22 02:21:45 +02003 * Copyright (c) 2014-2016, 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_GENERIC_LINK_SERVICE_HPP
27#define NFD_DAEMON_FACE_GENERIC_LINK_SERVICE_HPP
28
Junxiao Shi9f5b01d2016-08-05 03:54:28 +000029#include "core/common.hpp"
Eric Newberrya98bf932015-09-21 00:58:47 -070030#include "core/logger.hpp"
31
32#include "link-service.hpp"
Eric Newberry4c3e6b82015-11-10 16:48:42 -070033#include "lp-fragmenter.hpp"
34#include "lp-reassembler.hpp"
Eric Newberrya98bf932015-09-21 00:58:47 -070035
36namespace nfd {
37namespace face {
38
Eric Newberry4c3e6b82015-11-10 16:48:42 -070039/** \brief counters provided by GenericLinkService
40 * \note The type name 'GenericLinkServiceCounters' is implementation detail.
41 * Use 'GenericLinkService::Counters' in public API.
42 */
43class GenericLinkServiceCounters : public virtual LinkService::Counters
44{
45public:
46 explicit
47 GenericLinkServiceCounters(const LpReassembler& reassembler);
48
49 /** \brief count of failed fragmentations
50 */
51 PacketCounter nFragmentationErrors;
52
53 /** \brief count of outgoing LpPackets dropped due to exceeding MTU limit
54 *
55 * If this counter is non-zero, the operator should enable fragmentation.
56 */
57 PacketCounter nOutOverMtu;
58
59 /** \brief count of invalid LpPackets dropped before reassembly
60 */
61 PacketCounter nInLpInvalid;
62
63 /** \brief count of network-layer packets currently being reassembled
64 */
65 SizeCounter<LpReassembler> nReassembling;
66
67 /** \brief count of dropped partial network-layer packets due to reassembly timeout
68 */
69 PacketCounter nReassemblyTimeouts;
70
71 /** \brief count of invalid reassembled network-layer packets dropped
72 */
73 PacketCounter nInNetInvalid;
74};
75
Eric Newberry86d31872015-09-23 16:24:59 -070076/** \brief GenericLinkService is a LinkService that implements the NDNLPv2 protocol
77 * \sa http://redmine.named-data.net/projects/nfd/wiki/NDNLPv2
Eric Newberrya98bf932015-09-21 00:58:47 -070078 */
79class GenericLinkService : public LinkService
Eric Newberry4c3e6b82015-11-10 16:48:42 -070080 , protected virtual GenericLinkServiceCounters
Eric Newberrya98bf932015-09-21 00:58:47 -070081{
Eric Newberry86d31872015-09-23 16:24:59 -070082public:
83 /** \brief Options that control the behavior of GenericLinkService
84 */
85 class Options
86 {
87 public:
88 Options();
89
90 public:
Eric Newberry86d31872015-09-23 16:24:59 -070091 /** \brief enables encoding of IncomingFaceId, and decoding of NextHopFaceId and CachePolicy
92 */
93 bool allowLocalFields;
Eric Newberry4c3e6b82015-11-10 16:48:42 -070094
95 /** \brief enables fragmentation
96 */
97 bool allowFragmentation;
98
99 /** \brief options for fragmentation
100 */
101 LpFragmenter::Options fragmenterOptions;
102
103 /** \brief enables reassembly
104 */
105 bool allowReassembly;
106
107 /** \brief options for reassembly
108 */
109 LpReassembler::Options reassemblerOptions;
Eric Newberry86d31872015-09-23 16:24:59 -0700110 };
111
Eric Newberry4c3e6b82015-11-10 16:48:42 -0700112 /** \brief counters provided by GenericLinkService
113 */
114 typedef GenericLinkServiceCounters Counters;
115
Eric Newberry86d31872015-09-23 16:24:59 -0700116 explicit
117 GenericLinkService(const Options& options = Options());
118
119 /** \brief get Options used by GenericLinkService
120 */
121 const Options&
122 getOptions() const;
123
124 /** \brief sets Options used by GenericLinkService
125 */
126 void
127 setOptions(const Options& options);
128
Eric Newberry4c3e6b82015-11-10 16:48:42 -0700129 virtual const Counters&
Davide Pesaventob84bd3a2016-04-22 02:21:45 +0200130 getCounters() const override;
Eric Newberry4c3e6b82015-11-10 16:48:42 -0700131
132private: // send path
Junxiao Shi0de23a22015-12-03 20:07:02 +0000133 /** \brief send Interest
Eric Newberrya98bf932015-09-21 00:58:47 -0700134 */
135 void
Davide Pesaventob84bd3a2016-04-22 02:21:45 +0200136 doSendInterest(const Interest& interest) override;
Eric Newberrya98bf932015-09-21 00:58:47 -0700137
Junxiao Shi0de23a22015-12-03 20:07:02 +0000138 /** \brief send Data
Eric Newberrya98bf932015-09-21 00:58:47 -0700139 */
140 void
Davide Pesaventob84bd3a2016-04-22 02:21:45 +0200141 doSendData(const Data& data) override;
Eric Newberrya98bf932015-09-21 00:58:47 -0700142
Junxiao Shi0de23a22015-12-03 20:07:02 +0000143 /** \brief send Nack
Eric Newberrya98bf932015-09-21 00:58:47 -0700144 */
145 void
Davide Pesaventob84bd3a2016-04-22 02:21:45 +0200146 doSendNack(const ndn::lp::Nack& nack) override;
Eric Newberrya98bf932015-09-21 00:58:47 -0700147
Eric Newberryee400b52016-11-24 14:12:48 +0000148 /** \brief encode link protocol fields from tags onto an outgoing LpPacket
149 * \param netPkt network-layer packet to extract tags from
150 * \param lpPacket LpPacket to add link protocol fields to
Eric Newberry86d31872015-09-23 16:24:59 -0700151 */
Eric Newberryee400b52016-11-24 14:12:48 +0000152 void
153 encodeLpFields(const ndn::TagHost& netPkt, lp::Packet& lpPacket);
Eric Newberry86d31872015-09-23 16:24:59 -0700154
Junxiao Shi0de23a22015-12-03 20:07:02 +0000155 /** \brief send a complete network layer packet
Eric Newberry4c3e6b82015-11-10 16:48:42 -0700156 * \param pkt LpPacket containing a complete network layer packet
157 */
158 void
159 sendNetPacket(lp::Packet&& pkt);
160
161 /** \brief assign a sequence number to an LpPacket
162 */
163 void
164 assignSequence(lp::Packet& pkt);
165
166 /** \brief assign consecutive sequence numbers to LpPackets
167 */
168 void
169 assignSequences(std::vector<lp::Packet>& pkts);
170
171private: // receive path
172 /** \brief receive Packet from Transport
173 */
174 void
Davide Pesaventob84bd3a2016-04-22 02:21:45 +0200175 doReceivePacket(Transport::Packet&& packet) override;
Eric Newberry4c3e6b82015-11-10 16:48:42 -0700176
177 /** \brief decode incoming network-layer packet
178 * \param netPkt reassembled network-layer packet
179 * \param firstPkt LpPacket of first fragment
180 *
181 * If decoding is successful, a receive signal is emitted;
182 * otherwise, a warning is logged.
183 */
184 void
185 decodeNetPacket(const Block& netPkt, const lp::Packet& firstPkt);
186
Eric Newberry86d31872015-09-23 16:24:59 -0700187 /** \brief decode incoming Interest
188 * \param netPkt reassembled network-layer packet; TLV-TYPE must be Interest
189 * \param firstPkt LpPacket of first fragment; must not have Nack field
190 *
191 * If decoding is successful, receiveInterest signal is emitted;
192 * otherwise, a warning is logged.
193 *
194 * \throw tlv::Error parse error in an LpHeader field
195 */
196 void
197 decodeInterest(const Block& netPkt, const lp::Packet& firstPkt);
198
199 /** \brief decode incoming Interest
200 * \param netPkt reassembled network-layer packet; TLV-TYPE must be Data
201 * \param firstPkt LpPacket of first fragment
202 *
203 * If decoding is successful, receiveData signal is emitted;
204 * otherwise, a warning is logged.
205 *
206 * \throw tlv::Error parse error in an LpHeader field
207 */
208 void
209 decodeData(const Block& netPkt, const lp::Packet& firstPkt);
210
211 /** \brief decode incoming Interest
212 * \param netPkt reassembled network-layer packet; TLV-TYPE must be Interest
213 * \param firstPkt LpPacket of first fragment; must have Nack field
214 *
215 * If decoding is successful, receiveNack signal is emitted;
216 * otherwise, a warning is logged.
217 *
218 * \throw tlv::Error parse error in an LpHeader field
219 */
220 void
221 decodeNack(const Block& netPkt, const lp::Packet& firstPkt);
222
223private:
224 Options m_options;
Eric Newberry4c3e6b82015-11-10 16:48:42 -0700225 LpFragmenter m_fragmenter;
226 LpReassembler m_reassembler;
227 lp::Sequence m_lastSeqNo;
Eric Newberrya98bf932015-09-21 00:58:47 -0700228};
229
Eric Newberry86d31872015-09-23 16:24:59 -0700230inline const GenericLinkService::Options&
231GenericLinkService::getOptions() const
232{
233 return m_options;
234}
235
236inline void
237GenericLinkService::setOptions(const GenericLinkService::Options& options)
238{
239 m_options = options;
240}
241
Eric Newberry4c3e6b82015-11-10 16:48:42 -0700242inline const GenericLinkService::Counters&
243GenericLinkService::getCounters() const
244{
245 return *this;
246}
247
Eric Newberrya98bf932015-09-21 00:58:47 -0700248} // namespace face
249} // namespace nfd
250
Eric Newberry86d31872015-09-23 16:24:59 -0700251#endif // NFD_DAEMON_FACE_GENERIC_LINK_SERVICE_HPP