|
|
|
|
@ -70,8 +70,8 @@ static void etcp_link_send_init(struct ETCP_LINK* link, uint8_t reset) {
|
|
|
|
|
dgram->data[offset++] = (node_id >> 8) & 0xFF; |
|
|
|
|
dgram->data[offset++] = node_id & 0xFF; |
|
|
|
|
|
|
|
|
|
dgram->data[offset++] = (link->mtu >> 8) & 0xFF; |
|
|
|
|
dgram->data[offset++] = link->mtu & 0xFF; |
|
|
|
|
dgram->data[offset++] = (link->mtu_local >> 8) & 0xFF; |
|
|
|
|
dgram->data[offset++] = link->mtu_local & 0xFF; |
|
|
|
|
|
|
|
|
|
dgram->data[offset++] = (link->keepalive_interval >> 8) & 0xFF; |
|
|
|
|
dgram->data[offset++] = link->keepalive_interval & 0xFF; |
|
|
|
|
@ -415,7 +415,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) { |
|
|
|
|
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) { |
|
|
|
|
DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, ""); |
|
|
|
|
if (!instance) return NULL; |
|
|
|
|
|
|
|
|
|
@ -496,6 +496,7 @@ struct ETCP_SOCKET* etcp_socket_add(struct UTUN_INSTANCE* instance, struct socka
|
|
|
|
|
e_sock->errorcode = 0; |
|
|
|
|
e_sock->pkt_format_errors = 0; |
|
|
|
|
e_sock->type = type; |
|
|
|
|
e_sock->mtu = mtu; |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_BGP, "Add Socket type=%d", type); |
|
|
|
|
|
|
|
|
|
// Add to instance's socket list
|
|
|
|
|
@ -561,7 +562,10 @@ struct ETCP_LINK* etcp_link_new(struct ETCP_CONN* etcp, struct ETCP_SOCKET* conn
|
|
|
|
|
link->conn = conn; |
|
|
|
|
link->etcp = etcp; |
|
|
|
|
link->is_server = is_server; |
|
|
|
|
link->mtu = 1500; |
|
|
|
|
int mtu = conn->mtu; |
|
|
|
|
if (mtu == 0) mtu = 1500; |
|
|
|
|
link->mtu_local = mtu; |
|
|
|
|
link->mtu = mtu; |
|
|
|
|
link->initialized = 0; |
|
|
|
|
link->init_timer = NULL; |
|
|
|
|
link->init_timeout = 0; |
|
|
|
|
@ -921,6 +925,9 @@ static void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
|
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_CONNECTION, "set keepalive for link=%d", link->keepalive_interval); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
link->mtu_remote = (ack_hdr->mtu[0] << 8) | ack_hdr->mtu[1]; |
|
|
|
|
link->mtu = link->mtu_local < link->mtu_remote ? link->mtu_local : link->mtu_remote; |
|
|
|
|
|
|
|
|
|
struct { |
|
|
|
|
uint8_t code; |
|
|
|
|
uint8_t id[8]; |
|
|
|
|
@ -937,9 +944,9 @@ static void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
|
|
|
|
|
ack_repl_hdr->code = ETCP_INIT_RESPONSE_NOINIT; // 0x05 - without reset
|
|
|
|
|
} |
|
|
|
|
memcpy(ack_repl_hdr->id, &e_sock->instance->node_id, 8); |
|
|
|
|
int mtu=e_sock->instance->config->global.mtu; |
|
|
|
|
ack_repl_hdr->mtu[0]=mtu>>8; |
|
|
|
|
ack_repl_hdr->mtu[1]=mtu; |
|
|
|
|
|
|
|
|
|
ack_repl_hdr->mtu[0]=link->mtu_local>>8; |
|
|
|
|
ack_repl_hdr->mtu[1]=link->mtu_local; |
|
|
|
|
ack_repl_hdr->link_id = link->local_link_id; |
|
|
|
|
// Add client's IP:port (so client behind NAT can know its external address)
|
|
|
|
|
if (addr.ss_family == AF_INET) { |
|
|
|
|
@ -1023,7 +1030,8 @@ process_decrypted:
|
|
|
|
|
for (int i = 0; i < 8; i++) { |
|
|
|
|
server_node_id = (server_node_id << 8) | pkt->data[offset++]; |
|
|
|
|
} |
|
|
|
|
link->mtu = (pkt->data[offset++] << 8) | pkt->data[offset++]; |
|
|
|
|
link->mtu_remote = (pkt->data[offset++] << 8) | pkt->data[offset++]; |
|
|
|
|
link->mtu = link->mtu_local < link->mtu_remote ? link->mtu_local : link->mtu_remote; |
|
|
|
|
link->remote_link_id = pkt->data[offset++]; |
|
|
|
|
|
|
|
|
|
// Parse NAT IP:port from response (new format includes 4+2 bytes)
|
|
|
|
|
@ -1143,7 +1151,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); |
|
|
|
|
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); |
|
|
|
|
if (e_sock && default_ip != 0) { |
|
|
|
|
struct in_addr addr; |
|
|
|
|
addr.s_addr = default_ip; |
|
|
|
|
|