In vmx(4) TSO must pullup headers into first mbuf.
authorbluhm <bluhm@openbsd.org>
Mon, 17 Jun 2024 11:13:43 +0000 (11:13 +0000)
committerbluhm <bluhm@openbsd.org>
Mon, 17 Jun 2024 11:13:43 +0000 (11:13 +0000)
commitc95756fbdbd67a2f21d1de9fed4db3122a1cfd6d
treee155146ad95d50386e53f65d88471b0f53be14ba
parent331a70b61e9d6b6e97aaa0a677bd16e3cd743c3f
In vmx(4) TSO must pullup headers into first mbuf.

Forwarding IPv6 packets from vmx with LRO to vmx with TSO did not
work.  vmx(4) has the requirement that all headers are in the first
mbuf.  ip6_forward() is quite dumb.  It calls m_copym() to create
a mbuf that might be used for sending ICMP6 later.  After passing
the forwarded packet down to ether_encap(), m_prepend() is used to
restore the ethernet header.  As the mbuf cluster has been copied,
it is read only now.  That means m_prepend() does not provide the
empty space at the beginning of the cluster, but allocates a new
mbuf that contains only the ethernet header.  vmx(4) cannot transmit
such a TSO packet and drops it.

Solution is to call m_pullup() in vmxnet3_start().  If we ended up
in such a miserable condition, use the first mbuf in the chain and
move all headers into it.

OK jan@
sys/dev/pci/if_vmx.c