diff --git a/edge.c b/edge.c index 14b70bc..876468a 100644 --- a/edge.c +++ b/edge.c @@ -133,6 +133,9 @@ static void help() { #ifndef WIN32 "[-f]" #endif /* #ifndef WIN32 */ +#ifdef __linux__ +"[-T ]" +#endif "[-m ] " "-l \n" " " @@ -168,6 +171,9 @@ static void help() { #endif printf("-E | Accept multicast MAC addresses (default=drop).\n"); printf("-S | Do not connect P2P. Always use the supernode.\n"); +#ifdef __linux__ + printf("-T | TOS for packets (e.g. 0x48 for SSH like priority)\n"); +#endif printf("-v | Make more verbose. Repeat as required.\n"); printf("-t | Management UDP Port (for multiple edges on a machine).\n"); @@ -311,6 +317,18 @@ static int setOption(int optkey, char *optargument, n2n_priv_config_t *ec, n2n_e break; } +#ifdef __linux__ + case 'T': + { + if((optargument[0] == '0') && (optargument[1] == 'x')) + conf->tos = strtol(&optargument[2], NULL, 16); + else + conf->tos = atoi(optargument); + + break; + } +#endif + case 's': /* Subnet Mask */ { if(0 != ec->got_s) { @@ -371,6 +389,9 @@ static int loadFromCLI(int argc, char *argv[], n2n_edge_conf_t *conf, n2n_priv_c "K:k:a:bc:Eu:g:m:M:s:d:l:p:fvhrt:i:S" #ifdef N2N_HAVE_AES "A" +#endif +#ifdef __linux__ + "T:" #endif , long_options, NULL)) != '?') { diff --git a/edge_utils.c b/edge_utils.c index 598244a..2e6bb86 100644 --- a/edge_utils.c +++ b/edge_utils.c @@ -55,7 +55,7 @@ static void check_peer_registration_needed(n2n_edge_t * eee, uint8_t from_supernode, const n2n_mac_t mac, const n2n_sock_t * peer); -static int edge_init_sockets(n2n_edge_t *eee, int udp_local_port, int mgmt_port); +static int edge_init_sockets(n2n_edge_t *eee, int udp_local_port, int mgmt_port, uint8_t tos); static void supernode2addr(n2n_sock_t * sn, const n2n_sn_name_t addrIn); static void check_known_peer_sock_change(n2n_edge_t * eee, uint8_t from_supernode, @@ -214,7 +214,7 @@ n2n_edge_t* edge_init(const tuntap_dev *dev, const n2n_edge_conf_t *conf, int *r if(eee->transop.no_encryption) traceEvent(TRACE_WARNING, "Encryption is disabled in edge"); - if(edge_init_sockets(eee, conf->local_port, conf->mgmt_port) < 0) { + if(edge_init_sockets(eee, conf->local_port, conf->mgmt_port, conf->tos) < 0) { traceEvent(TRACE_ERROR, "Error: socket setup failed"); goto edge_init_error; } @@ -1798,7 +1798,7 @@ void edge_term(n2n_edge_t * eee) { /* ************************************** */ -static int edge_init_sockets(n2n_edge_t *eee, int udp_local_port, int mgmt_port) { +static int edge_init_sockets(n2n_edge_t *eee, int udp_local_port, int mgmt_port, uint8_t tos) { if(udp_local_port > 0) traceEvent(TRACE_NORMAL, "Binding to local port %d", udp_local_port); @@ -1808,6 +1808,18 @@ static int edge_init_sockets(n2n_edge_t *eee, int udp_local_port, int mgmt_port) return(-1); } +#ifdef __linux__ + if(tos) { + /* https://www.tucny.com/Home/dscp-tos */ + int sockopt = tos; + + if(setsockopt(eee->udp_sock, IPPROTO_IP, IP_TOS, &sockopt, sizeof(sockopt)) == 0) + traceEvent(TRACE_NORMAL, "TOS set to 0x%x", tos); + else + traceEvent(TRACE_ERROR, "Could not set TOS 0x%x[%d]: %s", tos, errno, strerror(errno)); + } +#endif + eee->udp_mgmt_sock = open_socket(mgmt_port, 0 /* bind LOOPBACK */); if(eee->udp_mgmt_sock < 0) { traceEvent(TRACE_ERROR, "Failed to bind management UDP port %u", mgmt_port); diff --git a/n2n.c b/n2n.c index b157837..3559ea4 100644 --- a/n2n.c +++ b/n2n.c @@ -34,7 +34,7 @@ static const uint8_t ipv6_multicast_addr[6] = { 0x33, 0x33, 0x00, 0x00, 0x00, 0x SOCKET open_socket(int local_port, int bind_any) { SOCKET sock_fd; struct sockaddr_in local_address; - int sockopt = 1; + int sockopt; if((sock_fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0) { traceEvent(TRACE_ERROR, "Unable to create socket [%s][%d]\n", @@ -46,7 +46,8 @@ SOCKET open_socket(int local_port, int bind_any) { /* fcntl(sock_fd, F_SETFL, O_NONBLOCK); */ #endif - setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR,(char *)&sockopt, sizeof(sockopt)); + sockopt = 1; + setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(sockopt)); memset(&local_address, 0, sizeof(local_address)); local_address.sin_family = AF_INET; diff --git a/n2n.h b/n2n.h index 4bcee3b..e57be34 100644 --- a/n2n.h +++ b/n2n.h @@ -211,6 +211,7 @@ typedef struct n2n_edge_conf { uint8_t drop_multicast; /**< Multicast ethernet addresses. */ uint8_t allow_p2p; /**< Allow P2P connection */ uint8_t sn_num; /**< Number of supernode addresses defined. */ + uint8_t tos; /** TOS for sent packets */ char *encrypt_key; int register_interval; /**< Interval for supernode registration, also used for UDP NAT hole punching. */ int local_port;