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

# Content
1 /*
2 device-tincd.C -- include one of the tincd low level implementations.
3 Copyright (C) 2003-2005 Marc Lehmann <gvpe@schmorp.de>
4
5 This file is part of GVPE.
6
7 GVPE is free software; you can redistribute it and/or modify
8 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 along with gvpe; if not, write to the Free Software
19 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 // following headers used by cygwin (maybe others)
36 #include "netcompat.h"
37 #include <signal.h>
38
39 #define xstrdup(strd) strdup(str)
40
41 /* make the tincd sources feel comfortable in our environment. */
42 /* this was reasonably easy to do. */
43 #define routing_mode 1
44 #define RMODE_ROUTER 0
45
46 #define LOG_TO_L(level) \
47 (level) == LOG_ERR ? L_ERR \
48 : (level) == LOG_DEBUG ? L_DEBUG \
49 : (level) == LOG_WARNING ? L_WARN \
50 : (level) == LOG_INFO ? L_INFO \
51 : 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
61 #define ifdebug(subsys) if (0)
62
63 #define cp()
64 #define lookup_config(config_tree,key) (key)
65
66 #define MTU MAX_MTU
67
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 else if (!strcmp (key, "DeviceType"))
84 *res = "tap";
85 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 const char * tap_device::if_up () { return "/sbin/ifconfig $IFNAME hw ether $MAC mtu $MTU"; }
99
100 #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 #elif IF_freebsd
105 # include "tincd/freebsd/device.c"
106 const char * tap_device::if_up () { return "/sbin/ifconfig $IFNAME ether $MAC mtu $MTU"; }
107
108 #elif IF_netbsd
109 # define IF_istun 1
110 # include "tincd/netbsd/device.c"
111 const char * tap_device::if_up () { return "/sbin/ifconfig $IFNAME mtu $MTU"; }
112
113 #elif IF_openbsd
114 # define IF_istun 1
115 # include "tincd/openbsd/device.c"
116 const char * tap_device::if_up () { return "/sbin/ifconfig $IFNAME mtu $MTU"; }
117
118 #elif IF_solaris
119 # define IF_istun 1
120 # include "tincd/solaris/device.c"
121 const char * tap_device::if_up () { return ""; }
122
123 #elif IF_cygwin
124 # include "tincd/cygwin/device.c"
125 const char * tap_device::if_up () { return ""; }
126
127 #elif IF_mingw
128 # include "tincd/mingw/device.c"
129 const char * tap_device::if_up () { return ""; }
130
131 #elif IF_darwin
132 # define IF_istun 1
133 # include "tincd/darwin/device.c"
134 const char * tap_device::if_up () { return "/sbin/ifconfig $IFNAME ether $MAC mtu $MTU"; }
135
136 #elif IF_raw_socket
137 # include "tincd/raw_socket/device.c"
138 const char * tap_device::if_up () { return "/sbin/ifconfig $IFNAME ether $MAC mtu $MTU"; }
139
140 #elif IF_uml_socket
141 # include "tincd/uml_socket/device.c"
142 const char * tap_device::if_up () { return 0; }
143
144 #else
145 # error No interface implementation for your IFTYPE/IFSUBTYPE combination.
146 #endif
147
148 #if IF_istun
149 # include "ether_emu.C"
150 #endif
151
152 const char *
153 tap_device::info ()
154 {
155 return _("tincd compatibility layer");
156 }
157
158 tap_device::tap_device ()
159 {
160 device = "(null)";
161
162 bool ok = setup_device ();
163
164 if (device_info)
165 device = device_info;
166
167 if (ok)
168 {
169 slog (L_DEBUG, _("interface %s on %s initialized"), info (), device);
170 fd = device_fd;
171 strcpy (ifrname, iface);
172 }
173 else
174 {
175 slog (L_ERR, _("error while configuring tincd device %s on %s"), info (), device);
176 exit (EXIT_FAILURE);
177 }
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 slog (L_ERR, _("can't read from to %s %s: %s"), info (), device,
194 strerror (errno));
195 return 0;
196 }
197
198 #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 return pkt;
211 }
212
213 void
214 tap_device::send (tap_packet *pkt)
215 {
216 if (
217 #if IF_istun
218 ether_emu.tap_to_tun (pkt) &&
219 #endif
220 !write_packet (reinterpret_cast<vpn_packet_t *>(pkt)))
221 slog (L_ERR, _("can't write to %s %s: %s"), info (), device,
222 strerror (errno));
223 }
224
225