|
|
|
|
@ -39,6 +39,7 @@ static void etcp_link_ready_callback(struct ETCP_CONN* etcp);
|
|
|
|
|
static void input_send_q_cb(struct ll_queue* q, void* arg); |
|
|
|
|
static void wait_ack_cb(struct ll_queue* q, void* arg); |
|
|
|
|
static void etcp_conn_process_send_queue(struct ETCP_CONN* etcp); |
|
|
|
|
struct ETCP_DGRAM* etcp_request_pkt(struct ETCP_CONN* etcp); |
|
|
|
|
|
|
|
|
|
// Helper function to drain and free ETCP_FRAGMENT queue
|
|
|
|
|
static void drain_and_free_fragment_queue(struct ETCP_CONN* etcp, struct ll_queue** q) { |
|
|
|
|
@ -184,7 +185,6 @@ void etcp_connection_close(struct ETCP_CONN* etcp) {
|
|
|
|
|
|
|
|
|
|
// Cancel active timers to prevent memory leaks
|
|
|
|
|
if (etcp->retrans_timer) { |
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "[%s] RETRANS TMR CANCEL", etcp->log_name); |
|
|
|
|
uasync_cancel_timeout(etcp->instance->ua, etcp->retrans_timer); |
|
|
|
|
etcp->retrans_timer = NULL; |
|
|
|
|
} |
|
|
|
|
@ -350,7 +350,7 @@ void etcp_update_log_name(struct ETCP_CONN* etcp) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ====================================================================== Отправка данных
|
|
|
|
|
// ====================================================================== Отправка данных в etcp после нормализации
|
|
|
|
|
|
|
|
|
|
// Send data through ETCP connection
|
|
|
|
|
// Allocates memory from data_pool and places in input queue
|
|
|
|
|
@ -532,22 +532,10 @@ static void input_queue_cb(struct ll_queue* q, void* arg) {
|
|
|
|
|
|
|
|
|
|
// DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "input_queue_cb: successfully moved from input_queue to input_send_q");
|
|
|
|
|
|
|
|
|
|
etcp_conn_process_send_queue(etcp);// сразу обработаем этот пакет
|
|
|
|
|
// etcp_conn_process_send_queue(etcp);// сразу обработаем этот пакет
|
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] nextloop, input_queue size=%d ", etcp->log_name, q->count); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void input_send_q_cb(struct ll_queue* q, void* arg) {// etcp->input_send_q processing
|
|
|
|
|
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, ""); |
|
|
|
|
struct ETCP_CONN* etcp=(struct ETCP_CONN*)arg; |
|
|
|
|
|
|
|
|
|
// size_t send_q_bytes = queue_total_bytes(etcp->input_send_q);
|
|
|
|
|
// size_t send_q_pkts = queue_entry_count(etcp->input_send_q);
|
|
|
|
|
// DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "input_send_q_cb: input_send_q status: %d pkt %d bytes", send_q_pkts, send_q_bytes);
|
|
|
|
|
etcp_conn_process_send_queue(etcp); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void ack_timeout_cb(void* arg); |
|
|
|
|
static void ack_timeout_check(struct ETCP_CONN* etcp) { |
|
|
|
|
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, ""); |
|
|
|
|
@ -608,6 +596,22 @@ static void wait_ack_cb(struct ll_queue* q, void* arg) {// добавили па
|
|
|
|
|
if (!etcp->retrans_timer) ack_timeout_check(etcp);// если таймер ретрансмиссий взведен - дожидаемся таймера.
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void input_send_q_cb(struct ll_queue* q, void* arg) {// etcp->input_send_q processing
|
|
|
|
|
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, ""); |
|
|
|
|
struct ETCP_CONN* etcp=(struct ETCP_CONN*)arg; |
|
|
|
|
etcp_conn_process_send_queue(etcp); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Process packets in send queue and transmit them
|
|
|
|
|
static void etcp_conn_process_send_queue(struct ETCP_CONN* etcp) {// вызываем когда есть элемент в send_q или надо отправить ack
|
|
|
|
|
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, ""); |
|
|
|
|
struct ETCP_DGRAM* dgram; |
|
|
|
|
while(dgram = etcp_request_pkt(etcp)) { |
|
|
|
|
etcp_loadbalancer_send(dgram); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Подготовить и отправить кодограмму
|
|
|
|
|
// вызывается линком когда освобождается или очередью если появляются данные на передачу
|
|
|
|
|
struct ETCP_DGRAM* etcp_request_pkt(struct ETCP_CONN* etcp) { |
|
|
|
|
@ -755,16 +759,6 @@ static void etcp_link_ready_callback(struct ETCP_CONN* etcp) {
|
|
|
|
|
// etcp_conn_process_send_queue(etcp);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Process packets in send queue and transmit them
|
|
|
|
|
static void etcp_conn_process_send_queue(struct ETCP_CONN* etcp) { |
|
|
|
|
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, ""); |
|
|
|
|
struct ETCP_DGRAM* dgram; |
|
|
|
|
while(dgram = etcp_request_pkt(etcp)) { |
|
|
|
|
// DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "etcp_conn_process_send_queue: sending packet");
|
|
|
|
|
etcp_loadbalancer_send(dgram); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void ack_response_timer_cb(void* arg) {// проверяем неотправленные ack response и отправляем если надо.
|
|
|
|
|
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, ""); |
|
|
|
|
struct ETCP_CONN* etcp = (struct ETCP_CONN*)arg; |
|
|
|
|
|