Code cleanup
This commit is contained in:
69
mud.c
69
mud.c
@@ -26,6 +26,7 @@ struct path_info {
|
|||||||
|
|
||||||
struct path {
|
struct path {
|
||||||
int fd;
|
int fd;
|
||||||
|
int ok;
|
||||||
struct addr addr;
|
struct addr addr;
|
||||||
uint64_t dt;
|
uint64_t dt;
|
||||||
uint64_t rdt;
|
uint64_t rdt;
|
||||||
@@ -98,10 +99,23 @@ uint64_t mud_now (struct mud *mud)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
ssize_t mud_send_path (struct path *path, const void *data, size_t size)
|
ssize_t mud_send_path (struct path *path, uint64_t now, const void *data, size_t size)
|
||||||
{
|
{
|
||||||
return sendto(path->fd, data, size, 0,
|
if (!size)
|
||||||
(struct sockaddr *)&path->addr.data, path->addr.size);
|
return 0;
|
||||||
|
|
||||||
|
ssize_t ret = sendto(path->fd, data, size, 0,
|
||||||
|
(struct sockaddr *)&path->addr.data, path->addr.size);
|
||||||
|
|
||||||
|
if (ret > 0) {
|
||||||
|
path->send.time = now;
|
||||||
|
} else if ((ret == -1) &&
|
||||||
|
(errno != EAGAIN) &&
|
||||||
|
(errno != EINTR)) {
|
||||||
|
path->ok = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
@@ -488,6 +502,8 @@ int mud_pull (struct mud *mud)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
path->ok = 1;
|
||||||
|
|
||||||
uint64_t send_time = mud_read48(packet->data);
|
uint64_t send_time = mud_read48(packet->data);
|
||||||
int64_t dt = (now-path->recv.time)-(send_time-path->recv.send_time);
|
int64_t dt = (now-path->recv.time)-(send_time-path->recv.send_time);
|
||||||
|
|
||||||
@@ -519,8 +535,7 @@ int mud_pull (struct mud *mud)
|
|||||||
int ret = mud_encrypt(mud, 0, tmp, sizeof(tmp), pong, sizeof(pong), sizeof(pong));
|
int ret = mud_encrypt(mud, 0, tmp, sizeof(tmp), pong, sizeof(pong), sizeof(pong));
|
||||||
|
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
mud_send_path(path, tmp, (size_t)ret);
|
mud_send_path(path, now, tmp, (size_t)ret);
|
||||||
path->send.time = now;
|
|
||||||
path->pong_time = now;
|
path->pong_time = now;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -562,6 +577,25 @@ int mud_push (struct mud *mud)
|
|||||||
{
|
{
|
||||||
struct path *path;
|
struct path *path;
|
||||||
|
|
||||||
|
for (path = mud->path; path; path = path->next) {
|
||||||
|
uint64_t now = mud_now(mud);
|
||||||
|
|
||||||
|
if ((path->send.time > path->recv.time) &&
|
||||||
|
(path->send.time-path->recv.time > UINT64_C(200000)))
|
||||||
|
path->ok = 0;
|
||||||
|
|
||||||
|
if (path->send.time &&
|
||||||
|
(now-path->send.time < UINT64_C(1000000)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
unsigned char ping[32];
|
||||||
|
|
||||||
|
int ret = mud_encrypt(mud, now, ping, sizeof(ping), NULL, 0, 0);
|
||||||
|
|
||||||
|
if (ret > 0)
|
||||||
|
mud_send_path(path, now, ping, (size_t)ret);
|
||||||
|
}
|
||||||
|
|
||||||
while (mud->tx.start != mud->tx.end) {
|
while (mud->tx.start != mud->tx.end) {
|
||||||
uint64_t now = mud_now(mud);
|
uint64_t now = mud_now(mud);
|
||||||
|
|
||||||
@@ -571,10 +605,7 @@ int mud_push (struct mud *mud)
|
|||||||
int64_t limit_min = INT64_MAX;
|
int64_t limit_min = INT64_MAX;
|
||||||
|
|
||||||
for (path = mud->path; path; path = path->next) {
|
for (path = mud->path; path; path = path->next) {
|
||||||
if (!path->recv.time)
|
if (!path->ok)
|
||||||
continue;
|
|
||||||
|
|
||||||
if (now-path->recv.time > UINT64_C(200000))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int64_t limit = path->limit;
|
int64_t limit = path->limit;
|
||||||
@@ -595,7 +626,7 @@ int mud_push (struct mud *mud)
|
|||||||
if (!path_min)
|
if (!path_min)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
ssize_t ret = mud_send_path(path_min, packet->data, packet->size);
|
ssize_t ret = mud_send_path(path_min, now, packet->data, packet->size);
|
||||||
|
|
||||||
mud->tx.start++;
|
mud->tx.start++;
|
||||||
|
|
||||||
@@ -603,24 +634,6 @@ int mud_push (struct mud *mud)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
path_min->limit = limit_min;
|
path_min->limit = limit_min;
|
||||||
path_min->send.time = now;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (path = mud->path; path; path = path->next) {
|
|
||||||
uint64_t now = mud_now(mud);
|
|
||||||
|
|
||||||
if (path->send.time && (now-path->send.time < UINT64_C(1000000)))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
unsigned char ping[32];
|
|
||||||
|
|
||||||
int ret = mud_encrypt(mud, now, ping, sizeof(ping), NULL, 0, 0);
|
|
||||||
|
|
||||||
if (ret <= 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
mud_send_path(path, ping, (size_t)ret);
|
|
||||||
path->send.time = now;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user