aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/os-Linux/drivers/tuntap_user.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/um/os-Linux/drivers/tuntap_user.c')
-rw-r--r--arch/um/os-Linux/drivers/tuntap_user.c75
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;