commit 799f3cee234877f41351a47c8dbfcb0daab5daec
parent 45d0f744cd44a92d51103064d3b3fae242b3c0a8
Author: sin <sin@2f30.org>
Date: Thu, 24 Mar 2016 10:13:12 +0000
squash tun/tap code
Diffstat:
M | stun.c | | | 152 | ++++++++++++++++++++++++++----------------------------------------------------- |
1 file changed, 50 insertions(+), 102 deletions(-)
diff --git a/stun.c b/stun.c
@@ -178,31 +178,9 @@ dummydec(EVP_CIPHER_CTX *ectx, unsigned char *plaintext,
return len;
}
-int (*opendev)(char *);
-int (*writedev)(int, unsigned char *, int);
-int (*readdev)(int, unsigned char *, int);
-
#if defined(__linux__)
int
-opentap(char *tapdev)
-{
- logerr("linux tap support is not ready");
-}
-
-int
-writetap(int fd, unsigned char *buf, int len)
-{
- return write(fd, buf, len);
-}
-
-int
-readtap(int fd, unsigned char *buf, int len)
-{
- return read(fd, buf, len);
-}
-
-int
-opentun(char *tundev)
+opendev(char *dev)
{
struct ifreq ifr;
int fd, s;
@@ -212,11 +190,11 @@ opentun(char *tundev)
logerr("failed to open %s", "/dev/net/tun");
memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
- strncpy(ifr.ifr_name, tundev, IF_NAMESIZE);
+ ifr.ifr_flags = (devtype == TUNDEV ? IFF_TUN : IFF_TAP) | IFF_NO_PI;
+ strncpy(ifr.ifr_name, dev, IF_NAMESIZE);
ifr.ifr_name[IF_NAMESIZE - 1] = '\0';
if (ioctl(fd, TUNSETIFF, &ifr) < 0)
- logerr("failed to set TUNSETIFF on %s", tundev);
+ logerr("failed to set TUNSETIFF on %s", dev);
/* dummy socket so we can manipulate the params */
s = socket(AF_INET, SOCK_STREAM, 0);
@@ -224,111 +202,94 @@ opentun(char *tundev)
logerr("failed to create socket");
ifr.ifr_mtu = MTU;
if (ioctl(s, SIOCSIFMTU, &ifr) < 0)
- logerr("failed to set MTU on %s", tundev);
+ logerr("failed to set MTU on %s", dev);
close(s);
return fd;
}
int
-writetun(int fd, unsigned char *buf, int len)
+writedev(int fd, unsigned char *buf, int len)
{
return write(fd, buf, len);
}
int
-readtun(int fd, unsigned char *buf, int len)
+readdev(int fd, unsigned char *buf, int len)
{
return read(fd, buf, len);
}
#elif defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD__)
int
-opentap(char *tapdev)
+opendev(char *dev)
{
struct tuninfo ti;
int fd;
- fd = open(tapdev, O_RDWR);
+ fd = open(dev, O_RDWR);
if (fd < 0)
- logerr("failed to open %s", tapdev);
+ logerr("failed to open %s", dev);
if (ioctl(fd, TUNGIFINFO, &ti) < 0)
- logerr("failed to set TUNGIFINFO on %s", tapdev);
- ti.mtu = MTU - 14;
+ logerr("failed to set TUNGIFINFO on %s", dev);
+ if (devtype == TUNDEV)
+ ti.mtu = MTU;
+ else
+ ti.mtu = MTU - 14; /* make some room for ethernet header */
if (ioctl(fd, TUNSIFINFO, &ti) < 0)
- logerr("failed to set TUNSIFINFO on %s", tapdev);
- return fd;
-}
-
-int
-writetap(int fd, unsigned char *buf, int len)
-{
- return write(fd, buf, len);
-}
+ logerr("failed to set TUNSIFINFO on %s", dev);
-int
-readtap(int fd, unsigned char *buf, int len)
-{
- return read(fd, buf, len);
-}
-
-int
-opentun(char *tundev)
-{
- struct tuninfo ti;
- int fd;
-
- fd = open(tundev, O_RDWR);
- if (fd < 0)
- logerr("failed to open %s", tundev);
- if (ioctl(fd, TUNGIFINFO, &ti) < 0)
- logerr("failed to set TUNGIFINFO on %s", tundev);
- ti.mtu = MTU;
- if (ioctl(fd, TUNSIFINFO, &ti) < 0)
- logerr("failed to set TUNSIFINFO on %s", tundev);
+ if (devtype == TUNDEV) {
#if defined(TUNSIFHEAD)
- int one = 1;
- if (ioctl(fd, TUNSIFHEAD, &one) < 0)
- logerr("failed to set TUNSIFHEAD on %s", tundev);
+ int one = 1;
+ if (ioctl(fd, TUNSIFHEAD, &one) < 0)
+ logerr("failed to set TUNSIFHEAD on %s", dev);
#endif
+ }
return fd;
}
int
-writetun(int fd, unsigned char *buf, int len)
+writedev(int fd, unsigned char *buf, int len)
{
struct iovec iov[2];
uint32_t type = htonl(AF_INET);
int n;
- iov[0].iov_base = &type;
- iov[0].iov_len = sizeof(type);
- iov[1].iov_base = buf;
- iov[1].iov_len = len;
- n = writev(fd, iov, 2);
- if (n < 0)
- logerr("writev failed");
- else if (n > 0)
- return n - sizeof(type);
- return n;
+ if (devtype == TUNDEV) {
+ iov[0].iov_base = &type;
+ iov[0].iov_len = sizeof(type);
+ iov[1].iov_base = buf;
+ iov[1].iov_len = len;
+ n = writev(fd, iov, 2);
+ if (n < 0)
+ logerr("writev failed");
+ else if (n > 0)
+ return n - sizeof(type);
+ return n;
+ }
+ return write(fd, buf, len);
}
int
-readtun(int fd, unsigned char *buf, int len)
+readdev(int fd, unsigned char *buf, int len)
{
struct iovec iov[2];
uint32_t type;
int n;
- iov[0].iov_base = &type;
- iov[0].iov_len = sizeof(type);
- iov[1].iov_base = buf;
- iov[1].iov_len = len;
- n = readv(fd, iov, 2);
- if (n < 0)
- logerr("readv failed");
- else if (n > 0)
- return n - sizeof(type);
- return n;
+ if (devtype == TUNDEV) {
+ iov[0].iov_base = &type;
+ iov[0].iov_len = sizeof(type);
+ iov[1].iov_base = buf;
+ iov[1].iov_len = len;
+ n = readv(fd, iov, 2);
+ if (n < 0)
+ logerr("readv failed");
+ else if (n > 0)
+ return n - sizeof(type);
+ return n;
+ }
+ return readdev(fd, buf, len);
}
#endif
@@ -705,20 +666,7 @@ main(int argc, char *argv[])
daemonize();
openlog("stun", LOG_PID | LOG_NDELAY, LOG_DAEMON);
- switch (devtype) {
- case TUNDEV:
- devfd = opentun(argv[0]);
- opendev = opentun;
- writedev = writetun;
- readdev = readtun;
- break;
- case TAPDEV:
- devfd = opentap(argv[0]);
- opendev = opentap;
- writedev = writetap;
- readdev = readtap;
- break;
- }
+ devfd = opendev(argv[0]);
pw = getenv("STUNPW");
if (!pw)