|
|
|
|
@ -744,20 +744,21 @@ void etcp_conn_input(struct ETCP_DGRAM* pkt) {
|
|
|
|
|
|
|
|
|
|
// Process sections as per protocol.txt
|
|
|
|
|
switch (type) { |
|
|
|
|
case ETCP_SECTION_ACK: { |
|
|
|
|
int elm_cnt=data[1]; |
|
|
|
|
uint32_t till=data[2] | (data[3]<<8) | (data[4]<<16) | (data[5]<<24); |
|
|
|
|
data+=6; |
|
|
|
|
for (int i=0; i<elm_cnt; i++) { |
|
|
|
|
uint32_t seq=data[0] | (data[1]<<8) | (data[2]<<16) | (data[3]<<24); |
|
|
|
|
uint16_t ts=data[4] | (data[5]<<8); |
|
|
|
|
uint16_t dts=data[6] | (data[7]<<8); |
|
|
|
|
etcp_ack_recv(etcp, seq, ts, dts); |
|
|
|
|
data+=8; |
|
|
|
|
} |
|
|
|
|
while (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_ACK: { |
|
|
|
|
int elm_cnt=data[1]; |
|
|
|
|
uint32_t till=data[2] | (data[3]<<8) | (data[4]<<16) | (data[5]<<24); |
|
|
|
|
int ack_section_len = 6 + elm_cnt * 8; |
|
|
|
|
data+=ack_section_len; |
|
|
|
|
len-=ack_section_len; |
|
|
|
|
for (int i=0; i<elm_cnt; i++) { |
|
|
|
|
uint32_t seq=data[-ack_section_len+6+i*8] | (data[-ack_section_len+7+i*8]<<8) | (data[-ack_section_len+8+i*8]<<16) | (data[-ack_section_len+9+i*8]<<24); |
|
|
|
|
uint16_t ts=data[-ack_section_len+10+i*8] | (data[-ack_section_len+11+i*8]<<8); |
|
|
|
|
uint16_t dts=data[-ack_section_len+12+i*8] | (data[-ack_section_len+13+i*8]<<8); |
|
|
|
|
etcp_ack_recv(etcp, seq, ts, dts); |
|
|
|
|
} |
|
|
|
|
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_PAYLOAD: { |
|
|
|
|
|
|
|
|
|
if (len>=5) { |
|
|
|
|
|