84 |
struct ifreq ifr; |
struct ifreq ifr; |
85 |
|
|
86 |
if ((fd = open ("/dev/net/tun", O_RDWR)) < 0) |
if ((fd = open ("/dev/net/tun", O_RDWR)) < 0) |
87 |
return tun_open_old (dev); |
return 0; |
88 |
|
/* We will try old tuntap when new support is ok */ |
89 |
|
/* return tun_open_old (dev); */ |
90 |
|
|
91 |
memset (&ifr, 0, sizeof (ifr)); |
memset (&ifr, 0, sizeof (ifr)); |
92 |
ifr.ifr_flags = IFF_TUN | IFF_NO_PI; |
ifr.ifr_flags = IFF_TUN | IFF_NO_PI; |
106 |
} |
} |
107 |
else |
else |
108 |
{ |
{ |
109 |
tun_close (); |
tun_close (); |
110 |
return 0; |
return 0; |
111 |
} |
} |
112 |
} |
} |
113 |
|
|
114 |
strcpy (PARAM_INTERFACE_NAME, ifr.ifr_name); |
/* |
115 |
|
* FIXME: total mess with allocation of parameters. |
116 |
|
* Can't strcpy in a constant string, but we should not always strdup. |
117 |
|
* And we don't know when to free old value (can be string constant). |
118 |
|
*/ |
119 |
|
PARAM_INTERFACE_NAME = strdup(ifr.ifr_name); |
120 |
return 1; |
return 1; |
|
|
|
121 |
} |
} |
122 |
|
|
123 |
#else /* !HAVE_LINUX_IF_TUN_H */ |
#else /* !HAVE_LINUX_IF_TUN_H */ |
149 |
} |
} |
150 |
|
|
151 |
int |
int |
152 |
tun_get(buffer, data, data_size) |
tun_get (buffer, data, data_size) |
153 |
buffer_t *buffer; |
buffer_t *buffer; |
154 |
char **data; |
char **data; |
155 |
size_t *data_size; |
size_t *data_size; |
156 |
{ |
{ |
157 |
struct iphdr *ip; |
struct iphdr *ip; |
158 |
|
|
159 |
ip=(struct iphdr*) buffer_end(buffer); |
ip = (struct iphdr*) buffer_end(buffer); |
160 |
*data=NULL; |
*data = NULL; |
161 |
*data_size=0; |
*data_size = 0; |
162 |
if(buffer->used < sizeof(struct iphdr)) |
if (buffer->used < sizeof(struct iphdr)) |
163 |
return 0; |
return 0; |
164 |
if(buffer->used < ip->tot_len) |
if (buffer->used < ip->tot_len) |
165 |
return 0; |
return 0; |
166 |
|
|
167 |
*data=(char*) ip; |
*data = (char*) ip; |
168 |
*data_size=ip->tot_len; |
*data_size = ip->tot_len; |
169 |
buffer_free(buffer,ip->tot_len); |
buffer_free (buffer,ip->tot_len); |
170 |
return 1; |
return 1; |
171 |
} |
} |
172 |
|
|
173 |
int |
int |
174 |
tun_put(buffer, data, data_size) |
tun_put (buffer, data, data_size) |
175 |
buffer_t *buffer; |
buffer_t *buffer; |
176 |
char *data; |
char *data; |
177 |
size_t data_size; |
size_t data_size; |
178 |
{ |
{ |
179 |
char *p; |
char *p; |
180 |
|
|
181 |
p=buffer_end(buffer); |
p = buffer_end(buffer); |
182 |
buffer_alloc(buffer,data_size); |
buffer_alloc (buffer,data_size); |
183 |
memcpy(p,data,data_size); |
memcpy (p,data,data_size); |
184 |
return 1; |
return 1; |
185 |
} |
} |
186 |
|
|