Imported Upstream version 0.3.2
[anytun.git] / src / tunDevice.h
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-2009 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 as published by
21  *  the Free Software Foundation, either version 3 of the License, or
22  *  any later version.
23  *
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.
28  *
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/>.
31  */
32
33 #ifndef ANYTUN_tunDevice_h_INCLUDED
34 #define ANYTUN_tunDevice_h_INCLUDED
35
36 #include "buffer.h"
37 #include "deviceConfig.hpp"
38 #include "threadUtils.hpp"
39
40 #ifdef _MSC_VER
41 #include <windows.h>
42 #endif
43
44 class TunDevice
45 {
46 public:
47   TunDevice(std::string dev,std::string dev_type, std::string ifcfg_addr, u_int16_t ifcfg_prefix);
48   ~TunDevice();
49   
50   int read(u_int8_t* buf, u_int32_t len);
51   int write(u_int8_t* buf, u_int32_t len);
52
53   const char* getActualName() const { return actual_name_.c_str(); }
54   const char* getActualNode() const { return actual_node_.c_str(); }
55   device_type_t getType() const { return conf_.type_; } 
56   const char* getTypeString() const
57   {
58 #ifndef _MSC_VER
59     if(fd_ < 0)
60 #else
61     if(handle_ == INVALID_HANDLE_VALUE)
62 #endif
63       return "";
64     
65     switch(conf_.type_)
66     {
67     case TYPE_UNDEF: return "undef"; break;
68     case TYPE_TUN: return "tun"; break;
69     case TYPE_TAP: return "tap"; break;
70     }
71     return "";
72   }
73
74
75 private:
76   void operator=(const TunDevice &src);
77   TunDevice(const TunDevice &src);
78
79   void init_post();
80   void do_ifconfig();
81   int fix_return(int ret, size_t pi_length) const;
82
83 #ifndef _MSC_VER
84   int fd_;
85 #else
86   bool getAdapter(std::string const& dev_name);
87   DWORD performIoControl(DWORD controlCode, LPVOID inBuffer, DWORD inBufferSize,
88                         LPVOID outBuffer, DWORD outBufferSize);
89   HANDLE handle_;
90   OVERLAPPED roverlapped_, woverlapped_;
91 #endif
92
93   DeviceConfig conf_;
94   bool with_pi_;
95   std::string actual_name_;
96   std::string actual_node_;
97 };
98
99 #endif