diff --git a/src/etcp.c b/src/etcp.c index d895a7e..fcf135c 100644 --- a/src/etcp.c +++ b/src/etcp.c @@ -129,7 +129,7 @@ struct ETCP_CONN* etcp_connection_create(struct UTUN_INSTANCE* instance, char* n queue_set_callback(etcp->input_queue, input_queue_cb, etcp); queue_set_callback(etcp->input_send_q, input_send_q_cb, etcp); queue_set_callback(etcp->input_wait_ack, wait_ack_cb, etcp); - queue_set_callback(etcp->ack_q, send_ack_req_cb, etcp); +// queue_set_callback(etcp->ack_q, send_ack_req_cb, etcp);// отправляем через таймаут etcp->link_ready_for_send_fn = etcp_link_ready_callback; @@ -631,9 +631,12 @@ static void input_send_q_cb(struct ll_queue* q, void* arg) {// etcp->input_send_ DEBUG_TRACE(DEBUG_CATEGORY_ETCP, ""); struct ETCP_CONN* etcp=(struct ETCP_CONN*)arg; etcp_conn_process_send_queue(etcp); - if (etcp->tx_state==ETCP_TX_STATE_DATA_WAIT) queue_resume_callback(etcp->input_send_q); + if (etcp->tx_state==ETCP_TX_STATE_DATA_WAIT) { + queue_resume_callback(etcp->input_send_q); + DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "resume input_send_q"); + } else DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "no resume - link busy"); } - +/* static void send_ack_req_cb(struct ll_queue* q, void* arg) {// etcp->ack_q data ready DEBUG_TRACE(DEBUG_CATEGORY_ETCP, ""); struct ETCP_CONN* etcp=(struct ETCP_CONN*)arg; @@ -642,7 +645,7 @@ static void send_ack_req_cb(struct ll_queue* q, void* arg) {// etcp->ack_q data etcp_conn_process_send_queue(etcp); if (etcp->tx_state==ETCP_TX_STATE_DATA_WAIT) queue_resume_callback(etcp->ack_q); } - +*/ void etcp_on_link_down(struct ETCP_CONN* etcp) { DEBUG_TRACE(DEBUG_CATEGORY_ETCP, ""); int up=0; @@ -679,11 +682,13 @@ static void etcp_link_ready_callback(struct ETCP_CONN* etcp) { etcp->tx_state = ETCP_TX_STATE_DATA_WAIT; queue_resume_callback(etcp->input_send_q); queue_resume_callback(etcp->ack_q); + DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "resume input_send_q+ack_q; link_wait->data_wait"); } static void ack_response_timer_cb(void* arg) {// проверяем неотправленные ack response и отправляем если надо. DEBUG_TRACE(DEBUG_CATEGORY_ETCP, ""); struct ETCP_CONN* etcp = (struct ETCP_CONN*)arg; + if (etcp->ack_q->count==0) return;// нечего отправлять etcp_conn_process_send_queue(etcp);// проталкиваем (она же должна отправлять только ack если больше ничего нет) // если ack все еще заняты - обновляем таймаут if (etcp->ack_q->count) etcp->ack_resp_timer = uasync_set_timeout(etcp->instance->ua, ACK_DELAY_TB, etcp, ack_response_timer_cb);