Skip to content

Commit

Permalink
[rx] fix per link stats for data packets
Browse files Browse the repository at this point in the history
and cleanup all netutils common functions

Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
  • Loading branch information
fabbione committed Aug 20, 2020
1 parent 75a86b0 commit 42661f3
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 64 deletions.
53 changes: 5 additions & 48 deletions libknet/netutils.c
Expand Up @@ -19,65 +19,22 @@
#include "internals.h"
#include "netutils.h"

static int is_v4_mapped(const struct sockaddr_storage *ss, socklen_t salen)
int cmpaddr(const struct sockaddr_storage *ss1, const struct sockaddr_storage *ss2)
{
char map[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff };
struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) ss;
return memcmp(&addr6->sin6_addr, map, 12);
}

int cmpaddr(const struct sockaddr_storage *ss1, socklen_t sslen1,
const struct sockaddr_storage *ss2, socklen_t sslen2)
{
int ss1_offset = 0, ss2_offset = 0;
struct sockaddr_in6 *ss1_addr6 = (struct sockaddr_in6 *)ss1;
struct sockaddr_in6 *ss2_addr6 = (struct sockaddr_in6 *)ss2;
struct sockaddr_in *ss1_addr = (struct sockaddr_in *)ss1;
struct sockaddr_in *ss2_addr = (struct sockaddr_in *)ss2;
char *addr1, *addr2;

if (ss1->ss_family == ss2->ss_family) {
return memcmp(ss1, ss2, sslen1);
if (ss1->ss_family != ss2->ss_family) {
return -1;
}

if (ss1->ss_family == AF_INET6) {
if (is_v4_mapped(ss1, sslen1)) {
return 1;
}
addr1 = (char *)&ss1_addr6->sin6_addr;
ss1_offset = 12;
} else {
addr1 = (char *)&ss1_addr->sin_addr;
}

if (ss2->ss_family == AF_INET6) {
if (is_v4_mapped(ss2, sslen2)) {
return 1;
}
addr2 = (char *)&ss2_addr6->sin6_addr;
ss2_offset = 12;
} else {
addr2 = (char *)&ss2_addr->sin_addr;
return memcmp(&ss1_addr6->sin6_addr.s6_addr32, &ss2_addr6->sin6_addr.s6_addr32, sizeof(struct in6_addr));
}

return memcmp(addr1+ss1_offset, addr2+ss2_offset, 4);
}

int cpyaddrport(struct sockaddr_storage *dst, const struct sockaddr_storage *src)
{
struct sockaddr_in6 *dst_addr6 = (struct sockaddr_in6 *)dst;
struct sockaddr_in6 *src_addr6 = (struct sockaddr_in6 *)src;

memset(dst, 0, sizeof(struct sockaddr_storage));

if (src->ss_family == AF_INET6) {
dst->ss_family = src->ss_family;
memmove(&dst_addr6->sin6_port, &src_addr6->sin6_port, sizeof(in_port_t));
memmove(&dst_addr6->sin6_addr, &src_addr6->sin6_addr, sizeof(struct in6_addr));
} else {
memmove(dst, src, sizeof(struct sockaddr_in));
}
return 0;
return memcmp(&ss1_addr->sin_addr.s_addr, &ss2_addr->sin_addr.s_addr, sizeof(struct in_addr));
}

socklen_t sockaddr_len(const struct sockaddr_storage *ss)
Expand Down
3 changes: 1 addition & 2 deletions libknet/netutils.h
Expand Up @@ -12,8 +12,7 @@

#include <sys/socket.h>

int cmpaddr(const struct sockaddr_storage *ss1, socklen_t sslen1, const struct sockaddr_storage *ss2, socklen_t sslen2);
int cpyaddrport(struct sockaddr_storage *dst, const struct sockaddr_storage *src);
int cmpaddr(const struct sockaddr_storage *ss1, const struct sockaddr_storage *ss2);

socklen_t sockaddr_len(const struct sockaddr_storage *ss);
#endif
33 changes: 19 additions & 14 deletions libknet/threads_rx.c
Expand Up @@ -244,10 +244,9 @@ static void _parse_recv_from_links(knet_handle_t knet_h, int sockfd, const struc
struct knet_hostinfo *knet_hostinfo;
struct iovec iov_out[1];
int8_t channel;
struct sockaddr_storage pckt_src;
seq_num_t recv_seq_num;
int wipe_bufs = 0;
int try_decrypt = 0, decrypted = 0, i;
int try_decrypt = 0, decrypted = 0, i, found_link = 0;

for (i = 1; i <= KNET_MAX_CRYPTO_INSTANCES; i++) {
if (knet_h->crypto_instance[i]) {
Expand Down Expand Up @@ -303,22 +302,16 @@ static void _parse_recv_from_links(knet_handle_t knet_h, int sockfd, const struc
return;
}

src_link = src_host->link +
(inbuf->khp_ping_link % KNET_MAX_LINK);
if ((inbuf->kh_type & KNET_HEADER_TYPE_PMSK) != 0) {
/* be aware this works only for PING / PONG and PMTUd packets! */
src_link = src_host->link +
(inbuf->khp_ping_link % KNET_MAX_LINK);
if (src_link->dynamic == KNET_LINK_DYNIP) {
/*
* cpyaddrport will only copy address and port of the incoming
* packet and strip extra bits such as flow and scopeid
*/
cpyaddrport(&pckt_src, msg->msg_hdr.msg_name);

if (cmpaddr(&src_link->dst_addr, sockaddr_len(&src_link->dst_addr),
&pckt_src, sockaddr_len(&pckt_src)) != 0) {
if (cmpaddr(&src_link->dst_addr, msg->msg_hdr.msg_name) != 0) {
log_debug(knet_h, KNET_SUB_RX, "host: %u link: %u appears to have changed ip address",
src_host->host_id, src_link->link_id);
memmove(&src_link->dst_addr, &pckt_src, sizeof(struct sockaddr_storage));
if (knet_addrtostr(&src_link->dst_addr, sockaddr_len(msg->msg_hdr.msg_name),
memmove(&src_link->dst_addr, msg->msg_hdr.msg_name, sizeof(struct sockaddr_storage));
if (knet_addrtostr(&src_link->dst_addr, sockaddr_len(&src_link->dst_addr),
src_link->status.dst_ipaddr, KNET_MAX_HOST_LEN,
src_link->status.dst_port, KNET_MAX_PORT_LEN) != 0) {
log_debug(knet_h, KNET_SUB_RX, "Unable to resolve ???");
Expand All @@ -337,6 +330,18 @@ static void _parse_recv_from_links(knet_handle_t knet_h, int sockfd, const struc
*/
transport_link_dyn_connect(knet_h, sockfd, src_link);
}
} else { /* data packet */
for (i = 0; i < KNET_MAX_LINK; i++) {
src_link = &src_host->link[i];
if (cmpaddr(&src_link->dst_addr, msg->msg_hdr.msg_name) == 0) {
found_link = 1;
break;
}
}
if (!found_link) {
log_debug(knet_h, KNET_SUB_RX, "Unable to determine source link for data packet. Discarding packet.");
return;
}
}

stats_err = pthread_mutex_lock(&src_link->link_stats_mutex);
Expand Down

0 comments on commit 42661f3

Please sign in to comment.