Send ip and port to peers

Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
This commit is contained in:
Adrien Gallouët
2018-03-10 15:31:41 +00:00
parent bb6b87bb54
commit b53248b6da
2 changed files with 43 additions and 1 deletions

42
mud.c
View File

@@ -105,11 +105,24 @@ struct mud_public {
unsigned char local[MUD_PUB_SIZE];
};
struct mud_addr {
union {
unsigned char v6[16];
struct {
unsigned char zero[10];
unsigned char ff[2];
unsigned char v4[4];
};
};
unsigned char port[2];
};
struct mud_packet {
struct {
unsigned char zero[MUD_U48_SIZE];
unsigned char time[MUD_U48_SIZE];
unsigned char kiss[MUD_KISS_SIZE];
struct mud_addr addr;
unsigned char code;
} hdr;
union {
@@ -967,6 +980,21 @@ mud_packet_send(struct mud *mud, enum mud_packet_code code,
mud_write48(packet->hdr.time, now);
memcpy(packet->hdr.kiss, mud->local.kiss, sizeof(mud->local.kiss));
if (path->addr.ss_family == AF_INET) {
packet->hdr.addr.ff[0] = 0xFF;
packet->hdr.addr.ff[1] = 0xFF;
memcpy(packet->hdr.addr.v4,
&((struct sockaddr_in *)&path->addr)->sin_addr, 4);
memcpy(packet->hdr.addr.port,
&((struct sockaddr_in *)&path->addr)->sin_port, 2);
} else if (path->addr.ss_family == AF_INET6) {
memcpy(packet->hdr.addr.v6,
&((struct sockaddr_in6 *)&path->addr)->sin6_addr, 16);
memcpy(packet->hdr.addr.port,
&((struct sockaddr_in6 *)&path->addr)->sin6_port, 2);
} else return;
packet->hdr.code = (unsigned char)code;
switch (code) {
@@ -1062,6 +1090,20 @@ mud_packet_recv(struct mud *mud, struct mud_path *path,
memcpy(mud->remote.kiss, packet->hdr.kiss,
sizeof(path->conf.kiss));
if (memcmp(packet->hdr.addr.v6, "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12)) {
path->r_addr.ss_family = AF_INET6;
memcpy(&((struct sockaddr_in6 *)&path->r_addr)->sin6_addr,
packet->hdr.addr.v6, 16);
memcpy(&((struct sockaddr_in6 *)&path->r_addr)->sin6_port,
packet->hdr.addr.port, 2);
} else {
path->r_addr.ss_family = AF_INET;
memcpy(&((struct sockaddr_in *)&path->r_addr)->sin_addr,
packet->hdr.addr.v4, 4);
memcpy(&((struct sockaddr_in *)&path->r_addr)->sin_port,
packet->hdr.addr.port, 2);
}
if (!mud->peer.set)
mud_kiss_path(mud, mud->remote.kiss);

2
mud.h
View File

@@ -17,7 +17,7 @@ enum mud_state {
struct mud_path {
enum mud_state state;
struct sockaddr_storage local_addr, addr;
struct sockaddr_storage local_addr, addr, r_addr;
struct {
uint64_t send_time;
int remote;