From ffb4e31b8a13ce2356de0158d58085cfd8a4ac33 Mon Sep 17 00:00:00 2001 From: Logan oos Even <46396513+Logan007@users.noreply.github.com> Date: Sun, 26 Jun 2022 00:07:29 +0200 Subject: [PATCH] encapsulated several fillings of n2n_sock_t in single function (#1025) * encapsulated several fillings of n2n_sock_t in single function * Windows specifics... * stuck to the project's style code --- include/n2n_typedefs.h | 2 ++ include/n2n_wire.h | 3 +++ src/edge_utils.c | 6 +++--- src/sn_utils.c | 35 +++++++++++------------------------ src/wire.c | 34 ++++++++++++++++++++++++++++++++++ 5 files changed, 53 insertions(+), 27 deletions(-) diff --git a/include/n2n_typedefs.h b/include/n2n_typedefs.h index f0c94e0..ad61c85 100644 --- a/include/n2n_typedefs.h +++ b/include/n2n_typedefs.h @@ -240,6 +240,8 @@ typedef struct tuntap_dev { } tuntap_dev; #define SOCKET int +#else /* #ifndef WIN32 */ +typedef u_short sa_family_t; #endif /* #ifndef WIN32 */ diff --git a/include/n2n_wire.h b/include/n2n_wire.h index 6ca11ed..f56c8d9 100644 --- a/include/n2n_wire.h +++ b/include/n2n_wire.h @@ -190,6 +190,9 @@ int fill_sockaddr (struct sockaddr * addr, size_t addrlen, const n2n_sock_t * sock); +int fill_n2nsock (n2n_sock_t* sock, + struct sockaddr* sa); + int encode_PACKET (uint8_t * base, size_t * idx, const n2n_common_t * common, diff --git a/src/edge_utils.c b/src/edge_utils.c index 7d77d6d..962fc4e 100644 --- a/src/edge_utils.c +++ b/src/edge_utils.c @@ -2190,9 +2190,9 @@ void process_udp (n2n_edge_t *eee, const struct sockaddr_in *sender_sock, const // TCP expects that we know our comm partner and does not deliver the sender memcpy(&sender, &(eee->curr_sn->sock), sizeof(struct sockaddr_in)); else { - sender.family = AF_INET; /* UDP socket was opened PF_INET v4 */ - sender.port = ntohs(sender_sock->sin_port); - memcpy(&(sender.addr.v4), &(sender_sock->sin_addr.s_addr), IPV4_SIZE); + // REVISIT: type conversion back and forth, choose a consistent approach throughout whole code, + // i.e. stick with more general sockaddr as long as possible and narrow only if required + fill_n2nsock(&sender, (struct sockaddr*)sender_sock); } /* The packet may not have an orig_sender socket spec. So default to last * hop as sender. */ diff --git a/src/sn_utils.c b/src/sn_utils.c index cb1d6f5..55fb318 100644 --- a/src/sn_utils.c +++ b/src/sn_utils.c @@ -1655,9 +1655,7 @@ static int process_udp (n2n_sn_t * sss, /* REVISIT: when UDP/IPv6 is supported we will need a flag to indicate which * IP transport version the packet arrived on. May need to UDP sockets. */ memset(&sender, 0, sizeof(n2n_sock_t)); - sender.family = AF_INET; /* UDP socket was opened PF_INET v4 */ - sender.port = ntohs(sender_sock->sin_port); - memcpy(&(sender.addr.v4), &(sender_sock->sin_addr.s_addr), IPV4_SIZE); + fill_n2nsock(&sender, (struct sockaddr*)sender_sock); from_supernode = cmn.flags & N2N_FLAGS_FROM_SUPERNODE; if(from_supernode) { @@ -1720,9 +1718,7 @@ static int process_udp (n2n_sn_t * sss, /* We are going to add socket even if it was not there before */ cmn2.flags |= N2N_FLAGS_SOCKET | N2N_FLAGS_FROM_SUPERNODE; - pkt.sock.family = AF_INET; - pkt.sock.port = ntohs(sender_sock->sin_port); - memcpy(pkt.sock.addr.v4, &(sender_sock->sin_addr.s_addr), IPV4_SIZE); + fill_n2nsock(&pkt.sock, (struct sockaddr*)sender_sock); rec_buf = encbuf; /* Re-encode the header. */ @@ -1805,9 +1801,7 @@ static int process_udp (n2n_sn_t * sss, /* We are going to add socket even if it was not there before */ cmn2.flags |= N2N_FLAGS_SOCKET | N2N_FLAGS_FROM_SUPERNODE; - reg.sock.family = AF_INET; - reg.sock.port = ntohs(sender_sock->sin_port); - memcpy(reg.sock.addr.v4, &(sender_sock->sin_addr.s_addr), IPV4_SIZE); + fill_n2nsock(®.sock, (struct sockaddr*)sender_sock); /* Re-encode the header. */ encode_REGISTER(encbuf, &encx, &cmn2, ®); @@ -1966,9 +1960,7 @@ static int process_udp (n2n_sn_t * sss, ack.lifetime = reg_lifetime(sss); - ack.sock.family = AF_INET; - ack.sock.port = ntohs(sender_sock->sin_port); - memcpy(ack.sock.addr.v4, &(sender_sock->sin_addr.s_addr), IPV4_SIZE); + fill_n2nsock(&ack.sock, (struct sockaddr*)sender_sock); /* Add sender's data to federation (or update it) */ if(comm->is_federation == IS_FEDERATION) { @@ -2049,9 +2041,7 @@ static int process_udp (n2n_sn_t * sss, // NULL comm and from_supernode parameter) // exception: do not forward auto ip draw if(!is_null_mac(reg.edgeMac)) { - reg.sock.family = AF_INET; - reg.sock.port = ntohs(sender_sock->sin_port); - memcpy(reg.sock.addr.v4, &(sender_sock->sin_addr.s_addr), IPV4_SIZE); + fill_n2nsock(®.sock, (struct sockaddr*)sender_sock); cmn2.pc = n2n_register_super; encode_REGISTER_SUPER(ackbuf, &encx, &cmn2, ®); @@ -2196,9 +2186,8 @@ static int process_udp (n2n_sn_t * sss, n2n_REGISTER_SUPER_ACK_payload_t *payload; memset(&sender, 0, sizeof(n2n_sock_t)); - sender.family = AF_INET; - sender.port = ntohs(sender_sock->sin_port); - memcpy(&(sender.addr.v4), &(sender_sock->sin_addr.s_addr), IPV4_SIZE); + fill_n2nsock(&sender, (struct sockaddr*)sender_sock); + orig_sender = &sender; memset(&ack, 0, sizeof(n2n_REGISTER_SUPER_ACK_t)); @@ -2282,9 +2271,7 @@ static int process_udp (n2n_sn_t * sss, n2n_sock_t sender; memset(&sender, 0, sizeof(n2n_sock_t)); - sender.family = AF_INET; - sender.port = ntohs(sender_sock->sin_port); - memcpy(&(sender.addr.v4), &(sender_sock->sin_addr.s_addr), IPV4_SIZE); + fill_n2nsock(&sender, (struct sockaddr*)sender_sock); memset(&nak, 0, sizeof(n2n_REGISTER_SUPER_NAK_t)); @@ -2401,9 +2388,9 @@ static int process_udp (n2n_sn_t * sss, pi.aflags = 0; memcpy(pi.mac, query.targetMac, sizeof(n2n_mac_t)); memcpy(pi.srcMac, sss->mac_addr, sizeof(n2n_mac_t)); - pi.sock.family = AF_INET; - pi.sock.port = ntohs(sender_sock->sin_port); - memcpy(pi.sock.addr.v4, &(sender_sock->sin_addr.s_addr), IPV4_SIZE); + + fill_n2nsock(&pi.sock, (struct sockaddr*)sender_sock); + pi.load = sn_selection_criterion_gather_data(sss); snprintf(pi.version, sizeof(pi.version), "%s", sss->version); diff --git a/src/wire.c b/src/wire.c index 4eb6576..2901ad3 100644 --- a/src/wire.c +++ b/src/wire.c @@ -600,11 +600,45 @@ int fill_sockaddr (struct sockaddr * addr, retval = 0; } } + if(AF_INET6 == sock->family) { + if(addrlen >= sizeof(struct sockaddr_in6)) { + struct sockaddr_in6 * si = (struct sockaddr_in6 *)addr; + si->sin6_family = sock->family; + si->sin6_port = htons(sock->port); + memcpy(&(si->sin6_addr.s6_addr), sock->addr.v6, IPV6_SIZE); + retval = 0; + } + } return retval; } +// fills struct sockaddr's data into n2n_sock +int fill_n2nsock (n2n_sock_t* sock, struct sockaddr* sa) { + + sock->family = *(sa_family_t*)sa; + switch(sock->family) { + case AF_INET: { + sock->port = ntohs(((struct sockaddr_in*)sa)->sin_port); + memcpy(sock->addr.v4, &((struct sockaddr_in*)sa)->sin_addr.s_addr, sizeof(struct in_addr)); + break; + } + case AF_INET6: { + sock->port = ntohs(((struct sockaddr_in6*)sa)->sin6_port); + memcpy(sock->addr.v6, &((struct sockaddr_in6*)sa)->sin6_addr.s6_addr, sizeof(struct in6_addr)); + break; + } + default: + sock->family = AF_INVALID; + return -1; + break; /* well, ... */ + } + + return 0; +} + + int encode_PACKET (uint8_t * base, size_t * idx, const n2n_common_t * common,