ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/device-tincd.C
Revision: 1.1
Committed: Tue Oct 14 03:22:09 2003 UTC (20 years, 7 months ago) by pcg
Content type: text/plain
Branch: MAIN
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    
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8    
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12     GNU General Public License for more details.
13    
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17     */
18    
19     #include <cstdio>
20     #include <cstring>
21     #include <cerrno>
22    
23     #include <sys/types.h>
24     #include <sys/stat.h>
25     #include <sys/ioctl.h>
26     #include <unistd.h>
27     #include <syslog.h>
28     #include <fcntl.h>
29    
30     #include "conf.h"
31    
32     #define routing_mode 1
33     #define RMODE_ROUTER 0
34    
35     /* need iso c-90 or ugly workaround :( */
36     #define logger(level, ...) slog ( \
37     (level) == LOG_ERR ? L_ERR \
38     : (level) == LOG_DEBUG ? L_DEBUG \
39     : (level) == LOG_WARNING ? L_WARN \
40     : (level) == LOG_INFO ? L_INFO \
41     : L_NOTICE, __VA_ARGS__)
42    
43     #define ifdebug(subsys) if (0)
44    
45     #define cp()
46     #define lookup_config(config_tree,key) (key)
47    
48     #define MTU MAXSIZE
49    
50     // BIGGEST hack of 'em all
51     // will be casted to data_packet, due to structural similarity
52     struct vpn_packet_t : net_packet {
53     u8 data[MAXSIZE];
54     };
55    
56     static tap_device *self;
57    
58     static bool overwrite_mac;
59    
60     static bool
61     get_config_string(const char *key, char **res)
62     {
63     if (!strcmp (key, "Interface"))
64     *res = conf.ifname;
65     else if (!strcmp (key, "Device"))
66     *res = 0;
67     else
68     {
69     slog (L_ERR, _("tincd layer asking for unknown config '%s'"), key);
70     *res = 0;
71     }
72    
73     return *res;
74     }
75    
76     #define netname conf.ifname
77    
78     #if IF_linux
79     # include "tincd/linux/device.c"
80     #elif IF_freebsd
81     # include "tincd/freebsd/device.c"
82     #elif IF_netbsd
83     # include "tincd/netbsd/device.c"
84     #elif IF_solaris
85     # include "tincd/solaris/device.c"
86     #elif IF_cygwin
87     # include "tincd/cygwin/device.c"
88     #elif IF_mingw
89     # include "tincd/mingw/device.c"
90     #elif IF_darwin
91     # include "tincd/darwin/device.c"
92     #elif IF_raw_socket
93     # include "tincd/raw_socket/device.c"
94     #else
95     # error No interface implementation for your IFTYPE/IFSUBTYPE combination.
96     #endif
97    
98     const char *
99     tap_device::info ()
100     {
101     return _("tincd compatibility layer");
102     }
103    
104     tap_device::tap_device ()
105     {
106     self = this;
107    
108     if (setup_device ())
109     {
110     //slog (L_DEBUG, _("%s is a %s"), device, info ());
111     fd = device_fd;
112     strcpy (ifrname, iface);
113     }
114     else
115     {
116     slog (L_ERR, _("error while configuring tincd device (%s/%s)"), device, info ());
117     exit (1);
118     }
119     }
120    
121     tap_device::~tap_device ()
122     {
123     close_device ();
124     }
125    
126     tap_packet *
127     tap_device::recv ()
128     {
129     tap_packet *pkt = new tap_packet;
130    
131     if (!read_packet (reinterpret_cast<vpn_packet_t *>(pkt)))
132     {
133     delete pkt;
134     slog (L_ERR, _("can't read from to %s %s: %s"), info (), DEFAULT_DEVICE,
135     strerror (errno));
136     return 0;
137     }
138    
139     return pkt;
140     }
141    
142     void
143     tap_device::send (tap_packet *pkt)
144     {
145     if (!write_packet (reinterpret_cast<vpn_packet_t *>(pkt)))
146     slog (L_ERR, _("can't write to %s %s: %s"), info (), DEFAULT_DEVICE,
147     strerror (errno));
148     }
149    
150