4 * The secure anycast tunneling protocol (satp) defines a protocol used
5 * for communication between any combination of unicast and anycast
6 * tunnel endpoints. It has less protocol overhead than IPSec in Tunnel
7 * mode and allows tunneling of every ETHER TYPE protocol (e.g.
8 * ethernet, ip, arp ...). satp directly includes cryptography and
9 * message authentication based on the methodes used by SRTP. It is
10 * intended to deliver a generic, scaleable and secure solution for
11 * tunneling and relaying of packets of any protocol.
14 * Copyright (C) 2007 anytun.org <satp@wirdorange.org>
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License version 2
18 * as published by the Free Software Foundation.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with this program (see the file COPYING included with this
27 * distribution); if not, write to the Free Software Foundation, Inc.,
28 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 #include "networkPrefix.h"
31 #include "threadUtils.hpp"
32 #include "datatypes.h"
34 #include "routingTable.h"
36 RoutingTable
* RoutingTable::inst
= NULL
;
37 Mutex
RoutingTable::instMutex
;
38 RoutingTable
& gRoutingTable
= RoutingTable::instance();
41 RoutingTable
& RoutingTable::instance()
44 static instanceCleaner c
;
46 inst
= new RoutingTable();
51 RoutingTable::RoutingTable()
55 RoutingTable::~RoutingTable()
59 void RoutingTable::addRoute(const NetworkPrefix
& pref
,u_int16_t mux
)
64 std::pair
<RoutingMap::iterator
, bool> ret
= routes_
.insert(RoutingMap::value_type(pref
,mux
));
67 routes_
.erase(ret
.first
);
68 routes_
.insert(RoutingMap::value_type(pref
,mux
));
73 void RoutingTable::delRoute(const NetworkPrefix
& pref
)
77 routes_
.erase(routes_
.find(pref
));
80 u_int16_t
RoutingTable::getRoute(const NetworkAddress
& addr
)
85 NetworkPrefix
prefix(addr
,32);
86 RoutingMap::iterator it
= routes_
.lower_bound(prefix
);
88 if (it
!=routes_
.end())
93 u_int16_t
* RoutingTable::getOrNewRoutingTEUnlocked(const NetworkPrefix
& addr
)
95 RoutingMap::iterator it
= routes_
.find(addr
);
99 routes_
.insert(RoutingMap::value_type(addr
, 1));
100 it
= routes_
.find(addr
);
101 return &(it
->second
);
104 uint16_t RoutingTable::getCountUnlocked()
106 RoutingMap::iterator it
= routes_
.begin();
108 for (;it
!=routes_
.end();++it
)
113 RoutingMap::iterator
RoutingTable::getBeginUnlocked()
115 return routes_
.begin();
118 RoutingMap::iterator
RoutingTable::getEndUnlocked()
120 return routes_
.end();
123 void RoutingTable::clear()
129 bool RoutingTable::empty()
132 return routes_
.empty();
135 Mutex
& RoutingTable::getMutex()