From 55606b63f9cdf0d860be645f92f6a31a27d740cf Mon Sep 17 00:00:00 2001 From: wangyu Date: Mon, 13 Jul 2020 22:23:17 -0400 Subject: [PATCH] refactor --bind and --interface, fix --key --- common.cpp | 8 +++++--- common.h | 2 +- main.cpp | 6 ++++-- makefile | 2 +- misc.cpp | 33 +++++++++++++++++++-------------- misc.h | 7 ++++--- tunnel_client.cpp | 2 +- tunnel_server.cpp | 2 +- 8 files changed, 36 insertions(+), 26 deletions(-) diff --git a/common.cpp b/common.cpp index 9411d01..02052a9 100644 --- a/common.cpp +++ b/common.cpp @@ -964,7 +964,7 @@ int new_listen_socket2(int &fd,address_t &addr) return 0; } -int new_connected_socket2(int &fd,address_t &addr,bool bind_enabled,address_t &bind_addr,char interface_string[]) +int new_connected_socket2(int &fd,address_t &addr,address_t *bind_addr,char * interface_string) { fd = socket(addr.get_type(), SOCK_DGRAM, IPPROTO_UDP); if (fd < 0) { @@ -972,17 +972,19 @@ int new_connected_socket2(int &fd,address_t &addr,bool bind_enabled,address_t &b return -1; } - if (bind_enabled && ::bind(fd, (struct sockaddr*) &bind_addr.inner, bind_addr.get_len()) == -1) { + if (bind_addr && ::bind(fd, (struct sockaddr*) &bind_addr->inner, bind_addr->get_len()) == -1) { mylog(log_fatal,"socket bind error=%s\n", get_sock_error()); //perror("socket bind error"); myexit(1); } - if (strlen(interface_string) > 0 && ::setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, interface_string, strlen(interface_string)) < 0) { +#ifdef __linux__ + if (interface_string && ::setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, interface_string, strlen(interface_string)) < 0) { mylog(log_fatal,"socket interface bind error=%s\n", get_sock_error()); //perror("socket bind error"); myexit(1); } +#endif setnonblocking(fd); set_buf_size(fd, socket_buf_size); diff --git a/common.h b/common.h index 1f04186..cb1797a 100644 --- a/common.h +++ b/common.h @@ -451,7 +451,7 @@ int new_listen_socket(int &fd,u32_t ip,int port); int new_connected_socket(int &fd,u32_t ip,int port); int new_listen_socket2(int &fd,address_t &addr); -int new_connected_socket2(int &fd,address_t &addr,bool bind_enabled,address_t &bind_addr,char interface_string[]); +int new_connected_socket2(int &fd,address_t &addr,address_t *bind_addr,char *out_interface); struct not_copy_able_t { diff --git a/main.cpp b/main.cpp index 1285de2..60fe327 100644 --- a/main.cpp +++ b/main.cpp @@ -37,8 +37,6 @@ static void print_help() printf(" --report turn on send/recv report, and set a period for reporting, unit: s\n"); printf("advanced options:\n"); - printf(" -b,--bind ip:port force all output packets to go through this address. Set port to 0 to use a random one.\n"); - printf(" --interface force all output packets to go through this interface.\n"); printf(" --mode fec-mode,available values: 0,1; mode 0(default) costs less bandwidth,no mtu problem.\n"); printf(" mode 1 usually introduces less latency, but you have to care about mtu.\n"); printf(" --mtu mtu. for mode 0, the program will split packet to segment smaller than mtu value.\n"); @@ -68,6 +66,10 @@ static void print_help() printf(" --delay-capacity max number of delayed packets, 0 means unlimited, default: 0\n"); printf(" --disable-fec completely disable fec, turn the program into a normal udp tunnel\n"); printf(" --sock-buf buf size for socket, >=10 and <=10240, unit: kbyte, default: 1024\n"); + printf(" --out-addr ip:port force all output packets to go through this address. Set port to 0 to use a random one.\n"); +#ifdef __linux__ + printf(" --out-interface force all output packets to go through this interface.\n"); +#endif printf("log and help options:\n"); printf(" --log-level 0: never 1: fatal 2: error 3: warn \n"); printf(" 4: info (default) 5: debug 6: trace\n"); diff --git a/makefile b/makefile index 38d429f..9853d7b 100755 --- a/makefile +++ b/makefile @@ -4,7 +4,7 @@ cc_mips24kc_be=/toolchains/lede-sdk-17.01.2-ar71xx-generic_gcc-5.4.0_musl-1.1.16 cc_mips24kc_le=/toolchains/lede-sdk-17.01.2-ramips-mt7621_gcc-5.4.0_musl-1.1.16.Linux-x86_64/staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl-1.1.16/bin/mipsel-openwrt-linux-musl-g++ cc_arm= /toolchains/arm-2014.05/bin/arm-none-linux-gnueabi-g++ cc_mingw_cross=i686-w64-mingw32-g++-posix -cc_mac_cross=o64-clang++ -stdlib=libc++ -std=c++11 +cc_mac_cross=o64-clang++ -stdlib=libc++ #cc_bcm2708=/home/wangyu/raspberry/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g++ FLAGS= -std=c++11 -Wall -Wextra -Wno-unused-variable -Wno-unused-parameter -Wno-missing-field-initializers ${OPT} diff --git a/misc.cpp b/misc.cpp index f60d8da..b165b89 100644 --- a/misc.cpp +++ b/misc.cpp @@ -28,10 +28,10 @@ int output_interval_max=0*1000; int fix_latency=0; -char interface_string[16]; -bool has_b=false; -address_t local_addr,remote_addr,bind_addr; +address_t local_addr,remote_addr; +address_t *out_addr=0; +char *out_interface=0; //u32_t local_ip_uint32,remote_ip_uint32=0; //char local_ip[100], remote_ip[100]; //int local_port = -1, remote_port = -1; @@ -651,14 +651,15 @@ void process_arg(int argc, char *argv[]) {"report", required_argument, 0, 1}, {"delay-capacity", required_argument, 0, 1}, {"mtu", required_argument, 0, 1}, - {"interface", required_argument, 0, 1}, {"mode", required_argument, 0,1}, {"timeout", required_argument, 0,1}, {"decode-buf", required_argument, 0,1}, {"queue-len", required_argument, 0,'q'}, {"fec", required_argument, 0,'f'}, {"jitter", required_argument, 0,'j'}, - {"bind", required_argument, 0,'b'}, + {"out-addr", required_argument, 0,1}, + {"out-interface", required_argument, 0, 1}, + {"key", required_argument, 0,'k'}, {"header-overhead", required_argument, 0, 1}, //{"debug-fec", no_argument, 0, 1}, {"debug-fec-enc", no_argument, 0, 1}, @@ -829,10 +830,6 @@ void process_arg(int argc, char *argv[]) no_r = 0; remote_addr.from_str(optarg); break; - case 'b': - has_b = true; - bind_addr.from_str(optarg); - break; case 'h': break; case 1: @@ -953,13 +950,21 @@ void process_arg(int argc, char *argv[]) myexit(-1); } } - else if(strcmp(long_options[option_index].name,"interface")==0) + else if(strcmp(long_options[option_index].name,"out-addr")==0) { - sscanf(optarg,"%s\n",interface_string); - mylog(log_debug,"interface=%s\n",interface_string); - if(strlen(interface_string)==0) + //has_b = true; + mylog(log_debug,"out-addr=%s\n",optarg); + out_addr=new address_t(); + out_addr->from_str(optarg); + } + else if(strcmp(long_options[option_index].name,"out-interface")==0) + { + out_interface=new char[strlen(optarg)+10]; + sscanf(optarg,"%s\n",out_interface); + mylog(log_debug,"out-interface=%s\n",out_interface); + if(strlen(out_interface)==0) { - mylog(log_fatal,"interface_string len=0??\n"); + mylog(log_fatal,"out_interface string len=0??\n"); myexit(-1); } } diff --git a/misc.h b/misc.h index 1bfd495..c0ff9da 100644 --- a/misc.h +++ b/misc.h @@ -39,10 +39,11 @@ extern int fix_latency; //extern char local_ip[100], remote_ip[100]; //extern int local_port, remote_port; -extern char interface_string[16]; -extern bool has_b; -extern address_t local_addr,remote_addr,bind_addr; +extern address_t local_addr,remote_addr; + +extern address_t *out_addr; +extern char *out_interface; extern conn_manager_t conn_manager; extern delay_manager_t delay_manager; diff --git a/tunnel_client.cpp b/tunnel_client.cpp index 93a4bde..638e722 100644 --- a/tunnel_client.cpp +++ b/tunnel_client.cpp @@ -295,7 +295,7 @@ int tunnel_client_event_loop() int & remote_fd=conn_info.remote_fd; fd64_t &remote_fd64=conn_info.remote_fd64; - assert(new_connected_socket2(remote_fd,remote_addr,has_b,bind_addr,interface_string)==0); + assert(new_connected_socket2(remote_fd,remote_addr,out_addr,out_interface)==0); remote_fd64=fd_manager.create(remote_fd); mylog(log_debug,"remote_fd64=%llu\n",remote_fd64); diff --git a/tunnel_server.cpp b/tunnel_server.cpp index 97e674b..b1c8a1b 100644 --- a/tunnel_server.cpp +++ b/tunnel_server.cpp @@ -232,7 +232,7 @@ static void local_listen_cb(struct ev_loop *loop, struct ev_io *watcher, int rev } int new_udp_fd; - ret=new_connected_socket2(new_udp_fd,remote_addr,has_b,bind_addr,interface_string); + ret=new_connected_socket2(new_udp_fd,remote_addr,out_addr,out_interface); if (ret != 0) { mylog(log_warn, "[%s]new_connected_socket failed\n",addr.get_str());