ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/device-tincd.C
Revision: 1.18
Committed: Fri Mar 25 16:05:22 2005 UTC (19 years, 2 months ago) by pcg
Content type: text/plain
Branch: MAIN
CVS Tags: rel-1_9
Changes since 1.17: +6 -0 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 /*
2     device-tincd.C -- include one of the tincd low level implementations.
3 pcg 1.12 Copyright (C) 2003-2005 Marc Lehmann <gvpe@schmorp.de>
4 pcg 1.1
5 pcg 1.12 This file is part of GVPE.
6    
7     GVPE is free software; you can redistribute it and/or modify
8 pcg 1.1 it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11    
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     GNU General Public License for more details.
16    
17     You should have received a copy of the GNU General Public License
18 pcg 1.12 along with gvpe; if not, write to the Free Software
19 pcg 1.1 Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20     */
21    
22     #include <cstdio>
23     #include <cstring>
24     #include <cerrno>
25    
26     #include <sys/types.h>
27     #include <sys/stat.h>
28     #include <sys/ioctl.h>
29     #include <unistd.h>
30     #include <syslog.h>
31     #include <fcntl.h>
32    
33     #include "conf.h"
34    
35 pcg 1.3 // following headers used by cygwin (maybe others)
36     #include "netcompat.h"
37     #include <signal.h>
38    
39     #define xstrdup(strd) strdup(str)
40    
41 pcg 1.2 /* make the tincd sources feel comfortable in our environment. */
42     /* this was reasonably easy to do. */
43 pcg 1.1 #define routing_mode 1
44     #define RMODE_ROUTER 0
45    
46 pcg 1.2 #define LOG_TO_L(level) \
47 pcg 1.1 (level) == LOG_ERR ? L_ERR \
48     : (level) == LOG_DEBUG ? L_DEBUG \
49     : (level) == LOG_WARNING ? L_WARN \
50     : (level) == LOG_INFO ? L_INFO \
51 pcg 1.2 : L_NOTICE
52    
53     #if __STDC_VERSION__ > 199900
54     # define logger(level, ...) slog (LOG_TO_L(level), __VA_ARGS__)
55     #elif __GNUC__
56     # define logger(level, args...) slog (LOG_TO_L(level), ## args)
57     #else
58     # error either need ISO-C 99 compliant compiler or gcc.
59     #endif
60 pcg 1.1
61     #define ifdebug(subsys) if (0)
62    
63     #define cp()
64     #define lookup_config(config_tree,key) (key)
65    
66 pcg 1.14 #define MTU MAX_MTU
67 pcg 1.1
68     // BIGGEST hack of 'em all
69     // will be casted to data_packet, due to structural similarity
70     struct vpn_packet_t : net_packet {
71     u8 data[MAXSIZE];
72     };
73    
74     static bool overwrite_mac;
75    
76     static bool
77     get_config_string(const char *key, char **res)
78     {
79     if (!strcmp (key, "Interface"))
80     *res = conf.ifname;
81     else if (!strcmp (key, "Device"))
82     *res = 0;
83 pcg 1.18 else if (!strcmp (key, "DeviceType"))
84     *res = "tap";
85 pcg 1.1 else
86     {
87     slog (L_ERR, _("tincd layer asking for unknown config '%s'"), key);
88     *res = 0;
89     }
90    
91     return *res;
92     }
93    
94     #define netname conf.ifname
95    
96     #if IF_linux
97     # include "tincd/linux/device.c"
98 pcg 1.17 const char * tap_device::if_up () { return "/sbin/ifconfig $IFNAME hw ether $MAC mtu $MTU"; }
99 pcg 1.6
100 pcg 1.18 #elif IF_bsd
101     # include "tincd/bsd/device.c"
102     const char * tap_device::if_up () { return "/sbin/ifconfig $IFNAME ether $MAC mtu $MTU"; }
103    
104 pcg 1.1 #elif IF_freebsd
105     # include "tincd/freebsd/device.c"
106 pcg 1.17 const char * tap_device::if_up () { return "/sbin/ifconfig $IFNAME ether $MAC mtu $MTU"; }
107 pcg 1.6
108 pcg 1.1 #elif IF_netbsd
109 pcg 1.11 # define IF_istun 1
110 pcg 1.1 # include "tincd/netbsd/device.c"
111 pcg 1.17 const char * tap_device::if_up () { return "/sbin/ifconfig $IFNAME mtu $MTU"; }
112 pcg 1.6
113     #elif IF_openbsd
114 pcg 1.11 # define IF_istun 1
115 pcg 1.6 # include "tincd/openbsd/device.c"
116 pcg 1.17 const char * tap_device::if_up () { return "/sbin/ifconfig $IFNAME mtu $MTU"; }
117 pcg 1.6
118 pcg 1.1 #elif IF_solaris
119 pcg 1.11 # define IF_istun 1
120 pcg 1.1 # include "tincd/solaris/device.c"
121 pcg 1.15 const char * tap_device::if_up () { return ""; }
122 pcg 1.6
123 pcg 1.1 #elif IF_cygwin
124     # include "tincd/cygwin/device.c"
125 pcg 1.15 const char * tap_device::if_up () { return ""; }
126 pcg 1.6
127 pcg 1.1 #elif IF_mingw
128     # include "tincd/mingw/device.c"
129 pcg 1.15 const char * tap_device::if_up () { return ""; }
130 pcg 1.6
131 pcg 1.1 #elif IF_darwin
132 pcg 1.11 # define IF_istun 1
133 pcg 1.1 # include "tincd/darwin/device.c"
134 pcg 1.17 const char * tap_device::if_up () { return "/sbin/ifconfig $IFNAME ether $MAC mtu $MTU"; }
135 pcg 1.6
136 pcg 1.1 #elif IF_raw_socket
137     # include "tincd/raw_socket/device.c"
138 pcg 1.17 const char * tap_device::if_up () { return "/sbin/ifconfig $IFNAME ether $MAC mtu $MTU"; }
139 pcg 1.6
140 pcg 1.13 #elif IF_uml_socket
141     # include "tincd/uml_socket/device.c"
142 pcg 1.15 const char * tap_device::if_up () { return 0; }
143 pcg 1.13
144 pcg 1.1 #else
145     # error No interface implementation for your IFTYPE/IFSUBTYPE combination.
146     #endif
147    
148 pcg 1.5 #if IF_istun
149     # include "ether_emu.C"
150     #endif
151    
152 pcg 1.1 const char *
153     tap_device::info ()
154     {
155     return _("tincd compatibility layer");
156     }
157    
158     tap_device::tap_device ()
159     {
160 pcg 1.8 device = "(null)";
161    
162 pcg 1.13 bool ok = setup_device ();
163    
164     if (device_info)
165     device = device_info;
166    
167     if (ok)
168 pcg 1.1 {
169 pcg 1.8 slog (L_DEBUG, _("interface %s on %s initialized"), info (), device);
170 pcg 1.1 fd = device_fd;
171     strcpy (ifrname, iface);
172     }
173     else
174     {
175 pcg 1.8 slog (L_ERR, _("error while configuring tincd device %s on %s"), info (), device);
176 pcg 1.10 exit (EXIT_FAILURE);
177 pcg 1.1 }
178     }
179    
180     tap_device::~tap_device ()
181     {
182     close_device ();
183     }
184    
185     tap_packet *
186     tap_device::recv ()
187     {
188     tap_packet *pkt = new tap_packet;
189    
190     if (!read_packet (reinterpret_cast<vpn_packet_t *>(pkt)))
191     {
192     delete pkt;
193 pcg 1.13 slog (L_ERR, _("can't read from to %s %s: %s"), info (), device,
194 pcg 1.1 strerror (errno));
195     return 0;
196     }
197    
198 pcg 1.5 #if IF_istun
199     // assume ipv4
200     (*pkt)[12] = 0x08;
201     (*pkt)[13] = 0x00;
202    
203     if (!ether_emu.tun_to_tap (pkt))
204     {
205     delete pkt;
206     return 0;
207     }
208     #endif
209    
210 pcg 1.1 return pkt;
211     }
212    
213     void
214     tap_device::send (tap_packet *pkt)
215     {
216 pcg 1.5 if (
217     #if IF_istun
218     ether_emu.tap_to_tun (pkt) &&
219     #endif
220     !write_packet (reinterpret_cast<vpn_packet_t *>(pkt)))
221 pcg 1.13 slog (L_ERR, _("can't write to %s %s: %s"), info (), device,
222 pcg 1.1 strerror (errno));
223     }
224    
225