Browse Source

stcp: close old TCP links on reconnect, check stcp_link_is_ready before send, notify ETCP on STCP close

1a: tcp_server_on_link — close existing TCP links before creating new ETCP_LINK
1b: etcp_tcp_send — skip send if stcp_link not ready
3a+3b+3c: stcp_conn_set_on_close → stcp_link_on_stcp_close → marks link DOWN → triggers reconnect
topo_upd
evgeny 2 months ago
parent
commit
087ac9b0e4
  1. 4
      src/transport_layer/etcp_connections.c
  2. 16
      src/transport_layer/stcp_link.c

4
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;

16
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);

Loading…
Cancel
Save