53 |
if (PARAM_INTERFACE_NAME) |
if (PARAM_INTERFACE_NAME) |
54 |
{ |
{ |
55 |
sprintf (tunname, "/dev/%s", PARAM_INTERFACE_NAME); |
sprintf (tunname, "/dev/%s", PARAM_INTERFACE_NAME); |
56 |
return open (tunname, O_RDWR); |
tun_fd = open (tunname, O_RDWR); |
57 |
} |
} |
58 |
|
|
59 |
for (i = 0; i < 255; i++) |
for (i = 0; i < 255; i++) |
63 |
if ((tun_fd = open (tunname, O_RDWR)) > 0) |
if ((tun_fd = open (tunname, O_RDWR)) > 0) |
64 |
{ |
{ |
65 |
sprintf (PARAM_INTERFACE_NAME, "tun%d", i); |
sprintf (PARAM_INTERFACE_NAME, "tun%d", i); |
66 |
|
break; |
67 |
} |
} |
68 |
} |
} |
69 |
return tun_ready (); |
|
70 |
|
if(!tun_ready ()) |
71 |
|
{ |
72 |
|
if (PARAM_INTERFACE_NAME) |
73 |
|
{ |
74 |
|
log(LOG_ERR, "Unable to open tun device /dev/%s (using 2.2 kernel " |
75 |
|
"method): %s(%d).\n", PARAM_INTERFACE_NAME, strerror(errno), |
76 |
|
errno); |
77 |
|
} |
78 |
|
else |
79 |
|
{ |
80 |
|
log(LOG_ERR, "Unable to open a valid tun device (using 2.2 kernel " |
81 |
|
"method).\n"); |
82 |
|
} |
83 |
|
return 0; |
84 |
|
} |
85 |
|
|
86 |
|
return 1; |
87 |
} |
} |
88 |
|
|
89 |
#ifdef HAVE_LINUX_IF_TUN_H /* New driver support */ |
#ifdef HAVE_LINUX_IF_TUN_H /* New driver support */ |
102 |
struct ifreq ifr; |
struct ifreq ifr; |
103 |
|
|
104 |
if ((tun_fd = open ("/dev/net/tun", O_RDWR | O_NONBLOCK)) < 0) |
if ((tun_fd = open ("/dev/net/tun", O_RDWR | O_NONBLOCK)) < 0) |
105 |
return 0; |
{ |
106 |
/* We will try old tuntap when new support is ok */ |
log(LOG_WARNING, "Unable to open /dev/net/tun: %s(%d).\n", |
107 |
/* return tun_open_old (dev); */ |
strerror(errno), errno); |
108 |
|
log(LOG_WARNING, "Assuming 2.2 kernel method.\n"); |
109 |
|
return tun_open_old (); |
110 |
|
} |
111 |
|
|
112 |
memset (&ifr, 0, sizeof (ifr)); |
memset (&ifr, 0, sizeof (ifr)); |
113 |
ifr.ifr_flags = IFF_TUN | IFF_NO_PI; |
ifr.ifr_flags = IFF_TUN | IFF_NO_PI; |
121 |
/* Try old ioctl */ |
/* Try old ioctl */ |
122 |
if (ioctl (tun_fd, OTUNSETIFF, (void *) &ifr) < 0) |
if (ioctl (tun_fd, OTUNSETIFF, (void *) &ifr) < 0) |
123 |
{ |
{ |
124 |
|
log(LOG_ERR, "Unable to open a valid tun device (using pre " |
125 |
|
"2.4.6 kernel method): %s(%d).\n", strerror(errno), errno); |
126 |
tun_close (); |
tun_close (); |
127 |
return 0; |
return 0; |
128 |
} |
} |
129 |
} |
} |
130 |
else |
else |
131 |
{ |
{ |
132 |
|
log(LOG_ERR, "Unable to open a valid tun device (using post " |
133 |
|
"2.4.6 kernel method): %s(%d).\n", strerror(errno), errno); |
134 |
tun_close (); |
tun_close (); |
135 |
return 0; |
return 0; |
136 |
} |
} |