Imported Upstream version 0.3
[anytun.git] / src / deviceConfig.hpp
1 /*
2  *  anytun
3  *
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.
12  *
13  *
14  *  Copyright (C) 2007-2008 Othmar Gsenger, Erwin Nindl, 
15  *                          Christian Pointner <satp@wirdorange.org>
16  *
17  *  This file is part of Anytun.
18  *
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.
22  *
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.
27  *
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/>.
30  */
31
32 #ifndef _DEVICE_CONFIG_HPP_
33 #define _DEVICE_CONFIG_HPP_
34
35 #include "networkAddress.h"
36 #include <boost/asio.hpp>
37 #include "anytunError.h"
38
39 class TunDevice;
40
41 enum device_type_t { TYPE_UNDEF, TYPE_TUN, TYPE_TAP };
42
43 class DeviceConfig 
44 {
45 public:
46   DeviceConfig(std::string dev_name ,std::string dev_type, std::string ifcfg_addr, u_int16_t ifcfg_prefix, u_int16_t mtu)
47   {
48     mtu_ = mtu;
49     type_ = TYPE_UNDEF;
50 #ifndef _MSC_VER
51     if(dev_type != "") {
52       if(!dev_type.compare(0,3,"tun"))
53         type_ = TYPE_TUN;
54       else if (!dev_type.compare(0,3,"tap"))
55         type_ = TYPE_TAP;
56     }
57     else if(dev_name != "") {
58       if(!dev_name.compare(0,3,"tun"))
59         type_ = TYPE_TUN;
60       else if(!dev_name.compare(0,3,"tap"))
61         type_ = TYPE_TAP;
62     }
63 #else
64     if(dev_type == "")
65       AnytunError::throwErr() << "Device type must be specified on Windows";
66     
67     if(dev_type == "tun")
68       type_ = TYPE_TUN;
69     else if(dev_type == "tap")
70       type_ = TYPE_TAP;
71
72     if(type_ == TYPE_TUN && ifcfg_addr == "")
73       AnytunError::throwErr() << "Device type tun requires ifconfig parameter (--ifconfig)";
74 #endif
75
76     if(ifcfg_addr != "")
77       addr_.setNetworkAddress(ipv4, ifcfg_addr.c_str());
78     prefix_ = ifcfg_prefix;
79     u_int32_t mask = 0;
80     for(u_int16_t i = 0; i < prefix_; ++i) {
81       mask = mask >> 1;
82       mask |= 0x80000000L;
83     }
84     netmask_.setNetworkAddress(boost::asio::ip::address_v4(mask));
85   }
86
87 private:
88   device_type_t type_;
89   NetworkAddress addr_;
90   NetworkAddress netmask_;
91   u_int16_t prefix_;
92   u_int16_t mtu_;
93
94   friend class TunDevice;
95 };
96
97 #endif