diff options
Diffstat (limited to 'arch/um/os-Linux/drivers/tuntap_user.c')
-rw-r--r-- | arch/um/os-Linux/drivers/tuntap_user.c | 75 |
1 files changed, 38 insertions, 37 deletions
diff --git a/arch/um/os-Linux/drivers/tuntap_user.c b/arch/um/os-Linux/drivers/tuntap_user.c index 72a2ff61556d..10714a413cfd 100644 --- a/arch/um/os-Linux/drivers/tuntap_user.c +++ b/arch/um/os-Linux/drivers/tuntap_user.c | |||
@@ -1,25 +1,22 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) | 2 | * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) |
3 | * Licensed under the GPL | 3 | * Licensed under the GPL |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <stdio.h> | 6 | #include <stdio.h> |
7 | #include <stddef.h> | ||
8 | #include <stdlib.h> | ||
9 | #include <unistd.h> | 7 | #include <unistd.h> |
10 | #include <errno.h> | 8 | #include <errno.h> |
11 | #include <sys/wait.h> | 9 | #include <string.h> |
10 | #include <linux/if_tun.h> | ||
11 | #include <net/if.h> | ||
12 | #include <sys/ioctl.h> | ||
12 | #include <sys/socket.h> | 13 | #include <sys/socket.h> |
13 | #include <sys/un.h> | 14 | #include <sys/wait.h> |
14 | #include <sys/uio.h> | 15 | #include <sys/uio.h> |
15 | #include <sys/ioctl.h> | 16 | #include "kern_constants.h" |
16 | #include <net/if.h> | 17 | #include "os.h" |
17 | #include <linux/if_tun.h> | ||
18 | #include "net_user.h" | ||
19 | #include "tuntap.h" | 18 | #include "tuntap.h" |
20 | #include "kern_util.h" | ||
21 | #include "user.h" | 19 | #include "user.h" |
22 | #include "os.h" | ||
23 | 20 | ||
24 | #define MAX_PACKET ETH_MAX_PACKET | 21 | #define MAX_PACKET ETH_MAX_PACKET |
25 | 22 | ||
@@ -37,7 +34,7 @@ static void tuntap_add_addr(unsigned char *addr, unsigned char *netmask, | |||
37 | struct tuntap_data *pri = data; | 34 | struct tuntap_data *pri = data; |
38 | 35 | ||
39 | tap_check_ips(pri->gate_addr, addr); | 36 | tap_check_ips(pri->gate_addr, addr); |
40 | if((pri->fd == -1) || pri->fixed_config) | 37 | if ((pri->fd == -1) || pri->fixed_config) |
41 | return; | 38 | return; |
42 | open_addr(addr, netmask, pri->dev_name); | 39 | open_addr(addr, netmask, pri->dev_name); |
43 | } | 40 | } |
@@ -47,7 +44,7 @@ static void tuntap_del_addr(unsigned char *addr, unsigned char *netmask, | |||
47 | { | 44 | { |
48 | struct tuntap_data *pri = data; | 45 | struct tuntap_data *pri = data; |
49 | 46 | ||
50 | if((pri->fd == -1) || pri->fixed_config) | 47 | if ((pri->fd == -1) || pri->fixed_config) |
51 | return; | 48 | return; |
52 | close_addr(addr, netmask, pri->dev_name); | 49 | close_addr(addr, netmask, pri->dev_name); |
53 | } | 50 | } |
@@ -85,14 +82,14 @@ static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote, | |||
85 | 82 | ||
86 | pid = run_helper(tuntap_pre_exec, &data, argv); | 83 | pid = run_helper(tuntap_pre_exec, &data, argv); |
87 | 84 | ||
88 | if(pid < 0) | 85 | if (pid < 0) |
89 | return -pid; | 86 | return -pid; |
90 | 87 | ||
91 | close(remote); | 88 | close(remote); |
92 | 89 | ||
93 | msg.msg_name = NULL; | 90 | msg.msg_name = NULL; |
94 | msg.msg_namelen = 0; | 91 | msg.msg_namelen = 0; |
95 | if(buffer != NULL){ | 92 | if (buffer != NULL) { |
96 | iov = ((struct iovec) { buffer, buffer_len }); | 93 | iov = ((struct iovec) { buffer, buffer_len }); |
97 | msg.msg_iov = &iov; | 94 | msg.msg_iov = &iov; |
98 | msg.msg_iovlen = 1; | 95 | msg.msg_iovlen = 1; |
@@ -106,22 +103,24 @@ static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote, | |||
106 | msg.msg_flags = 0; | 103 | msg.msg_flags = 0; |
107 | n = recvmsg(me, &msg, 0); | 104 | n = recvmsg(me, &msg, 0); |
108 | *used_out = n; | 105 | *used_out = n; |
109 | if(n < 0){ | 106 | if (n < 0) { |
110 | err = -errno; | 107 | err = -errno; |
111 | printk("tuntap_open_tramp : recvmsg failed - errno = %d\n", | 108 | printk(UM_KERN_ERR "tuntap_open_tramp : recvmsg failed - " |
112 | errno); | 109 | "errno = %d\n", errno); |
113 | return err; | 110 | return err; |
114 | } | 111 | } |
115 | CATCH_EINTR(waitpid(pid, NULL, 0)); | 112 | CATCH_EINTR(waitpid(pid, NULL, 0)); |
116 | 113 | ||
117 | cmsg = CMSG_FIRSTHDR(&msg); | 114 | cmsg = CMSG_FIRSTHDR(&msg); |
118 | if(cmsg == NULL){ | 115 | if (cmsg == NULL) { |
119 | printk("tuntap_open_tramp : didn't receive a message\n"); | 116 | printk(UM_KERN_ERR "tuntap_open_tramp : didn't receive a " |
117 | "message\n"); | ||
120 | return -EINVAL; | 118 | return -EINVAL; |
121 | } | 119 | } |
122 | if((cmsg->cmsg_level != SOL_SOCKET) || | 120 | if ((cmsg->cmsg_level != SOL_SOCKET) || |
123 | (cmsg->cmsg_type != SCM_RIGHTS)){ | 121 | (cmsg->cmsg_type != SCM_RIGHTS)) { |
124 | printk("tuntap_open_tramp : didn't receive a descriptor\n"); | 122 | printk(UM_KERN_ERR "tuntap_open_tramp : didn't receive a " |
123 | "descriptor\n"); | ||
125 | return -EINVAL; | 124 | return -EINVAL; |
126 | } | 125 | } |
127 | *fd_out = ((int *) CMSG_DATA(cmsg))[0]; | 126 | *fd_out = ((int *) CMSG_DATA(cmsg))[0]; |
@@ -137,38 +136,39 @@ static int tuntap_open(void *data) | |||
137 | int err, fds[2], len, used; | 136 | int err, fds[2], len, used; |
138 | 137 | ||
139 | err = tap_open_common(pri->dev, pri->gate_addr); | 138 | err = tap_open_common(pri->dev, pri->gate_addr); |
140 | if(err < 0) | 139 | if (err < 0) |
141 | return err; | 140 | return err; |
142 | 141 | ||
143 | if(pri->fixed_config){ | 142 | if (pri->fixed_config) { |
144 | pri->fd = os_open_file("/dev/net/tun", | 143 | pri->fd = os_open_file("/dev/net/tun", |
145 | of_cloexec(of_rdwr(OPENFLAGS())), 0); | 144 | of_cloexec(of_rdwr(OPENFLAGS())), 0); |
146 | if(pri->fd < 0){ | 145 | if (pri->fd < 0) { |
147 | printk("Failed to open /dev/net/tun, err = %d\n", | 146 | printk(UM_KERN_ERR "Failed to open /dev/net/tun, " |
148 | -pri->fd); | 147 | "err = %d\n", -pri->fd); |
149 | return pri->fd; | 148 | return pri->fd; |
150 | } | 149 | } |
151 | memset(&ifr, 0, sizeof(ifr)); | 150 | memset(&ifr, 0, sizeof(ifr)); |
152 | ifr.ifr_flags = IFF_TAP | IFF_NO_PI; | 151 | ifr.ifr_flags = IFF_TAP | IFF_NO_PI; |
153 | strlcpy(ifr.ifr_name, pri->dev_name, sizeof(ifr.ifr_name)); | 152 | strlcpy(ifr.ifr_name, pri->dev_name, sizeof(ifr.ifr_name)); |
154 | if(ioctl(pri->fd, TUNSETIFF, (void *) &ifr) < 0){ | 153 | if (ioctl(pri->fd, TUNSETIFF, (void *) &ifr) < 0) { |
155 | err = -errno; | 154 | err = -errno; |
156 | printk("TUNSETIFF failed, errno = %d\n", errno); | 155 | printk(UM_KERN_ERR "TUNSETIFF failed, errno = %d\n", |
156 | errno); | ||
157 | close(pri->fd); | 157 | close(pri->fd); |
158 | return err; | 158 | return err; |
159 | } | 159 | } |
160 | } | 160 | } |
161 | else { | 161 | else { |
162 | err = socketpair(AF_UNIX, SOCK_DGRAM, 0, fds); | 162 | err = socketpair(AF_UNIX, SOCK_DGRAM, 0, fds); |
163 | if(err){ | 163 | if (err) { |
164 | err = -errno; | 164 | err = -errno; |
165 | printk("tuntap_open : socketpair failed - errno = %d\n", | 165 | printk(UM_KERN_ERR "tuntap_open : socketpair failed - " |
166 | errno); | 166 | "errno = %d\n", errno); |
167 | return err; | 167 | return err; |
168 | } | 168 | } |
169 | 169 | ||
170 | buffer = get_output_buffer(&len); | 170 | buffer = get_output_buffer(&len); |
171 | if(buffer != NULL) | 171 | if (buffer != NULL) |
172 | len--; | 172 | len--; |
173 | used = 0; | 173 | used = 0; |
174 | 174 | ||
@@ -176,10 +176,11 @@ static int tuntap_open(void *data) | |||
176 | fds[1], buffer, len, &used); | 176 | fds[1], buffer, len, &used); |
177 | 177 | ||
178 | output = buffer; | 178 | output = buffer; |
179 | if(err < 0) { | 179 | if (err < 0) { |
180 | printk("%s", output); | 180 | printk("%s", output); |
181 | free_output_buffer(buffer); | 181 | free_output_buffer(buffer); |
182 | printk("tuntap_open_tramp failed - err = %d\n", -err); | 182 | printk(UM_KERN_ERR "tuntap_open_tramp failed - " |
183 | "err = %d\n", -err); | ||
183 | return err; | 184 | return err; |
184 | } | 185 | } |
185 | 186 | ||
@@ -199,7 +200,7 @@ static void tuntap_close(int fd, void *data) | |||
199 | { | 200 | { |
200 | struct tuntap_data *pri = data; | 201 | struct tuntap_data *pri = data; |
201 | 202 | ||
202 | if(!pri->fixed_config) | 203 | if (!pri->fixed_config) |
203 | iter_addresses(pri->dev, close_addr, pri->dev_name); | 204 | iter_addresses(pri->dev, close_addr, pri->dev_name); |
204 | close(fd); | 205 | close(fd); |
205 | pri->fd = -1; | 206 | pri->fd = -1; |