From 0a797b4f5fbbe5030abfec89d678236016146cb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Gallou=C3=ABt?= Date: Wed, 7 Jun 2017 11:27:44 +0200 Subject: [PATCH] Try value 42 for mptcp (fallback to 26) --- src/main.c | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/main.c b/src/main.c index f34a386..077f51c 100644 --- a/src/main.c +++ b/src/main.c @@ -53,8 +53,6 @@ #define GT_ABYTES (16) #define GT_KEYBYTES (32) -#define MPTCP_ENABLED (26) - static struct { volatile sig_atomic_t quit; volatile sig_atomic_t info; @@ -116,13 +114,16 @@ enum sk_opt { sk_acceptfilter, sk_quickack, sk_user_timeout, - sk_mptcp, + sk_mptcp_26, + sk_mptcp_42, }; -static void sk_set (int fd, enum sk_opt opt, const void *val, socklen_t len) +static int sk_set (int fd, enum sk_opt opt, const void *val, socklen_t len) { - if (!val || len<=0) - return; + if (!val || len<=0) { + errno = EINVAL; + return -1; + } struct { const char *name; @@ -173,33 +174,44 @@ static void sk_set (int fd, enum sk_opt opt, const void *val, socklen_t len) 1, IPPROTO_TCP, TCP_USER_TIMEOUT, #endif }, - [sk_mptcp] = { "MPTCP_ENABLED", -#ifdef MPTCP_ENABLED - 1, IPPROTO_TCP, MPTCP_ENABLED, -#endif - }, + [sk_mptcp_26] = { "MPTCP_ENABLED (26)", 1, IPPROTO_TCP, 26 }, + [sk_mptcp_42] = { "MPTCP_ENABLED (42)", 1, IPPROTO_TCP, 42 }, }; if (!opts[opt].present) { gt_na(opts[opt].name); - return; + errno = EINVAL; + return -1; } - if (setsockopt(fd, opts[opt].level, opts[opt].option, val, len)==-1) + int ret = setsockopt(fd, opts[opt].level, opts[opt].option, val, len); + + if (ret==-1) { + int err = errno; gt_log("couldn't set socket option `%s'\n", opts[opt].name); + errno = err; + } + + return ret; } -static void sk_set_int (int fd, enum sk_opt opt, int val) +static int sk_set_int (int fd, enum sk_opt opt, int val) { return sk_set(fd, opt, &val, sizeof(val)); } +static void sk_set_mptcp (int fd) +{ + if (sk_set_int(fd, sk_mptcp_42, 1)==-1) + sk_set_int(fd, sk_mptcp_26, 1); +} + static int sk_listen (int fd, struct addrinfo *ai) { sk_set_int(fd, sk_reuseaddr, 1); if (gt.mptcp) - sk_set_int(fd, sk_mptcp, 1); + sk_set_mptcp(fd); if (bind(fd, ai->ai_addr, ai->ai_addrlen)==-1) { perror("bind"); @@ -226,7 +238,7 @@ static int sk_connect (int fd, struct addrinfo *ai) fd_set_nonblock(fd); if (gt.mptcp) - sk_set_int(fd, sk_mptcp, 1); + sk_set_mptcp(fd); int ret = connect(fd, ai->ai_addr, ai->ai_addrlen);