From: Mark Wooding Date: Mon, 2 Jun 2014 21:55:32 +0000 (+0100) Subject: server/tun-*.c: Factor out the (very similar) TUN-like drivers. X-Git-Tag: 1.0.0pre16~24 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/commitdiff_plain/cd1f331085c70b1cb4ee4212ea0eda167ffdd63a server/tun-*.c: Factor out the (very similar) TUN-like drivers. --- diff --git a/server/Makefile.am b/server/Makefile.am index 4bebcd9e..e1b41e3b 100644 --- a/server/Makefile.am +++ b/server/Makefile.am @@ -53,9 +53,7 @@ tripe_SOURCES += admin.c tripe_SOURCES += tripe.c ## Tunnel drivers. -tripe_SOURCES += tun-unet.c -tripe_SOURCES += tun-bsd.c -tripe_SOURCES += tun-linux.c +tripe_SOURCES += tun-std.c tripe_SOURCES += tun-slip.c ## Server manual page. diff --git a/server/tun-bsd.c b/server/tun-bsd.c deleted file mode 100644 index 219b9934..00000000 --- a/server/tun-bsd.c +++ /dev/null @@ -1,153 +0,0 @@ -/* -*-c-*- - * - * Tunnel interface for 4.4BSD-derived systems - * - * (c) 2001 Straylight/Edgeware - */ - -/*----- Licensing notice --------------------------------------------------* - * - * This file is part of Trivial IP Encryption (TrIPE). - * - * TrIPE is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * TrIPE is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with TrIPE; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -/*----- Header files ------------------------------------------------------*/ - -#define TUN_INTERNALS - -#include "tripe.h" - -/*----- Main code ---------------------------------------------------------*/ - -#ifdef TUN_BSD - -struct tunnel { - const tunnel_ops *ops; /* Pointer to operations */ - sel_file f; /* Selector for tunnel device */ - struct peer *p; /* Pointer to my peer */ -}; - -/* --- @t_read@ --- * - * - * Arguments: @int fd@ = file descriptor to read - * @unsigned mode@ = what's happened - * @void *v@ = pointer to tunnel block - * - * Returns: --- - * - * Use: Reads data from the tunnel. - */ - -static void t_read(int fd, unsigned mode, void *v) -{ - tunnel *t = v; - ssize_t n; - buf b; - - n = read(fd, buf_i, sizeof(buf_i)); - if (n < 0) { - a_warn("TUN", "%s", p_ifname(t->p), "bsd", - "read-error", "?ERRNO", A_END); - return; - } - IF_TRACING(T_TUNNEL, { - trace(T_TUNNEL, "tun-bsd: packet arrived"); - trace_block(T_PACKET, "tun-bsd: packet contents", buf_i, n); - }) - buf_init(&b, buf_i, n); - p_tun(t->p, &b); -} - -/* --- @t_init@ --- * - * - * Arguments: --- - * - * Returns: --- - * - * Use: Initializes the tunneling system. Maybe this will require - * opening file descriptors or something. - */ - -static void t_init(void) { return; } - -/* --- @t_create@ --- * - * - * Arguments: @peer *p@ = pointer to peer block - * @int fd@ = file descriptor of tunnel device - * @char **ifn@ = where to put the interface name - * - * Returns: A tunnel block if it worked, or null on failure. - * - * Use: Initializes a new tunnel. - */ - -static tunnel *t_create(peer *p, int fd, char **ifn) -{ - tunnel *t; - - fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC); - t = CREATE(tunnel); - t->ops = &tun_bsd; - t->p = p; - sel_initfile(&sel, &t->f, fd, SEL_READ, t_read, t); - sel_addfile(&t->f); - return (t); -} - -/* --- @t_inject@ --- * - * - * Arguments: @tunnel *t@ = pointer to tunnel block - * @buf *b@ = buffer to send - * - * Returns: --- - * - * Use: Injects a packet into the local network stack. - */ - -static void t_inject(tunnel *t, buf *b) -{ - IF_TRACING(T_TUNNEL, { - trace(T_TUNNEL, "tun-bsd: inject decrypted packet"); - trace_block(T_PACKET, "tun-bsd: packet contents", BBASE(b), BLEN(b)); - }) - DISCARD(write(t->f.fd, BBASE(b), BLEN(b))); -} - -/* --- @t_destroy@ --- * - * - * Arguments: @tunnel *t@ = pointer to tunnel block - * - * Returns: --- - * - * Use: Destroys a tunnel. - */ - -static void t_destroy(tunnel *t) - { sel_rmfile(&t->f); close(t->f.fd); DESTROY(t); } - -const tunnel_ops tun_bsd = { - "bsd", - TUNF_PRIVOPEN, - t_init, - t_create, - 0, - t_inject, - t_destroy -}; - -#endif - -/*----- That's all, folks -------------------------------------------------*/ diff --git a/server/tun-linux.c b/server/tun-std.c similarity index 77% rename from server/tun-linux.c rename to server/tun-std.c index 7b1fa1df..29837673 100644 --- a/server/tun-linux.c +++ b/server/tun-std.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * Tunnel interface based on Linux TUN/TAP driver + * Tunnel interface for Linux-tun-shaped arrangements * * (c) 2003 Straylight/Edgeware */ @@ -30,15 +30,9 @@ #include "tripe.h" -#ifdef TUN_LINUX -# include -# include -# include -#endif - /*----- Main code ---------------------------------------------------------*/ -#ifdef TUN_LINUX +#if defined(TUN_LINUX) || defined(TUN_BSD) || defined(TUN_UNET) struct tunnel { const tunnel_ops *ops; /* Pointer to operations */ @@ -65,13 +59,13 @@ static void t_read(int fd, unsigned mode, void *v) n = read(fd, buf_i, sizeof(buf_i)); if (n < 0) { - a_warn("TUN", "%s", p_ifname(t->p), "linux", + a_warn("TUN", "%s", p_ifname(t->p), "%s", t->ops->name, "read-error", "?ERRNO", A_END); return; } IF_TRACING(T_TUNNEL, { - trace(T_TUNNEL, "tun-linux: packet arrived"); - trace_block(T_PACKET, "tun-linux: packet contents", buf_i, n); + trace(T_TUNNEL, "tun-%s: packet arrived", t->ops->name); + trace_block(T_PACKET, "tunnel: packet contents", buf_i, n); }) buf_init(&b, buf_i, n); p_tun(t->p, &b); @@ -100,13 +94,13 @@ static void t_init(void) { return; } * Use: Initializes a new tunnel. */ -static tunnel *t_create(peer *p, int fd, char **ifn) +static tunnel *t_create(peer *p, int fd, char **ifn, const tunnel_ops *ops) { tunnel *t; fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC); t = CREATE(tunnel); - t->ops = &tun_linux; + t->ops = ops; t->p = p; sel_initfile(&sel, &t->f, fd, SEL_READ, t_read, t); sel_addfile(&t->f); @@ -126,7 +120,7 @@ static tunnel *t_create(peer *p, int fd, char **ifn) static void t_inject(tunnel *t, buf *b) { IF_TRACING(T_TUNNEL, { - trace(T_TUNNEL, "tun-linux: inject decrypted packet"); + trace(T_TUNNEL, "tun-%s: inject decrypted packet", t->ops->name); trace_block(T_PACKET, "tunnel: packet contents", BBASE(b), BLEN(b)); }) DISCARD(write(t->f.fd, BBASE(b), BLEN(b))); @@ -144,15 +138,29 @@ static void t_inject(tunnel *t, buf *b) static void t_destroy(tunnel *t) { sel_rmfile(&t->f); close(t->f.fd); DESTROY(t); } -const tunnel_ops tun_linux = { - "linux", - TUNF_PRIVOPEN, - t_init, - t_create, - 0, - t_inject, - t_destroy -}; +#define DEFOPS(name) \ + \ +static tunnel *t_create_##name(peer *p, int fd, char **ifn); \ + \ +const tunnel_ops tun_##name = { \ + #name, TUNF_PRIVOPEN, \ + t_init, t_create_##name, 0, t_inject, t_destroy \ +}; \ + \ +static tunnel *t_create_##name(peer *p, int fd, char **ifn) \ + { return t_create(p, fd, ifn, &tun_##name); } + +#ifdef TUN_LINUX + DEFOPS(linux) +#endif + +#ifdef TUN_BSD + DEFOPS(bsd) +#endif + +#ifdef TUN_UNET + DEFOPS(unet) +#endif #endif diff --git a/server/tun-unet.c b/server/tun-unet.c deleted file mode 100644 index f283d568..00000000 --- a/server/tun-unet.c +++ /dev/null @@ -1,159 +0,0 @@ -/* -*-c-*- - * - * Tunnel interface based on Linux Usernet - * - * (c) 2001 Straylight/Edgeware - */ - -/*----- Licensing notice --------------------------------------------------* - * - * This file is part of Trivial IP Encryption (TrIPE). - * - * TrIPE is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * TrIPE is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with TrIPE; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -/*----- Header files ------------------------------------------------------*/ - -#define TUN_INTERNALS - -#include "tripe.h" - -#ifdef TUN_UNET -# include -# include -# include -#endif - -/*----- Main code ---------------------------------------------------------*/ - -#ifdef TUN_UNET - -struct tunnel { - const tunnel_ops *ops; /* Pointer to operations */ - sel_file f; /* Selector for Usernet device */ - struct peer *p; /* Pointer to my peer */ -}; - -/* --- @t_read@ --- * - * - * Arguments: @int fd@ = file descriptor to read - * @unsigned mode@ = what's happened - * @void *v@ = pointer to tunnel block - * - * Returns: --- - * - * Use: Reads data from the tunnel. - */ - -static void t_read(int fd, unsigned mode, void *v) -{ - tunnel *t = v; - ssize_t n; - buf b; - - n = read(fd, buf_i, sizeof(buf_i)); - if (n < 0) { - a_warn("TUN", "%s", p_ifname(t->p), "unet", - "read-error", "?ERRNO", A_END); - return; - } - IF_TRACING(T_TUNNEL, { - trace(T_TUNNEL, "tun-unet: packet arrived"); - trace_block(T_PACKET, "tun-unet: packet contents", buf_i, n); - }) - buf_init(&b, buf_i, n); - p_tun(t->p, &b); -} - -/* --- @t_init@ --- * - * - * Arguments: --- - * - * Returns: --- - * - * Use: Initializes the tunneling system. Maybe this will require - * opening file descriptors or something. - */ - -static void t_init(void) { return; } - -/* --- @t_create@ --- * - * - * Arguments: @peer *p@ = pointer to peer block - * @int fd@ = file descriptor of tunnel device - * @char **ifn@ = where to put the interface name - * - * Returns: A tunnel block if it worked, or null on failure. - * - * Use: Initializes a new tunnel. - */ - -static tunnel *t_create(peer *p, int fd, char **ifn) -{ - tunnel *t; - - fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC); - t = CREATE(tunnel); - t->ops = &tun_unet; - t->p = p; - sel_initfile(&sel, &t->f, fd, SEL_READ, t_read, t); - sel_addfile(&t->f); - return (t); -} - -/* --- @t_inject@ --- * - * - * Arguments: @tunnel *t@ = pointer to tunnel block - * @buf *b@ = buffer to send - * - * Returns: --- - * - * Use: Injects a packet into the local network stack. - */ - -static void t_inject(tunnel *t, buf *b) -{ - IF_TRACING(T_TUNNEL, { - trace(T_TUNNEL, "tun-unet: inject decrypted packet"); - trace_block(T_PACKET, "tun-unet: packet contents", BBASE(b), BLEN(b)); - }) - DISCARD(write(t->f.fd, BBASE(b), BLEN(b))); -} - -/* --- @t_destroy@ --- * - * - * Arguments: @tunnel *t@ = pointer to tunnel block - * - * Returns: --- - * - * Use: Destroys a tunnel. - */ - -static void t_destroy(tunnel *t) - { sel_rmfile(&t->f); close(t->f.fd); DESTROY(t); } - -const tunnel_ops tun_unet = { - "unet", - TUNF_PRIVOPEN, - t_init, - t_create, - 0, - t_inject, - t_destroy -}; - -#endif - -/*----- That's all, folks -------------------------------------------------*/