blob: 13a5b6c8c3aee1f60a88c45410efb4715c4c3a51 [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Alexander Afanasyev67758b12018-03-06 18:36:44 -05002/*
Ashlesh Gawande85998a12017-12-07 22:22:13 -06003 * Copyright (c) 2014-2019, 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/>.
Alexander Afanasyev67758b12018-03-06 18:36:44 -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
akmhoquec8a10f72014-04-25 18:42:55 -050029#include <ndn-cxx/util/scheduler.hpp>
akmhoquec7a79b22014-05-26 08:06:19 -050030#include <ndn-cxx/util/time.hpp>
Nick Gordon0fa4c772017-10-23 13:33:03 -050031#include <boost/tokenizer.hpp>
akmhoquec7a79b22014-05-26 08:06:19 -050032
akmhoque53353462014-04-22 08:43:45 -050033namespace nlsr {
akmhoque31d1d4b2014-05-05 22:08:14 -050034
akmhoque53353462014-04-22 08:43:45 -050035class Lsa
36{
37public:
Nick Gordon727d4832017-10-13 18:04:25 -050038 enum class Type {
39 ADJACENCY,
40 COORDINATE,
41 NAME,
Nick Gordon9212bd42017-10-23 10:59:38 -050042 BASE,
43 MOCK
Nick Gordon727d4832017-10-13 18:04:25 -050044 };
45
Alexander Afanasyev67758b12018-03-06 18:36:44 -050046 virtual
47 ~Lsa() = default;
48
Nick Gordon727d4832017-10-13 18:04:25 -050049 virtual Type
50 getType() const
akmhoque53353462014-04-22 08:43:45 -050051 {
Nick Gordon727d4832017-10-13 18:04:25 -050052 return Type::BASE;
akmhoque53353462014-04-22 08:43:45 -050053 }
54
55 void
56 setLsSeqNo(uint32_t lsn)
57 {
58 m_lsSeqNo = lsn;
59 }
60
61 uint32_t
62 getLsSeqNo() const
63 {
64 return m_lsSeqNo;
65 }
66
akmhoque31d1d4b2014-05-05 22:08:14 -050067 const ndn::Name&
akmhoque53353462014-04-22 08:43:45 -050068 getOrigRouter() const
69 {
70 return m_origRouter;
71 }
72
73 void
akmhoque31d1d4b2014-05-05 22:08:14 -050074 setOrigRouter(const ndn::Name& org)
akmhoque53353462014-04-22 08:43:45 -050075 {
76 m_origRouter = org;
77 }
78
akmhoquec7a79b22014-05-26 08:06:19 -050079 const ndn::time::system_clock::TimePoint&
80 getExpirationTimePoint() const
akmhoque53353462014-04-22 08:43:45 -050081 {
akmhoquec7a79b22014-05-26 08:06:19 -050082 return m_expirationTimePoint;
akmhoque53353462014-04-22 08:43:45 -050083 }
84
85 void
akmhoquec7a79b22014-05-26 08:06:19 -050086 setExpirationTimePoint(const ndn::time::system_clock::TimePoint& lt)
akmhoque53353462014-04-22 08:43:45 -050087 {
akmhoquec7a79b22014-05-26 08:06:19 -050088 m_expirationTimePoint = lt;
akmhoque53353462014-04-22 08:43:45 -050089 }
90
91 void
Davide Pesaventoaf7a2112019-03-19 14:55:20 -040092 setExpiringEventId(ndn::scheduler::EventId eid)
akmhoque53353462014-04-22 08:43:45 -050093 {
Davide Pesaventoaf7a2112019-03-19 14:55:20 -040094 m_expiringEventId = std::move(eid);
akmhoque53353462014-04-22 08:43:45 -050095 }
96
Davide Pesaventoaf7a2112019-03-19 14:55:20 -040097 ndn::scheduler::EventId
akmhoque53353462014-04-22 08:43:45 -050098 getExpiringEventId() const
99 {
100 return m_expiringEventId;
101 }
102
Nick Gordonfaf49f42017-10-23 12:36:28 -0500103 /*! \brief Return the data that this LSA represents.
104 */
Nick Gordon9212bd42017-10-23 10:59:38 -0500105 virtual std::string
Nick Gordonfaf49f42017-10-23 12:36:28 -0500106 serialize() const = 0;
Nick Gordon9212bd42017-10-23 10:59:38 -0500107
Nick Gordon22cc1a82017-10-23 13:06:53 -0500108 /*! \brief Gets the key for this LSA.
109
110 Format is: \<router name\>/\<LSA type>\
111 */
112 const ndn::Name
113 getKey() const;
114
Nick Gordon2f623382017-11-03 13:49:31 -0500115 /*! \brief Populate this LSA with content from the string "content".
116 \param content The string containing a valid serialization of LSA content.
117
118 This method populates "this" LSA with data from the string.
119 */
Nick Gordon9212bd42017-10-23 10:59:38 -0500120 virtual bool
Nick Gordon2f623382017-11-03 13:49:31 -0500121 deserialize(const std::string& content) noexcept = 0;
Nick Gordon9212bd42017-10-23 10:59:38 -0500122
Nick Gordonae0a0472017-10-23 15:51:23 -0500123 virtual void
124 writeLog() const = 0;
125
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 Gordonae0a0472017-10-23 15:51:23 -0500135 /*! Print data common to all LSA types.
136 */
137 std::string
138 toString() const;
139
Nick Gordon0fa4c772017-10-23 13:33:03 -0500140 bool
141 deserializeCommon(boost::tokenizer<boost::char_separator<char>>::iterator& iterator);
142
Nick Gordonfaf49f42017-10-23 12:36:28 -0500143protected:
akmhoque31d1d4b2014-05-05 22:08:14 -0500144 ndn::Name m_origRouter;
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400145 uint32_t m_lsSeqNo = 0;
akmhoquec7a79b22014-05-26 08:06:19 -0500146 ndn::time::system_clock::TimePoint m_expirationTimePoint;
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400147 ndn::scheduler::EventId m_expiringEventId;
akmhoque53353462014-04-22 08:43:45 -0500148};
149
Alexander Afanasyev67758b12018-03-06 18:36:44 -0500150class NameLsa : public Lsa
akmhoque53353462014-04-22 08:43:45 -0500151{
152public:
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400153 NameLsa() = default;
akmhoque53353462014-04-22 08:43:45 -0500154
Ashlesh Gawanded02c3882015-12-29 16:02:51 -0600155 NameLsa(const ndn::Name& origR, uint32_t lsn,
akmhoquec7a79b22014-05-26 08:06:19 -0500156 const ndn::time::system_clock::TimePoint& lt,
akmhoquefdbddb12014-05-02 18:35:19 -0500157 NamePrefixList& npl);
akmhoque53353462014-04-22 08:43:45 -0500158
Nick Gordon727d4832017-10-13 18:04:25 -0500159 Lsa::Type
160 getType() const override
161 {
162 return Lsa::Type::NAME;
163 }
164
akmhoquec8a10f72014-04-25 18:42:55 -0500165 NamePrefixList&
akmhoque53353462014-04-22 08:43:45 -0500166 getNpl()
167 {
168 return m_npl;
169 }
170
Nick Gordon56d1fae2017-05-26 16:39:25 -0500171 const NamePrefixList&
172 getNpl() const
173 {
174 return m_npl;
175 }
176
akmhoque53353462014-04-22 08:43:45 -0500177 void
akmhoque31d1d4b2014-05-05 22:08:14 -0500178 addName(const ndn::Name& name)
akmhoque53353462014-04-22 08:43:45 -0500179 {
180 m_npl.insert(name);
181 }
182
183 void
akmhoque31d1d4b2014-05-05 22:08:14 -0500184 removeName(const ndn::Name& name)
akmhoque53353462014-04-22 08:43:45 -0500185 {
186 m_npl.remove(name);
187 }
188
Nick G97e34942016-07-11 14:46:27 -0500189 /*! \brief Initializes this LSA object with content's data.
190
191 \param content The data (e.g. name prefixes) to initialize this LSA with.
192
193 This function initializes this object to represent the data
194 contained in content. The format for this is the same as for
195 getData(); getData() returns data of this format, in other words.
196 */
akmhoque53353462014-04-22 08:43:45 -0500197 bool
Nick Gordon2f623382017-11-03 13:49:31 -0500198 deserialize(const std::string& content) noexcept override;
akmhoque53353462014-04-22 08:43:45 -0500199
Nick Gordon56d1fae2017-05-26 16:39:25 -0500200 bool
201 isEqualContent(const NameLsa& other) const;
202
akmhoque53353462014-04-22 08:43:45 -0500203 void
Nick Gordonae0a0472017-10-23 15:51:23 -0500204 writeLog() const override;
akmhoque53353462014-04-22 08:43:45 -0500205
Nick Gordonfaf49f42017-10-23 12:36:28 -0500206 /*! \brief Returns the data that this name LSA has.
207
208 Format is: \<original router
209 prefix\>|name|\<seq. no.\>|\<exp. time\>|\<prefix 1\>|\<prefix
210 2\>|...|\<prefix n\>|
211 */
212 std::string
213 serialize() const override;
214
akmhoque53353462014-04-22 08:43:45 -0500215private:
akmhoquec8a10f72014-04-25 18:42:55 -0500216 NamePrefixList m_npl;
Nick Gordonae0a0472017-10-23 15:51:23 -0500217
218 friend std::ostream&
219 operator<<(std::ostream& os, const NameLsa& lsa);
akmhoque53353462014-04-22 08:43:45 -0500220};
221
Alexander Afanasyev67758b12018-03-06 18:36:44 -0500222class AdjLsa : public Lsa
akmhoque53353462014-04-22 08:43:45 -0500223{
224public:
alvydce3f182015-04-09 11:23:30 -0500225 typedef AdjacencyList::const_iterator const_iterator;
226
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400227 AdjLsa() = default;
akmhoque53353462014-04-22 08:43:45 -0500228
Ashlesh Gawanded02c3882015-12-29 16:02:51 -0600229 AdjLsa(const ndn::Name& origR, uint32_t lsn,
akmhoquec7a79b22014-05-26 08:06:19 -0500230 const ndn::time::system_clock::TimePoint& lt,
231 uint32_t nl , AdjacencyList& adl);
akmhoque53353462014-04-22 08:43:45 -0500232
Nick Gordon727d4832017-10-13 18:04:25 -0500233 Lsa::Type
234 getType() const override
235 {
236 return Lsa::Type::ADJACENCY;
237 }
238
akmhoquec8a10f72014-04-25 18:42:55 -0500239 AdjacencyList&
akmhoque53353462014-04-22 08:43:45 -0500240 getAdl()
241 {
242 return m_adl;
243 }
244
Nick Gordon22b5c952017-08-10 17:48:15 -0500245 const AdjacencyList&
246 getAdl() const
247 {
248 return m_adl;
249 }
250
akmhoque53353462014-04-22 08:43:45 -0500251 void
252 addAdjacent(Adjacent adj)
253 {
254 m_adl.insert(adj);
255 }
256
Nick G97e34942016-07-11 14:46:27 -0500257 /*! \brief Initializes this adj. LSA from the supplied content.
258
259 \param content The content that this LSA is to have, formatted
260 according to getData().
261 */
akmhoque53353462014-04-22 08:43:45 -0500262 bool
Nick Gordon2f623382017-11-03 13:49:31 -0500263 deserialize(const std::string& content) noexcept override;
akmhoque53353462014-04-22 08:43:45 -0500264
265 uint32_t
266 getNoLink()
267 {
268 return m_noLink;
269 }
270
271 bool
Ryan Wickmanf3c79a62018-05-10 19:32:32 -0500272 isEqualContent(const AdjLsa& alsa) const;
akmhoque53353462014-04-22 08:43:45 -0500273
akmhoque674b0b12014-05-20 14:33:28 -0500274 void
Nick Gordonae0a0472017-10-23 15:51:23 -0500275 writeLog() const override;
akmhoque674b0b12014-05-20 14:33:28 -0500276
alvydce3f182015-04-09 11:23:30 -0500277 const_iterator
278 begin() const
279 {
280 return m_adl.begin();
281 }
282
283 const_iterator
284 end() const
285 {
286 return m_adl.end();
287 }
288
Nick Gordonfaf49f42017-10-23 12:36:28 -0500289 /*! \brief Returns the data this adjacency LSA has.
290
291 The format is: \<original
292 router\>|adjacency|\<seq. no.\>|\<exp. time\>|\<size\>|\<adjacency prefix
293 1\>|\<face uri 1\>|\<cost 1\>|...|\<adjacency prefix n\>|\<face uri
294 n\>|\<cost n\>|
295 */
296 std::string
297 serialize() const override;
298
akmhoque53353462014-04-22 08:43:45 -0500299private:
300 uint32_t m_noLink;
akmhoquec8a10f72014-04-25 18:42:55 -0500301 AdjacencyList m_adl;
Nick Gordonae0a0472017-10-23 15:51:23 -0500302
303 friend std::ostream&
304 operator<<(std::ostream& os, const AdjLsa& lsa);
akmhoque53353462014-04-22 08:43:45 -0500305};
306
Alexander Afanasyev67758b12018-03-06 18:36:44 -0500307class CoordinateLsa : public Lsa
akmhoque53353462014-04-22 08:43:45 -0500308{
309public:
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400310 CoordinateLsa() = default;
akmhoque53353462014-04-22 08:43:45 -0500311
Ashlesh Gawanded02c3882015-12-29 16:02:51 -0600312 CoordinateLsa(const ndn::Name& origR, uint32_t lsn,
akmhoquec7a79b22014-05-26 08:06:19 -0500313 const ndn::time::system_clock::TimePoint& lt,
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600314 double r, std::vector<double> theta);
akmhoque53353462014-04-22 08:43:45 -0500315
Nick Gordon727d4832017-10-13 18:04:25 -0500316 Lsa::Type
317 getType() const override
318 {
319 return Lsa::Type::COORDINATE;
320 }
321
Nick G97e34942016-07-11 14:46:27 -0500322 /*! \brief Initializes this coordinate LSA with the data in content.
323
324 \param content The string content that is used to build the LSA.
325
326 This function initializes this LSA object to represent the data
327 specified by the parameter. The format that it is expecting is the
328 same as for getData();
329 */
akmhoque53353462014-04-22 08:43:45 -0500330 bool
Nick Gordon2f623382017-11-03 13:49:31 -0500331 deserialize(const std::string& content) noexcept override;
akmhoque53353462014-04-22 08:43:45 -0500332
333 double
akmhoqueb6450b12014-04-24 00:01:03 -0500334 getCorRadius() const
akmhoque53353462014-04-22 08:43:45 -0500335 {
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400336 return m_corRad;
akmhoque53353462014-04-22 08:43:45 -0500337 }
338
339 void
340 setCorRadius(double cr)
341 {
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400342 m_corRad = cr;
akmhoque53353462014-04-22 08:43:45 -0500343 }
344
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600345 const std::vector<double>
akmhoqueb6450b12014-04-24 00:01:03 -0500346 getCorTheta() const
akmhoque53353462014-04-22 08:43:45 -0500347 {
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600348 return m_angles;
akmhoque53353462014-04-22 08:43:45 -0500349 }
350
351 void
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600352 setCorTheta(std::vector<double> ct)
akmhoque53353462014-04-22 08:43:45 -0500353 {
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600354 m_angles = ct;
akmhoque53353462014-04-22 08:43:45 -0500355 }
356
357 bool
Ryan Wickmanf3c79a62018-05-10 19:32:32 -0500358 isEqualContent(const CoordinateLsa& clsa) const;
akmhoque53353462014-04-22 08:43:45 -0500359
akmhoque674b0b12014-05-20 14:33:28 -0500360 void
Nick Gordonae0a0472017-10-23 15:51:23 -0500361 writeLog() const override;
akmhoque674b0b12014-05-20 14:33:28 -0500362
Nick Gordonfaf49f42017-10-23 12:36:28 -0500363 /*! \brief Returns the data that this coordinate LSA represents.
364
365 The format is: \<original
366 router\>|coordinate|\<seq. no.\>|\<exp. time\>|\<radians\>|\<theta\>|
367 */
368 std::string
369 serialize() const override;
370
akmhoque53353462014-04-22 08:43:45 -0500371private:
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400372 double m_corRad = 0.0;
Muktadir R Chowdhuryb00dc2a2016-11-05 10:48:58 -0600373 std::vector<double> m_angles;
Nick Gordonae0a0472017-10-23 15:51:23 -0500374
375 friend std::ostream&
376 operator<<(std::ostream& os, const CoordinateLsa& lsa);
akmhoque53353462014-04-22 08:43:45 -0500377};
378
alvydce3f182015-04-09 11:23:30 -0500379std::ostream&
Nick Gordonae0a0472017-10-23 15:51:23 -0500380operator<<(std::ostream& os, const AdjLsa& lsa);
381
382std::ostream&
383operator<<(std::ostream& os, const CoordinateLsa& lsa);
384
385std::ostream&
386operator<<(std::ostream& os, const NameLsa& lsa);
alvydce3f182015-04-09 11:23:30 -0500387
Nick Gordon727d4832017-10-13 18:04:25 -0500388std::ostream&
389operator<<(std::ostream& os, const Lsa::Type& type);
390
391std::istream&
392operator>>(std::istream& is, Lsa::Type& type);
393
Nick Gordonfad8e252016-08-11 14:21:38 -0500394} // namespace nlsr
akmhoque53353462014-04-22 08:43:45 -0500395
Nick Gordon727d4832017-10-13 18:04:25 -0500396namespace std {
Davide Pesaventoaf7a2112019-03-19 14:55:20 -0400397std::string
398to_string(const nlsr::Lsa::Type& type);
Nick Gordon727d4832017-10-13 18:04:25 -0500399} // namespace std
400
Nick Gordon56d1fae2017-05-26 16:39:25 -0500401#endif // NLSR_LSA_HPP