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

# User Rev Content
1 pcg 1.1 /*
2     device-tincd.C -- include one of the tincd low level implementations.
3 pcg 1.9 Copyright (C) 2003-2004 Marc Lehmann <pcg@goof.com>
4 pcg 1.1
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 pcg 1.3 // following headers used by cygwin (maybe others)
34     #include "netcompat.h"
35     #include <signal.h>
36    
37     #define xstrdup(strd) strdup(str)
38    
39 pcg 1.2 /* make the tincd sources feel comfortable in our environment. */
40     /* this was reasonably easy to do. */
41 pcg 1.1 #define routing_mode 1
42     #define RMODE_ROUTER 0
43    
44 pcg 1.2 #define LOG_TO_L(level) \
45 pcg 1.1 (level) == LOG_ERR ? L_ERR \
46     : (level) == LOG_DEBUG ? L_DEBUG \
47     : (level) == LOG_WARNING ? L_WARN \
48     : (level) == LOG_INFO ? L_INFO \
49 pcg 1.2 : 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 pcg 1.1
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 pcg 1.6
95 pcg 1.1 #elif IF_freebsd
96     # include "tincd/freebsd/device.c"
97 pcg 1.6
98 pcg 1.1 #elif IF_netbsd
99 pcg 1.11 # define IF_istun 1
100 pcg 1.1 # include "tincd/netbsd/device.c"
101 pcg 1.6
102     #elif IF_openbsd
103 pcg 1.11 # define IF_istun 1
104 pcg 1.6 # include "tincd/openbsd/device.c"
105    
106 pcg 1.1 #elif IF_solaris
107 pcg 1.11 # define IF_istun 1
108 pcg 1.1 # include "tincd/solaris/device.c"
109 pcg 1.6
110 pcg 1.1 #elif IF_cygwin
111     # include "tincd/cygwin/device.c"
112 pcg 1.6
113 pcg 1.1 #elif IF_mingw
114     # include "tincd/mingw/device.c"
115 pcg 1.6
116 pcg 1.1 #elif IF_darwin
117 pcg 1.11 # define IF_istun 1
118 pcg 1.1 # include "tincd/darwin/device.c"
119 pcg 1.6
120 pcg 1.1 #elif IF_raw_socket
121 pcg 1.11 # define IF_istun 1
122 pcg 1.1 # include "tincd/raw_socket/device.c"
123 pcg 1.6
124 pcg 1.1 #else
125     # error No interface implementation for your IFTYPE/IFSUBTYPE combination.
126     #endif
127    
128 pcg 1.5 #if IF_istun
129     # include "ether_emu.C"
130     #endif
131    
132 pcg 1.1 const char *
133     tap_device::info ()
134     {
135     return _("tincd compatibility layer");
136     }
137    
138     tap_device::tap_device ()
139     {
140 pcg 1.8 device = "(null)";
141    
142 pcg 1.1 if (setup_device ())
143     {
144 pcg 1.8 slog (L_DEBUG, _("interface %s on %s initialized"), info (), device);
145 pcg 1.1 fd = device_fd;
146     strcpy (ifrname, iface);
147     }
148     else
149     {
150 pcg 1.8 slog (L_ERR, _("error while configuring tincd device %s on %s"), info (), device);
151 pcg 1.10 exit (EXIT_FAILURE);
152 pcg 1.1 }
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 pcg 1.5 #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 pcg 1.1 return pkt;
186     }
187    
188     void
189     tap_device::send (tap_packet *pkt)
190     {
191 pcg 1.5 if (
192     #if IF_istun
193     ether_emu.tap_to_tun (pkt) &&
194     #endif
195     !write_packet (reinterpret_cast<vpn_packet_t *>(pkt)))
196 pcg 1.1 slog (L_ERR, _("can't write to %s %s: %s"), info (), DEFAULT_DEVICE,
197     strerror (errno));
198     }
199    
200