From 0bb931a32cf4de1e5c989c8b8dfd5d9ad30262c6 Mon Sep 17 00:00:00 2001 From: "Fabio M. Di Nitto" Date: Mon, 19 Dec 2016 10:28:22 +0100 Subject: [PATCH] [PMTUd] adjust all values around new transports Signed-off-by: Fabio M. Di Nitto --- libknet/internals.h | 2 +- libknet/link.c | 4 ++++ libknet/threads_pmtud.c | 22 +++++++--------------- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/libknet/internals.h b/libknet/internals.h index 6504dfc89..4784c21b8 100644 --- a/libknet/internals.h +++ b/libknet/internals.h @@ -31,7 +31,6 @@ typedef void *knet_transport_link_t; /* per link transport handle */ typedef void *knet_transport_t; /* per knet_h transport handle */ struct knet_transport_ops; /* Forward because of circular dependancy */ - struct knet_listener { int sock; struct sockaddr_storage address; @@ -65,6 +64,7 @@ struct knet_link { uint8_t received_pong; struct timespec ping_last; /* used by PMTUD thread as temp per-link variables and should always contain the onwire_len value! */ + uint32_t proto_overhead; struct timespec pmtud_last; uint32_t last_ping_size; uint32_t last_good_mtu; diff --git a/libknet/link.c b/libknet/link.c index 8bd8a969e..4087fa9b9 100644 --- a/libknet/link.c +++ b/libknet/link.c @@ -157,6 +157,10 @@ int knet_link_set_config(knet_handle_t knet_h, uint16_t host_id, uint8_t link_id exit_unlock: if (!err) { link->transport_type = transport; + if ((knet_h->transport_ops[link->transport_type]) && + (knet_h->transport_ops[link->transport_type]->link_get_mtu_overhead)) { + link->proto_overhead = knet_h->transport_ops[link->transport_type]->link_get_mtu_overhead(link->transport); + } link->configured = 1; link->pong_count = KNET_LINK_DEFAULT_PONG_COUNT; link->has_valid_mtu = 0; diff --git a/libknet/threads_pmtud.c b/libknet/threads_pmtud.c index 46f53497e..71e2296c6 100644 --- a/libknet/threads_pmtud.c +++ b/libknet/threads_pmtud.c @@ -41,28 +41,20 @@ static int _handle_check_link_pmtud(knet_handle_t knet_h, struct knet_host *dst_ failsafe = 0; pad_len = 0; - /* - * FIXME: proto overhead should be included in overhead_len - */ - if ((knet_h->transport_ops[dst_link->transport_type]) && - (knet_h->transport_ops[dst_link->transport_type]->link_get_mtu_overhead)) { - dst_link->last_bad_mtu = knet_h->transport_ops[dst_link->transport_type]->link_get_mtu_overhead(dst_link->transport); - } else { - dst_link->last_bad_mtu = 0; - } + dst_link->last_bad_mtu = 0; knet_h->pmtudbuf->khp_pmtud_link = dst_link->link_id; switch (dst_link->dst_addr.ss_family) { case AF_INET6: max_mtu_len = KNET_PMTUD_SIZE_V6; - overhead_len = KNET_PMTUD_OVERHEAD_V6; - dst_link->last_good_mtu = dst_link->last_ping_size + KNET_PMTUD_OVERHEAD_V6; + overhead_len = KNET_PMTUD_OVERHEAD_V6 + dst_link->proto_overhead; + dst_link->last_good_mtu = dst_link->last_ping_size + overhead_len; break; case AF_INET: max_mtu_len = KNET_PMTUD_SIZE_V4; - overhead_len = KNET_PMTUD_OVERHEAD_V4; - dst_link->last_good_mtu = dst_link->last_ping_size + KNET_PMTUD_OVERHEAD_V6; + overhead_len = KNET_PMTUD_OVERHEAD_V4 + dst_link->proto_overhead; + dst_link->last_good_mtu = dst_link->last_ping_size + overhead_len; break; default: log_debug(knet_h, KNET_SUB_PMTUD_T, "PMTUD aborted, unknown protocol"); @@ -277,10 +269,10 @@ static int _handle_check_pmtud(knet_handle_t knet_h, struct knet_host *dst_host, switch (dst_link->dst_addr.ss_family) { case AF_INET6: - dst_link->status.proto_overhead = KNET_PMTUD_OVERHEAD_V6 + KNET_HEADER_ALL_SIZE + knet_h->sec_header_size; + dst_link->status.proto_overhead = KNET_PMTUD_OVERHEAD_V6 + dst_link->proto_overhead + KNET_HEADER_ALL_SIZE + knet_h->sec_header_size; break; case AF_INET: - dst_link->status.proto_overhead = KNET_PMTUD_OVERHEAD_V4 + KNET_HEADER_ALL_SIZE + knet_h->sec_header_size; + dst_link->status.proto_overhead = KNET_PMTUD_OVERHEAD_V4 + dst_link->proto_overhead + KNET_HEADER_ALL_SIZE + knet_h->sec_header_size; break; }