Add resendPktQueue to struct in UDPConnection
Resending packets now put in higher priority queue in ConnectionData; if queued both regular packet and resending packet, resending packets are sent first.
This commit is contained in:
parent
d6f5653048
commit
3b4ae6e7dd
3 changed files with 50 additions and 9 deletions
|
@ -47,6 +47,7 @@ static const char *UDPC_ERR_THREADFAIL_STR = "Failed to create thread";
|
||||||
#define UDPC_SENT_PKTS_MAX_SIZE 34
|
#define UDPC_SENT_PKTS_MAX_SIZE 34
|
||||||
#define UDPC_SENT_PKTS_ALLOC_SIZE 35
|
#define UDPC_SENT_PKTS_ALLOC_SIZE 35
|
||||||
#define UDPC_SEND_PKTS_ALLOC_SIZE 40
|
#define UDPC_SEND_PKTS_ALLOC_SIZE 40
|
||||||
|
#define UDPC_RESEND_PKTS_ALLOC_SIZE 40
|
||||||
|
|
||||||
#define UDPC_PACKET_MAX_SIZE 8192
|
#define UDPC_PACKET_MAX_SIZE 8192
|
||||||
|
|
||||||
|
|
|
@ -167,6 +167,7 @@ void UDPC_destroy(UDPC_Context *ctx)
|
||||||
void UDPC_INTERNAL_destroy_conMap(void *unused, uint32_t addr, char *data)
|
void UDPC_INTERNAL_destroy_conMap(void *unused, uint32_t addr, char *data)
|
||||||
{
|
{
|
||||||
UDPC_INTERNAL_ConnectionData *cd = (UDPC_INTERNAL_ConnectionData*)data;
|
UDPC_INTERNAL_ConnectionData *cd = (UDPC_INTERNAL_ConnectionData*)data;
|
||||||
|
|
||||||
for(int x = 0; x * sizeof(UDPC_INTERNAL_PacketInfo) < cd->sentPkts->size; ++x)
|
for(int x = 0; x * sizeof(UDPC_INTERNAL_PacketInfo) < cd->sentPkts->size; ++x)
|
||||||
{
|
{
|
||||||
UDPC_INTERNAL_PacketInfo *pinfo = UDPC_Deque_index_ptr(
|
UDPC_INTERNAL_PacketInfo *pinfo = UDPC_Deque_index_ptr(
|
||||||
|
@ -177,6 +178,7 @@ void UDPC_INTERNAL_destroy_conMap(void *unused, uint32_t addr, char *data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UDPC_Deque_destroy(cd->sentPkts);
|
UDPC_Deque_destroy(cd->sentPkts);
|
||||||
|
|
||||||
for(int x = 0; x * sizeof(UDPC_INTERNAL_PacketInfo) < cd->sendPktQueue->size; ++x)
|
for(int x = 0; x * sizeof(UDPC_INTERNAL_PacketInfo) < cd->sendPktQueue->size; ++x)
|
||||||
{
|
{
|
||||||
UDPC_INTERNAL_PacketInfo *pinfo = UDPC_Deque_index_ptr(
|
UDPC_INTERNAL_PacketInfo *pinfo = UDPC_Deque_index_ptr(
|
||||||
|
@ -187,6 +189,17 @@ void UDPC_INTERNAL_destroy_conMap(void *unused, uint32_t addr, char *data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UDPC_Deque_destroy(cd->sendPktQueue);
|
UDPC_Deque_destroy(cd->sendPktQueue);
|
||||||
|
|
||||||
|
for(int x = 0; x * sizeof(UDPC_INTERNAL_PacketInfo) < cd->resendPktQueue->size; ++x)
|
||||||
|
{
|
||||||
|
UDPC_INTERNAL_PacketInfo *pinfo = UDPC_Deque_index_ptr(
|
||||||
|
cd->resendPktQueue, sizeof(UDPC_INTERNAL_PacketInfo), x);
|
||||||
|
if(pinfo->data)
|
||||||
|
{
|
||||||
|
free(pinfo->data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
UDPC_Deque_destroy(cd->resendPktQueue);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UDPC_set_callback_connected(
|
void UDPC_set_callback_connected(
|
||||||
|
@ -452,6 +465,7 @@ void UDPC_update(UDPC_Context *ctx)
|
||||||
ntohs(receivedData.sin_port),
|
ntohs(receivedData.sin_port),
|
||||||
UDPC_Deque_init(sizeof(UDPC_INTERNAL_PacketInfo) * UDPC_SENT_PKTS_ALLOC_SIZE),
|
UDPC_Deque_init(sizeof(UDPC_INTERNAL_PacketInfo) * UDPC_SENT_PKTS_ALLOC_SIZE),
|
||||||
UDPC_Deque_init(sizeof(UDPC_INTERNAL_PacketInfo) * UDPC_SEND_PKTS_ALLOC_SIZE),
|
UDPC_Deque_init(sizeof(UDPC_INTERNAL_PacketInfo) * UDPC_SEND_PKTS_ALLOC_SIZE),
|
||||||
|
UDPC_Deque_init(sizeof(UDPC_INTERNAL_PacketInfo) * UDPC_RESEND_PKTS_ALLOC_SIZE),
|
||||||
{0, 0},
|
{0, 0},
|
||||||
{0, 0},
|
{0, 0},
|
||||||
0.0f
|
0.0f
|
||||||
|
@ -699,9 +713,9 @@ void UDPC_INTERNAL_update_send(void *userData, uint32_t addr, char *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
cd->flags = cd->flags & 0xFFFFFFFE;
|
cd->flags = cd->flags & 0xFFFFFFFE;
|
||||||
if(cd->sendPktQueue->size == 0)
|
if(cd->sendPktQueue->size == 0 && cd->resendPktQueue->size == 0)
|
||||||
{
|
{
|
||||||
// send packet queue is empty, send heartbeat packet
|
// send and resend packet queue is empty, send heartbeat packet
|
||||||
if(UDPC_INTERNAL_ts_diff(&us->tsNow, &cd->sent) < UDPC_HEARTBEAT_PKT_INTERVAL)
|
if(UDPC_INTERNAL_ts_diff(&us->tsNow, &cd->sent) < UDPC_HEARTBEAT_PKT_INTERVAL)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -752,10 +766,22 @@ void UDPC_INTERNAL_update_send(void *userData, uint32_t addr, char *data)
|
||||||
}
|
}
|
||||||
free(data);
|
free(data);
|
||||||
}
|
}
|
||||||
else // sendPktQueue not empty
|
else // sendPktQueue or resendPktQueue not empty
|
||||||
{
|
{
|
||||||
UDPC_INTERNAL_PacketInfo *pinfo = UDPC_Deque_get_front_ptr(
|
UDPC_INTERNAL_PacketInfo *pinfo;
|
||||||
|
int isResendingPkt = 0;
|
||||||
|
|
||||||
|
if(cd->resendPktQueue->size != 0)
|
||||||
|
{
|
||||||
|
pinfo = UDPC_Deque_get_front_ptr(
|
||||||
|
cd->resendPktQueue, sizeof(UDPC_INTERNAL_PacketInfo));
|
||||||
|
isResendingPkt = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pinfo = UDPC_Deque_get_front_ptr(
|
||||||
cd->sendPktQueue, sizeof(UDPC_INTERNAL_PacketInfo));
|
cd->sendPktQueue, sizeof(UDPC_INTERNAL_PacketInfo));
|
||||||
|
}
|
||||||
char *data = malloc(20 + pinfo->size);
|
char *data = malloc(20 + pinfo->size);
|
||||||
UDPC_INTERNAL_prepare_pkt(
|
UDPC_INTERNAL_prepare_pkt(
|
||||||
data,
|
data,
|
||||||
|
@ -783,7 +809,14 @@ void UDPC_INTERNAL_update_send(void *userData, uint32_t addr, char *data)
|
||||||
UDPC_INTERNAL_atostr(us->ctx, addr), cd->port);
|
UDPC_INTERNAL_atostr(us->ctx, addr), cd->port);
|
||||||
free(data);
|
free(data);
|
||||||
free(pinfo->data);
|
free(pinfo->data);
|
||||||
|
if(isResendingPkt != 0)
|
||||||
|
{
|
||||||
|
UDPC_Deque_pop_front(cd->resendPktQueue, sizeof(UDPC_INTERNAL_PacketInfo));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
UDPC_Deque_pop_front(cd->sendPktQueue, sizeof(UDPC_INTERNAL_PacketInfo));
|
UDPC_Deque_pop_front(cd->sendPktQueue, sizeof(UDPC_INTERNAL_PacketInfo));
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -827,9 +860,16 @@ void UDPC_INTERNAL_update_send(void *userData, uint32_t addr, char *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
free(pinfo->data);
|
free(pinfo->data);
|
||||||
|
if(isResendingPkt != 0)
|
||||||
|
{
|
||||||
|
UDPC_Deque_pop_front(cd->resendPktQueue, sizeof(UDPC_INTERNAL_PacketInfo));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
UDPC_Deque_pop_front(cd->sendPktQueue, sizeof(UDPC_INTERNAL_PacketInfo));
|
UDPC_Deque_pop_front(cd->sendPktQueue, sizeof(UDPC_INTERNAL_PacketInfo));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void UDPC_INTERNAL_update_rtt(
|
void UDPC_INTERNAL_update_rtt(
|
||||||
UDPC_Context *ctx,
|
UDPC_Context *ctx,
|
||||||
|
@ -923,9 +963,8 @@ void UDPC_INTERNAL_check_pkt_timeout(
|
||||||
pinfo->flags |= 0x4;
|
pinfo->flags |= 0x4;
|
||||||
pinfo->data = NULL;
|
pinfo->data = NULL;
|
||||||
pinfo->size = 0;
|
pinfo->size = 0;
|
||||||
// TODO use separate queue for resending packets
|
|
||||||
UDPC_Deque_push_back(
|
UDPC_Deque_push_back(
|
||||||
cd->sendPktQueue,
|
cd->resendPktQueue,
|
||||||
&newPkt,
|
&newPkt,
|
||||||
sizeof(UDPC_INTERNAL_PacketInfo));
|
sizeof(UDPC_INTERNAL_PacketInfo));
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,6 +83,7 @@ typedef struct {
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
UDPC_Deque *sentPkts;
|
UDPC_Deque *sentPkts;
|
||||||
UDPC_Deque *sendPktQueue;
|
UDPC_Deque *sendPktQueue;
|
||||||
|
UDPC_Deque *resendPktQueue;
|
||||||
struct timespec received;
|
struct timespec received;
|
||||||
struct timespec sent;
|
struct timespec sent;
|
||||||
float rtt;
|
float rtt;
|
||||||
|
|
Loading…
Reference in a new issue