blob: b35f3bfa6dedd7f781705bdf3b446c8daee16011 [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,
Nick Gordonf8b5bcd2016-08-11 15:06:50 -05004 * Regents of the University of California
akmhoque3d06e792014-05-27 16:23:20 -05005 *
6 * This file is part of NLSR (Named-data Link State Routing).
7 * See AUTHORS.md for complete list of NLSR authors and contributors.
8 *
9 * NLSR is free software: you can redistribute it and/or modify it under the terms
10 * of the GNU General Public License as published by the Free Software Foundation,
11 * either version 3 of the License, or (at your option) any later version.
12 *
13 * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
14 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along with
18 * NLSR, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
akmhoque3d06e792014-05-27 16:23:20 -050019 **/
Nick Gordond0a7df32017-05-30 16:44:34 -050020
akmhoquefdbddb12014-05-02 18:35:19 -050021#ifndef NLSR_NEXTHOP_LIST_HPP
22#define NLSR_NEXTHOP_LIST_HPP
akmhoque53353462014-04-22 08:43:45 -050023
Nick Gordond0a7df32017-05-30 16:44:34 -050024#include "nexthop.hpp"
25#include "adjacent.hpp"
26
Vince Lehmanef21d8e2015-04-01 15:59:39 -050027#include <set>
akmhoque53353462014-04-22 08:43:45 -050028#include <iostream>
akmhoquefdbddb12014-05-02 18:35:19 -050029#include <boost/cstdint.hpp>
30
31#include <ndn-cxx/face.hpp>
akmhoque53353462014-04-22 08:43:45 -050032
akmhoque53353462014-04-22 08:43:45 -050033namespace nlsr {
34
Vince Lehmanef21d8e2015-04-01 15:59:39 -050035struct NextHopComparator {
36 bool
37 operator() (const NextHop& nh1, const NextHop& nh2) const {
38 if (nh1.getRouteCostAsAdjustedInteger() < nh2.getRouteCostAsAdjustedInteger()) {
39 return true;
40 }
41 else if (nh1.getRouteCostAsAdjustedInteger() == nh2.getRouteCostAsAdjustedInteger()) {
42 return nh1.getConnectingFaceUri() < nh2.getConnectingFaceUri();
43 }
44 else {
45 return false;
46 }
47 }
48};
49
akmhoquec8a10f72014-04-25 18:42:55 -050050class NexthopList
akmhoque53353462014-04-22 08:43:45 -050051{
52public:
akmhoquec8a10f72014-04-25 18:42:55 -050053 NexthopList()
akmhoque53353462014-04-22 08:43:45 -050054 {
55 }
56
akmhoquec8a10f72014-04-25 18:42:55 -050057 ~NexthopList()
akmhoque53353462014-04-22 08:43:45 -050058 {
59 }
akmhoquefdbddb12014-05-02 18:35:19 -050060
Nick G97e34942016-07-11 14:46:27 -050061 /*! \brief Adds a next hop to the list.
62 \param nh The next hop.
63
Nick Gordonb50e51b2016-07-22 16:05:57 -050064 Adds a next hop to this object. If the next hop is new it is
65 added. If the next hop already exists in the list then that next
66 hop's route cost is updated.
Nick G97e34942016-07-11 14:46:27 -050067 */
akmhoque53353462014-04-22 08:43:45 -050068 void
Vince Lehmanef21d8e2015-04-01 15:59:39 -050069 addNextHop(const NextHop& nh);
akmhoque53353462014-04-22 08:43:45 -050070
Vince Lehmanef21d8e2015-04-01 15:59:39 -050071 /*! \brief Remove a next hop from the Next Hop list
72 \param nh The NextHop we want to remove.
Nick G97e34942016-07-11 14:46:27 -050073
Vince Lehmanef21d8e2015-04-01 15:59:39 -050074 The next hop gets removed only if both next hop face and route cost are same.
Nick G97e34942016-07-11 14:46:27 -050075 */
akmhoque53353462014-04-22 08:43:45 -050076 void
Vince Lehmanef21d8e2015-04-01 15:59:39 -050077 removeNextHop(const NextHop& nh);
akmhoque53353462014-04-22 08:43:45 -050078
akmhoquefdbddb12014-05-02 18:35:19 -050079 size_t
akmhoque53353462014-04-22 08:43:45 -050080 getSize()
81 {
82 return m_nexthopList.size();
83 }
84
Nick Gordonb50e51b2016-07-22 16:05:57 -050085 size_t
86 getSize() const
87 {
88 return m_nexthopList.size();
89 }
90
akmhoque53353462014-04-22 08:43:45 -050091 void
92 reset()
93 {
akmhoquefdbddb12014-05-02 18:35:19 -050094 m_nexthopList.clear();
akmhoque53353462014-04-22 08:43:45 -050095 }
96
Vince Lehmanef21d8e2015-04-01 15:59:39 -050097 std::set<NextHop, NextHopComparator>&
akmhoquefdbddb12014-05-02 18:35:19 -050098 getNextHops()
akmhoque53353462014-04-22 08:43:45 -050099 {
100 return m_nexthopList;
101 }
102
Vince Lehmanef21d8e2015-04-01 15:59:39 -0500103 typedef std::set<NextHop, NextHopComparator>::iterator iterator;
104 typedef std::set<NextHop, NextHopComparator>::const_iterator const_iterator;
Vince Lehman18841082014-08-19 17:15:24 -0500105
106 iterator
107 begin()
108 {
109 return m_nexthopList.begin();
110 }
111
112 iterator
113 end()
114 {
115 return m_nexthopList.end();
116 }
117
Vince Lehman942eb7b2014-10-02 10:09:27 -0500118 const_iterator
119 cbegin() const
120 {
121 return m_nexthopList.begin();
122 }
123
124 const_iterator
125 cend() const
126 {
127 return m_nexthopList.end();
128 }
129
akmhoque674b0b12014-05-20 14:33:28 -0500130 void
131 writeLog();
132
akmhoque53353462014-04-22 08:43:45 -0500133private:
Vince Lehmanef21d8e2015-04-01 15:59:39 -0500134 std::set<NextHop, NextHopComparator> m_nexthopList;
akmhoque53353462014-04-22 08:43:45 -0500135};
136
Nick Gordonb50e51b2016-07-22 16:05:57 -0500137bool
138operator==(NexthopList& lhs, NexthopList& rhs);
139
140bool
141operator==(const NexthopList& lhs, const NexthopList& rhs);
142
143std::ostream&
144operator<<(std::ostream& os, const NexthopList& nhl);
145
Nick Gordonfad8e252016-08-11 14:21:38 -0500146} // namespace nlsr
akmhoque53353462014-04-22 08:43:45 -0500147
Nick Gordond0a7df32017-05-30 16:44:34 -0500148#endif // NLSR_NEXTHOP_LIST_HPP