Move mud_mtux in mud_conf
This commit is contained in:
38
mud.c
38
mud.c
@@ -128,7 +128,6 @@ enum mud_packet_code {
|
|||||||
mud_conf,
|
mud_conf,
|
||||||
mud_stat,
|
mud_stat,
|
||||||
mud_keyx,
|
mud_keyx,
|
||||||
mud_mtux,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mud_packet {
|
struct mud_packet {
|
||||||
@@ -140,6 +139,7 @@ struct mud_packet {
|
|||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
unsigned char kiss[MUD_SID_SIZE];
|
unsigned char kiss[MUD_SID_SIZE];
|
||||||
|
unsigned char mtu[MUD_U48_SIZE];
|
||||||
unsigned char backup;
|
unsigned char backup;
|
||||||
} conf;
|
} conf;
|
||||||
struct {
|
struct {
|
||||||
@@ -148,7 +148,6 @@ struct mud_packet {
|
|||||||
unsigned char rst[MUD_U48_SIZE];
|
unsigned char rst[MUD_U48_SIZE];
|
||||||
} stat;
|
} stat;
|
||||||
struct mud_crypto_pub public;
|
struct mud_crypto_pub public;
|
||||||
unsigned char mtu[MUD_U48_SIZE];
|
|
||||||
} data;
|
} data;
|
||||||
unsigned char _do_not_use_[MUD_MAC_SIZE];
|
unsigned char _do_not_use_[MUD_MAC_SIZE];
|
||||||
};
|
};
|
||||||
@@ -168,7 +167,6 @@ struct mud {
|
|||||||
int aes;
|
int aes;
|
||||||
} crypto;
|
} crypto;
|
||||||
struct {
|
struct {
|
||||||
uint64_t send_time;
|
|
||||||
int remote;
|
int remote;
|
||||||
int local;
|
int local;
|
||||||
} mtu;
|
} mtu;
|
||||||
@@ -534,6 +532,15 @@ mud_peer(struct mud *mud, const char *name, const char *host, int port,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mud_update_conf(struct mud *mud)
|
||||||
|
{
|
||||||
|
struct mud_path *path;
|
||||||
|
|
||||||
|
for (path = mud->path; path; path = path->next)
|
||||||
|
path->conf.remote = 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
mud_get_key(struct mud *mud, unsigned char *key, size_t *size)
|
mud_get_key(struct mud *mud, unsigned char *key, size_t *size)
|
||||||
{
|
{
|
||||||
@@ -605,15 +612,15 @@ mud_get_mtu(struct mud *mud)
|
|||||||
int
|
int
|
||||||
mud_set_mtu(struct mud *mud, int mtu)
|
mud_set_mtu(struct mud *mud, int mtu)
|
||||||
{
|
{
|
||||||
if ((mtu < 500) ||
|
if ((mtu < sizeof(struct mud_packet)) ||
|
||||||
(mtu > MUD_PACKET_MAX_SIZE - 50)) {
|
(mtu > MUD_PACKET_MAX_SIZE - 50)) { // XXX
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mud->mtu.local != mtu) {
|
if (mud->mtu.local != mtu) {
|
||||||
mud->mtu.local = mtu;
|
mud->mtu.local = mtu;
|
||||||
mud->mtu.send_time = UINT64_C(0);
|
mud_update_conf(mud);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -858,6 +865,7 @@ mud_packet_send(struct mud *mud, enum mud_packet_code code,
|
|||||||
case mud_conf:
|
case mud_conf:
|
||||||
size = sizeof(packet.data.conf);
|
size = sizeof(packet.data.conf);
|
||||||
memcpy(&packet.data.conf.kiss, &mud->kiss, size);
|
memcpy(&packet.data.conf.kiss, &mud->kiss, size);
|
||||||
|
mud_write48(packet.data.conf.mtu, mud->mtu.local);
|
||||||
packet.data.conf.backup = (unsigned char)path->state.backup;
|
packet.data.conf.backup = (unsigned char)path->state.backup;
|
||||||
break;
|
break;
|
||||||
case mud_stat:
|
case mud_stat:
|
||||||
@@ -870,10 +878,6 @@ mud_packet_send(struct mud *mud, enum mud_packet_code code,
|
|||||||
size = sizeof(packet.data.public);
|
size = sizeof(packet.data.public);
|
||||||
memcpy(&packet.data.public, &mud->crypto.public, size);
|
memcpy(&packet.data.public, &mud->crypto.public, size);
|
||||||
break;
|
break;
|
||||||
case mud_mtux:
|
|
||||||
size = sizeof(packet.data.mtu);
|
|
||||||
mud_write48(packet.data.mtu, mud->mtu.local);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct mud_crypto_opt opt = {
|
struct mud_crypto_opt opt = {
|
||||||
@@ -976,7 +980,6 @@ mud_packet_check_size(unsigned char *data, size_t size)
|
|||||||
[mud_conf] = MUD_PACKET_SIZE(sizeof(packet->data.conf)),
|
[mud_conf] = MUD_PACKET_SIZE(sizeof(packet->data.conf)),
|
||||||
[mud_stat] = MUD_PACKET_SIZE(sizeof(packet->data.stat)),
|
[mud_stat] = MUD_PACKET_SIZE(sizeof(packet->data.stat)),
|
||||||
[mud_keyx] = MUD_PACKET_SIZE(sizeof(packet->data.public)),
|
[mud_keyx] = MUD_PACKET_SIZE(sizeof(packet->data.public)),
|
||||||
[mud_mtux] = MUD_PACKET_SIZE(sizeof(packet->data.mtu)),
|
|
||||||
}; // clang-format on
|
}; // clang-format on
|
||||||
|
|
||||||
return (packet->hdr.code >= sizeof(sizes)) ||
|
return (packet->hdr.code >= sizeof(sizes)) ||
|
||||||
@@ -1020,6 +1023,7 @@ mud_packet_recv(struct mud *mud, struct mud_path *path,
|
|||||||
path->conf.remote = 1;
|
path->conf.remote = 1;
|
||||||
}
|
}
|
||||||
path->state.backup = !!packet->data.conf.backup;
|
path->state.backup = !!packet->data.conf.backup;
|
||||||
|
mud->mtu.remote = mud_read48(packet->data.conf.mtu);
|
||||||
mud_packet_send(mud, mud_conf, path, now);
|
mud_packet_send(mud, mud_conf, path, now);
|
||||||
break;
|
break;
|
||||||
case mud_stat:
|
case mud_stat:
|
||||||
@@ -1032,11 +1036,6 @@ mud_packet_recv(struct mud *mud, struct mud_path *path,
|
|||||||
case mud_keyx:
|
case mud_keyx:
|
||||||
mud_recv_keyx(mud, path, now, &packet->data.public);
|
mud_recv_keyx(mud, path, now, &packet->data.public);
|
||||||
break;
|
break;
|
||||||
case mud_mtux:
|
|
||||||
mud->mtu.remote = mud_read48(packet->data.mtu);
|
|
||||||
if (!path->state.active)
|
|
||||||
mud_packet_send(mud, mud_mtux, path, now);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1166,13 +1165,6 @@ mud_update(struct mud *mud)
|
|||||||
mud->crypto.send_time = now;
|
mud->crypto.send_time = now;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!mud->mtu.remote) &&
|
|
||||||
(mud_timeout(now, mud->mtu.send_time, mud->send_timeout))) {
|
|
||||||
mud_packet_send(mud, mud_mtux, path, now);
|
|
||||||
mud->mtu.send_time = now;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user