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@