Remove old icmp/auto mtu code
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
This commit is contained in:
2
mud
2
mud
Submodule mud updated: 5aeb0a3cb2...b809bf0785
74
src/bind.c
74
src/bind.c
@@ -6,7 +6,6 @@
|
|||||||
#include "tun.h"
|
#include "tun.h"
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
|
|
||||||
@@ -17,8 +16,6 @@
|
|||||||
#define O_CLOEXEC 0
|
#define O_CLOEXEC 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define GT_MTU(X) ((X)-28)
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fd_set_nonblock(int fd)
|
fd_set_nonblock(int fd)
|
||||||
{
|
{
|
||||||
@@ -91,13 +88,19 @@ gt_setup_secretkey(struct mud *mud, const char *keyfile)
|
|||||||
static size_t
|
static size_t
|
||||||
gt_setup_mtu(struct mud *mud, const char *tun_name)
|
gt_setup_mtu(struct mud *mud, const char *tun_name)
|
||||||
{
|
{
|
||||||
|
static size_t oldmtu = 0;
|
||||||
size_t mtu = mud_get_mtu(mud);
|
size_t mtu = mud_get_mtu(mud);
|
||||||
|
|
||||||
|
if (mtu == oldmtu)
|
||||||
|
return mtu;
|
||||||
|
|
||||||
gt_log("setup MTU to %zu on interface %s\n", mtu, tun_name);
|
gt_log("setup MTU to %zu on interface %s\n", mtu, tun_name);
|
||||||
|
|
||||||
if (iface_set_mtu(tun_name, mtu) == -1)
|
if (iface_set_mtu(tun_name, mtu) == -1)
|
||||||
perror("tun_set_mtu");
|
perror("tun_set_mtu");
|
||||||
|
|
||||||
|
oldmtu = mtu;
|
||||||
|
|
||||||
return mtu;
|
return mtu;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,12 +114,7 @@ gt_bind(int argc, char **argv)
|
|||||||
const char *dev = NULL;
|
const char *dev = NULL;
|
||||||
const char *keyfile = NULL;
|
const char *keyfile = NULL;
|
||||||
size_t bufsize = 64 * 1024 * 1024;
|
size_t bufsize = 64 * 1024 * 1024;
|
||||||
size_t mtu = 1500;
|
size_t mtu = 1330;
|
||||||
|
|
||||||
struct argz mtuz[] = {
|
|
||||||
{"auto", NULL, NULL, argz_option},
|
|
||||||
{NULL, "BYTES", &mtu, argz_bytes},
|
|
||||||
{NULL}};
|
|
||||||
|
|
||||||
struct argz toz[] = {
|
struct argz toz[] = {
|
||||||
{NULL, "IPADDR", &peer_addr, argz_addr},
|
{NULL, "IPADDR", &peer_addr, argz_addr},
|
||||||
@@ -128,7 +126,7 @@ gt_bind(int argc, char **argv)
|
|||||||
{NULL, "PORT", &bind_port, argz_ushort},
|
{NULL, "PORT", &bind_port, argz_ushort},
|
||||||
{"to", NULL, &toz, argz_option},
|
{"to", NULL, &toz, argz_option},
|
||||||
{"dev", "NAME", &dev, argz_str},
|
{"dev", "NAME", &dev, argz_str},
|
||||||
{"mtu", NULL, &mtuz, argz_option},
|
{"mtu", "BYTES", &mtu, argz_option},
|
||||||
{"keyfile", "FILE", &keyfile, argz_str},
|
{"keyfile", "FILE", &keyfile, argz_str},
|
||||||
{"chacha", NULL, NULL, argz_option},
|
{"chacha", NULL, NULL, argz_option},
|
||||||
{"persist", NULL, NULL, argz_option},
|
{"persist", NULL, NULL, argz_option},
|
||||||
@@ -148,19 +146,9 @@ gt_bind(int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int mtu_auto = argz_is_set(mtuz, "auto");
|
|
||||||
int chacha = argz_is_set(bindz, "chacha");
|
int chacha = argz_is_set(bindz, "chacha");
|
||||||
int persist = argz_is_set(bindz, "persist");
|
int persist = argz_is_set(bindz, "persist");
|
||||||
|
|
||||||
int icmp_fd = -1;
|
|
||||||
|
|
||||||
if (mtu_auto && (peer_addr.ss_family == AF_INET)) {
|
|
||||||
icmp_fd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
|
|
||||||
|
|
||||||
if (icmp_fd == -1)
|
|
||||||
gt_log("couldn't create ICMP socket\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
struct mud *mud = mud_create((struct sockaddr *)&bind_addr);
|
struct mud *mud = mud_create((struct sockaddr *)&bind_addr);
|
||||||
|
|
||||||
if (!mud) {
|
if (!mud) {
|
||||||
@@ -183,8 +171,6 @@ gt_bind(int argc, char **argv)
|
|||||||
chacha = 1;
|
chacha = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
mud_set_mtu(mud, GT_MTU(mtu));
|
|
||||||
|
|
||||||
char tun_name[64];
|
char tun_name[64];
|
||||||
int tun_fd = tun_create(tun_name, sizeof(tun_name) - 1, dev);
|
int tun_fd = tun_create(tun_name, sizeof(tun_name) - 1, dev);
|
||||||
|
|
||||||
@@ -193,6 +179,9 @@ gt_bind(int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mud_set_mtu(mud, mtu);
|
||||||
|
mtu = gt_setup_mtu(mud, tun_name);
|
||||||
|
|
||||||
if (tun_set_persist(tun_fd, persist) == -1)
|
if (tun_set_persist(tun_fd, persist) == -1)
|
||||||
perror("tun_set_persist");
|
perror("tun_set_persist");
|
||||||
|
|
||||||
@@ -203,8 +192,6 @@ gt_bind(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mtu = gt_setup_mtu(mud, tun_name);
|
|
||||||
|
|
||||||
int ctl_fd = ctl_create("/run/" PACKAGE_NAME, tun_name);
|
int ctl_fd = ctl_create("/run/" PACKAGE_NAME, tun_name);
|
||||||
|
|
||||||
if (ctl_fd == -1) {
|
if (ctl_fd == -1) {
|
||||||
@@ -216,7 +203,6 @@ gt_bind(int argc, char **argv)
|
|||||||
|
|
||||||
fd_set_nonblock(tun_fd);
|
fd_set_nonblock(tun_fd);
|
||||||
fd_set_nonblock(mud_fd);
|
fd_set_nonblock(mud_fd);
|
||||||
fd_set_nonblock(icmp_fd);
|
|
||||||
fd_set_nonblock(ctl_fd);
|
fd_set_nonblock(ctl_fd);
|
||||||
|
|
||||||
gt_log("running...\n");
|
gt_log("running...\n");
|
||||||
@@ -224,16 +210,13 @@ gt_bind(int argc, char **argv)
|
|||||||
fd_set rfds;
|
fd_set rfds;
|
||||||
FD_ZERO(&rfds);
|
FD_ZERO(&rfds);
|
||||||
|
|
||||||
int last_fd = 1 + MAX(tun_fd, MAX(mud_fd, MAX(ctl_fd, icmp_fd)));
|
int last_fd = 1 + MAX(tun_fd, MAX(mud_fd, ctl_fd));
|
||||||
|
|
||||||
while (!gt_quit) {
|
while (!gt_quit) {
|
||||||
FD_SET(tun_fd, &rfds);
|
FD_SET(tun_fd, &rfds);
|
||||||
FD_SET(mud_fd, &rfds);
|
FD_SET(mud_fd, &rfds);
|
||||||
FD_SET(ctl_fd, &rfds);
|
FD_SET(ctl_fd, &rfds);
|
||||||
|
|
||||||
if (icmp_fd != -1)
|
|
||||||
FD_SET(icmp_fd, &rfds);
|
|
||||||
|
|
||||||
if (select(last_fd, &rfds, NULL, NULL, NULL) == -1) {
|
if (select(last_fd, &rfds, NULL, NULL, NULL) == -1) {
|
||||||
if (errno != EBADF)
|
if (errno != EBADF)
|
||||||
continue;
|
continue;
|
||||||
@@ -241,22 +224,7 @@ gt_bind(int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (icmp_fd != -1 && FD_ISSET(icmp_fd, &rfds)) {
|
mtu = gt_setup_mtu(mud, tun_name);
|
||||||
struct ip_common ic;
|
|
||||||
struct sockaddr_storage ss;
|
|
||||||
socklen_t sl = sizeof(ss);
|
|
||||||
|
|
||||||
ssize_t r = recvfrom(icmp_fd, buf, bufsize, 0,
|
|
||||||
(struct sockaddr *)&ss, &sl);
|
|
||||||
|
|
||||||
if (!ip_get_common(&ic, buf, r)) {
|
|
||||||
size_t mtu = ip_get_mtu(&ic, buf, r);
|
|
||||||
if (mtu > 0) {
|
|
||||||
gt_log("received MTU from ICMP: %zu\n", mtu);
|
|
||||||
mud_set_mtu(mud, GT_MTU(mtu));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FD_ISSET(ctl_fd, &rfds)) {
|
if (FD_ISSET(ctl_fd, &rfds)) {
|
||||||
struct ctl_msg req, res = {.reply = 1};
|
struct ctl_msg req, res = {.reply = 1};
|
||||||
@@ -299,9 +267,9 @@ gt_bind(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CTL_MTU:
|
case CTL_MTU:
|
||||||
mud_set_mtu(mud, GT_MTU((size_t)req.mtu));
|
mud_set_mtu(mud, (size_t)req.mtu);
|
||||||
res.mtu = gt_setup_mtu(mud, tun_name);
|
mtu = gt_setup_mtu(mud, tun_name);
|
||||||
mtu = res.mtu;
|
res.mtu = mtu;
|
||||||
break;
|
break;
|
||||||
case CTL_TC:
|
case CTL_TC:
|
||||||
if (mud_set_tc(mud, req.tc))
|
if (mud_set_tc(mud, req.tc))
|
||||||
@@ -317,7 +285,6 @@ gt_bind(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
case CTL_STATUS:
|
case CTL_STATUS:
|
||||||
res.status.mtu = mtu;
|
res.status.mtu = mtu;
|
||||||
res.status.mtu_auto = (icmp_fd != -1);
|
|
||||||
res.status.chacha = chacha;
|
res.status.chacha = chacha;
|
||||||
res.status.bind = bind_addr;
|
res.status.bind = bind_addr;
|
||||||
res.status.peer = peer_addr;
|
res.status.peer = peer_addr;
|
||||||
@@ -375,11 +342,12 @@ gt_bind(int argc, char **argv)
|
|||||||
|
|
||||||
int r = mud_send(mud, &buf[p], q - p, tc);
|
int r = mud_send(mud, &buf[p], q - p, tc);
|
||||||
|
|
||||||
if (r == -1 && errno == EMSGSIZE) {
|
if (r == -1) {
|
||||||
mtu = gt_setup_mtu(mud, tun_name);
|
if (errno == EMSGSIZE) {
|
||||||
} else {
|
mtu = gt_setup_mtu(mud, tun_name);
|
||||||
if (r == -1 && errno != EAGAIN)
|
} else if (errno != EAGAIN) {
|
||||||
perror("mud_send");
|
perror("mud_send");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
p = q;
|
p = q;
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ struct ctl_msg {
|
|||||||
struct mud_path path_status;
|
struct mud_path path_status;
|
||||||
struct {
|
struct {
|
||||||
size_t mtu;
|
size_t mtu;
|
||||||
int mtu_auto;
|
|
||||||
int chacha;
|
int chacha;
|
||||||
struct sockaddr_storage bind;
|
struct sockaddr_storage bind;
|
||||||
struct sockaddr_storage peer;
|
struct sockaddr_storage peer;
|
||||||
|
|||||||
@@ -32,25 +32,21 @@ gt_show_dev_status(int fd, const char *dev)
|
|||||||
printf("server %s:\n"
|
printf("server %s:\n"
|
||||||
" bind: %s port %"PRIu16"\n"
|
" bind: %s port %"PRIu16"\n"
|
||||||
" mtu: %zu\n"
|
" mtu: %zu\n"
|
||||||
" auto mtu: %s\n"
|
|
||||||
" cipher: %s\n",
|
" cipher: %s\n",
|
||||||
dev,
|
dev,
|
||||||
bindstr, gt_get_port((struct sockaddr *)&res.status.bind),
|
bindstr, gt_get_port((struct sockaddr *)&res.status.bind),
|
||||||
res.status.mtu,
|
res.status.mtu,
|
||||||
res.status.mtu_auto ? "enabled" : "disabled",
|
|
||||||
res.status.chacha ? "chacha20poly1305" : "aes256gcm");
|
res.status.chacha ? "chacha20poly1305" : "aes256gcm");
|
||||||
} else {
|
} else {
|
||||||
printf("client %s:\n"
|
printf("client %s:\n"
|
||||||
" bind: %s port %"PRIu16"\n"
|
" bind: %s port %"PRIu16"\n"
|
||||||
" peer: %s port %"PRIu16"\n"
|
" peer: %s port %"PRIu16"\n"
|
||||||
" mtu: %zu\n"
|
" mtu: %zu\n"
|
||||||
" auto mtu: %s\n"
|
|
||||||
" cipher: %s\n",
|
" cipher: %s\n",
|
||||||
dev,
|
dev,
|
||||||
bindstr, gt_get_port((struct sockaddr *)&res.status.bind),
|
bindstr, gt_get_port((struct sockaddr *)&res.status.bind),
|
||||||
peerstr, gt_get_port((struct sockaddr *)&res.status.peer),
|
peerstr, gt_get_port((struct sockaddr *)&res.status.peer),
|
||||||
res.status.mtu,
|
res.status.mtu,
|
||||||
res.status.mtu_auto ? "enabled" : "disabled",
|
|
||||||
res.status.chacha ? "chacha20poly1305" : "aes256gcm");
|
res.status.chacha ? "chacha20poly1305" : "aes256gcm");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ HOST=$HOST
|
|||||||
PORT=$PORT
|
PORT=$PORT
|
||||||
BIND=$BIND
|
BIND=$BIND
|
||||||
BIND_PORT=$BIND_PORT
|
BIND_PORT=$BIND_PORT
|
||||||
OPTIONS="mtu auto"
|
OPTIONS=
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
( umask 077; echo "$KEY" > "$DIR/key" )
|
( umask 077; echo "$KEY" > "$DIR/key" )
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ Restart=always
|
|||||||
EnvironmentFile=/etc/glorytun/%i/env
|
EnvironmentFile=/etc/glorytun/%i/env
|
||||||
ExecStart=@bindir@/glorytun-run keyfile /etc/glorytun/%i/key $OPTIONS
|
ExecStart=@bindir@/glorytun-run keyfile /etc/glorytun/%i/key $OPTIONS
|
||||||
ExecStartPost=-/etc/glorytun/%i/post.sh
|
ExecStartPost=-/etc/glorytun/%i/post.sh
|
||||||
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW
|
CapabilityBoundingSet=CAP_NET_ADMIN
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
|
|||||||
Reference in New Issue
Block a user