|
|
|
@ -36,8 +36,18 @@ struct stcp_server { |
|
|
|
uint8_t reality_enabled; |
|
|
|
uint8_t reality_enabled; |
|
|
|
struct reality_server_config reality_srv; |
|
|
|
struct reality_server_config reality_srv; |
|
|
|
char reality_dest[REALITY_DEST_MAX]; |
|
|
|
char reality_dest[REALITY_DEST_MAX]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct stcp_conn *conns; // список принятых (accept) коннектов — закрываются при destroy
|
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void stcp_server_remove_conn(struct stcp_conn *c) { |
|
|
|
|
|
|
|
if (!c || !c->srv) return; |
|
|
|
|
|
|
|
struct stcp_conn **pp = &c->srv->conns; |
|
|
|
|
|
|
|
while (*pp && *pp != c) pp = &(*pp)->srv_next; |
|
|
|
|
|
|
|
if (*pp) *pp = c->srv_next; |
|
|
|
|
|
|
|
c->srv = NULL; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void server_accept_cb(socket_t sock, void *arg); |
|
|
|
static void server_accept_cb(socket_t sock, void *arg); |
|
|
|
static void server_conn_read_cb(socket_t sock, void *arg); |
|
|
|
static void server_conn_read_cb(socket_t sock, void *arg); |
|
|
|
static void server_hs_phase1_cb(struct stcp_conn *c, uint8_t *data, size_t len); |
|
|
|
static void server_hs_phase1_cb(struct stcp_conn *c, uint8_t *data, size_t len); |
|
|
|
@ -290,6 +300,10 @@ static void server_accept_cb(socket_t listen_sock, void *arg) { |
|
|
|
stcp_recv_set(c, SC_PUBKEY_ENC_SIZE + STCP_HS_ENC_CLIENT, 0, server_hs_phase1_cb); |
|
|
|
stcp_recv_set(c, SC_PUBKEY_ENC_SIZE + STCP_HS_ENC_CLIENT, 0, server_hs_phase1_cb); |
|
|
|
} |
|
|
|
} |
|
|
|
c->hs_timer = uasync_set_timeout(c->ua, STCP_HS_TIMEOUT, c, hs_timeout_cb, "stcp_hs"); |
|
|
|
c->hs_timer = uasync_set_timeout(c->ua, STCP_HS_TIMEOUT, c, hs_timeout_cb, "stcp_hs"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
c->srv = srv; |
|
|
|
|
|
|
|
c->srv_next = srv->conns; |
|
|
|
|
|
|
|
srv->conns = c; |
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "stcp_server: accepted connection fd=%d", (int)cli_sock); |
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "stcp_server: accepted connection fd=%d", (int)cli_sock); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -356,6 +370,10 @@ void stcp_server_destroy(struct stcp_server *srv) { |
|
|
|
if (!srv) return; |
|
|
|
if (!srv) return; |
|
|
|
if (srv->listen_id) uasync_remove_socket_t(srv->ua, srv->listen_sock); |
|
|
|
if (srv->listen_id) uasync_remove_socket_t(srv->ua, srv->listen_sock); |
|
|
|
if (srv->listen_sock != SOCKET_INVALID) socket_close_wrapper(srv->listen_sock); |
|
|
|
if (srv->listen_sock != SOCKET_INVALID) socket_close_wrapper(srv->listen_sock); |
|
|
|
|
|
|
|
while (srv->conns) { |
|
|
|
|
|
|
|
struct stcp_conn *c = srv->conns; |
|
|
|
|
|
|
|
stcp_conn_do_close(c, 0); // снимает c из списка (c->srv) и каскадно закрывает серверный ETCP_LINK
|
|
|
|
|
|
|
|
} |
|
|
|
u_free(srv); |
|
|
|
u_free(srv); |
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "stcp_server destroyed"); |
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "stcp_server destroyed"); |
|
|
|
} |
|
|
|
} |
|
|
|
|