1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
3 * Copyright (c) 2004 Francisco J. Ros
4 * Copyright (c) 2007 INESC Porto
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation;
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 * Authors: Francisco J. Ros <fjrm@dif.um.es>
20 * Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
24 /// \file OlsrState.cc
25 /// \brief Implementation of all functions needed for manipulating the internal
26 /// state of an OLSR node.
29 #include "olsr-state.h"
35 /********** MPR Selector Set Manipulation **********/
38 OlsrState::FindMprSelectorTuple (Ipv4Address const &mainAddr)
40 for (MprSelectorSet::iterator it = m_mprSelectorSet.begin ();
41 it != m_mprSelectorSet.end (); it++)
43 if (it->mainAddr == mainAddr)
50 OlsrState::EraseMprSelectorTuple (const MprSelectorTuple &tuple)
52 for (MprSelectorSet::iterator it = m_mprSelectorSet.begin ();
53 it != m_mprSelectorSet.end (); it++)
57 m_mprSelectorSet.erase (it);
64 OlsrState::EraseMprSelectorTuples (const Ipv4Address &mainAddr)
66 for (MprSelectorSet::iterator it = m_mprSelectorSet.begin ();
67 it != m_mprSelectorSet.end ();)
69 if (it->mainAddr == mainAddr)
71 it = m_mprSelectorSet.erase (it);
81 OlsrState::InsertMprSelectorTuple (MprSelectorTuple const &tuple)
83 m_mprSelectorSet.push_back (tuple);
87 OlsrState::PrintMprSelectorSet () const
89 std::ostringstream os;
91 for (MprSelectorSet::const_iterator iter = m_mprSelectorSet.begin ();
92 iter != m_mprSelectorSet.end (); iter++)
94 MprSelectorSet::const_iterator next = iter;
97 if (next != m_mprSelectorSet.end ())
105 /********** Neighbor Set Manipulation **********/
108 OlsrState::FindNeighborTuple (Ipv4Address const &mainAddr)
110 for (NeighborSet::iterator it = m_neighborSet.begin ();
111 it != m_neighborSet.end (); it++)
113 if (it->neighborMainAddr == mainAddr)
120 OlsrState::FindSymNeighborTuple (Ipv4Address const &mainAddr) const
122 for (NeighborSet::const_iterator it = m_neighborSet.begin ();
123 it != m_neighborSet.end (); it++)
125 if (it->neighborMainAddr == mainAddr && it->status == NeighborTuple::STATUS_SYM)
132 OlsrState::FindNeighborTuple (Ipv4Address const &mainAddr, uint8_t willingness)
134 for (NeighborSet::iterator it = m_neighborSet.begin ();
135 it != m_neighborSet.end (); it++)
137 if (it->neighborMainAddr == mainAddr && it->willingness == willingness)
144 OlsrState::EraseNeighborTuple (const NeighborTuple &tuple)
146 for (NeighborSet::iterator it = m_neighborSet.begin ();
147 it != m_neighborSet.end (); it++)
151 m_neighborSet.erase (it);
158 OlsrState::EraseNeighborTuple (const Ipv4Address &mainAddr)
160 for (NeighborSet::iterator it = m_neighborSet.begin ();
161 it != m_neighborSet.end (); it++)
163 if (it->neighborMainAddr == mainAddr)
165 it = m_neighborSet.erase (it);
172 OlsrState::InsertNeighborTuple (NeighborTuple const &tuple)
174 for (NeighborSet::iterator it = m_neighborSet.begin ();
175 it != m_neighborSet.end (); it++)
177 if (it->neighborMainAddr == tuple.neighborMainAddr)
184 m_neighborSet.push_back (tuple);
187 /********** Neighbor 2 Hop Set Manipulation **********/
190 OlsrState::FindTwoHopNeighborTuple (Ipv4Address const &neighborMainAddr,
191 Ipv4Address const &twoHopNeighborAddr)
193 for (TwoHopNeighborSet::iterator it = m_twoHopNeighborSet.begin ();
194 it != m_twoHopNeighborSet.end (); it++)
196 if (it->neighborMainAddr == neighborMainAddr
197 && it->twoHopNeighborAddr == twoHopNeighborAddr)
206 OlsrState::EraseTwoHopNeighborTuple (const TwoHopNeighborTuple &tuple)
208 for (TwoHopNeighborSet::iterator it = m_twoHopNeighborSet.begin ();
209 it != m_twoHopNeighborSet.end (); it++)
213 m_twoHopNeighborSet.erase(it);
220 OlsrState::EraseTwoHopNeighborTuples (const Ipv4Address &neighborMainAddr,
221 const Ipv4Address &twoHopNeighborAddr)
223 for (TwoHopNeighborSet::iterator it = m_twoHopNeighborSet.begin ();
224 it != m_twoHopNeighborSet.end ();)
226 if (it->neighborMainAddr == neighborMainAddr
227 && it->twoHopNeighborAddr == twoHopNeighborAddr)
229 it = m_twoHopNeighborSet.erase (it);
239 OlsrState::EraseTwoHopNeighborTuples (const Ipv4Address &neighborMainAddr)
241 for (TwoHopNeighborSet::iterator it = m_twoHopNeighborSet.begin ();
242 it != m_twoHopNeighborSet.end ();)
244 if (it->neighborMainAddr == neighborMainAddr)
246 it = m_twoHopNeighborSet.erase (it);
256 OlsrState::InsertTwoHopNeighborTuple (TwoHopNeighborTuple const &tuple)
258 m_twoHopNeighborSet.push_back (tuple);
261 /********** MPR Set Manipulation **********/
264 OlsrState::FindMprAddress (Ipv4Address const &addr)
266 MprSet::iterator it = m_mprSet.find (addr);
267 return (it != m_mprSet.end ());
271 OlsrState::SetMprSet (MprSet mprSet)
276 /********** Duplicate Set Manipulation **********/
279 OlsrState::FindDuplicateTuple (Ipv4Address const &addr, uint16_t sequenceNumber)
281 for (DuplicateSet::iterator it = m_duplicateSet.begin ();
282 it != m_duplicateSet.end(); it++)
284 if (it->address == addr && it->sequenceNumber == sequenceNumber)
291 OlsrState::EraseDuplicateTuple (const DuplicateTuple &tuple)
293 for (DuplicateSet::iterator it = m_duplicateSet.begin ();
294 it != m_duplicateSet.end (); it++)
298 m_duplicateSet.erase (it);
305 OlsrState::InsertDuplicateTuple (DuplicateTuple const &tuple)
307 m_duplicateSet.push_back (tuple);
310 /********** Link Set Manipulation **********/
313 OlsrState::FindLinkTuple (Ipv4Address const & ifaceAddr)
315 for (LinkSet::iterator it = m_linkSet.begin ();
316 it != m_linkSet.end (); it++)
318 if (it->neighborIfaceAddr == ifaceAddr)
325 OlsrState::FindSymLinkTuple (Ipv4Address const &ifaceAddr, Time now)
327 for (LinkSet::iterator it = m_linkSet.begin ();
328 it != m_linkSet.end (); it++)
330 if (it->neighborIfaceAddr == ifaceAddr)
332 if (it->symTime > now)
342 OlsrState::EraseLinkTuple (const LinkTuple &tuple)
344 for (LinkSet::iterator it = m_linkSet.begin ();
345 it != m_linkSet.end (); it++)
349 m_linkSet.erase (it);
356 OlsrState::InsertLinkTuple (LinkTuple const &tuple)
358 m_linkSet.push_back (tuple);
359 return m_linkSet.back ();
362 /********** Topology Set Manipulation **********/
365 OlsrState::FindTopologyTuple (Ipv4Address const &destAddr,
366 Ipv4Address const &lastAddr)
368 for (TopologySet::iterator it = m_topologySet.begin ();
369 it != m_topologySet.end (); it++)
371 if (it->destAddr == destAddr && it->lastAddr == lastAddr)
378 OlsrState::FindNewerTopologyTuple (Ipv4Address const & lastAddr, uint16_t ansn)
380 for (TopologySet::iterator it = m_topologySet.begin ();
381 it != m_topologySet.end (); it++)
383 if (it->lastAddr == lastAddr && it->sequenceNumber > ansn)
390 OlsrState::EraseTopologyTuple(const TopologyTuple &tuple)
392 for (TopologySet::iterator it = m_topologySet.begin ();
393 it != m_topologySet.end (); it++)
397 m_topologySet.erase (it);
404 OlsrState::EraseOlderTopologyTuples (const Ipv4Address &lastAddr, uint16_t ansn)
406 for (TopologySet::iterator it = m_topologySet.begin();
407 it != m_topologySet.end();)
409 if (it->lastAddr == lastAddr && it->sequenceNumber < ansn)
411 it = m_topologySet.erase (it);
421 OlsrState::InsertTopologyTuple (TopologyTuple const &tuple)
423 m_topologySet.push_back (tuple);
426 /********** Interface Association Set Manipulation **********/
429 OlsrState::FindIfaceAssocTuple (Ipv4Address const &ifaceAddr)
431 for (IfaceAssocSet::iterator it = m_ifaceAssocSet.begin ();
432 it != m_ifaceAssocSet.end (); it++)
434 if (it->ifaceAddr == ifaceAddr)
440 const IfaceAssocTuple*
441 OlsrState::FindIfaceAssocTuple (Ipv4Address const &ifaceAddr) const
443 for (IfaceAssocSet::const_iterator it = m_ifaceAssocSet.begin ();
444 it != m_ifaceAssocSet.end (); it++)
446 if (it->ifaceAddr == ifaceAddr)
453 OlsrState::EraseIfaceAssocTuple (const IfaceAssocTuple &tuple)
455 for (IfaceAssocSet::iterator it = m_ifaceAssocSet.begin ();
456 it != m_ifaceAssocSet.end (); it++)
460 m_ifaceAssocSet.erase (it);
467 OlsrState::InsertIfaceAssocTuple (const IfaceAssocTuple &tuple)
469 m_ifaceAssocSet.push_back (tuple);
472 std::vector<Ipv4Address>
473 OlsrState::FindNeighborInterfaces (const Ipv4Address &neighborMainAddr) const
475 std::vector<Ipv4Address> retval;
476 for (IfaceAssocSet::const_iterator it = m_ifaceAssocSet.begin ();
477 it != m_ifaceAssocSet.end (); it++)
479 if (it->mainAddr == neighborMainAddr)
480 retval.push_back (it->ifaceAddr);