blob: 71da57c5ebd77cb7b762a955447ae93249edec1d [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 Gordon2f623382017-11-03 13:49:31 -0500123 /*! \brief Populate this LSA with content from the string "content".
124 \param content The string containing a valid serialization of LSA content.
125
126 This method populates "this" LSA with data from the string.
127 */
Nick Gordon9212bd42017-10-23 10:59:38 -0500128 virtual bool
Nick Gordon2f623382017-11-03 13:49:31 -0500129 deserialize(const std::string& content) noexcept = 0;
Nick Gordon9212bd42017-10-23 10:59:38 -0500130
Nick Gordonae0a0472017-10-23 15:51:23 -0500131 virtual void
132 writeLog() const = 0;
133
akmhoque53353462014-04-22 08:43:45 -0500134protected:
Nick Gordonfaf49f42017-10-23 12:36:28 -0500135 /*! Get data common to all LSA types.
136
137 This method should be called by all LSA classes in their
138 serialize() method.
139 */
140 std::string
141 getData() const;
142
Nick Gordonae0a0472017-10-23 15:51:23 -0500143 /*! Print data common to all LSA types.
144 */
145 std::string
146 toString() const;
147
Nick Gordon0fa4c772017-10-23 13:33:03 -0500148 bool
149 deserializeCommon(boost::tokenizer<boost::char_separator<char>>::iterator& iterator);
150
Nick Gordonfaf49f42017-10-23 12:36:28 -0500151protected:
akmhoque31d1d4b2014-05-05 22:08:14 -0500152 ndn::Name m_origRouter;
akmhoque53353462014-04-22 08:43:45 -0500153 uint32_t m_lsSeqNo;
akmhoquec7a79b22014-05-26 08:06:19 -0500154 ndn::time::system_clock::TimePoint m_expirationTimePoint;
akmhoque53353462014-04-22 08:43:45 -0500155 ndn::EventId m_expiringEventId;
156};
157
158class NameLsa: public Lsa
159{
160public:
161 NameLsa()
akmhoque53353462014-04-22 08:43:45 -0500162 {
akmhoque53353462014-04-22 08:43:45 -0500163 }
164
Ashlesh Gawanded02c3882015-12-29 16:02:51 -0600165 NameLsa(const ndn::Name& origR, uint32_t lsn,
akmhoquec7a79b22014-05-26 08:06:19 -0500166 const ndn::time::system_clock::TimePoint& lt,
akmhoquefdbddb12014-05-02 18:35:19 -0500167 NamePrefixList& npl);
akmhoque53353462014-04-22 08:43:45 -0500168
Nick Gordon727d4832017-10-13 18:04:25 -0500169 Lsa::Type
170 getType() const override
171 {
172 return Lsa::Type::NAME;
173 }
174
akmhoquec8a10f72014-04-25 18:42:55 -0500175 NamePrefixList&
akmhoque53353462014-04-22 08:43:45 -0500176 getNpl()
177 {
178 return m_npl;
179 }
180
Nick Gordon56d1fae2017-05-26 16:39:25 -0500181 const NamePrefixList&
182 getNpl() const
183 {
184 return m_npl;
185 }
186
akmhoque53353462014-04-22 08:43:45 -0500187 void
akmhoque31d1d4b2014-05-05 22:08:14 -0500188 addName(const ndn::Name& name)
akmhoque53353462014-04-22 08:43:45 -0500189 {
190 m_npl.insert(name);
191 }
192
193 void
akmhoque31d1d4b2014-05-05 22:08:14 -0500194 removeName(const ndn::Name& name)
akmhoque53353462014-04-22 08:43:45 -0500195 {
196 m_npl.remove(name);
197 }
198
Nick G97e34942016-07-11 14:46:27 -0500199 /*! \brief Initializes this LSA object with content's data.
200
201 \param content The data (e.g. name prefixes) to initialize this LSA with.
202
203 This function initializes this object to represent the data
204 contained in content. The format for this is the same as for
205 getData(); getData() returns data of this format, in other words.
206 */
akmhoque53353462014-04-22 08:43:45 -0500207 bool
Nick Gordon2f623382017-11-03 13:49:31 -0500208 deserialize(const std::string& content) noexcept override;
akmhoque53353462014-04-22 08:43:45 -0500209
Nick Gordon56d1fae2017-05-26 16:39:25 -0500210 bool
211 isEqualContent(const NameLsa& other) const;
212
akmhoque53353462014-04-22 08:43:45 -0500213 void
Nick Gordonae0a0472017-10-23 15:51:23 -0500214 writeLog() const override;
akmhoque53353462014-04-22 08:43:45 -0500215
Nick Gordonfaf49f42017-10-23 12:36:28 -0500216 /*! \brief Returns the data that this name LSA has.
217
218 Format is: \<original router
219 prefix\>|name|\<seq. no.\>|\<exp. time\>|\<prefix 1\>|\<prefix
220 2\>|...|\<prefix n\>|
221 */
222 std::string
223 serialize() const override;
224
akmhoque53353462014-04-22 08:43:45 -0500225private:
akmhoquec8a10f72014-04-25 18:42:55 -0500226 NamePrefixList m_npl;
Nick Gordonae0a0472017-10-23 15:51:23 -0500227
228 friend std::ostream&
229 operator<<(std::ostream& os, const NameLsa& lsa);
akmhoque53353462014-04-22 08:43:45 -0500230};
231
akmhoque53353462014-04-22 08:43:45 -0500232class AdjLsa: public Lsa
233{
234public:
alvydce3f182015-04-09 11:23:30 -0500235 typedef AdjacencyList::const_iterator const_iterator;
236
akmhoque53353462014-04-22 08:43:45 -0500237 AdjLsa()
akmhoque53353462014-04-22 08:43:45 -0500238 {
akmhoque53353462014-04-22 08:43:45 -0500239 }
240
Ashlesh Gawanded02c3882015-12-29 16:02:51 -0600241 AdjLsa(const ndn::Name& origR, uint32_t lsn,
akmhoquec7a79b22014-05-26 08:06:19 -0500242 const ndn::time::system_clock::TimePoint& lt,
243 uint32_t nl , AdjacencyList& adl);
akmhoque53353462014-04-22 08:43:45 -0500244
Nick Gordon727d4832017-10-13 18:04:25 -0500245 Lsa::Type
246 getType() const override
247 {
248 return Lsa::Type::ADJACENCY;
249 }
250
akmhoquec8a10f72014-04-25 18:42:55 -0500251 AdjacencyList&
akmhoque53353462014-04-22 08:43:45 -0500252 getAdl()
253 {
254 return m_adl;
255 }
256
Nick Gordon22b5c952017-08-10 17:48:15 -0500257 const AdjacencyList&
258 getAdl() const
259 {
260 return m_adl;
261 }
262
akmhoque53353462014-04-22 08:43:45 -0500263 void
264 addAdjacent(Adjacent adj)
265 {
266 m_adl.insert(adj);
267 }
268
Nick G97e34942016-07-11 14:46:27 -0500269 /*! \brief Initializes this adj. LSA from the supplied content.
270
271 \param content The content that this LSA is to have, formatted
272 according to getData().
273 */
akmhoque53353462014-04-22 08:43:45 -0500274 bool
Nick Gordon2f623382017-11-03 13:49:31 -0500275 deserialize(const std::string& content) noexcept override;
akmhoque53353462014-04-22 08:43:45 -0500276
277 uint32_t
278 getNoLink()
279 {
280 return m_noLink;
281 }
282
283 bool
akmhoquefdbddb12014-05-02 18:35:19 -0500284 isEqualContent(AdjLsa& alsa);
akmhoque53353462014-04-22 08:43:45 -0500285
Nick G97e34942016-07-11 14:46:27 -0500286 /*! \brief Installs this LSA's name prefixes into the NPT.
287
288 \param pnlsr The NLSR top-level whose NPT you want to install the
289 entries into.
290 */
akmhoque53353462014-04-22 08:43:45 -0500291 void
292 addNptEntries(Nlsr& pnlsr);
293
294 void
295 removeNptEntries(Nlsr& pnlsr);
296
akmhoque674b0b12014-05-20 14:33:28 -0500297 void
Nick Gordonae0a0472017-10-23 15:51:23 -0500298 writeLog() const override;
akmhoque674b0b12014-05-20 14:33:28 -0500299
alvydce3f182015-04-09 11:23:30 -0500300 const_iterator
301 begin() const
302 {
303 return m_adl.begin();
304 }
305
306 const_iterator
307 end() const
308 {
309 return m_adl.end();
310 }
311
Nick Gordonfaf49f42017-10-23 12:36:28 -0500312 /*! \brief Returns the data this adjacency LSA has.
313
314 The format is: \<original
315 router\>|adjacency|\<seq. no.\>|\<exp. time\>|\<size\>|\<adjacency prefix
316 1\>|\<face uri 1\>|\<cost 1\>|...|\<adjacency prefix n\>|\<face uri
317 n\>|\<cost n\>|
318 */
319 std::string
320 serialize() const override;
321
akmhoque53353462014-04-22 08:43:45 -0500322private:
323 uint32_t m_noLink;
akmhoquec8a10f72014-04-25 18:42:55 -0500324 AdjacencyList m_adl;
Nick Gordonae0a0472017-10-23 15:51:23 -0500325
326 friend std::ostream&
327 operator<<(std::ostream& os, const AdjLsa& lsa);
akmhoque53353462014-04-22 08:43:45 -0500328};
329
akmhoqueb6450b12014-04-24 00:01:03 -0500330class CoordinateLsa: public Lsa
akmhoque53353462014-04-22 08:43:45 -0500331{
332public:
akmhoqueb6450b12014-04-24 00:01:03 -0500333 CoordinateLsa()
Nick Gordon727d4832017-10-13 18:04:25 -0500334 : m_corRad(0)
akmhoque53353462014-04-22 08:43:45 -0500335 {
akmhoque53353462014-04-22 08:43:45 -0500336 }
337
Ashlesh Gawanded02c3882015-12-29 16:02:51 -0600338 CoordinateLsa(const ndn::Name& origR, uint32_t lsn,
akmhoquec7a79b22014-05-26 08:06:19 -0500339 const ndn::time::system_clock::TimePoint& lt,
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600340 double r, std::vector<double> theta);
akmhoque53353462014-04-22 08:43:45 -0500341
Nick Gordon727d4832017-10-13 18:04:25 -0500342 Lsa::Type
343 getType() const override
344 {
345 return Lsa::Type::COORDINATE;
346 }
347
Nick G97e34942016-07-11 14:46:27 -0500348 /*! \brief Initializes this coordinate LSA with the data in content.
349
350 \param content The string content that is used to build the LSA.
351
352 This function initializes this LSA object to represent the data
353 specified by the parameter. The format that it is expecting is the
354 same as for getData();
355 */
akmhoque53353462014-04-22 08:43:45 -0500356 bool
Nick Gordon2f623382017-11-03 13:49:31 -0500357 deserialize(const std::string& content) noexcept override;
akmhoque53353462014-04-22 08:43:45 -0500358
359 double
akmhoqueb6450b12014-04-24 00:01:03 -0500360 getCorRadius() const
akmhoque53353462014-04-22 08:43:45 -0500361 {
akmhoque53353462014-04-22 08:43:45 -0500362 return m_corRad;
akmhoque53353462014-04-22 08:43:45 -0500363 }
364
365 void
366 setCorRadius(double cr)
367 {
akmhoque157b0a42014-05-13 00:26:37 -0500368 m_corRad = cr;
akmhoque53353462014-04-22 08:43:45 -0500369 }
370
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600371 const std::vector<double>
akmhoqueb6450b12014-04-24 00:01:03 -0500372 getCorTheta() const
akmhoque53353462014-04-22 08:43:45 -0500373 {
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600374 return m_angles;
akmhoque53353462014-04-22 08:43:45 -0500375 }
376
377 void
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600378 setCorTheta(std::vector<double> ct)
akmhoque53353462014-04-22 08:43:45 -0500379 {
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600380 m_angles = ct;
akmhoque53353462014-04-22 08:43:45 -0500381 }
382
383 bool
akmhoquefdbddb12014-05-02 18:35:19 -0500384 isEqualContent(const CoordinateLsa& clsa);
akmhoque53353462014-04-22 08:43:45 -0500385
akmhoque674b0b12014-05-20 14:33:28 -0500386 void
Nick Gordonae0a0472017-10-23 15:51:23 -0500387 writeLog() const override;
akmhoque674b0b12014-05-20 14:33:28 -0500388
Nick Gordonfaf49f42017-10-23 12:36:28 -0500389 /*! \brief Returns the data that this coordinate LSA represents.
390
391 The format is: \<original
392 router\>|coordinate|\<seq. no.\>|\<exp. time\>|\<radians\>|\<theta\>|
393 */
394 std::string
395 serialize() const override;
396
akmhoque53353462014-04-22 08:43:45 -0500397private:
398 double m_corRad;
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600399 std::vector<double> m_angles;
Nick Gordonae0a0472017-10-23 15:51:23 -0500400
401 friend std::ostream&
402 operator<<(std::ostream& os, const CoordinateLsa& lsa);
akmhoque53353462014-04-22 08:43:45 -0500403};
404
alvydce3f182015-04-09 11:23:30 -0500405std::ostream&
Nick Gordonae0a0472017-10-23 15:51:23 -0500406operator<<(std::ostream& os, const AdjLsa& lsa);
407
408std::ostream&
409operator<<(std::ostream& os, const CoordinateLsa& lsa);
410
411std::ostream&
412operator<<(std::ostream& os, const NameLsa& lsa);
alvydce3f182015-04-09 11:23:30 -0500413
Nick Gordon727d4832017-10-13 18:04:25 -0500414std::ostream&
415operator<<(std::ostream& os, const Lsa::Type& type);
416
417std::istream&
418operator>>(std::istream& is, Lsa::Type& type);
419
Nick Gordonfad8e252016-08-11 14:21:38 -0500420} // namespace nlsr
akmhoque53353462014-04-22 08:43:45 -0500421
Nick Gordon727d4832017-10-13 18:04:25 -0500422namespace std {
423 std::string
424 to_string(const nlsr::Lsa::Type& type);
425} // namespace std
426
Nick Gordon56d1fae2017-05-26 16:39:25 -0500427#endif // NLSR_LSA_HPP