|
|
|
@ -427,9 +427,18 @@ int etcp_find_free_local_link_id(struct ETCP_CONN* etcp) { |
|
|
|
|
|
|
|
|
|
|
|
// ===============================
|
|
|
|
// ===============================
|
|
|
|
|
|
|
|
|
|
|
|
struct ETCP_SOCKET* etcp_socket_add(struct UTUN_INSTANCE* instance, struct sockaddr_storage* ip, uint32_t netif_index, int so_mark, uint8_t type, int mtu, int loss_rate, char* name) { |
|
|
|
struct ETCP_SOCKET* etcp_socket_add(struct UTUN_INSTANCE* instance, struct CFG_SERVER* server) { |
|
|
|
DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, ""); |
|
|
|
DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, ""); |
|
|
|
if (!instance) return NULL; |
|
|
|
if (!instance || !server) return NULL; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct sockaddr_storage* ip = &server->ip; |
|
|
|
|
|
|
|
uint32_t netif_index = server->netif_index; |
|
|
|
|
|
|
|
int so_mark = server->so_mark; |
|
|
|
|
|
|
|
int fib = server->fib; |
|
|
|
|
|
|
|
uint8_t type = server->type; |
|
|
|
|
|
|
|
int mtu = server->mtu ? server->mtu : instance->config->global.mtu; |
|
|
|
|
|
|
|
int loss_rate = server->loss_rate; |
|
|
|
|
|
|
|
char* name = server->name; |
|
|
|
|
|
|
|
|
|
|
|
struct ETCP_SOCKET* e_sock = u_calloc(1, sizeof(struct ETCP_SOCKET)); |
|
|
|
struct ETCP_SOCKET* e_sock = u_calloc(1, sizeof(struct ETCP_SOCKET)); |
|
|
|
if (!e_sock) { |
|
|
|
if (!e_sock) { |
|
|
|
@ -477,6 +486,15 @@ struct ETCP_SOCKET* etcp_socket_add(struct UTUN_INSTANCE* instance, struct socka |
|
|
|
if (so_mark > 0) { |
|
|
|
if (so_mark > 0) { |
|
|
|
socket_set_mark(e_sock->fd, so_mark); |
|
|
|
socket_set_mark(e_sock->fd, so_mark); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Set FIB for FreeBSD
|
|
|
|
|
|
|
|
#ifdef __FreeBSD__ |
|
|
|
|
|
|
|
if (fib > 0) { |
|
|
|
|
|
|
|
if (setsockopt(e_sock->fd, SOL_SOCKET, SO_SETFIB, &fib, sizeof(fib)) < 0) { |
|
|
|
|
|
|
|
DEBUG_WARN(DEBUG_CATEGORY_CONNECTION, "Failed to set FIB %d: %s", fib, strerror(errno)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
// Bind to interface if specified (Linux only)
|
|
|
|
// Bind to interface if specified (Linux only)
|
|
|
|
#ifndef _WIN32 |
|
|
|
#ifndef _WIN32 |
|
|
|
@ -1257,7 +1275,7 @@ int init_connections(struct UTUN_INSTANCE* instance) { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
struct ETCP_SOCKET* e_sock = etcp_socket_add(instance, &server->ip, server->netif_index, server->so_mark, server->type, server->mtu ? server->mtu : instance->config->global.mtu, server->loss_rate, server->name); |
|
|
|
struct ETCP_SOCKET* e_sock = etcp_socket_add(instance, server); |
|
|
|
if (e_sock && default_ip != 0) { |
|
|
|
if (e_sock && default_ip != 0) { |
|
|
|
struct in_addr addr; |
|
|
|
struct in_addr addr; |
|
|
|
addr.s_addr = default_ip; |
|
|
|
addr.s_addr = default_ip; |
|
|
|
|