Added more presets - TODO: test to ensure they work as described

This commit is contained in:
frekky 2016-01-09 22:12:00 +08:00
parent 7068bcc08d
commit 8232979a6e

View File

@ -46,8 +46,21 @@
#include "base32.h" #include "base32.h"
#ifdef WINDOWS32 #ifdef WINDOWS32
#include "windows.h"
WORD req_version = MAKEWORD(2, 2); WORD req_version = MAKEWORD(2, 2);
WSADATA wsa_data; WSADATA wsa_data;
#else
#include <arpa/nameser.h>
#ifdef ANDROID
#include "android_dns.h"
#endif
#ifdef DARWIN
#define BIND_8_COMPAT
#include <arpa/nameser_compat.h>
#endif
#include <grp.h>
#include <pwd.h>
#include <netdb.h>
#endif #endif
#if !defined(BSD) && !defined(__GLIBC__) #if !defined(BSD) && !defined(__GLIBC__)
@ -72,8 +85,6 @@ struct client_instance this;
.rtt_total_ms = 200 .rtt_total_ms = 200
static struct client_instance preset_default = { static struct client_instance preset_default = {
.debug = 0,
.stats = 0,
.raw_mode = 1, .raw_mode = 1,
.lazymode = 1, .lazymode = 1,
.max_timeout_ms = 5000, .max_timeout_ms = 5000,
@ -93,7 +104,7 @@ static struct client_instance preset_default = {
}; };
static struct client_instance preset_original = { static struct client_instance preset_original = {
.raw_mode = 1, .raw_mode = 0,
.lazymode = 1, .lazymode = 1,
.max_timeout_ms = 4000, .max_timeout_ms = 4000,
.send_interval_ms = 0, .send_interval_ms = 0,
@ -111,29 +122,72 @@ static struct client_instance preset_original = {
PRESET_STATIC_VALUES PRESET_STATIC_VALUES
}; };
struct option_presets { static struct client_instance preset_fast = {
size_t preset_data_len; /* sizeof(struct client/server_instance) */ .raw_mode = 0,
size_t num_presets; .lazymode = 1,
struct option_preset { .max_timeout_ms = 3000,
void *preset_data; /* Pointer to client/server "instance" struct */ .send_interval_ms = 0,
char short_name; .server_timeout_ms = 2500,
char *long_name; .downstream_timeout_ms = 100,
} presets[]; .autodetect_server_timeout = 1,
.dataenc = &base32_encoder,
.autodetect_frag_size = 1,
.max_downstream_frag_size = 1176,
.compression_up = 1,
.compression_down = 1,
.windowsize_up = 64,
.windowsize_down = 32,
.hostname_maxlen = 0xFF,
PRESET_STATIC_VALUES
}; };
#define NUM_CLIENT_PRESETS 2 static struct client_instance preset_fallback = {
.raw_mode = 1,
.lazymode = 1,
.max_timeout_ms = 1000,
.send_interval_ms = 20,
.server_timeout_ms = 500,
.downstream_timeout_ms = 1000,
.autodetect_server_timeout = 1,
.dataenc = &base32_encoder,
.autodetect_frag_size = 1,
.max_downstream_frag_size = 500,
.compression_up = 1,
.compression_down = 1,
.windowsize_up = 1,
.windowsize_down = 1,
.hostname_maxlen = 100,
.downenc = 'T',
.do_qtype = T_CNAME,
PRESET_STATIC_VALUES
};
#define NUM_CLIENT_PRESETS 4
static struct { static struct {
struct client_instance *preset_data; struct client_instance *preset_data;
char short_name; char short_name;
char *desc;
} client_presets[NUM_CLIENT_PRESETS] = { } client_presets[NUM_CLIENT_PRESETS] = {
{ {
.preset_data = &preset_default, .preset_data = &preset_default,
.short_name = 'D' .short_name = 'D',
.desc = "Defaults"
}, },
{ {
.preset_data = &preset_original, .preset_data = &preset_original,
.short_name = 'O' .short_name = '7',
.desc = "Imitate iodine 0.7"
},
{
.preset_data = &preset_fast,
.short_name = 'F',
.desc = "Fast and low latency"
},
{
.preset_data = &preset_fallback,
.short_name = 'M',
.desc = "Minimal DNS queries and short DNS timeouts"
} }
}; };
@ -156,7 +210,7 @@ print_usage()
{ {
extern char *__progname; extern char *__progname;
fprintf(stderr, "Usage: %s [-v] [-h] [-V sec] [-X port] [-f] [-r] [-u user] [-t chrootdir] [-d device] " fprintf(stderr, "Usage: %s [-v] [-h] [-Y preset] [-V sec] [-X port] [-f] [-r] [-u user] [-t chrootdir] [-d device] "
"[-w downfrags] [-W upfrags] [-i sec -j sec] [-I sec] [-c 0|1] [-C 0|1] [-s ms] " "[-w downfrags] [-W upfrags] [-i sec -j sec] [-I sec] [-c 0|1] [-C 0|1] [-s ms] "
"[-P password] [-m maxfragsize] [-M maxlen] [-T type] [-O enc] [-L 0|1] [-R rdomain] " "[-P password] [-m maxfragsize] [-M maxlen] [-T type] [-O enc] [-L 0|1] [-R rdomain] "
"[-z context] [-F pidfile] topdomain [nameserver1 [nameserver2 [...]]]\n", __progname); "[-z context] [-F pidfile] topdomain [nameserver1 [nameserver2 [...]]]\n", __progname);
@ -169,6 +223,17 @@ usage()
exit(2); exit(2);
} }
static void
print_presets(int spaces)
{
#define INDENT fprintf(stderr, "%*s", spaces, "");
INDENT fprintf(stderr, "Available presets: (use -Y <preset ID>)\n");
spaces += 2;
for (int i = 0; i < NUM_CLIENT_PRESETS; i++) {
INDENT fprintf(stderr, "'%c': %s\n", client_presets[i].short_name, client_presets[i].desc);
}
}
static void static void
help() help()
{ {
@ -207,8 +272,8 @@ help()
fprintf(stderr, " -d set tunnel device name\n"); fprintf(stderr, " -d set tunnel device name\n");
fprintf(stderr, " -u drop privileges and run as specified user\n"); fprintf(stderr, " -u drop privileges and run as specified user\n");
fprintf(stderr, " -F write PID to specified file\n"); fprintf(stderr, " -F write PID to specified file\n");
fprintf(stderr, " -Y, --preset use a set of predefined options (can be overridden manually)\n"); fprintf(stderr, " -Y, --preset use a set of predefined options for DNS tunnel (can be overridden manually)\n");
fprintf(stderr, " Available presets: 'O' for iodine 0.7 behaviour, 'F' for fast/low latency settings\n"); print_presets(6);
fprintf(stderr, " --chroot chroot to given directory\n"); fprintf(stderr, " --chroot chroot to given directory\n");
fprintf(stderr, " --context apply specified SELinux context after initialization\n"); fprintf(stderr, " --context apply specified SELinux context after initialization\n");
fprintf(stderr, " --rdomain use specified routing domain (OpenBSD only)\n\n"); fprintf(stderr, " --rdomain use specified routing domain (OpenBSD only)\n\n");
@ -291,7 +356,7 @@ main(int argc, char **argv)
/* find index of preset */ /* find index of preset */
if (optarg) { if (optarg) {
for (int i = 0; i < NUM_CLIENT_PRESETS; i++) { for (int i = 0; i < NUM_CLIENT_PRESETS; i++) {
if (toupper(optarg[0] == client_presets[i].short_name)) { if (toupper(optarg[0]) == client_presets[i].short_name) {
preset_id = i; preset_id = i;
break; break;
} }
@ -304,7 +369,8 @@ main(int argc, char **argv)
if (preset_id < 0) { if (preset_id < 0) {
/* invalid preset or none specified */ /* invalid preset or none specified */
fprintf(stderr, "Invalid preset or none specified with -Y or --preset! Run 'iodine -h' to see available presets.\n"); fprintf(stderr, "Invalid preset or none specified with -Y or --preset!\n");
print_presets(2);
usage(); usage();
/* not reached */ /* not reached */
} }