anyrtpproxy: commandhanlder uses now boost::asio and boost::thread
[anytun.git] / src / routingTable.cpp
blob409a5ab0db7e74407ab013747b46e0e664329312
1 /*
2 * anytun
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-2008 Othmar Gsenger, Erwin Nindl,
15 * Christian Pointner <satp@wirdorange.org>
17 * This file is part of Anytun.
19 * Anytun is free software: you can redistribute it and/or modify
20 * it under the terms of the GNU General Public License version 3 as
21 * published by the Free Software Foundation.
23 * Anytun is distributed in the hope that it will be useful,
24 * but WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 * GNU General Public License for more details.
28 * You should have received a copy of the GNU General Public License
29 * along with anytun. If not, see <http://www.gnu.org/licenses/>.
31 #include "networkPrefix.h"
32 #include "threadUtils.hpp"
33 #include "datatypes.h"
35 #include "routingTable.h"
37 RoutingTable* RoutingTable::inst = NULL;
38 Mutex RoutingTable::instMutex;
39 RoutingTable& gRoutingTable = RoutingTable::instance();
42 RoutingTable& RoutingTable::instance()
44 Lock lock(instMutex);
45 static instanceCleaner c;
46 if(!inst)
47 inst = new RoutingTable();
49 return *inst;
52 RoutingTable::RoutingTable()
56 RoutingTable::~RoutingTable()
60 void RoutingTable::addRoute(const NetworkPrefix & pref,u_int16_t mux )
62 Lock lock(mutex_);
65 std::pair<RoutingMap::iterator, bool> ret = routes_.insert(RoutingMap::value_type(pref,mux));
66 if(!ret.second)
68 routes_.erase(ret.first);
69 routes_.insert(RoutingMap::value_type(pref,mux));
74 void RoutingTable::delRoute(const NetworkPrefix & pref )
76 Lock lock(mutex_);
78 routes_.erase(routes_.find(pref));
81 u_int16_t RoutingTable::getRoute(const NetworkAddress & addr)
83 Lock lock(mutex_);
84 if (routes_.empty())
85 return 0;
86 NetworkPrefix prefix(addr,32);
87 //TODO Routing algorithem isnt working!!!
88 RoutingMap::iterator it = routes_.lower_bound(prefix);
89 // it--;
90 if (it!=routes_.end())
91 return it->second;
92 it=routes_.begin();
93 return it->second;
96 u_int16_t* RoutingTable::getOrNewRoutingTEUnlocked(const NetworkPrefix & addr)
98 RoutingMap::iterator it = routes_.find(addr);
99 if(it!=routes_.end())
100 return &(it->second);
102 routes_.insert(RoutingMap::value_type(addr, 1));
103 it = routes_.find(addr);
104 return &(it->second);
107 uint16_t RoutingTable::getCountUnlocked()
109 RoutingMap::iterator it = routes_.begin();
110 uint16_t routes=0;
111 for (;it!=routes_.end();++it)
112 routes++;
113 return routes;
116 RoutingMap::iterator RoutingTable::getBeginUnlocked()
118 return routes_.begin();
121 RoutingMap::iterator RoutingTable::getEndUnlocked()
123 return routes_.end();
126 void RoutingTable::clear()
128 Lock lock(mutex_);
129 routes_.clear();
132 bool RoutingTable::empty()
134 Lock lock(mutex_);
135 return routes_.empty();
138 Mutex& RoutingTable::getMutex()
140 return mutex_;