aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartlomiej Grzesik <bag@semihalf.com>2021-09-24 08:25:53 +0000
committerWojciech Macek <wma@FreeBSD.org>2021-09-24 08:25:53 +0000
commitb4220bf387e62f59d73308f122f5eea887a59d58 (patch)
treee9fe848f4e34f21bbdab081c3dc51b150b94ef00
parent4f3376951d7024d1c3446af2260cef9e4d3404a6 (diff)
downloadsrc-b4220bf387e62f59d73308f122f5eea887a59d58.tar.gz
src-b4220bf387e62f59d73308f122f5eea887a59d58.zip
ipsec: If no PMTU in hostcache assume it's equal to link's MTU
If we fail to find to PMTU in hostcache, we assume it's equal to link's MTU. This patch prevents packets larger then link's MTU to be dropped silently if there is no PMTU in hostcache. Differential revision: https://reviews.freebsd.org/D31770 Obtained from: Semihalf Sponsored by: Stormshield
-rw-r--r--sys/netipsec/ipsec_output.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/sys/netipsec/ipsec_output.c b/sys/netipsec/ipsec_output.c
index 50bbd72f0589..c4e34665b8f5 100644
--- a/sys/netipsec/ipsec_output.c
+++ b/sys/netipsec/ipsec_output.c
@@ -352,15 +352,29 @@ setdf:
key_freesav(&sav);
pmtu = tcp_hc_getmtu(&inc);
- /* No entry in hostcache. */
- if (pmtu == 0)
- return (0);
+ /* No entry in hostcache. Use link MTU instead. */
+ if (pmtu == 0) {
+ switch (dst->sa.sa_family) {
+ case AF_INET:
+ pmtu = tcp_maxmtu(&inc, NULL);
+ break;
+#ifdef INET6
+ case AF_INET6:
+ pmtu = tcp_maxmtu6(&inc, NULL);
+ break;
+#endif
+ }
+ if (pmtu == 0)
+ return (0);
+
+ tcp_hc_updatemtu(&inc, pmtu);
+ }
hlen = ipsec_hdrsiz_internal(sp);
if (m_length(m, NULL) + hlen > pmtu) {
/*
* If we're forwarding generate ICMP message here,
- * so that it contains pmtu and not link mtu.
+ * so that it contains pmtu substraced by header size.
* Set error to EINPROGRESS, in order for the frame
* to be dropped silently.
*/