1
This commit is contained in:
1 parent
226a5744b5
commit
4556f327c2
10 files changed
+63
-94
No files matched your search
+3
-2
@@ -516,11 +516,12 @@ int etcp_router_input_q_count(struct UTUN_INSTANCE* inst, uint64_t node_id) {
|
||||
}
|
||||
|
||||
void etcp_router_waiter_register(struct UTUN_INSTANCE* inst, uint64_t peer_node_id,
|
||||
struct queue_waiter_handle* h) {
|
||||
struct queue_waiter_handle* h,
|
||||
queue_threshold_callback_fn callback, void* arg) {
|
||||
if (!inst || !inst->bgp || !h) return;
|
||||
struct ETCP_CONN* conn = route_bgp_find_conn_for_node(inst->bgp, peer_node_id);
|
||||
if (!conn || !conn->normalizer || !conn->normalizer->input) return;
|
||||
queue_waiter_wait(conn->normalizer->input, h);
|
||||
queue_waiter_wait(conn->normalizer->input, h, callback, arg);
|
||||
}
|
||||
|
||||
void etcp_router_waiter_cancel(struct UTUN_INSTANCE* inst, uint64_t peer_node_id,
|
||||
|
||||
+2
-1
@@ -93,7 +93,8 @@ int etcp_router_input_q_count(struct UTUN_INSTANCE* inst, uint64_t node_id);
|
||||
|
||||
// Backpressure: зарегистрировать/отменить waiter на normalizer->input очереди
|
||||
void etcp_router_waiter_register(struct UTUN_INSTANCE* inst, uint64_t peer_node_id,
|
||||
struct queue_waiter_handle* h);
|
||||
struct queue_waiter_handle* h,
|
||||
queue_threshold_callback_fn callback, void* arg);
|
||||
void etcp_router_waiter_cancel(struct UTUN_INSTANCE* inst, uint64_t peer_node_id,
|
||||
struct queue_waiter_handle* h);
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ struct PKTNORM* pn_init(struct ETCP_CONN* etcp) {
|
||||
pn->recvpart = NULL;
|
||||
pn->flush_timer = NULL;
|
||||
|
||||
queue_waiter_handle_init(&pn->input_waiter_handle, etcp_input_ready_cb, pn);
|
||||
pn->input_waiter_handle.internal = NULL;
|
||||
|
||||
return pn;
|
||||
}
|
||||
@@ -215,7 +215,7 @@ static void packer_cb(struct ll_queue* q, void* arg) {
|
||||
struct PKTNORM* pn = (struct PKTNORM*)arg;
|
||||
if (!pn) return;
|
||||
DEBUG_TRACE(DEBUG_CATEGORY_NORMALIZER, "input_q->pn: waiting etcp input threshold");
|
||||
queue_waiter_wait(pn->etcp->input_queue, &pn->input_waiter_handle);
|
||||
queue_waiter_wait(pn->etcp->input_queue, &pn->input_waiter_handle, etcp_input_ready_cb, pn);
|
||||
}
|
||||
|
||||
// Helper to send block to ETCP as ETCP_FRAGMENT
|
||||
|
||||
@@ -227,7 +227,6 @@ static err_t tcp_proxy_client_accept_cb(void *arg, struct tcp_pcb *newpcb, err_t
|
||||
tcp_nagle_disable(newpcb);
|
||||
|
||||
pc->to_lwip = queue_new(p->ua, 0, 0, 0, "to_lwip");
|
||||
queue_waiter_handle_init(&pc->tx_waiter, tcp_proxy_client_tx_waiter_cb, pc);
|
||||
|
||||
if (tcp_proxy_client_send_connect(pc) != 0) { DEBUG_ERROR(DEBUG_CATEGORY_SOCKET, "TCP proxy client: send_connect failed sid=%08x to %d.%d.%d.%d:%d", pc->stream_id, pc->dest_ip[0], pc->dest_ip[1], pc->dest_ip[2], pc->dest_ip[3], ntohs(pc->dest_port)); u_free(pc); return LERR_MEM; }
|
||||
|
||||
@@ -285,7 +284,8 @@ static err_t tcp_proxy_client_recv_cb(void *arg, struct tcp_pcb *pcb, struct pbu
|
||||
if (ret == 0) { tcp_recved(pcb, len); u_free(data); }
|
||||
else {
|
||||
pc->tx_buf = data; pc->tx_len = len;
|
||||
etcp_router_waiter_register(pc->proxy->inst, pc->proxy->via_node_id, &pc->tx_waiter);
|
||||
etcp_router_waiter_register(pc->proxy->inst, pc->proxy->via_node_id, &pc->tx_waiter,
|
||||
tcp_proxy_client_tx_waiter_cb, pc);
|
||||
}
|
||||
} else DEBUG_ERROR(DEBUG_CATEGORY_SOCKET, "PROXY recv malloc(%u) failed sid=%08x", len, pc->stream_id);
|
||||
pbuf_free(p);
|
||||
|
||||
@@ -199,7 +199,8 @@ static void tcp_proxy_server_sock_read_cb(socket_t sock, void* arg) {
|
||||
if (rc->pause_buf) { memcpy(rc->pause_buf, buf, n); rc->pause_len = n; }
|
||||
else DEBUG_ERROR(DEBUG_CATEGORY_SOCKET, "SOCK:PAUSE malloc(%zd) failed sid=%08x", n, rc->stream_id);
|
||||
if (rc->read_id) { uasync_remove_socket_t(rc->ua, rc->sock); rc->read_id = NULL; }
|
||||
etcp_router_waiter_register(inst, rc->peer_node_id, &rc->pause_waiter);
|
||||
etcp_router_waiter_register(inst, rc->peer_node_id, &rc->pause_waiter,
|
||||
tcp_proxy_server_pause_waiter_cb, rc);
|
||||
}
|
||||
} else if (n == 0) {
|
||||
DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "SOCK:EOF fd=%d sid=%08x total=%d cli_closed=%d sock_closed=%d",
|
||||
@@ -298,7 +299,6 @@ int tcp_proxy_server_handle_connect(struct UTUN_INSTANCE* inst, struct ll_entry*
|
||||
rc->ctx = ctx; rc->stream_id = stream_id; rc->peer_node_id = src_node_id;
|
||||
memcpy(rc->dest_ip, dest_ip, 4); rc->dest_port = dest_port;
|
||||
rc->ua = inst->ua; rc->sock = SOCKET_INVALID;
|
||||
queue_waiter_handle_init(&rc->pause_waiter, tcp_proxy_server_pause_waiter_cb, rc);
|
||||
|
||||
rc->sock = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (rc->sock == SOCKET_INVALID) { DEBUG_ERROR(DEBUG_CATEGORY_SOCKET, "TCP proxy server: socket() failed"); u_free(rc); queue_dgram_free(entry); queue_entry_free(entry); return -1; }
|
||||
|
||||
Reference in new issue
Block a user