From: mdw Date: Mon, 5 Feb 2001 19:48:18 +0000 (+0000) Subject: Initial support for BSD tunnel devices. X-Git-Tag: 1.0.0pre1~34 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/commitdiff_plain/fd528bdeb067dc6450ef8e795824539181e097d5?ds=sidebyside Initial support for BSD tunnel devices. --- diff --git a/Makefile.am b/Makefile.am index afbee21d..f77fc6b4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,6 @@ ## -*-makefile-*- ## -## $Id: Makefile.am,v 1.1 2001/02/03 20:26:37 mdw Exp $ +## $Id: Makefile.am,v 1.2 2001/02/05 19:48:18 mdw Exp $ ## ## Makefile for TrIPE ## @@ -28,6 +28,9 @@ ##----- Revision history ---------------------------------------------------- ## ## $Log: Makefile.am,v $ +## Revision 1.2 2001/02/05 19:48:18 mdw +## Initial support for BSD tunnel devices. +## ## Revision 1.1 2001/02/03 20:26:37 mdw ## Initial checkin. ## @@ -42,7 +45,10 @@ tripe_SOURCES = \ admin.c peer.c tun-$(tun).c \ keymgmt.c keyexch.c keyset.c \ buf.c servutil.c util.c util.h +EXTRA_tripe_SOURCES = \ + tun-unet.c tun-bsd.c tripectl_SOURCES = \ client.c util.c util.h + tun-unet.c tun-bsd.c ##----- That's all, folks --------------------------------------------------- diff --git a/tun-bsd.c b/tun-bsd.c new file mode 100644 index 00000000..39e3e108 --- /dev/null +++ b/tun-bsd.c @@ -0,0 +1,185 @@ +/* -*-c-*- + * + * $Id: tun-bsd.c,v 1.1 2001/02/05 19:48:18 mdw Exp $ + * + * 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. + */ + +/*----- Revision history --------------------------------------------------* + * + * $Log: tun-bsd.c,v $ + * Revision 1.1 2001/02/05 19:48:18 mdw + * Initial support for BSD tunnel devices. + * + */ + +/*----- Header files ------------------------------------------------------*/ + +#include "tripe.h" + +/*----- Main code ---------------------------------------------------------*/ + +#if TUN_TYPE != TUN_BSD +# error "Tunnel type mismatch: fix the Makefile" +#endif + +/* --- @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. + */ + +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("tunnel read failed (%s): %s", tun_ifname(t), strerror(errno)); + return; + } + IF_TRACING(T_TUNNEL, { + trace(T_TUNNEL, "tunnel: packet arrived"); + trace_block(T_PACKET, "tunnel: packet contents", buf_i, n); + }) + buf_init(&b, buf_i, n); + p_tun(t->p, &b); +} + +/* --- @tun_init@ --- * + * + * Arguments: --- + * + * Returns: --- + * + * Use: Initializes the tunneling system. Maybe this will require + * opening file descriptors or something. + */ + +void tun_init(void) +{ + return; +} + +/* --- @tun_create@ --- * + * + * Arguments: @tunnel *t@ = pointer to tunnel block + * @peer *p@ = pointer to peer block + * + * Returns: Zero if it worked, nonzero on failure. + * + * Use: Initializes a new tunnel. + */ + +int tun_create(tunnel *t, peer *p) +{ + int fd; + unsigned n; + char buf[16]; + + n = 0; + for (;;) { + sprintf(buf, "/dev/tun%u", n); + if ((fd = open("/dev/unet", O_RDWR)) >= 0) + break; + switch (errno) { + case EBUSY: + T( trace(T_TUNNEL, "tunnel device %u busy: skipping", n); ) + break; + case ENOENT: + a_warn("no suitable tunnel devices found"); + return (-1); + default: + a_warn("error opening `%s': %s (skipping)", buf, strerror(errno)); + break; + } + n++; + } + + fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC); + t->p = p; + t->n = n; + sel_initfile(&sel, &t->f, fd, SEL_READ, t_read, t); + sel_addfile(&t->f); + T( trace(T_TUNNEL, "tunnel: attached interface %s to peer `%s'", + tun_ifname(t), p_name(p)); ) + return (0); +} + +/* --- @tun_ifname@ --- * + * + * Arguments: @tunnel *t@ = pointer to tunnel block + * + * Returns: A pointer to the tunnel's interface name. + */ + +const char *tun_ifname(tunnel *t) +{ + static char buf[8]; + sprintf(buf, "tun%u", t->n); + return (buf); +} + +/* --- @tun_inject@ --- * + * + * Arguments: @tunnel *t@ = pointer to tunnel block + * @buf *b@ = buffer to send + * + * Returns: --- + * + * Use: Injects a packet into the local network stack. + */ + +void tun_inject(tunnel *t, buf *b) +{ + IF_TRACING(T_TUNNEL, { + trace(T_TUNNEL, "tunnel: inject decrypted packet"); + trace_block(T_PACKET, "tunnel: packet contents", BBASE(b), BLEN(b)); + }) + write(t->f.fd, BBASE(b), BLEN(b)); +} + +/* --- @tun_destroy@ --- * + * + * Arguments: @tunnel *t@ = pointer to tunnel block + * + * Returns: --- + * + * Use: Destroys a tunnel. + */ + +void tun_destroy(tunnel *t) +{ + sel_rmfile(&t->f); + close(t->f.fd); +} + +/*----- That's all, folks -------------------------------------------------*/