For path MTU discovery tcp_mtudisc() should resend a TCP packet by
authorbluhm <bluhm@openbsd.org>
Wed, 30 Jun 2021 11:26:49 +0000 (11:26 +0000)
committerbluhm <bluhm@openbsd.org>
Wed, 30 Jun 2021 11:26:49 +0000 (11:26 +0000)
calling tcp_output() if the TCP maximum segment size changes.  But
that did not work, as the new value was compared before tcp_mss()
had a chance to modify it.  Move the comparison and change it from
not equal to greater than.  It makes only sense to resend a packet
immediately if it becomes smaller and is more likely to fit.
OK sashan@ tobhe@

sys/netinet/tcp_subr.c

index 49f3aa8..6ec0fb7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tcp_subr.c,v 1.176 2021/02/25 02:48:21 dlg Exp $      */
+/*     $OpenBSD: tcp_subr.c,v 1.177 2021/06/30 11:26:49 bluhm Exp $    */
 /*     $NetBSD: tcp_subr.c,v 1.22 1996/02/13 23:44:00 christos Exp $   */
 
 /*
@@ -837,15 +837,14 @@ tcp_mtudisc(struct inpcb *inp, int errno)
 {
        struct tcpcb *tp = intotcpcb(inp);
        struct rtentry *rt;
-       int change = 0;
+       int orig_maxseg, change = 0;
 
        if (tp == NULL)
                return;
+       orig_maxseg = tp->t_maxseg;
 
        rt = in_pcbrtentry(inp);
        if (rt != NULL) {
-               int orig_maxseg = tp->t_maxseg;
-
                /*
                 * If this was not a host route, remove and realloc.
                 */
@@ -854,11 +853,12 @@ tcp_mtudisc(struct inpcb *inp, int errno)
                        if ((rt = in_pcbrtentry(inp)) == NULL)
                                return;
                }
-               if (orig_maxseg != tp->t_maxseg ||
-                   (rt->rt_locks & RTV_MTU))
+               if (rt->rt_locks & RTV_MTU)
                        change = 1;
        }
        tcp_mss(tp, -1);
+       if (orig_maxseg > tp->t_maxseg)
+               change = 1;
 
        /*
         * Resend unacknowledged packets