blob: c9adcd7f381bbf44d9dd9cc897fd2965a631f04c [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
Junxiao Shi0de23a22015-12-03 20:07:02 +0000148 /** \brief encode local fields from tags onto outgoing LpPacket
149 * \param pkt LpPacket containing a complete network layer packet
Eric Newberry86d31872015-09-23 16:24:59 -0700150 */
Junxiao Shi0de23a22015-12-03 20:07:02 +0000151 static void
152 encodeLocalFields(const ndn::TagHost& netPkt, lp::Packet& lpPacket);
Eric Newberry86d31872015-09-23 16:24:59 -0700153
Junxiao Shi0de23a22015-12-03 20:07:02 +0000154 /** \brief send a complete network layer packet
Eric Newberry4c3e6b82015-11-10 16:48:42 -0700155 * \param pkt LpPacket containing a complete network layer packet
156 */
157 void
158 sendNetPacket(lp::Packet&& pkt);
159
160 /** \brief assign a sequence number to an LpPacket
161 */
162 void
163 assignSequence(lp::Packet& pkt);
164
165 /** \brief assign consecutive sequence numbers to LpPackets
166 */
167 void
168 assignSequences(std::vector<lp::Packet>& pkts);
169
170private: // receive path
171 /** \brief receive Packet from Transport
172 */
173 void
Davide Pesaventob84bd3a2016-04-22 02:21:45 +0200174 doReceivePacket(Transport::Packet&& packet) override;
Eric Newberry4c3e6b82015-11-10 16:48:42 -0700175
176 /** \brief decode incoming network-layer packet
177 * \param netPkt reassembled network-layer packet
178 * \param firstPkt LpPacket of first fragment
179 *
180 * If decoding is successful, a receive signal is emitted;
181 * otherwise, a warning is logged.
182 */
183 void
184 decodeNetPacket(const Block& netPkt, const lp::Packet& firstPkt);
185
Eric Newberry86d31872015-09-23 16:24:59 -0700186 /** \brief decode incoming Interest
187 * \param netPkt reassembled network-layer packet; TLV-TYPE must be Interest
188 * \param firstPkt LpPacket of first fragment; must not have Nack field
189 *
190 * If decoding is successful, receiveInterest signal is emitted;
191 * otherwise, a warning is logged.
192 *
193 * \throw tlv::Error parse error in an LpHeader field
194 */
195 void
196 decodeInterest(const Block& netPkt, const lp::Packet& firstPkt);
197
198 /** \brief decode incoming Interest
199 * \param netPkt reassembled network-layer packet; TLV-TYPE must be Data
200 * \param firstPkt LpPacket of first fragment
201 *
202 * If decoding is successful, receiveData signal is emitted;
203 * otherwise, a warning is logged.
204 *
205 * \throw tlv::Error parse error in an LpHeader field
206 */
207 void
208 decodeData(const Block& netPkt, const lp::Packet& firstPkt);
209
210 /** \brief decode incoming Interest
211 * \param netPkt reassembled network-layer packet; TLV-TYPE must be Interest
212 * \param firstPkt LpPacket of first fragment; must have Nack field
213 *
214 * If decoding is successful, receiveNack signal is emitted;
215 * otherwise, a warning is logged.
216 *
217 * \throw tlv::Error parse error in an LpHeader field
218 */
219 void
220 decodeNack(const Block& netPkt, const lp::Packet& firstPkt);
221
222private:
223 Options m_options;
Eric Newberry4c3e6b82015-11-10 16:48:42 -0700224 LpFragmenter m_fragmenter;
225 LpReassembler m_reassembler;
226 lp::Sequence m_lastSeqNo;
Eric Newberrya98bf932015-09-21 00:58:47 -0700227};
228
Eric Newberry86d31872015-09-23 16:24:59 -0700229inline const GenericLinkService::Options&
230GenericLinkService::getOptions() const
231{
232 return m_options;
233}
234
235inline void
236GenericLinkService::setOptions(const GenericLinkService::Options& options)
237{
238 m_options = options;
239}
240
Eric Newberry4c3e6b82015-11-10 16:48:42 -0700241inline const GenericLinkService::Counters&
242GenericLinkService::getCounters() const
243{
244 return *this;
245}
246
Eric Newberrya98bf932015-09-21 00:58:47 -0700247} // namespace face
248} // namespace nfd
249
Eric Newberry86d31872015-09-23 16:24:59 -0700250#endif // NFD_DAEMON_FACE_GENERIC_LINK_SERVICE_HPP