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