added a workaround for strerror_r problem
[anytun.git] / src / routingTree.hpp
blobc75aef5979eedcbc1db727a6e7a649a099faddb2
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/>.
32 #ifndef __ROUTING_TREE_
33 #define __ROUTING_TREE_
35 class RoutingTree {
37 public:
38 template <class BinaryType>
39 static void walk(BinaryType bytes ,RoutingTreeNode * node,u_int8_t length,u_int16_t mux)
41 for (int i=0; i<(length/8); i++)
43 if (!node->nodes_[bytes[i]])
44 node->nodes_[bytes[i]] = new RoutingTreeNode;
45 node=node->nodes_[bytes[i]];
47 if (length%8)
49 unsigned char idx=0xff;
50 idx <<=8-(length%8);
51 idx &= bytes[length/8];
52 unsigned char maxidx=0xff;
53 maxidx>>=(length%8);
54 maxidx|=idx;
55 for (unsigned char i=idx; i<=maxidx; i++)
57 if (!node->nodes_[i])
58 node->nodes_[i] = new RoutingTreeNode;
59 node->nodes_[i]->valid_=true;
60 node->nodes_[i]->mux_=mux;
62 } else {
63 node->valid_=true;
64 node->mux_=mux;
68 template <class BinaryType>
69 static u_int16_t find(BinaryType bytes ,RoutingTreeNode & root )
71 bool valid=0;
72 u_int16_t mux=0;
73 RoutingTreeNode * node = &root;
74 if (root.valid_)
76 mux=root.mux_;
77 valid=1;
79 for (size_t level=0;level<bytes.size();level++)
81 if (node->nodes_[bytes[level]])
83 node=node->nodes_[bytes[level]];
84 if(node->valid_)
86 mux=node->mux_;
87 valid=1;
89 } else {
90 break;
93 if(!valid)
94 throw std::runtime_error("no route");
95 return mux;
100 #endif