diff --git a/src/etcp.c b/src/etcp.c index fcf135c..2cab08d 100644 --- a/src/etcp.c +++ b/src/etcp.c @@ -662,6 +662,16 @@ void etcp_on_link_down(struct ETCP_CONN* etcp) { } } +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); + else etcp->ack_resp_timer=NULL; +} + static void etcp_link_ready_callback(struct ETCP_CONN* etcp) { DEBUG_TRACE(DEBUG_CATEGORY_ETCP, ""); if (!etcp) return; @@ -681,18 +691,13 @@ static void etcp_link_ready_callback(struct ETCP_CONN* etcp) { if (etcp->tx_state!=ETCP_TX_STATE_LINK_WAIT) return; 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"); -} +// queue_resume_callback(etcp->ack_q); + if (etcp->ack_q->count && etcp->ack_resp_timer == NULL) { + ack_response_timer_cb(etcp); + } -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); - else etcp->ack_resp_timer=NULL; + + DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "resume input_send_q+ack_q; link_wait->data_wait"); } // Process packets in send queue and transmit them