|
|
|
|
@ -628,6 +628,24 @@ struct ETCP_DGRAM* etcp_request_pkt(struct ETCP_CONN* etcp) {
|
|
|
|
|
|
|
|
|
|
dgram->data[1]=ptr/8; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (link->last_recv_updated) {// если есть данные - добавим channel_timestamp
|
|
|
|
|
uint64_t now=get_time_tb(); |
|
|
|
|
uint64_t dt=now - link->last_recv_local_time; |
|
|
|
|
link->last_recv_updated=0; |
|
|
|
|
if (dt<1000000) { |
|
|
|
|
dgram->data[ptr++]=ETCP_SECTION_TIMESTAMP; |
|
|
|
|
|
|
|
|
|
uint16_t t=link->last_recv_timestamp + dt; |
|
|
|
|
dgram->data[ptr++]=t; |
|
|
|
|
dgram->data[ptr++]=t>>8; |
|
|
|
|
|
|
|
|
|
t=link->last_recv_local_time - link->last_recv_timestamp; |
|
|
|
|
dgram->data[ptr++]=t; |
|
|
|
|
dgram->data[ptr++]=t>>8; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (inf_pkt) { |
|
|
|
|
// фрейм data (0) обязательно в конец
|
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] add DATA (seq=%u, len=%u), ack_size=%d", etcp->log_name, inf_pkt->seq, inf_pkt->ll.len, dgram->data[1]); |
|
|
|
|
@ -835,6 +853,15 @@ void etcp_conn_input(struct ETCP_DGRAM* pkt) {
|
|
|
|
|
while ((int32_t)(etcp->rx_ack_till-till)<0) { etcp->rx_ack_till++; etcp_ack_recv(etcp, etcp->rx_ack_till, -1, -1); }// подтверждаем всё по till
|
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
case ETCP_SECTION_TIMESTAMP: { |
|
|
|
|
uint16_t cur_ts=get_current_timestamp(); |
|
|
|
|
uint16_t ret_ts=data[1] | (data[2]<<8);// cur_ts=ret_ts = RTT
|
|
|
|
|
uint16_t recv_dt=data[3] | (data[4]<<8); |
|
|
|
|
pkt->link->rtt_last=cur_ts-ret_ts; |
|
|
|
|
pkt->link->recv_dt_last=recv_dt; |
|
|
|
|
data+=5; len-=5; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
case ETCP_SECTION_PAYLOAD: { |
|
|
|
|
|
|
|
|
|
if (len>=5) { |
|
|
|
|
|