chiark
/
gitweb
/
~mdw
/
tripe
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix uninitialized variable in p_create.
[tripe]
/
tun-linux.c
diff --git
a/tun-linux.c
b/tun-linux.c
index c30784d7cf91c76c61cabfd0c3e2b9904ce8b39c..8c7278cebd947dcc21fd7e087e3032acf4317a52 100644
(file)
--- a/
tun-linux.c
+++ b/
tun-linux.c
@@
-1,6
+1,6
@@
/* -*-c-*-
*
/* -*-c-*-
*
- * $Id
: tun-linux.c,v 1.3 2004/04/08 01:36:17 mdw Exp
$
+ * $Id$
*
* Tunnel interface based on Linux TUN/TAP driver
*
*
* Tunnel interface based on Linux TUN/TAP driver
*
@@
-28,15
+28,26
@@
/*----- Header files ------------------------------------------------------*/
/*----- Header files ------------------------------------------------------*/
+#define TUN_INTERNALS
+
#include "tripe.h"
#include "tripe.h"
-#include <sys/ioctl.h>
+#ifdef TUN_LINUX
+# include <sys/ioctl.h>
+# include <linux/if.h>
+# include <linux/if_tun.h>
+#endif
/*----- Main code ---------------------------------------------------------*/
/*----- 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@ --- *
*
/* --- @t_read@ --- *
*
@@
-57,7
+68,7
@@
static void t_read(int fd, unsigned mode, void *v)
n = read(fd, buf_i, sizeof(buf_i));
if (n < 0) {
n = read(fd, buf_i, sizeof(buf_i));
if (n < 0) {
- a_warn("
tunnel read failed (%s):
%s", t->ifn, strerror(errno));
+ a_warn("
TUN %s read-error --
%s", t->ifn, strerror(errno));
return;
}
IF_TRACING(T_TUNNEL, {
return;
}
IF_TRACING(T_TUNNEL, {
@@
-68,7
+79,7
@@
static void t_read(int fd, unsigned mode, void *v)
p_tun(t->p, &b);
}
p_tun(t->p, &b);
}
-/* --- @t
un
_init@ --- *
+/* --- @t_init@ --- *
*
* Arguments: ---
*
*
* Arguments: ---
*
@@
-78,40
+89,38
@@
static void t_read(int fd, unsigned mode, void *v)
* opening file descriptors or something.
*/
* opening file descriptors or something.
*/
-void tun_init(void)
-{
- return;
-}
+static void t_init(void) { return; }
-/* --- @t
un
_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.
*/
*
* 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;
{
int fd;
int f;
struct ifreq iff;
+ tunnel *t;
if ((fd = open("/dev/net/tun", O_RDWR)) < 0) {
if ((fd = open("/dev/net/tun", O_RDWR)) < 0) {
- a_warn("
open `/dev/net/tun' failed:
%s", strerror(errno));
- return (
-1
);
+ a_warn("
TUN - open-error /dev/net/tun --
%s", strerror(errno));
+ return (
0
);
}
fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC);
iff.ifr_name[0] = 0;
}
fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC);
iff.ifr_name[0] = 0;
- iff.ifr_flags = IFF_TUN;
+ iff.ifr_flags = IFF_TUN
| IFF_NO_PI
;
if ((f = ioctl(fd, TUNSETIFF, &iff)) < 0) {
if ((f = ioctl(fd, TUNSETIFF, &iff)) < 0) {
- a_warn("couldn't set configure new TUN/TAP interface: %s",
- strerror(errno));
+ a_warn("TUN - linux config-error -- %s", strerror(errno));
close(fd);
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);
t->p = p;
sel_initfile(&sel, &t->f, fd, SEL_READ, t_read, t);
sel_addfile(&t->f);
@@
-119,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)); )
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
);
}
}
-/* --- @t
un
_ifname@ --- *
+/* --- @t_ifname@ --- *
*
* Arguments: @tunnel *t@ = pointer to tunnel block
*
* Returns: A pointer to the tunnel's interface name.
*/
*
* 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); }
-/* --- @t
un
_inject@ --- *
+/* --- @t_inject@ --- *
*
* Arguments: @tunnel *t@ = pointer to tunnel block
* @buf *b@ = buffer to send
*
* Arguments: @tunnel *t@ = pointer to tunnel block
* @buf *b@ = buffer to send
@@
-144,7
+150,7
@@
const char *tun_ifname(tunnel *t)
* Use: Injects a packet into the local network stack.
*/
* 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");
{
IF_TRACING(T_TUNNEL, {
trace(T_TUNNEL, "tunnel: inject decrypted packet");
@@
-153,7
+159,7
@@
void tun_inject(tunnel *t, buf *b)
write(t->f.fd, BBASE(b), BLEN(b));
}
write(t->f.fd, BBASE(b), BLEN(b));
}
-/* --- @t
un
_destroy@ --- *
+/* --- @t_destroy@ --- *
*
* Arguments: @tunnel *t@ = pointer to tunnel block
*
*
* Arguments: @tunnel *t@ = pointer to tunnel block
*
@@
-162,10
+168,22
@@
void tun_inject(tunnel *t, buf *b)
* Use: Destroys a tunnel.
*/
* Use: Destroys a tunnel.
*/
-
void tun
_destroy(tunnel *t)
+
static void t
_destroy(tunnel *t)
{
sel_rmfile(&t->f);
close(t->f.fd);
{
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 -------------------------------------------------*/
/*----- That's all, folks -------------------------------------------------*/