|
|
|
|
@ -374,7 +374,7 @@ 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) { |
|
|
|
|
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) { |
|
|
|
|
DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, ""); |
|
|
|
|
if (!instance) return NULL; |
|
|
|
|
|
|
|
|
|
@ -456,6 +456,7 @@ struct ETCP_SOCKET* etcp_socket_add(struct UTUN_INSTANCE* instance, struct socka
|
|
|
|
|
e_sock->pkt_format_errors = 0; |
|
|
|
|
e_sock->type = type; |
|
|
|
|
e_sock->mtu = mtu; |
|
|
|
|
e_sock->loss_rate = loss_rate; |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_BGP, "Add Socket type=%d", type); |
|
|
|
|
|
|
|
|
|
// Add to instance's socket list
|
|
|
|
|
@ -655,9 +656,17 @@ int etcp_encrypt_send(struct ETCP_DGRAM* dgram) {
|
|
|
|
|
struct sockaddr_in* sin = (struct sockaddr_in*)addr; |
|
|
|
|
// inet_ntop removed - use ip_to_str
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ssize_t sent = socket_sendto(dgram->link->conn->fd, enc_buf, enc_buf_len + dgram->noencrypt_len, |
|
|
|
|
|
|
|
|
|
ssize_t sent=-1; |
|
|
|
|
int loss_rate = dgram->link->conn->loss_rate; |
|
|
|
|
int rnd = rand() % 100; |
|
|
|
|
if (loss_rate == 0 || rnd >= loss_rate) { |
|
|
|
|
sent = socket_sendto(dgram->link->conn->fd, enc_buf, enc_buf_len + dgram->noencrypt_len, |
|
|
|
|
(struct sockaddr*)addr, addr_len); |
|
|
|
|
} else { |
|
|
|
|
DEBUG_WARN(DEBUG_CATEGORY_ETCP, "[%s] Packet dropped by loss_rate (rnd=%d, loss_rate=%d%%)",
|
|
|
|
|
dgram->link->etcp->log_name, rnd, loss_rate); |
|
|
|
|
} |
|
|
|
|
if (sent < 0) {
|
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "sendto failed, sock_err=%d", socket_get_error()); |
|
|
|
|
dgram->link->send_errors++; errcode=4; goto es_err; |
|
|
|
|
@ -892,6 +901,7 @@ static void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
|
|
|
|
|
|
|
|
|
|
memory_pool_free(e_sock->instance->pkt_pool, pkt); |
|
|
|
|
link->initialized = 1;// получен init request (server), считаем линк уже готовым к работе
|
|
|
|
|
link->link_state = 3; // connected
|
|
|
|
|
if (link->etcp->initialized == 0) { |
|
|
|
|
etcp_conn_ready(link->etcp); |
|
|
|
|
} |
|
|
|
|
@ -1089,7 +1099,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); |
|
|
|
|
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); |
|
|
|
|
if (e_sock && default_ip != 0) { |
|
|
|
|
struct in_addr addr; |
|
|
|
|
addr.s_addr = default_ip; |
|
|
|
|
|