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>
> >>>>>>
> >>>>>
> >>>>
> >>>
> >>
> >
>


Reply via email to