diff --git a/src/etcp_router.c b/src/etcp_router.c index 985a0e59..3b9f977c 100644 --- a/src/etcp_router.c +++ b/src/etcp_router.c @@ -486,6 +486,14 @@ int etcp_route_send(struct UTUN_INSTANCE* inst, uint64_t dst_node_id, struct ll_ return 0; } + struct ETCP_CONN* etcp_conn = route_bgp_find_conn_for_node(inst->bgp, dst_node_id); + if (!etcp_conn) { + DEBUG_WARN(DEBUG_CATEGORY_ETCP, "etcp_route_send: no BGP route to %016llx svc_id=%u, dropping", + (unsigned long long)dst_node_id, svc_id); + queue_dgram_free(entry); queue_entry_free(entry); + return -1; + } + struct ETCP_ROUTER_CONN* rconn = etcp_router_conn_get(inst, dst_node_id, svc_id); if (!rconn) { queue_dgram_free(entry); queue_entry_free(entry); return -1; } diff --git a/src/remote_proxy.c b/src/remote_proxy.c index d17aef2a..f87d9ee9 100644 --- a/src/remote_proxy.c +++ b/src/remote_proxy.c @@ -141,7 +141,10 @@ static void rp_sock_pause_cb(void* arg) { } if (rc->pause_buf && rc->pause_len > 0) { DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "SOCK:PAUSE_FLUSH fd=%d sid=%08x len=%zu qcnt=%d", (int)rc->sock, rc->stream_id, rc->pause_len, qcnt); - rp_send_msg(inst, rc->peer_node_id, TCP_PROXY_SUBCMD_DATA, rc->stream_id, rc->pause_buf, rc->pause_len); + if (rp_send_msg(inst, rc->peer_node_id, TCP_PROXY_SUBCMD_DATA, rc->stream_id, rc->pause_buf, rc->pause_len) < 0) { + DEBUG_ERROR(DEBUG_CATEGORY_SOCKET, "SOCK:PAUSE_FLUSH send failed — closing sid=%08x", rc->stream_id); + rc->error = 1; u_free(rc->pause_buf); rc->pause_buf = NULL; rc->pause_len = 0; rp_conn_free(rc); return; + } u_free(rc->pause_buf); rc->pause_buf = NULL; rc->pause_len = 0; } rc->read_id = uasync_add_socket_t(rc->ua, rc->sock, rp_sock_read_cb, rp_sock_write_cb, rp_sock_error_cb, rc); @@ -171,7 +174,10 @@ static void rp_sock_read_cb(socket_t sock, void* arg) { return; } DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "SOCK:RECV fd=%d sid=%08x len=%zd total=%d", (int)rc->sock, rc->stream_id, n, rp_conn_total(rc)); - rp_send_msg(inst, rc->peer_node_id, TCP_PROXY_SUBCMD_DATA, rc->stream_id, buf, (size_t)n); + if (rp_send_msg(inst, rc->peer_node_id, TCP_PROXY_SUBCMD_DATA, rc->stream_id, buf, (size_t)n) < 0) { + DEBUG_ERROR(DEBUG_CATEGORY_SOCKET, "SOCK:RECV send failed — closing sid=%08x", rc->stream_id); + rc->error = 1; rp_conn_free(rc); return; + } } else if (n == 0) { DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "SOCK:EOF fd=%d sid=%08x total=%d cli_closed=%d sock_closed=%d", (int)rc->sock, rc->stream_id, rp_conn_total(rc), rc->cli_closed, rc->sock_closed); diff --git a/src/route_bgp.c b/src/route_bgp.c index 174c0934..f2387059 100644 --- a/src/route_bgp.c +++ b/src/route_bgp.c @@ -436,6 +436,7 @@ void route_bgp_remove_conn(struct ETCP_CONN* conn) { struct ll_entry* entry = node_entry; if (entry) { queue_remove_data(bgp->nodes, entry); queue_entry_free(entry); } nodes_removed++; + etcp_router_conn_close_all_for_node(bgp->instance, key); DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "Removed node %016llx after link down", (unsigned long long)key); } node_entry = next;