diff --git a/src/transport_layer/etcp_connections.c b/src/transport_layer/etcp_connections.c index 4ecc2480..3b8a43c2 100644 --- a/src/transport_layer/etcp_connections.c +++ b/src/transport_layer/etcp_connections.c @@ -62,6 +62,9 @@ static void tcp_server_on_link(struct stcp_link *link, void *arg) { etcp_update_log_name(conn); { struct conn_queue_entry* ce = (struct conn_queue_entry*)conn->conn_queue_entry->data; ce->peer_node_id = node_id; queue_remove_data(conn->conn_queue, conn->conn_queue_entry); queue_data_put_with_index(conn->conn_queue, conn->conn_queue_entry); } DEBUG_INFO(DEBUG_CATEGORY_ETCP, "tcp_server_on_link: new ETCP_CONN peer=0x%016llx", (unsigned long long)node_id); + } else { + struct ETCP_LINK* nl = conn->links; + while (nl) { struct ETCP_LINK* nx = nl->next; if (nl->is_tcp) etcp_link_close(nl); nl = nx; } } struct ETCP_LINK *tlink = etcp_link_new(conn, NULL, NULL, 1); @@ -1127,6 +1130,7 @@ static void tcp_link_close_cb(struct stcp_link *sl, int err, void *arg) { static int etcp_tcp_send(struct ETCP_DGRAM* dgram) { struct ETCP_LINK *link = dgram->link; + if (!link->tcp_link || !stcp_link_is_ready(link->tcp_link)) return -1; link->pkt_sent_since_keepalive = 1; dgram->flag_up = link->recv_keepalive; int rc; diff --git a/src/transport_layer/stcp_link.c b/src/transport_layer/stcp_link.c index 7bef6408..edc1dd05 100644 --- a/src/transport_layer/stcp_link.c +++ b/src/transport_layer/stcp_link.c @@ -78,6 +78,18 @@ static void link_rx_cb(struct ll_queue *q, void *arg) { queue_resume_callback(q); } +// ====== STCP close → link down ====== + +#include "etcp_connections.h" + +static void stcp_link_on_stcp_close(struct stcp_conn *conn, int err, void *arg) { + struct stcp_link *link = (struct stcp_link *)arg; + (void)conn; (void)err; + link->conn = NULL; link->ready = 0; + if (link->etcp_link) { link->etcp_link->recv_keepalive = 0; link->etcp_link->link_status = 0; } + if (link->on_close_cb) link->on_close_cb(link, err, link->close_arg); +} + // ====== server accept → link ====== static void server_accept_cb(struct stcp_conn *conn, void *arg) { @@ -88,6 +100,8 @@ static void server_accept_cb(struct stcp_conn *conn, void *arg) { link->ready = 1; link->conn = conn; + stcp_conn_set_on_close(conn, stcp_link_on_stcp_close, link); + struct ll_queue *rx = queue_new(conn->ua, 0, 0, 0, "srx"); queue_set_callback(rx, link_rx_cb, link); stcp_conn_set_rx_queue(conn, rx); @@ -108,6 +122,8 @@ static void client_ready_cb(struct stcp_conn *conn, void *arg) { link->ready = 1; link->conn = conn; + stcp_conn_set_on_close(conn, stcp_link_on_stcp_close, link); + struct ll_queue *rx = queue_new(conn->ua, 0, 0, 0, "crx"); queue_set_callback(rx, link_rx_cb, link); stcp_conn_set_rx_queue(conn, rx);