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
);
86 prefix
.setNetworkPrefixLength(32);
87 RoutingMap::iterator it
= routes_
.lower_bound(prefix
);
89 if (it
!=routes_
.end())
94 u_int16_t
& RoutingTable::getOrNewRoutingTEUnlocked(const NetworkAddress
& addr
)
96 RoutingMap::iterator it
= routes_
.find(addr
);
100 routes_
.insert(RoutingMap::value_type(addr
, 0));
101 it
= routes_
.find(addr
);
105 uint16_t RoutingTable::getCountUnlocked()
107 RoutingMap::iterator it
= routes_
.begin();
109 for (;it
!=routes_
.end();++it
)
114 RoutingMap::iterator
RoutingTable::getBeginUnlocked()
116 return routes_
.begin();
119 RoutingMap::iterator
RoutingTable::getEndUnlocked()
121 return routes_
.end();
124 void RoutingTable::clear()
130 bool RoutingTable::empty()
133 return routes_
.empty();
136 Mutex
& RoutingTable::getMutex()