mirror of
https://github.com/ntop/n2n.git
synced 2024-09-19 16:41:11 +02:00
Add support for TOS setting in edge
This commit is contained in:
parent
eea0c9b46b
commit
2f671cf6d9
21
edge.c
21
edge.c
|
@ -133,6 +133,9 @@ static void help() {
|
|||
#ifndef WIN32
|
||||
"[-f]"
|
||||
#endif /* #ifndef WIN32 */
|
||||
#ifdef __linux__
|
||||
"[-T <tos>]"
|
||||
#endif
|
||||
"[-m <MAC address>] "
|
||||
"-l <supernode host:port>\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> | TOS for packets (e.g. 0x48 for SSH like priority)\n");
|
||||
#endif
|
||||
printf("-v | Make more verbose. Repeat as required.\n");
|
||||
printf("-t <port> | 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)) != '?') {
|
||||
|
|
18
edge_utils.c
18
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);
|
||||
|
|
5
n2n.c
5
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;
|
||||
|
|
1
n2n.h
1
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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user