On Thu, Oct 19, 2023 at 04:04:26PM +0200, Jan Klemkow wrote:
> On Wed, Oct 18, 2023 at 08:53:44PM +0200, Alexander Bluhm wrote:
> > On Wed, Oct 18, 2023 at 08:19:29PM +0200, Mischa wrote:
> > > It's indeed something like that: ix -> vlan (tagged) -> veb
> > 
> > When vlan is added to veb, kernel should disable LRO on ix.
> > All testing before release did not find this code path :-(
> > 
> > Is it possible to add vlan to veb first, and then add or change the
> > vlan parent to ix?  If it works, that should also disable LRO.
> > 
> > Jan said he will have a look tomorrow.
> > 
> > trunk, carp, ... in veb or bridge might have the same issue.
> 
> First round of fixes for vlan(4), vxlan(4), nvgre(4) and bpe(4).

Don't know much about nvgre(4) and bpe(4).

Maybe we should call ifsetlro(ifp0, 0) unconditionally in
vxlan_set_parent().  Otherwise we may get large UDP packets with
large TCP frames.

For vlan(4) this diff is correct.  For the others it is at least
an improvement.

OK bluhm@

> Index: net/if.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if.c,v
> retrieving revision 1.708
> diff -u -p -r1.708 if.c
> --- net/if.c  16 Sep 2023 09:33:27 -0000      1.708
> +++ net/if.c  19 Oct 2023 13:03:33 -0000
> @@ -3243,6 +3243,17 @@ ifsetlro(struct ifnet *ifp, int on)
>       struct ifreq ifrq;
>       int error = 0;
>       int s = splnet();
> +     struct if_parent parent;
> +
> +     memset(&parent, 0, sizeof(parent));
> +     if ((*ifp->if_ioctl)(ifp, SIOCGIFPARENT, (caddr_t)&parent) != -1) {
> +             struct ifnet *ifp0 = if_unit(parent.ifp_parent);
> +
> +             if (ifp0 != NULL) {
> +                     ifsetlro(ifp0, on);
> +                     if_put(ifp0);
> +             }
> +     }
>  
>       if (!ISSET(ifp->if_capabilities, IFCAP_LRO)) {
>               error = ENOTSUP;
> Index: net/if_bpe.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_bpe.c,v
> retrieving revision 1.19
> diff -u -p -r1.19 if_bpe.c
> --- net/if_bpe.c      8 Nov 2021 04:54:44 -0000       1.19
> +++ net/if_bpe.c      19 Oct 2023 13:20:18 -0000
> @@ -631,6 +631,9 @@ bpe_set_parent(struct bpe_softc *sc, con
>               goto put;
>       }
>  
> +     if (ether_brport_isset(ifp))
> +             ifsetlro(ifp0, 0);
> +
>       /* commit */
>       sc->sc_key.k_if = ifp0->if_index;
>       etherbridge_flush(&sc->sc_eb, IFBF_FLUSHALL);
> Index: net/if_gre.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_gre.c,v
> retrieving revision 1.174
> diff -u -p -r1.174 if_gre.c
> --- net/if_gre.c      13 May 2023 13:35:17 -0000      1.174
> +++ net/if_gre.c      19 Oct 2023 13:24:56 -0000
> @@ -3544,6 +3544,9 @@ nvgre_set_parent(struct nvgre_softc *sc,
>               return (EPROTONOSUPPORT);
>       }
>  
> +     if (ether_brport_isset(&sc->sc_ac.ac_if))
> +             ifsetlro(ifp0, 0);
> +
>       /* commit */
>       sc->sc_ifp0 = ifp0->if_index;
>       if_put(ifp0);
> Index: net/if_vlan.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_vlan.c,v
> retrieving revision 1.215
> diff -u -p -r1.215 if_vlan.c
> --- net/if_vlan.c     16 May 2023 14:32:54 -0000      1.215
> +++ net/if_vlan.c     19 Oct 2023 11:08:23 -0000
> @@ -937,6 +937,9 @@ vlan_set_parent(struct vlan_softc *sc, c
>       if (error != 0)
>               goto put;
>  
> +     if (ether_brport_isset(ifp))
> +             ifsetlro(ifp0, 0);
> +
>       /* commit */
>       sc->sc_ifidx0 = ifp0->if_index;
>       if (!ISSET(sc->sc_flags, IFVF_LLADDR))
> Index: net/if_vxlan.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_vxlan.c,v
> retrieving revision 1.93
> diff -u -p -r1.93 if_vxlan.c
> --- net/if_vxlan.c    3 Aug 2023 09:49:08 -0000       1.93
> +++ net/if_vxlan.c    19 Oct 2023 13:18:47 -0000
> @@ -1582,6 +1582,9 @@ vxlan_set_parent(struct vxlan_softc *sc,
>               goto put;
>       }
>  
> +     if (ether_brport_isset(ifp))
> +             ifsetlro(ifp0, 0);
> +
>       /* commit */
>       sc->sc_if_index0 = ifp0->if_index;
>       etherbridge_flush(&sc->sc_eb, IFBF_FLUSHALL);

Reply via email to