X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/98fdb08d96bd62384e5f4f18d63bd2045c302e1f..42da2a58637902f3bba731a83538804e57e340bf:/tun-linux.c diff --git a/tun-linux.c b/tun-linux.c index ff65a5e7..8c7278ce 100644 --- a/tun-linux.c +++ b/tun-linux.c @@ -28,15 +28,26 @@ /*----- Header files ------------------------------------------------------*/ +#define TUN_INTERNALS + #include "tripe.h" -#include +#ifdef TUN_LINUX +# include +# include +# include +#endif /*----- Main code ---------------------------------------------------------*/ -#if TUN_TYPE != TUN_LINUX -# error "Tunnel type mismatch: fix the Makefile" -#endif +#ifdef TUN_LINUX + +struct tunnel { + const tunnel_ops *ops; /* Pointer to operations */ + sel_file f; /* Selector for TUN/TAP device */ + struct peer *p; /* Pointer to my peer */ + char ifn[IFNAMSIZ]; /* Interface name buffer */ +}; /* --- @t_read@ --- * * @@ -68,7 +79,7 @@ static void t_read(int fd, unsigned mode, void *v) p_tun(t->p, &b); } -/* --- @tun_init@ --- * +/* --- @t_init@ --- * * * Arguments: --- * @@ -78,30 +89,27 @@ static void t_read(int fd, unsigned mode, void *v) * opening file descriptors or something. */ -void tun_init(void) -{ - return; -} +static void t_init(void) { return; } -/* --- @tun_create@ --- * +/* --- @t_create@ --- * * - * Arguments: @tunnel *t@ = pointer to tunnel block - * @peer *p@ = pointer to peer block + * Arguments: @peer *p@ = pointer to peer block * - * Returns: Zero if it worked, nonzero on failure. + * Returns: A tunnel block if it worked, or null on failure. * * Use: Initializes a new tunnel. */ -int tun_create(tunnel *t, peer *p) +static tunnel *t_create(peer *p) { int fd; int f; struct ifreq iff; + tunnel *t; if ((fd = open("/dev/net/tun", O_RDWR)) < 0) { a_warn("TUN - open-error /dev/net/tun -- %s", strerror(errno)); - return (-1); + return (0); } fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC); iff.ifr_name[0] = 0; @@ -109,8 +117,10 @@ int tun_create(tunnel *t, peer *p) if ((f = ioctl(fd, TUNSETIFF, &iff)) < 0) { a_warn("TUN - linux config-error -- %s", strerror(errno)); close(fd); - return (-1); + return (0); } + t = CREATE(tunnel); + t->ops = &tun_linux; t->p = p; sel_initfile(&sel, &t->f, fd, SEL_READ, t_read, t); sel_addfile(&t->f); @@ -118,22 +128,19 @@ int tun_create(tunnel *t, peer *p) strcpy(t->ifn, iff.ifr_name); T( trace(T_TUNNEL, "tunnel: attached interface %s to peer `%s'", t->ifn, p_name(p)); ) - return (0); + return (t); } -/* --- @tun_ifname@ --- * +/* --- @t_ifname@ --- * * * Arguments: @tunnel *t@ = pointer to tunnel block * * Returns: A pointer to the tunnel's interface name. */ -const char *tun_ifname(tunnel *t) -{ - return (t->ifn); -} +static const char *t_ifname(tunnel *t) { return (t->ifn); } -/* --- @tun_inject@ --- * +/* --- @t_inject@ --- * * * Arguments: @tunnel *t@ = pointer to tunnel block * @buf *b@ = buffer to send @@ -143,7 +150,7 @@ const char *tun_ifname(tunnel *t) * Use: Injects a packet into the local network stack. */ -void tun_inject(tunnel *t, buf *b) +static void t_inject(tunnel *t, buf *b) { IF_TRACING(T_TUNNEL, { trace(T_TUNNEL, "tunnel: inject decrypted packet"); @@ -152,7 +159,7 @@ void tun_inject(tunnel *t, buf *b) write(t->f.fd, BBASE(b), BLEN(b)); } -/* --- @tun_destroy@ --- * +/* --- @t_destroy@ --- * * * Arguments: @tunnel *t@ = pointer to tunnel block * @@ -161,10 +168,22 @@ void tun_inject(tunnel *t, buf *b) * Use: Destroys a tunnel. */ -void tun_destroy(tunnel *t) +static void t_destroy(tunnel *t) { sel_rmfile(&t->f); close(t->f.fd); + DESTROY(t); } +const tunnel_ops tun_linux = { + "linux", + t_init, + t_create, + t_ifname, + t_inject, + t_destroy +}; + +#endif + /*----- That's all, folks -------------------------------------------------*/