@@ -21,6 +21,7 @@ glorytun_SOURCES = \
|
|||||||
src/keygen.c \
|
src/keygen.c \
|
||||||
src/main.c \
|
src/main.c \
|
||||||
src/path.c \
|
src/path.c \
|
||||||
|
src/set.c \
|
||||||
src/show.c \
|
src/show.c \
|
||||||
src/str.h \
|
src/str.h \
|
||||||
src/tun.c \
|
src/tun.c \
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ executable('glorytun', install: true,
|
|||||||
'src/keygen.c',
|
'src/keygen.c',
|
||||||
'src/main.c',
|
'src/main.c',
|
||||||
'src/path.c',
|
'src/path.c',
|
||||||
|
'src/set.c',
|
||||||
'src/show.c',
|
'src/show.c',
|
||||||
'src/tun.c',
|
'src/tun.c',
|
||||||
],
|
],
|
||||||
|
|||||||
2
mud
2
mud
Submodule mud updated: 53f8d31f77...1aded8ec29
37
src/bind.c
37
src/bind.c
@@ -87,20 +87,17 @@ gt_setup_secretkey(struct mud *mud, const char *keyfile)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static size_t
|
||||||
gt_setup_mtu(struct mud *mud, const char *tun_name, size_t *old_mtu)
|
gt_setup_mtu(struct mud *mud, const char *tun_name)
|
||||||
{
|
{
|
||||||
size_t mtu = mud_get_mtu(mud);
|
size_t mtu = mud_get_mtu(mud);
|
||||||
|
|
||||||
if (mtu == *old_mtu)
|
|
||||||
return;
|
|
||||||
|
|
||||||
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");
|
||||||
|
|
||||||
*old_mtu = mtu;
|
return mtu;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -125,8 +122,6 @@ gt_bind(int argc, char **argv)
|
|||||||
unsigned short peer_port = bind_port;
|
unsigned short peer_port = bind_port;
|
||||||
const char *dev = NULL;
|
const char *dev = NULL;
|
||||||
const char *keyfile = NULL;
|
const char *keyfile = NULL;
|
||||||
unsigned long timeout = 5000;
|
|
||||||
unsigned long timetolerance = 0;
|
|
||||||
size_t bufsize = 64 * 1024 * 1024;
|
size_t bufsize = 64 * 1024 * 1024;
|
||||||
size_t mtu = 1500;
|
size_t mtu = 1500;
|
||||||
|
|
||||||
@@ -148,8 +143,6 @@ gt_bind(int argc, char **argv)
|
|||||||
{"mtu", NULL, &mtuz, argz_option},
|
{"mtu", NULL, &mtuz, argz_option},
|
||||||
{"keyfile", "FILE", &keyfile, argz_str},
|
{"keyfile", "FILE", &keyfile, argz_str},
|
||||||
{"chacha", NULL, NULL, argz_option},
|
{"chacha", NULL, NULL, argz_option},
|
||||||
{"timeout", "SECONDS", &timeout, argz_time},
|
|
||||||
{"timetolerance", "SECONDS", &timetolerance, argz_time},
|
|
||||||
{"persist", NULL, NULL, argz_option},
|
{"persist", NULL, NULL, argz_option},
|
||||||
{"bufsize", "BYTES", &bufsize, argz_bytes},
|
{"bufsize", "BYTES", &bufsize, argz_bytes},
|
||||||
{}};
|
{}};
|
||||||
@@ -202,16 +195,6 @@ gt_bind(int argc, char **argv)
|
|||||||
chacha = 1;
|
chacha = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (timeout && mud_set_send_timeout(mud, timeout)) {
|
|
||||||
perror("timeout");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timetolerance && mud_set_time_tolerance(mud, timetolerance)) {
|
|
||||||
perror("timetolerance");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
mud_set_mtu(mud, GT_MTU(mtu));
|
mud_set_mtu(mud, GT_MTU(mtu));
|
||||||
|
|
||||||
char tun_name[64];
|
char tun_name[64];
|
||||||
@@ -232,7 +215,7 @@ gt_bind(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gt_setup_mtu(mud, tun_name, &mtu);
|
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);
|
||||||
|
|
||||||
@@ -309,6 +292,16 @@ gt_bind(int argc, char **argv)
|
|||||||
perror("mud_del_path");
|
perror("mud_del_path");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case CTL_MTU:
|
||||||
|
reply.reply = (int)mud_set_mtu(mud, GT_MTU((size_t)msg.mtu));
|
||||||
|
mtu = gt_setup_mtu(mud, tun_name);
|
||||||
|
break;
|
||||||
|
case CTL_TIMEOUT:
|
||||||
|
reply.reply = mud_set_send_timeout(mud, msg.timeout);
|
||||||
|
break;
|
||||||
|
case CTL_TIMETOLERANCE:
|
||||||
|
reply.reply = mud_set_time_tolerance(mud, msg.timetolerance);
|
||||||
|
break;
|
||||||
case CTL_STATUS:
|
case CTL_STATUS:
|
||||||
reply = (struct ctl_msg){
|
reply = (struct ctl_msg){
|
||||||
.type = CTL_STATUS_REPLY,
|
.type = CTL_STATUS_REPLY,
|
||||||
@@ -383,7 +376,7 @@ 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 && errno == EMSGSIZE) {
|
||||||
gt_setup_mtu(mud, tun_name, &mtu);
|
mtu = gt_setup_mtu(mud, tun_name);
|
||||||
} else {
|
} else {
|
||||||
if (r == -1 && errno != EAGAIN)
|
if (r == -1 && errno != EAGAIN)
|
||||||
perror("mud_send");
|
perror("mud_send");
|
||||||
|
|||||||
@@ -8,6 +8,9 @@ enum ctl_type {
|
|||||||
CTL_PATH_DEL,
|
CTL_PATH_DEL,
|
||||||
CTL_STATUS,
|
CTL_STATUS,
|
||||||
CTL_STATUS_REPLY,
|
CTL_STATUS_REPLY,
|
||||||
|
CTL_MTU,
|
||||||
|
CTL_TIMEOUT,
|
||||||
|
CTL_TIMETOLERANCE,
|
||||||
CTL_REPLY,
|
CTL_REPLY,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -25,6 +28,9 @@ struct ctl_msg {
|
|||||||
struct sockaddr_storage bind;
|
struct sockaddr_storage bind;
|
||||||
struct sockaddr_storage peer;
|
struct sockaddr_storage peer;
|
||||||
} status;
|
} status;
|
||||||
|
int mtu;
|
||||||
|
unsigned long timeout;
|
||||||
|
unsigned long timetolerance;
|
||||||
int reply;
|
int reply;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ int gt_bind(int, char **);
|
|||||||
int gt_path(int, char **);
|
int gt_path(int, char **);
|
||||||
int gt_keygen(int, char **);
|
int gt_keygen(int, char **);
|
||||||
int gt_bench(int, char **);
|
int gt_bench(int, char **);
|
||||||
|
int gt_set(int, char **);
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
@@ -69,6 +70,7 @@ main(int argc, char **argv)
|
|||||||
{"show", "show all running tunnels", gt_show},
|
{"show", "show all running tunnels", gt_show},
|
||||||
{"bench", "start a crypto bench", gt_bench},
|
{"bench", "start a crypto bench", gt_bench},
|
||||||
{"bind", "start a new tunnel", gt_bind},
|
{"bind", "start a new tunnel", gt_bind},
|
||||||
|
{"set", "change tunnel properties", gt_set},
|
||||||
{"keygen", "generate a new secret key", gt_keygen},
|
{"keygen", "generate a new secret key", gt_keygen},
|
||||||
{"path", "manage paths", gt_path},
|
{"path", "manage paths", gt_path},
|
||||||
{"version", "show version", gt_version},
|
{"version", "show version", gt_version},
|
||||||
|
|||||||
121
src/set.c
Normal file
121
src/set.c
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
#include "common.h"
|
||||||
|
#include "ctl.h"
|
||||||
|
#include "str.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
#include "../argz/argz.h"
|
||||||
|
|
||||||
|
static ssize_t
|
||||||
|
gt_reply(int fd, struct ctl_msg *res, struct ctl_msg *req)
|
||||||
|
{
|
||||||
|
if ((send(fd, req, sizeof(struct ctl_msg), 0) == -1) ||
|
||||||
|
(recv(fd, res, sizeof(struct ctl_msg), 0) == -1)) {
|
||||||
|
int err = errno;
|
||||||
|
ctl_delete(fd);
|
||||||
|
errno = err;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res->type == CTL_REPLY) {
|
||||||
|
if (res->reply < 0) {
|
||||||
|
errno = res->reply;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
errno = EINTR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
gt_set_mtu(int fd, size_t mtu)
|
||||||
|
{
|
||||||
|
struct ctl_msg res, req = {
|
||||||
|
.type = CTL_MTU,
|
||||||
|
.mtu = mtu,
|
||||||
|
};
|
||||||
|
|
||||||
|
int ret = gt_reply(fd, &res, &req);
|
||||||
|
|
||||||
|
if (!ret)
|
||||||
|
printf("new mtu: %i\n", res.reply);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
gt_set_timeout(int fd, unsigned long timeout)
|
||||||
|
{
|
||||||
|
struct ctl_msg res, req = {
|
||||||
|
.type = CTL_TIMEOUT,
|
||||||
|
.timeout = timeout,
|
||||||
|
};
|
||||||
|
|
||||||
|
return gt_reply(fd, &res, &req);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
gt_set_timetolerance(int fd, unsigned long timetolerance)
|
||||||
|
{
|
||||||
|
struct ctl_msg res, req = {
|
||||||
|
.type = CTL_TIMETOLERANCE,
|
||||||
|
.timetolerance = timetolerance,
|
||||||
|
};
|
||||||
|
|
||||||
|
return gt_reply(fd, &res, &req);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
gt_set(int argc, char **argv)
|
||||||
|
{
|
||||||
|
const char *dev = "tun0";
|
||||||
|
unsigned long timetolerance = 0;
|
||||||
|
unsigned long timeout = 0;
|
||||||
|
size_t mtu = 0;
|
||||||
|
|
||||||
|
struct argz pathz[] = {
|
||||||
|
{"dev", "NAME", &dev, argz_str},
|
||||||
|
{"mtu", "BYTES", &mtu, argz_bytes},
|
||||||
|
{"timeout", "SECONDS", &timeout, argz_time},
|
||||||
|
{"timetolerance", "SECONDS", &timetolerance, argz_time},
|
||||||
|
{}};
|
||||||
|
|
||||||
|
if (argz(pathz, argc, argv))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
int fd = ctl_create("/run/" PACKAGE_NAME, NULL);
|
||||||
|
|
||||||
|
if (fd == -1) {
|
||||||
|
perror("ctl_create");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctl_connect(fd, "/run/" PACKAGE_NAME, dev) == -1) {
|
||||||
|
gt_log("couldn't connect to %s\n", dev);
|
||||||
|
ctl_delete(fd);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mtu && gt_set_mtu(fd, mtu)) {
|
||||||
|
perror("mtu");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timeout && gt_set_timeout(fd, timeout)) {
|
||||||
|
perror("timeout");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timetolerance && gt_set_timetolerance(fd, timetolerance)) {
|
||||||
|
perror("timetolerance");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctl_delete(fd);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user