blob: b2e090057244e26b38e1af03e516d5210f9366b5 [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Nick Gordonc6a85222017-01-03 16:54:34 -06003 * Copyright (c) 2014-2017, The University of Memphis,
Vince Lehmanc2e51f62015-01-20 15:03:11 -06004 * Regents of the University of California,
5 * Arizona Board of Regents.
akmhoque3d06e792014-05-27 16:23:20 -05006 *
7 * This file is part of NLSR (Named-data Link State Routing).
8 * See AUTHORS.md for complete list of NLSR authors and contributors.
9 *
10 * NLSR is free software: you can redistribute it and/or modify it under the terms
11 * of the GNU General Public License as published by the Free Software Foundation,
12 * either version 3 of the License, or (at your option) any later version.
13 *
14 * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
15 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
16 * PURPOSE. See the GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along with
19 * NLSR, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
akmhoque3d06e792014-05-27 16:23:20 -050020 **/
Vince Lehmanc2e51f62015-01-20 15:03:11 -060021
akmhoque53353462014-04-22 08:43:45 -050022#ifndef NLSR_LSA_HPP
23#define NLSR_LSA_HPP
24
Nick Gordon22b5c952017-08-10 17:48:15 -050025#include "name-prefix-list.hpp"
26#include "adjacent.hpp"
27#include "adjacency-list.hpp"
28
akmhoquefdbddb12014-05-02 18:35:19 -050029#include <boost/cstdint.hpp>
akmhoquec8a10f72014-04-25 18:42:55 -050030#include <ndn-cxx/util/scheduler.hpp>
akmhoquec7a79b22014-05-26 08:06:19 -050031#include <ndn-cxx/util/time.hpp>
Nick Gordon0fa4c772017-10-23 13:33:03 -050032#include <boost/tokenizer.hpp>
akmhoquec7a79b22014-05-26 08:06:19 -050033
akmhoque53353462014-04-22 08:43:45 -050034namespace nlsr {
akmhoque31d1d4b2014-05-05 22:08:14 -050035
Vince Lehmanf7eec4f2015-05-08 19:02:31 -050036class Nlsr;
37
akmhoque53353462014-04-22 08:43:45 -050038class Lsa
39{
40public:
Nick Gordon727d4832017-10-13 18:04:25 -050041 enum class Type {
42 ADJACENCY,
43 COORDINATE,
44 NAME,
Nick Gordon9212bd42017-10-23 10:59:38 -050045 BASE,
46 MOCK
Nick Gordon727d4832017-10-13 18:04:25 -050047 };
48
49 Lsa()
akmhoque53353462014-04-22 08:43:45 -050050 : m_origRouter()
51 , m_lsSeqNo()
akmhoquec7a79b22014-05-26 08:06:19 -050052 , m_expirationTimePoint()
akmhoque53353462014-04-22 08:43:45 -050053 , m_expiringEventId()
54 {
55 }
56
Nick Gordon727d4832017-10-13 18:04:25 -050057 virtual Type
58 getType() const
akmhoque53353462014-04-22 08:43:45 -050059 {
Nick Gordon727d4832017-10-13 18:04:25 -050060 return Type::BASE;
akmhoque53353462014-04-22 08:43:45 -050061 }
62
63 void
64 setLsSeqNo(uint32_t lsn)
65 {
66 m_lsSeqNo = lsn;
67 }
68
69 uint32_t
70 getLsSeqNo() const
71 {
72 return m_lsSeqNo;
73 }
74
akmhoque31d1d4b2014-05-05 22:08:14 -050075 const ndn::Name&
akmhoque53353462014-04-22 08:43:45 -050076 getOrigRouter() const
77 {
78 return m_origRouter;
79 }
80
81 void
akmhoque31d1d4b2014-05-05 22:08:14 -050082 setOrigRouter(const ndn::Name& org)
akmhoque53353462014-04-22 08:43:45 -050083 {
84 m_origRouter = org;
85 }
86
akmhoquec7a79b22014-05-26 08:06:19 -050087 const ndn::time::system_clock::TimePoint&
88 getExpirationTimePoint() const
akmhoque53353462014-04-22 08:43:45 -050089 {
akmhoquec7a79b22014-05-26 08:06:19 -050090 return m_expirationTimePoint;
akmhoque53353462014-04-22 08:43:45 -050091 }
92
93 void
akmhoquec7a79b22014-05-26 08:06:19 -050094 setExpirationTimePoint(const ndn::time::system_clock::TimePoint& lt)
akmhoque53353462014-04-22 08:43:45 -050095 {
akmhoquec7a79b22014-05-26 08:06:19 -050096 m_expirationTimePoint = lt;
akmhoque53353462014-04-22 08:43:45 -050097 }
98
99 void
100 setExpiringEventId(const ndn::EventId leei)
101 {
102 m_expiringEventId = leei;
103 }
104
105 ndn::EventId
106 getExpiringEventId() const
107 {
108 return m_expiringEventId;
109 }
110
Nick Gordonfaf49f42017-10-23 12:36:28 -0500111 /*! \brief Return the data that this LSA represents.
112 */
Nick Gordon9212bd42017-10-23 10:59:38 -0500113 virtual std::string
Nick Gordonfaf49f42017-10-23 12:36:28 -0500114 serialize() const = 0;
Nick Gordon9212bd42017-10-23 10:59:38 -0500115
Nick Gordon22cc1a82017-10-23 13:06:53 -0500116 /*! \brief Gets the key for this LSA.
117
118 Format is: \<router name\>/\<LSA type>\
119 */
120 const ndn::Name
121 getKey() const;
122
Nick Gordon9212bd42017-10-23 10:59:38 -0500123 virtual bool
Nick Gordon0fa4c772017-10-23 13:33:03 -0500124 deserialize(const std::string& content) = 0;
Nick Gordon9212bd42017-10-23 10:59:38 -0500125
akmhoque53353462014-04-22 08:43:45 -0500126protected:
Nick Gordonfaf49f42017-10-23 12:36:28 -0500127 /*! Get data common to all LSA types.
128
129 This method should be called by all LSA classes in their
130 serialize() method.
131 */
132 std::string
133 getData() const;
134
Nick Gordon0fa4c772017-10-23 13:33:03 -0500135 bool
136 deserializeCommon(boost::tokenizer<boost::char_separator<char>>::iterator& iterator);
137
Nick Gordonfaf49f42017-10-23 12:36:28 -0500138protected:
akmhoque31d1d4b2014-05-05 22:08:14 -0500139 ndn::Name m_origRouter;
akmhoque53353462014-04-22 08:43:45 -0500140 uint32_t m_lsSeqNo;
akmhoquec7a79b22014-05-26 08:06:19 -0500141 ndn::time::system_clock::TimePoint m_expirationTimePoint;
akmhoque53353462014-04-22 08:43:45 -0500142 ndn::EventId m_expiringEventId;
143};
144
145class NameLsa: public Lsa
146{
147public:
148 NameLsa()
akmhoque53353462014-04-22 08:43:45 -0500149 {
akmhoque53353462014-04-22 08:43:45 -0500150 }
151
Ashlesh Gawanded02c3882015-12-29 16:02:51 -0600152 NameLsa(const ndn::Name& origR, uint32_t lsn,
akmhoquec7a79b22014-05-26 08:06:19 -0500153 const ndn::time::system_clock::TimePoint& lt,
akmhoquefdbddb12014-05-02 18:35:19 -0500154 NamePrefixList& npl);
akmhoque53353462014-04-22 08:43:45 -0500155
Nick Gordon727d4832017-10-13 18:04:25 -0500156 Lsa::Type
157 getType() const override
158 {
159 return Lsa::Type::NAME;
160 }
161
akmhoquec8a10f72014-04-25 18:42:55 -0500162 NamePrefixList&
akmhoque53353462014-04-22 08:43:45 -0500163 getNpl()
164 {
165 return m_npl;
166 }
167
Nick Gordon56d1fae2017-05-26 16:39:25 -0500168 const NamePrefixList&
169 getNpl() const
170 {
171 return m_npl;
172 }
173
akmhoque53353462014-04-22 08:43:45 -0500174 void
akmhoque31d1d4b2014-05-05 22:08:14 -0500175 addName(const ndn::Name& name)
akmhoque53353462014-04-22 08:43:45 -0500176 {
177 m_npl.insert(name);
178 }
179
180 void
akmhoque31d1d4b2014-05-05 22:08:14 -0500181 removeName(const ndn::Name& name)
akmhoque53353462014-04-22 08:43:45 -0500182 {
183 m_npl.remove(name);
184 }
185
Nick G97e34942016-07-11 14:46:27 -0500186 /*! \brief Initializes this LSA object with content's data.
187
188 \param content The data (e.g. name prefixes) to initialize this LSA with.
189
190 This function initializes this object to represent the data
191 contained in content. The format for this is the same as for
192 getData(); getData() returns data of this format, in other words.
193 */
akmhoque53353462014-04-22 08:43:45 -0500194 bool
Nick Gordon0fa4c772017-10-23 13:33:03 -0500195 deserialize(const std::string& content) override;
akmhoque53353462014-04-22 08:43:45 -0500196
Nick Gordon56d1fae2017-05-26 16:39:25 -0500197 bool
198 isEqualContent(const NameLsa& other) const;
199
akmhoque53353462014-04-22 08:43:45 -0500200 void
201 writeLog();
202
Nick Gordonfaf49f42017-10-23 12:36:28 -0500203 /*! \brief Returns the data that this name LSA has.
204
205 Format is: \<original router
206 prefix\>|name|\<seq. no.\>|\<exp. time\>|\<prefix 1\>|\<prefix
207 2\>|...|\<prefix n\>|
208 */
209 std::string
210 serialize() const override;
211
akmhoque53353462014-04-22 08:43:45 -0500212private:
akmhoquec8a10f72014-04-25 18:42:55 -0500213 NamePrefixList m_npl;
akmhoque53353462014-04-22 08:43:45 -0500214};
215
akmhoque53353462014-04-22 08:43:45 -0500216class AdjLsa: public Lsa
217{
218public:
alvydce3f182015-04-09 11:23:30 -0500219 typedef AdjacencyList::const_iterator const_iterator;
220
akmhoque53353462014-04-22 08:43:45 -0500221 AdjLsa()
akmhoque53353462014-04-22 08:43:45 -0500222 {
akmhoque53353462014-04-22 08:43:45 -0500223 }
224
Ashlesh Gawanded02c3882015-12-29 16:02:51 -0600225 AdjLsa(const ndn::Name& origR, uint32_t lsn,
akmhoquec7a79b22014-05-26 08:06:19 -0500226 const ndn::time::system_clock::TimePoint& lt,
227 uint32_t nl , AdjacencyList& adl);
akmhoque53353462014-04-22 08:43:45 -0500228
Nick Gordon727d4832017-10-13 18:04:25 -0500229 Lsa::Type
230 getType() const override
231 {
232 return Lsa::Type::ADJACENCY;
233 }
234
akmhoquec8a10f72014-04-25 18:42:55 -0500235 AdjacencyList&
akmhoque53353462014-04-22 08:43:45 -0500236 getAdl()
237 {
238 return m_adl;
239 }
240
Nick Gordon22b5c952017-08-10 17:48:15 -0500241 const AdjacencyList&
242 getAdl() const
243 {
244 return m_adl;
245 }
246
akmhoque53353462014-04-22 08:43:45 -0500247 void
248 addAdjacent(Adjacent adj)
249 {
250 m_adl.insert(adj);
251 }
252
Nick G97e34942016-07-11 14:46:27 -0500253 /*! \brief Initializes this adj. LSA from the supplied content.
254
255 \param content The content that this LSA is to have, formatted
256 according to getData().
257 */
akmhoque53353462014-04-22 08:43:45 -0500258 bool
Nick Gordon0fa4c772017-10-23 13:33:03 -0500259 deserialize(const std::string& content) override;
akmhoque53353462014-04-22 08:43:45 -0500260
261 uint32_t
262 getNoLink()
263 {
264 return m_noLink;
265 }
266
267 bool
akmhoquefdbddb12014-05-02 18:35:19 -0500268 isEqualContent(AdjLsa& alsa);
akmhoque53353462014-04-22 08:43:45 -0500269
Nick G97e34942016-07-11 14:46:27 -0500270 /*! \brief Installs this LSA's name prefixes into the NPT.
271
272 \param pnlsr The NLSR top-level whose NPT you want to install the
273 entries into.
274 */
akmhoque53353462014-04-22 08:43:45 -0500275 void
276 addNptEntries(Nlsr& pnlsr);
277
278 void
279 removeNptEntries(Nlsr& pnlsr);
280
akmhoque674b0b12014-05-20 14:33:28 -0500281 void
282 writeLog();
283
alvydce3f182015-04-09 11:23:30 -0500284 const_iterator
285 begin() const
286 {
287 return m_adl.begin();
288 }
289
290 const_iterator
291 end() const
292 {
293 return m_adl.end();
294 }
295
Nick Gordonfaf49f42017-10-23 12:36:28 -0500296 /*! \brief Returns the data this adjacency LSA has.
297
298 The format is: \<original
299 router\>|adjacency|\<seq. no.\>|\<exp. time\>|\<size\>|\<adjacency prefix
300 1\>|\<face uri 1\>|\<cost 1\>|...|\<adjacency prefix n\>|\<face uri
301 n\>|\<cost n\>|
302 */
303 std::string
304 serialize() const override;
305
akmhoque53353462014-04-22 08:43:45 -0500306private:
307 uint32_t m_noLink;
akmhoquec8a10f72014-04-25 18:42:55 -0500308 AdjacencyList m_adl;
akmhoque53353462014-04-22 08:43:45 -0500309};
310
akmhoqueb6450b12014-04-24 00:01:03 -0500311class CoordinateLsa: public Lsa
akmhoque53353462014-04-22 08:43:45 -0500312{
313public:
akmhoqueb6450b12014-04-24 00:01:03 -0500314 CoordinateLsa()
Nick Gordon727d4832017-10-13 18:04:25 -0500315 : m_corRad(0)
akmhoque53353462014-04-22 08:43:45 -0500316 {
akmhoque53353462014-04-22 08:43:45 -0500317 }
318
Ashlesh Gawanded02c3882015-12-29 16:02:51 -0600319 CoordinateLsa(const ndn::Name& origR, uint32_t lsn,
akmhoquec7a79b22014-05-26 08:06:19 -0500320 const ndn::time::system_clock::TimePoint& lt,
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600321 double r, std::vector<double> theta);
akmhoque53353462014-04-22 08:43:45 -0500322
Nick Gordon727d4832017-10-13 18:04:25 -0500323 Lsa::Type
324 getType() const override
325 {
326 return Lsa::Type::COORDINATE;
327 }
328
Nick G97e34942016-07-11 14:46:27 -0500329 /*! \brief Initializes this coordinate LSA with the data in content.
330
331 \param content The string content that is used to build the LSA.
332
333 This function initializes this LSA object to represent the data
334 specified by the parameter. The format that it is expecting is the
335 same as for getData();
336 */
akmhoque53353462014-04-22 08:43:45 -0500337 bool
Nick Gordon0fa4c772017-10-23 13:33:03 -0500338 deserialize(const std::string& content) override;
akmhoque53353462014-04-22 08:43:45 -0500339
340 double
akmhoqueb6450b12014-04-24 00:01:03 -0500341 getCorRadius() const
akmhoque53353462014-04-22 08:43:45 -0500342 {
akmhoque53353462014-04-22 08:43:45 -0500343 return m_corRad;
akmhoque53353462014-04-22 08:43:45 -0500344 }
345
346 void
347 setCorRadius(double cr)
348 {
akmhoque157b0a42014-05-13 00:26:37 -0500349 m_corRad = cr;
akmhoque53353462014-04-22 08:43:45 -0500350 }
351
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600352 const std::vector<double>
akmhoqueb6450b12014-04-24 00:01:03 -0500353 getCorTheta() const
akmhoque53353462014-04-22 08:43:45 -0500354 {
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600355 return m_angles;
akmhoque53353462014-04-22 08:43:45 -0500356 }
357
358 void
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600359 setCorTheta(std::vector<double> ct)
akmhoque53353462014-04-22 08:43:45 -0500360 {
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600361 m_angles = ct;
akmhoque53353462014-04-22 08:43:45 -0500362 }
363
364 bool
akmhoquefdbddb12014-05-02 18:35:19 -0500365 isEqualContent(const CoordinateLsa& clsa);
akmhoque53353462014-04-22 08:43:45 -0500366
akmhoque674b0b12014-05-20 14:33:28 -0500367 void
368 writeLog();
369
Nick Gordonfaf49f42017-10-23 12:36:28 -0500370 /*! \brief Returns the data that this coordinate LSA represents.
371
372 The format is: \<original
373 router\>|coordinate|\<seq. no.\>|\<exp. time\>|\<radians\>|\<theta\>|
374 */
375 std::string
376 serialize() const override;
377
akmhoque53353462014-04-22 08:43:45 -0500378private:
379 double m_corRad;
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600380 std::vector<double> m_angles;
akmhoque53353462014-04-22 08:43:45 -0500381};
382
alvydce3f182015-04-09 11:23:30 -0500383std::ostream&
384operator<<(std::ostream& os, const AdjLsa& adjLsa);
385
Nick Gordon727d4832017-10-13 18:04:25 -0500386std::ostream&
387operator<<(std::ostream& os, const Lsa::Type& type);
388
389std::istream&
390operator>>(std::istream& is, Lsa::Type& type);
391
Nick Gordonfad8e252016-08-11 14:21:38 -0500392} // namespace nlsr
akmhoque53353462014-04-22 08:43:45 -0500393
Nick Gordon727d4832017-10-13 18:04:25 -0500394namespace std {
395 std::string
396 to_string(const nlsr::Lsa::Type& type);
397} // namespace std
398
Nick Gordon56d1fae2017-05-26 16:39:25 -0500399#endif // NLSR_LSA_HPP