Fix handling of timed out packets
This commit is contained in:
parent
4ac65ab6de
commit
4e9929d7ba
2 changed files with 20 additions and 4 deletions
|
@ -350,7 +350,7 @@ void UDPC_update(UDPC_Context *ctx)
|
||||||
|
|
||||||
UDPC_INTERNAL_update_rtt(ctx, cd, rseq, &us.tsNow);
|
UDPC_INTERNAL_update_rtt(ctx, cd, rseq, &us.tsNow);
|
||||||
cd->received = us.tsNow;
|
cd->received = us.tsNow;
|
||||||
UDPC_INTERNAL_check_pkt_timeout(cd, rseq, ack, &us.tsNow);
|
UDPC_INTERNAL_check_pkt_timeout(ctx, cd, rseq, ack, &us.tsNow);
|
||||||
|
|
||||||
int isOutOfOrder = 0;
|
int isOutOfOrder = 0;
|
||||||
uint32_t diff = 0;
|
uint32_t diff = 0;
|
||||||
|
@ -683,6 +683,7 @@ void UDPC_INTERNAL_update_rtt(
|
||||||
}
|
}
|
||||||
|
|
||||||
void UDPC_INTERNAL_check_pkt_timeout(
|
void UDPC_INTERNAL_check_pkt_timeout(
|
||||||
|
UDPC_Context *ctx,
|
||||||
UDPC_INTERNAL_ConnectionData *cd,
|
UDPC_INTERNAL_ConnectionData *cd,
|
||||||
uint32_t rseq,
|
uint32_t rseq,
|
||||||
uint32_t ack,
|
uint32_t ack,
|
||||||
|
@ -707,15 +708,29 @@ void UDPC_INTERNAL_check_pkt_timeout(
|
||||||
float seconds = UDPC_ts_diff_to_seconds(tsNow, &pinfo->sent);
|
float seconds = UDPC_ts_diff_to_seconds(tsNow, &pinfo->sent);
|
||||||
if(seconds >= UDPC_PACKET_TIMEOUT_SEC)
|
if(seconds >= UDPC_PACKET_TIMEOUT_SEC)
|
||||||
{
|
{
|
||||||
|
if(pinfo->size <= 20)
|
||||||
|
{
|
||||||
|
UDPC_INTERNAL_log(ctx, 0,
|
||||||
|
"ERROR: Timed out sentPkt (%d) to %s has size at most 20",
|
||||||
|
rseq,
|
||||||
|
UDPC_INTERNAL_atostr(ctx, cd->addr));
|
||||||
|
pinfo->flags |= 0x4; // treat as resent to avoid reprinting error
|
||||||
|
break;
|
||||||
|
}
|
||||||
// packet timed out, resending
|
// packet timed out, resending
|
||||||
UDPC_INTERNAL_PacketInfo newPkt = {
|
UDPC_INTERNAL_PacketInfo newPkt = {
|
||||||
cd->addr,
|
cd->addr,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
pinfo->data,
|
NULL,
|
||||||
pinfo->size,
|
0,
|
||||||
{0, 0}
|
{0, 0}
|
||||||
};
|
};
|
||||||
|
newPkt.size = pinfo->size - 20;
|
||||||
|
newPkt.data = malloc(newPkt.size);
|
||||||
|
memcpy(newPkt.data, pinfo->data + 20, newPkt.size);
|
||||||
|
free(pinfo->data);
|
||||||
|
|
||||||
pinfo->flags |= 0x4;
|
pinfo->flags |= 0x4;
|
||||||
pinfo->data = NULL;
|
pinfo->data = NULL;
|
||||||
pinfo->size = 0;
|
pinfo->size = 0;
|
||||||
|
|
|
@ -67,7 +67,7 @@ typedef struct {
|
||||||
float rtt;
|
float rtt;
|
||||||
} UDPC_INTERNAL_ConnectionData;
|
} UDPC_INTERNAL_ConnectionData;
|
||||||
|
|
||||||
/// This struct should not be modified, only passed to functions that require it
|
/// This struct should not be used externally, only passed to functions that require it
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/*
|
/*
|
||||||
* 0x1 - is threaded
|
* 0x1 - is threaded
|
||||||
|
@ -140,6 +140,7 @@ void UDPC_INTERNAL_update_rtt(
|
||||||
struct timespec *tsNow);
|
struct timespec *tsNow);
|
||||||
|
|
||||||
void UDPC_INTERNAL_check_pkt_timeout(
|
void UDPC_INTERNAL_check_pkt_timeout(
|
||||||
|
UDPC_Context *ctx,
|
||||||
UDPC_INTERNAL_ConnectionData *cd,
|
UDPC_INTERNAL_ConnectionData *cd,
|
||||||
uint32_t rseq,
|
uint32_t rseq,
|
||||||
uint32_t ack,
|
uint32_t ack,
|
||||||
|
|
Loading…
Reference in a new issue