From 95fefbdb39dfdac91567c6454e74a354203ef03f Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Sat, 27 Oct 2018 00:57:58 +0200 Subject: Allow customizing MTU Signed-off-by: Jason A. Donenfeld --- wireguard-go-bridge/example.c | 6 +++--- wireguard-go-bridge/src/api-ios.go | 4 ++-- wireguard-go-bridge/src/tun/tun_ios.go | 11 +++++++++-- wireguard-go-bridge/wireguard.h | 3 ++- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/wireguard-go-bridge/example.c b/wireguard-go-bridge/example.c index 912d181..33ed1f0 100644 --- a/wireguard-go-bridge/example.c +++ b/wireguard-go-bridge/example.c @@ -14,14 +14,14 @@ static struct { static bool is_closed = false; -ssize_t do_read(const void *ctx, const unsigned char *buf, size_t len) +ssize_t do_read(void *ctx, unsigned char *buf, size_t len) { printf("Reading from instance with ctx %p into buffer %p of length %zu\n", ctx, buf, len); sleep(1); return is_closed ? -1 : 0; } -ssize_t do_write(const void *ctx, const unsigned char *buf, size_t len) +ssize_t do_write(void *ctx, unsigned char *buf, size_t len) { printf("Writing from instance with ctx %p into buffer %p of length %zu\n", ctx, buf, len); return len; @@ -38,7 +38,7 @@ int main(int argc, char *argv[]) printf("WireGuard Go Version %s\n", wgVersion()); wgSetLogger(do_log); - handle = wgTurnOn((gostring_t){ .p = "test", .n = 4 }, (gostring_t){ .p = "", .n = 0 }, do_read, do_write, &ctx); + handle = wgTurnOn((gostring_t){ .p = "test", .n = 4 }, (gostring_t){ .p = "", .n = 0 }, 0, do_read, do_write, &ctx); sleep(5); is_closed = true; wgTurnOff(handle); diff --git a/wireguard-go-bridge/src/api-ios.go b/wireguard-go-bridge/src/api-ios.go index dcc588f..7bb648e 100644 --- a/wireguard-go-bridge/src/api-ios.go +++ b/wireguard-go-bridge/src/api-ios.go @@ -79,7 +79,7 @@ func wgSetLogger(loggerFn uintptr) { } //export wgTurnOn -func wgTurnOn(ifnameRef string, settings string, readFn uintptr, writeFn uintptr, ctx uintptr) int32 { +func wgTurnOn(ifnameRef string, settings string, mtu uint16, readFn uintptr, writeFn uintptr, ctx uintptr) int32 { interfaceName := string([]byte(ifnameRef)) logger := &Logger{ @@ -90,7 +90,7 @@ func wgTurnOn(ifnameRef string, settings string, readFn uintptr, writeFn uintptr logger.Debug.Println("Debug log enabled") - tun := tun.CreateTUN(1280, unsafe.Pointer(readFn), unsafe.Pointer(writeFn), unsafe.Pointer(ctx)) + tun := tun.CreateTUN(mtu, unsafe.Pointer(readFn), unsafe.Pointer(writeFn), unsafe.Pointer(ctx)) logger.Info.Println("Attaching to interface") device := NewDevice(tun, logger) diff --git a/wireguard-go-bridge/src/tun/tun_ios.go b/wireguard-go-bridge/src/tun/tun_ios.go index 93a0503..cafe33b 100644 --- a/wireguard-go-bridge/src/tun/tun_ios.go +++ b/wireguard-go-bridge/src/tun/tun_ios.go @@ -26,10 +26,17 @@ type nativeTun struct { ctx unsafe.Pointer } -func CreateTUN(mtu int, readFn unsafe.Pointer, writeFn unsafe.Pointer, ctx unsafe.Pointer) TUNDevice { +func CreateTUN(mtu uint16, readFn unsafe.Pointer, writeFn unsafe.Pointer, ctx unsafe.Pointer) TUNDevice { + if mtu == 0 { + /* 0 means automatic MTU, which iOS makes outerMTU-80-15. The 80 is for + * WireGuard and the 15 ensures our padding will work. Therefore, it's + * safe to have this code assume a massive MTU. + */ + mtu = ^mtu + } tun := &nativeTun{ events: make(chan TUNEvent, 10), - mtu: mtu, + mtu: int(mtu), readFn: readFn, writeFn: writeFn, ctx: ctx, diff --git a/wireguard-go-bridge/wireguard.h b/wireguard-go-bridge/wireguard.h index effae8e..a0950bf 100644 --- a/wireguard-go-bridge/wireguard.h +++ b/wireguard-go-bridge/wireguard.h @@ -7,12 +7,13 @@ #define WIREGUARD_H #include +#include typedef struct { const char *p; size_t n; } gostring_t; typedef ssize_t(*read_write_fn_t)(void *ctx, unsigned char *buf, size_t len); typedef void(*logger_fn_t)(int level, const char *tag, const char *msg); extern void wgSetLogger(logger_fn_t logger_fn); -extern int wgTurnOn(gostring_t ifname, gostring_t settings, read_write_fn_t read_fn, read_write_fn_t write_fn, void *ctx); +extern int wgTurnOn(gostring_t ifname, gostring_t settings, uint16_t mtu, read_write_fn_t read_fn, read_write_fn_t write_fn, void *ctx); extern void wgTurnOff(int handle); extern char *wgVersion(); -- cgit v1.2.3-59-g8ed1b