ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/tincd/netbsd/device.c
Revision: 1.1
Committed: Tue Oct 14 03:22:09 2003 UTC (20 years, 8 months ago) by pcg
Content type: text/plain
Branch: MAIN
CVS Tags: rel-1_9, rel-1_8, rel-2_01, poll-based-iom, rel-3_0, VPE_1_2, rel-2_2, rel-2_0, VPE_1_4, VPE_1_6, rel-1_7, VPE-1_6_1, rel-2_21, rel-2_22, rel-2_25, HEAD
Log Message:
*** empty log message ***

File Contents

# Content
1 /*
2 device.c -- Interaction with NetBSD tun device
3 Copyright (C) 2001-2003 Ivo Timmermans <ivo@o2w.nl>,
4 2001-2003 Guus Sliepen <guus@sliepen.eu.org>
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19
20 $Id: device.c,v 1.1.2.13 2003/07/31 11:31:50 guus Exp $
21 */
22
23
24
25 #define DEFAULT_DEVICE "/dev/tun0"
26
27 #define DEVICE_TYPE_ETHERTAP 0
28 #define DEVICE_TYPE_TUNTAP 1
29
30 int device_fd = -1;
31 char *device;
32 char *iface;
33 char *device_info;
34
35 int device_total_in = 0;
36 int device_total_out = 0;
37
38 bool setup_device(void)
39 {
40 cp();
41
42 if(!get_config_string(lookup_config(config_tree, "Device"), &device))
43 device = DEFAULT_DEVICE;
44
45 if(!get_config_string(lookup_config(config_tree, "Interface"), &iface))
46 iface = rindex(device, '/') ? rindex(device, '/') + 1 : device;
47 if((device_fd = open(device, O_RDWR | O_NONBLOCK)) < 0) {
48 logger(LOG_ERR, _("Could not open %s: %s"), device, strerror(errno));
49 return false;
50 }
51
52 device_info = _("NetBSD tun device");
53
54 logger(LOG_INFO, _("%s is a %s"), device, device_info);
55
56 return true;
57 }
58
59 void close_device(void)
60 {
61 cp();
62
63 close(device_fd);
64 }
65
66 bool read_packet(vpn_packet_t *packet)
67 {
68 int lenin;
69
70 cp();
71
72 if((lenin = read(device_fd, packet->data + 14, MTU - 14)) <= 0) {
73 logger(LOG_ERR, _("Error while reading from %s %s: %s"), device_info,
74 device, strerror(errno));
75 return false;
76 }
77
78 packet->data[12] = 0x08;
79 packet->data[13] = 0x00;
80
81 packet->len = lenin + 14;
82
83 device_total_in += packet->len;
84
85 ifdebug(TRAFFIC) logger(LOG_DEBUG, _("Read packet of %d bytes from %s"), packet->len,
86 device_info);
87
88 return true;
89 }
90
91 bool write_packet(vpn_packet_t *packet)
92 {
93 cp();
94
95 ifdebug(TRAFFIC) logger(LOG_DEBUG, _("Writing packet of %d bytes to %s"),
96 packet->len, device_info);
97
98 if(write(device_fd, packet->data + 14, packet->len - 14) < 0) {
99 logger(LOG_ERR, _("Can't write to %s %s: %s"), device_info, device,
100 strerror(errno));
101 return false;
102 }
103
104 device_total_out += packet->len;
105
106 return true;
107 }
108
109 void dump_device_stats(void)
110 {
111 cp();
112
113 logger(LOG_DEBUG, _("Statistics for %s %s:"), device_info, device);
114 logger(LOG_DEBUG, _(" total bytes in: %10d"), device_total_in);
115 logger(LOG_DEBUG, _(" total bytes out: %10d"), device_total_out);
116 }