summaryrefslogtreecommitdiff
path: root/src/routingTable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/routingTable.cpp')
-rw-r--r--src/routingTable.cpp162
1 files changed, 83 insertions, 79 deletions
diff --git a/src/routingTable.cpp b/src/routingTable.cpp
index c64366d..3cfe6f6 100644
--- a/src/routingTable.cpp
+++ b/src/routingTable.cpp
@@ -11,7 +11,7 @@
* tunneling and relaying of packets of any protocol.
*
*
- * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl,
+ * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl,
* Christian Pointner <satp@wirdorange.org>
*
* This file is part of Anytun.
@@ -46,8 +46,9 @@ RoutingTable& RoutingTable::instance()
{
Lock lock(instMutex);
static instanceCleaner c;
- if(!inst)
+ if(!inst) {
inst = new RoutingTable();
+ }
return *inst;
}
@@ -58,102 +59,104 @@ RoutingTable::RoutingTable()
RoutingTable::~RoutingTable()
{
-}
+}
-void RoutingTable::updateRouteTreeUnlocked(const NetworkPrefix & pref)
+void RoutingTable::updateRouteTreeUnlocked(const NetworkPrefix& pref)
{
//Lock lock(mutex_); //deadlock
- u_int8_t length=pref.getNetworkPrefixLength();
- network_address_type_t type=pref.getNetworkAddressType();
- u_int16_t mux = routes_[pref.getNetworkAddressType()].find(pref)->second;
- RoutingTreeNode * node = &(root_[type]);
- if (type==ipv4)
- {
- ipv4_bytes_type bytes(pref.to_bytes_v4());
- if (length>32)
- length=32;
- RoutingTree::walk(bytes, node, length, mux);
- } else if (type==ipv6) {
- ipv6_bytes_type bytes(pref.to_bytes_v6());
- if (length>128)
- length=128;
- RoutingTree::walk(bytes, node, length, mux);
- } else if (type==ethernet) {
- ethernet_bytes_type bytes(pref.to_bytes_ethernet());
- if (length>48)
- length=48;
- RoutingTree::walk(bytes, node, length, mux);
- } else {
- AnytunError::throwErr() << "illegal protocol type";
- }
- //root_[type].print(0);
+ u_int8_t length=pref.getNetworkPrefixLength();
+ network_address_type_t type=pref.getNetworkAddressType();
+ u_int16_t mux = routes_[pref.getNetworkAddressType()].find(pref)->second;
+ RoutingTreeNode* node = &(root_[type]);
+ if(type==ipv4) {
+ ipv4_bytes_type bytes(pref.to_bytes_v4());
+ if(length>32) {
+ length=32;
+ }
+ RoutingTree::walk(bytes, node, length, mux);
+ } else if(type==ipv6) {
+ ipv6_bytes_type bytes(pref.to_bytes_v6());
+ if(length>128) {
+ length=128;
+ }
+ RoutingTree::walk(bytes, node, length, mux);
+ } else if(type==ethernet) {
+ ethernet_bytes_type bytes(pref.to_bytes_ethernet());
+ if(length>48) {
+ length=48;
+ }
+ RoutingTree::walk(bytes, node, length, mux);
+ } else {
+ AnytunError::throwErr() << "illegal protocol type";
+ }
+ //root_[type].print(0);
}
-void RoutingTable::addRoute(const NetworkPrefix & pref, u_int16_t mux)
+void RoutingTable::addRoute(const NetworkPrefix& pref, u_int16_t mux)
{
Lock lock(mutex_);
-
- network_address_type_t type=pref.getNetworkAddressType();
- if (type==ipv4 || type==ipv6)
- {
+ network_address_type_t type=pref.getNetworkAddressType();
+
+ if(type==ipv4 || type==ipv6) {
std::pair<RoutingMap::iterator, bool> ret = routes_[type].insert(RoutingMap::value_type(pref,mux));
- if(!ret.second)
- {
+ if(!ret.second) {
routes_[pref.getNetworkAddressType()].erase(ret.first);
routes_[pref.getNetworkAddressType()].insert(RoutingMap::value_type(pref,mux));
}
- root_[pref.getNetworkAddressType()]=RoutingTreeNode();
- RoutingMap::iterator it = routes_[type].begin();
- for (;it!=routes_[pref.getNetworkAddressType()].end();++it)
- updateRouteTreeUnlocked(it->first);
- } else if (type==ethernet) {
+ root_[pref.getNetworkAddressType()]=RoutingTreeNode();
+ RoutingMap::iterator it = routes_[type].begin();
+ for(; it!=routes_[pref.getNetworkAddressType()].end(); ++it) {
+ updateRouteTreeUnlocked(it->first);
+ }
+ } else if(type==ethernet) {
return; // TODO: add support for ethernet
- } else {
- AnytunError::throwErr() << "illegal protocol type";
- }
+ } else {
+ AnytunError::throwErr() << "illegal protocol type";
+ }
}
-void RoutingTable::delRoute(const NetworkPrefix & pref )
+void RoutingTable::delRoute(const NetworkPrefix& pref)
{
Lock lock(mutex_);
-
- routes_[pref.getNetworkAddressType()].erase(routes_[pref.getNetworkAddressType()].find(pref));
+
+ routes_[pref.getNetworkAddressType()].erase(routes_[pref.getNetworkAddressType()].find(pref));
}
-u_int16_t RoutingTable::getRoute(const NetworkAddress & addr)
+u_int16_t RoutingTable::getRoute(const NetworkAddress& addr)
{
- Lock lock(mutex_);
- network_address_type_t type=addr.getNetworkAddressType();
-
- if (routes_[type].empty())
- AnytunError::throwErr() << "no route";
-
- if (type==ipv4)
- {
- ipv4_bytes_type bytes(addr.to_bytes_v4());
- return RoutingTree::find(bytes, root_[type]);
- } else if (type==ipv6) {
- ipv6_bytes_type bytes(addr.to_bytes_v6());
- return RoutingTree::find(bytes, root_[type]);
- } else if (type==ethernet) {
- //TODO Our model wont fit to ethernet addresses well.
- // maybe use hashmap or something like that instead
- ethernet_bytes_type bytes(addr.to_bytes_ethernet());
- return RoutingTree::find(bytes, root_[type]);
- } else {
- AnytunError::throwErr() << "illegal protocol type";
- }
+ Lock lock(mutex_);
+ network_address_type_t type=addr.getNetworkAddressType();
+
+ if(routes_[type].empty()) {
+ AnytunError::throwErr() << "no route";
+ }
+
+ if(type==ipv4) {
+ ipv4_bytes_type bytes(addr.to_bytes_v4());
+ return RoutingTree::find(bytes, root_[type]);
+ } else if(type==ipv6) {
+ ipv6_bytes_type bytes(addr.to_bytes_v6());
+ return RoutingTree::find(bytes, root_[type]);
+ } else if(type==ethernet) {
+ //TODO Our model wont fit to ethernet addresses well.
+ // maybe use hashmap or something like that instead
+ ethernet_bytes_type bytes(addr.to_bytes_ethernet());
+ return RoutingTree::find(bytes, root_[type]);
+ } else {
+ AnytunError::throwErr() << "illegal protocol type";
+ }
return 0;
}
-u_int16_t* RoutingTable::getOrNewRoutingTEUnlocked(const NetworkPrefix & addr)
+u_int16_t* RoutingTable::getOrNewRoutingTEUnlocked(const NetworkPrefix& addr)
{
RoutingMap::iterator it = routes_[addr.getNetworkAddressType()].find(addr);
- if(it!=routes_[addr.getNetworkAddressType()].end())
+ if(it!=routes_[addr.getNetworkAddressType()].end()) {
return &(it->second);
+ }
routes_[addr.getNetworkAddressType()].insert(RoutingMap::value_type(addr, 1));
it = routes_[addr.getNetworkAddressType()].find(addr);
@@ -162,33 +165,34 @@ u_int16_t* RoutingTable::getOrNewRoutingTEUnlocked(const NetworkPrefix & addr)
u_int16_t RoutingTable::getCountUnlocked(network_address_type_t type)
{
- RoutingMap::iterator it = routes_[type].begin();
- u_int16_t routes=0;
- for (;it!=routes_[type].end();++it)
- routes++;
- return routes;
+ RoutingMap::iterator it = routes_[type].begin();
+ u_int16_t routes=0;
+ for(; it!=routes_[type].end(); ++it) {
+ routes++;
+ }
+ return routes;
}
RoutingMap::iterator RoutingTable::getBeginUnlocked(network_address_type_t type)
{
- return routes_[type].begin();
+ return routes_[type].begin();
}
RoutingMap::iterator RoutingTable::getEndUnlocked(network_address_type_t type)
{
- return routes_[type].end();
+ return routes_[type].end();
}
void RoutingTable::clear(network_address_type_t type)
{
Lock lock(mutex_);
- routes_[type].clear();
+ routes_[type].clear();
}
bool RoutingTable::empty(network_address_type_t type)
{
Lock lock(mutex_);
- return routes_[type].empty();
+ return routes_[type].empty();
}
Mutex& RoutingTable::getMutex()