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 methods 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-2014 Markus Grüneis, 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 as published by
21 * the Free Software Foundation, either version 3 of the License, or
24 * Anytun is distributed in the hope that it will be useful,
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 * GNU General Public License for more details.
29 * You should have received a copy of the GNU General Public License
30 * along with Anytun. If not, see <http://www.gnu.org/licenses/>.
32 * In addition, as a special exception, the copyright holders give
33 * permission to link the code of portions of this program with the
34 * OpenSSL library under certain conditions as described in each
35 * individual source file, and distribute linked combinations
37 * You must obey the GNU General Public License in all respects
38 * for all of the code used other than OpenSSL. If you modify
39 * file(s) with this exception, you may extend this exception to your
40 * version of the file(s), but you are not obligated to do so. If you
41 * do not wish to do so, delete this exception statement from your
42 * version. If you delete this exception statement from all source
43 * files in the program, then also delete it here.
46 #include "threadUtils.hpp"
47 #include "datatypes.h"
48 #include "keyDerivationFactory.h"
50 #include "packetSource.h"
52 #include "connectionList.h"
54 ConnectionList& gConnectionList = ConnectionList::instance();
56 ConnectionList& ConnectionList::instance()
58 static ConnectionList instance;
62 ConnectionList::ConnectionList()
66 ConnectionList::~ConnectionList()
68 // TODO: comment this in as soon as threads @ main get cleaned up properly
70 // ConnectionMap::iterator it;
71 // for(it = connections_.begin(); it != connections_.end(); ++it) {
72 // delete &it->second.kd_;
73 // delete &it->second.seq_window_;
77 void ConnectionList::addConnection(ConnectionParam& conn, uint16_t mux)
81 std::pair<ConnectionMap::iterator, bool> ret = connections_.insert(ConnectionMap::value_type(mux, conn));
83 connections_.erase(ret.first);
84 connections_.insert(ConnectionMap::value_type(mux, conn));
88 const ConnectionMap::iterator ConnectionList::getEnd()
91 return connections_.end();
94 ConnectionMap::iterator ConnectionList::getBeginUnlocked()
96 return connections_.begin();
99 const ConnectionMap::iterator ConnectionList::getBegin()
102 return connections_.begin();
106 ConnectionMap::iterator ConnectionList::getEndUnlocked()
108 return connections_.end();
111 const ConnectionMap::iterator ConnectionList::getConnection(uint16_t mux)
114 ConnectionMap::iterator it = connections_.find(mux);
119 ConnectionParam& ConnectionList::getOrNewConnectionUnlocked(uint16_t mux)
121 ConnectionMap::iterator it = connections_.find(mux);
122 if(it!=connections_.end()) {
127 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
128 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p'
132 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
133 'i', 'j', 'k', 'l', 'm', 'n'
136 SeqWindow* seq= new SeqWindow(0);
138 KeyDerivation* kd = KeyDerivationFactory::create(gOpt.getKdPrf());
139 kd->init(Buffer(key, sizeof(key)), Buffer(salt, sizeof(salt)));
140 ConnectionParam conn((*kd), (*seq), seq_nr_, PacketSourceEndpoint());
141 connections_.insert(ConnectionMap::value_type(mux, conn));
142 it = connections_.find(mux);
146 void ConnectionList::clear()
149 connections_.clear();
152 bool ConnectionList::empty()
155 return connections_.empty();
158 Mutex& ConnectionList::getMutex()