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
This commit is contained in:
Logan oos Even 2022-06-26 00:07:29 +02:00 committed by GitHub
parent 063db27ea6
commit ffb4e31b8a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 53 additions and 27 deletions

View File

@ -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 */

View File

@ -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,

View File

@ -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. */

View File

@ -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(&reg.sock, (struct sockaddr*)sender_sock);
/* Re-encode the header. */
encode_REGISTER(encbuf, &encx, &cmn2, &reg);
@ -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(&reg.sock, (struct sockaddr*)sender_sock);
cmn2.pc = n2n_register_super;
encode_REGISTER_SUPER(ackbuf, &encx, &cmn2, &reg);
@ -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);

View File

@ -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,