blob: 7002ad8e33f1c2d1d8d0bd9d1a1127ec217bd019 [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2014 University of Memphis,
4 * Regents of the University of California
5 *
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/>.
19 *
20 * \author A K M Mahmudul Hoque <ahoque1@memphis.edu>
21 *
22 **/
akmhoque53353462014-04-22 08:43:45 -050023#include <iostream>
Vince Lehman0a7da612014-10-29 14:39:29 -050024
25#include "common.hpp"
akmhoquec8a10f72014-04-25 18:42:55 -050026#include "nexthop-list.hpp"
akmhoque53353462014-04-22 08:43:45 -050027#include "nexthop.hpp"
akmhoque674b0b12014-05-20 14:33:28 -050028#include "logger.hpp"
akmhoque53353462014-04-22 08:43:45 -050029
30namespace nlsr {
31
akmhoque674b0b12014-05-20 14:33:28 -050032INIT_LOGGER("NexthopList");
33
akmhoque53353462014-04-22 08:43:45 -050034using namespace std;
35
36static bool
37nexthopCompare(NextHop& nh1, NextHop& nh2)
38{
akmhoque157b0a42014-05-13 00:26:37 -050039 return nh1.getConnectingFaceUri() == nh2.getConnectingFaceUri();
akmhoque53353462014-04-22 08:43:45 -050040}
41
42static bool
43nexthopRemoveCompare(NextHop& nh1, NextHop& nh2)
44{
akmhoque157b0a42014-05-13 00:26:37 -050045 return (nh1.getConnectingFaceUri() == nh2.getConnectingFaceUri() &&
Vince Lehman145064a2014-08-23 11:44:16 -050046 nh1.getRouteCostAsAdjustedInteger() == nh2.getRouteCostAsAdjustedInteger()) ;
akmhoque53353462014-04-22 08:43:45 -050047}
48
49static bool
50nextHopSortingComparator(const NextHop& nh1, const NextHop& nh2)
51{
52 return nh1.getRouteCost() < nh2.getRouteCost();
53}
54
55/**
56Add next hop to the Next Hop list
57If next hop is new it is added
58If next hop already exists in next
59hop list then updates the route
60cost with new next hop's route cost
61*/
62
63void
akmhoquec8a10f72014-04-25 18:42:55 -050064NexthopList::addNextHop(NextHop& nh)
akmhoque53353462014-04-22 08:43:45 -050065{
66 std::list<NextHop>::iterator it = std::find_if(m_nexthopList.begin(),
67 m_nexthopList.end(),
akmhoque157b0a42014-05-13 00:26:37 -050068 ndn::bind(&nexthopCompare, _1, nh));
69 if (it == m_nexthopList.end()) {
akmhoque53353462014-04-22 08:43:45 -050070 m_nexthopList.push_back(nh);
Alexander Afanasyev1717b242014-07-15 13:53:17 -070071 return;
akmhoque53353462014-04-22 08:43:45 -050072 }
akmhoque157b0a42014-05-13 00:26:37 -050073 if ((*it).getRouteCost() > nh.getRouteCost()) {
akmhoque53353462014-04-22 08:43:45 -050074 (*it).setRouteCost(nh.getRouteCost());
75 }
76}
77
78/**
79Remove a next hop only if both next hop face and route cost are same
80
81*/
82
83void
akmhoquec8a10f72014-04-25 18:42:55 -050084NexthopList::removeNextHop(NextHop& nh)
akmhoque53353462014-04-22 08:43:45 -050085{
86 std::list<NextHop>::iterator it = std::find_if(m_nexthopList.begin(),
87 m_nexthopList.end(),
akmhoque157b0a42014-05-13 00:26:37 -050088 ndn::bind(&nexthopRemoveCompare, _1, nh));
89 if (it != m_nexthopList.end()) {
akmhoque53353462014-04-22 08:43:45 -050090 m_nexthopList.erase(it);
91 }
92}
93
94void
akmhoquec8a10f72014-04-25 18:42:55 -050095NexthopList::sort()
akmhoque53353462014-04-22 08:43:45 -050096{
97 m_nexthopList.sort(nextHopSortingComparator);
98}
99
akmhoque674b0b12014-05-20 14:33:28 -0500100void
101NexthopList::writeLog()
102{
103 int i = 1;
akmhoquedcee9362014-08-05 22:58:01 -0500104 sort();
akmhoque674b0b12014-05-20 14:33:28 -0500105 for (std::list<NextHop>::iterator it = m_nexthopList.begin();
106 it != m_nexthopList.end() ; it++, i++) {
107 _LOG_DEBUG("Nexthop " << i << ": " << (*it).getConnectingFaceUri()
108 << " Route Cost: " << (*it).getRouteCost());
109 }
110}
111
akmhoque53353462014-04-22 08:43:45 -0500112}//namespace nlsr