On Wed, Mar 27, 2024 at 11:05 AM Akihiko Odaki <akihiko.od...@daynix.com> wrote: > > On 2024/03/27 11:59, Jason Wang wrote: > > On Wed, Mar 27, 2024 at 10:53 AM Akihiko Odaki <akihiko.od...@daynix.com> > > wrote: > >> > >> On 2024/03/27 11:50, Jason Wang wrote: > >>> On Tue, Mar 26, 2024 at 3:04 PM Akihiko Odaki <akihiko.od...@daynix.com> > >>> wrote: > >>>> > >>>> On 2024/03/26 15:51, Jason Wang wrote: > >>>>> On Sun, Mar 24, 2024 at 4:32 PM Akihiko Odaki > >>>>> <akihiko.od...@daynix.com> wrote: > >>>>>> > >>>>>> It is incorrect to have the VIRTIO_NET_HDR_F_NEEDS_CSUM set when > >>>>>> checksum offloading is disabled so clear the bit. Set the > >>>>>> VIRTIO_NET_HDR_F_DATA_VALID bit instead to tell the checksum is valid. > >>>>>> > >>>>>> TCP/UDP checksum is usually offloaded when the peer requires virtio > >>>>>> headers because they can instruct the peer to compute checksum. > >>>>>> However, > >>>>>> igb disables TX checksum offloading when a VF is enabled whether the > >>>>>> peer requires virtio headers because a transmitted packet can be routed > >>>>>> to it and it expects the packet has a proper checksum. Therefore, it > >>>>>> is necessary to have a correct virtio header even when checksum > >>>>>> offloading is disabled. > >>>>>> > >>>>>> A real TCP/UDP checksum will be computed and saved in the buffer when > >>>>>> checksum offloading is disabled. The virtio specification requires to > >>>>>> set the packet checksum stored in the buffer to the TCP/UDP pseudo > >>>>>> header when the VIRTIO_NET_HDR_F_NEEDS_CSUM bit is set so the bit must > >>>>>> be cleared in that case. > >>>>>> > >>>>>> The VIRTIO_NET_HDR_F_NEEDS_CSUM bit also tells to skip checksum > >>>>>> validation. Even if checksum offloading is disabled, it is desirable to > >>>>>> skip checksum validation because the checksum is always correct. Use > >>>>>> the > >>>>>> VIRTIO_NET_HDR_F_DATA_VALID bit to claim the validity of the checksum. > >>>>>> > >>>>>> Fixes: ffbd2dbd8e64 ("e1000e: Perform software segmentation for > >>>>>> loopback") > >>>>>> Buglink: https://issues.redhat.com/browse/RHEL-23067 > >>>>>> Signed-off-by: Akihiko Odaki <akihiko.od...@daynix.com> > >>>>>> --- > >>>>>> hw/net/net_tx_pkt.c | 3 +++ > >>>>>> 1 file changed, 3 insertions(+) > >>>>>> > >>>>>> diff --git a/hw/net/net_tx_pkt.c b/hw/net/net_tx_pkt.c > >>>>>> index 2e5f58b3c9cc..c225cf706513 100644 > >>>>>> --- a/hw/net/net_tx_pkt.c > >>>>>> +++ b/hw/net/net_tx_pkt.c > >>>>>> @@ -833,6 +833,9 @@ bool net_tx_pkt_send_custom(struct NetTxPkt *pkt, > >>>>>> bool offload, > >>>>>> > >>>>>> if (offload || gso_type == VIRTIO_NET_HDR_GSO_NONE) { > >>>>>> if (!offload && pkt->virt_hdr.flags & > >>>>>> VIRTIO_NET_HDR_F_NEEDS_CSUM) { > >>>>>> + pkt->virt_hdr.flags = > >>>>>> + (pkt->virt_hdr.flags & ~VIRTIO_NET_HDR_F_NEEDS_CSUM) | > >>>>>> + VIRTIO_NET_HDR_F_DATA_VALID; > >>>>> > >>>>> Why VIRTIO_NET_HDR_F_DATA_VALID is used in TX path? > >>>> > >>>> On igb, a packet sent from a PCI function may be routed to another > >>>> function. The virtio header updated here will be directly provided to > >>>> the RX path in such a case. > >>> > >>> But I meant for example net_tx_pkt_send_custom() is used in > >>> e1000e_tx_pkt_send() which is the tx path on the host. > >>> > >>> VIRTIO_NET_HDR_F_DATA_VALID is not necessary in the tx path. > >> > >> igb passes igb_tx_pkt_vmdq_callback to net_tx_pkt_send_custom(). > >> igb_tx_pkt_vmdq_callback() passes the packet to its rx path for loopback. > >> > > > > You are right, how about igb_tx_pkt_vmdq_callback()? > > > > We probably need to tweak the name if it is only used in rx path. > > igb_tx_pkt_vmdq_callback() itself is part of the tx path of a PCI > function, and invokes the rx path of another PCI function in case of > loopback, or triggers the transmission to the external peer.
Right, so if it's an external TX, VIRTIO_NET_HDR_F_DATA_VALID may not work there. Thanks > > Regards, > Akihiko Odaki > > > > > Thanks > > > >> Regards, > >> Akihiko Odaki > >> > >>> > >>> Thanks > >>> > >>>> > >>>> Regards, > >>>> Akihiko Odaki > >>>> > >>>>> > >>>>> Thanks > >>>>> > >>>>>> net_tx_pkt_do_sw_csum(pkt, > >>>>>> &pkt->vec[NET_TX_PKT_L2HDR_FRAG], > >>>>>> pkt->payload_frags + > >>>>>> NET_TX_PKT_PL_START_FRAG - 1, > >>>>>> pkt->payload_len); > >>>>>> > >>>>>> --- > >>>>>> base-commit: ba49d760eb04630e7b15f423ebecf6c871b8f77b > >>>>>> change-id: 20240324-tx-c57d3c22ad73 > >>>>>> > >>>>>> Best regards, > >>>>>> -- > >>>>>> Akihiko Odaki <akihiko.od...@daynix.com> > >>>>>> > >>>>> > >>>> > >>> > >> > > >