Rework pong
This commit is contained in:
66
mud.c
66
mud.c
@@ -53,7 +53,7 @@
|
|||||||
#define MUD_PACKET_MAX_SIZE (1500U)
|
#define MUD_PACKET_MAX_SIZE (1500U)
|
||||||
#define MUD_PACKET_SIZEOF(X) ((X)+MUD_PACKET_MIN_SIZE)
|
#define MUD_PACKET_SIZEOF(X) ((X)+MUD_PACKET_MIN_SIZE)
|
||||||
|
|
||||||
#define MUD_PONG_SIZE MUD_PACKET_SIZEOF(MUD_U48_SIZE*3)
|
#define MUD_PONG_SIZE MUD_PACKET_SIZEOF(MUD_U48_SIZE*4)
|
||||||
#define MUD_PKEY_SIZE (crypto_scalarmult_BYTES+1)
|
#define MUD_PKEY_SIZE (crypto_scalarmult_BYTES+1)
|
||||||
#define MUD_KEYX_SIZE MUD_PACKET_SIZEOF(MUD_U48_SIZE+2*MUD_PKEY_SIZE)
|
#define MUD_KEYX_SIZE MUD_PACKET_SIZEOF(MUD_U48_SIZE+2*MUD_PKEY_SIZE)
|
||||||
#define MUD_MTUX_SIZE MUD_PACKET_SIZEOF(MUD_U48_SIZE*2)
|
#define MUD_MTUX_SIZE MUD_PACKET_SIZEOF(MUD_U48_SIZE*2)
|
||||||
@@ -89,13 +89,16 @@ struct path {
|
|||||||
size_t size;
|
size_t size;
|
||||||
} ctrl;
|
} ctrl;
|
||||||
unsigned char *tc;
|
unsigned char *tc;
|
||||||
uint64_t dt;
|
|
||||||
uint64_t rdt;
|
uint64_t rdt;
|
||||||
uint64_t rtt;
|
uint64_t rtt;
|
||||||
int64_t sdt;
|
uint64_t sdt;
|
||||||
|
uint64_t rst;
|
||||||
|
uint64_t r_sdt;
|
||||||
|
uint64_t r_rdt;
|
||||||
|
uint64_t r_rst;
|
||||||
|
int64_t r_dt;
|
||||||
uint64_t limit;
|
uint64_t limit;
|
||||||
uint64_t recv_time;
|
uint64_t recv_time;
|
||||||
uint64_t recv_send_time;
|
|
||||||
uint64_t send_time;
|
uint64_t send_time;
|
||||||
uint64_t pong_time;
|
uint64_t pong_time;
|
||||||
struct path *next;
|
struct path *next;
|
||||||
@@ -214,7 +217,7 @@ uint64_t mud_now (struct mud *mud)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
uint64_t mud_dt (uint64_t a, uint64_t b)
|
uint64_t mud_abs_diff (uint64_t a, uint64_t b)
|
||||||
{
|
{
|
||||||
return (a >= b) ? a-b : b-a;
|
return (a >= b) ? a-b : b-a;
|
||||||
}
|
}
|
||||||
@@ -838,9 +841,10 @@ void mud_ctrl_path (struct mud *mud, enum mud_msg msg, struct path *path,
|
|||||||
|
|
||||||
switch (msg) {
|
switch (msg) {
|
||||||
case mud_pong:
|
case mud_pong:
|
||||||
mud_write48(ctrl.data, path->recv_send_time);
|
mud_write48(ctrl.data, path->sdt);
|
||||||
mud_write48(&ctrl.data[MUD_U48_SIZE], path->rdt);
|
mud_write48(&ctrl.data[MUD_U48_SIZE], path->rdt);
|
||||||
size = MUD_U48_SIZE*2;
|
mud_write48(&ctrl.data[2*MUD_U48_SIZE], path->rst);
|
||||||
|
size = MUD_U48_SIZE*3;
|
||||||
break;
|
break;
|
||||||
case mud_keyx:
|
case mud_keyx:
|
||||||
memcpy(ctrl.data, &mud->crypto.public, sizeof(mud->crypto.public));
|
memcpy(ctrl.data, &mud->crypto.public, sizeof(mud->crypto.public));
|
||||||
@@ -967,7 +971,7 @@ int mud_recv (struct mud *mud, void *data, size_t size)
|
|||||||
send_time = mud_read48(&packet[MUD_U48_SIZE]);
|
send_time = mud_read48(&packet[MUD_U48_SIZE]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mud_dt(now, send_time) >= mud->time_tolerance)
|
if (mud_abs_diff(now, send_time) >= mud->time_tolerance)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (mud_packet) {
|
if (mud_packet) {
|
||||||
@@ -998,29 +1002,24 @@ int mud_recv (struct mud *mud, void *data, size_t size)
|
|||||||
if (!path)
|
if (!path)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
int64_t dt = (now-path->recv_time)-(send_time-path->recv_send_time);
|
if (path->rdt) {
|
||||||
|
path->rdt = ((now-path->recv_time)+UINT64_C(7)*path->rdt)/UINT64_C(8);
|
||||||
if (path->recv_time && path->recv_send_time && (dt > 0))
|
path->sdt = ((send_time-path->rst)+UINT64_C(7)*path->sdt)/UINT64_C(8);
|
||||||
path->rdt = (path->rdt*UINT64_C(7)+dt)/UINT64_C(8);
|
} else if (path->recv_time) {
|
||||||
|
path->rdt = now-path->recv_time;
|
||||||
path->recv_send_time = send_time;
|
path->sdt = send_time-path->rst;
|
||||||
path->recv_time = now;
|
|
||||||
|
|
||||||
if (mud_packet && (packet_size == (ssize_t)MUD_PONG_SIZE)) {
|
|
||||||
uint64_t st = mud_read48(&packet[MUD_U48_SIZE*2]);
|
|
||||||
uint64_t dt = mud_read48(&packet[MUD_U48_SIZE*3]);
|
|
||||||
|
|
||||||
path->dt = dt;
|
|
||||||
path->sdt = send_time-st;
|
|
||||||
path->rtt = now-st;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mud_timeout(now, path->pong_time, MUD_PONG_TIMEOUT)) {
|
path->rst = send_time;
|
||||||
|
|
||||||
|
if ((path->recv_time) &&
|
||||||
|
(mud_timeout(now, path->pong_time, MUD_PONG_TIMEOUT))) {
|
||||||
mud_ctrl_path(mud, mud_pong, path, now);
|
mud_ctrl_path(mud, mud_pong, path, now);
|
||||||
path->pong_time = now;
|
path->pong_time = now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
path->recv_time = now;
|
||||||
|
|
||||||
if (mud_packet) {
|
if (mud_packet) {
|
||||||
if (packet_size == (ssize_t)MUD_KEYX_SIZE) {
|
if (packet_size == (ssize_t)MUD_KEYX_SIZE) {
|
||||||
mud_recv_keyx(mud, path, now, &packet[MUD_U48_SIZE*2]);
|
mud_recv_keyx(mud, path, now, &packet[MUD_U48_SIZE*2]);
|
||||||
@@ -1028,6 +1027,12 @@ int mud_recv (struct mud *mud, void *data, size_t size)
|
|||||||
mud->mtu.remote = (int)mud_read48(&packet[MUD_U48_SIZE*2]);
|
mud->mtu.remote = (int)mud_read48(&packet[MUD_U48_SIZE*2]);
|
||||||
if (!path->state.active)
|
if (!path->state.active)
|
||||||
mud_ctrl_path(mud, mud_mtux, path, now);
|
mud_ctrl_path(mud, mud_mtux, path, now);
|
||||||
|
} else if (packet_size == (ssize_t)MUD_PONG_SIZE) {
|
||||||
|
path->r_sdt = mud_read48(&packet[MUD_U48_SIZE*2]);
|
||||||
|
path->r_rdt = mud_read48(&packet[MUD_U48_SIZE*3]);
|
||||||
|
path->r_rst = mud_read48(&packet[MUD_U48_SIZE*4]);
|
||||||
|
path->r_dt = send_time-path->r_rst;
|
||||||
|
path->rtt = now-path->r_rst;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1054,9 +1059,7 @@ int mud_send_ctrl (struct mud *mud)
|
|||||||
mud_ctrl_path(mud, mud_keyx, path, now);
|
mud_ctrl_path(mud, mud_keyx, path, now);
|
||||||
mud->crypto.bad_key = 0;
|
mud->crypto.bad_key = 0;
|
||||||
}
|
}
|
||||||
continue;
|
} else {
|
||||||
}
|
|
||||||
|
|
||||||
if ((mud_timeout(now, mud->crypto.send_time, mud->send_timeout)) &&
|
if ((mud_timeout(now, mud->crypto.send_time, mud->send_timeout)) &&
|
||||||
(mud_timeout(now, mud->crypto.recv_time, MUD_KEYX_TIMEOUT))) {
|
(mud_timeout(now, mud->crypto.recv_time, MUD_KEYX_TIMEOUT))) {
|
||||||
mud_ctrl_path(mud, mud_keyx, path, now);
|
mud_ctrl_path(mud, mud_keyx, path, now);
|
||||||
@@ -1072,6 +1075,7 @@ int mud_send_ctrl (struct mud *mud)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int mud_send (struct mud *mud, const void *data, size_t size, int tc)
|
int mud_send (struct mud *mud, const void *data, size_t size, int tc)
|
||||||
{
|
{
|
||||||
@@ -1107,8 +1111,10 @@ int mud_send (struct mud *mud, const void *data, size_t size, int tc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!path_min)
|
if (!path_min) {
|
||||||
return 0;
|
errno = ENOTCONN;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned char packet[2048];
|
unsigned char packet[2048];
|
||||||
|
|
||||||
|
|||||||
2
mud.h
2
mud.h
@@ -17,8 +17,6 @@ int mud_set_mtu (struct mud *, int mtu);
|
|||||||
int mud_set_send_timeout_msec (struct mud *, unsigned);
|
int mud_set_send_timeout_msec (struct mud *, unsigned);
|
||||||
int mud_set_time_tolerance_sec (struct mud *, unsigned);
|
int mud_set_time_tolerance_sec (struct mud *, unsigned);
|
||||||
|
|
||||||
int mud_set_on (struct mud *, const char *, int);
|
|
||||||
|
|
||||||
int mud_peer (struct mud *, const char *, const char *, int);
|
int mud_peer (struct mud *, const char *, const char *, int);
|
||||||
|
|
||||||
int mud_recv (struct mud *, void *, size_t);
|
int mud_recv (struct mud *, void *, size_t);
|
||||||
|
|||||||
Reference in New Issue
Block a user