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 #include "anytunError.h"
40 template <class BinaryType>
41 static void walk(BinaryType bytes ,RoutingTreeNode * node,u_int8_t length,u_int16_t mux)
43 for (int i=0; i<(length/8); i++)
45 if (!node->nodes_[bytes[i]])
46 node->nodes_[bytes[i]] = new RoutingTreeNode;
47 node=node->nodes_[bytes[i]];
51 unsigned char idx=0xff;
53 idx &= bytes[length/8];
54 unsigned char maxidx=0xff;
57 for (unsigned char i=idx; i<=maxidx; i++)
60 node->nodes_[i] = new RoutingTreeNode;
61 node->nodes_[i]->valid_=true;
62 node->nodes_[i]->mux_=mux;
70 template <class BinaryType>
71 static u_int16_t find(BinaryType bytes ,RoutingTreeNode & root )
75 RoutingTreeNode * node = &root;
81 for (size_t level=0;level<bytes.size();level++)
83 if (node->nodes_[bytes[level]])
85 node=node->nodes_[bytes[level]];
96 AnytunError::throwErr() << "no route";