OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

virtio-comment message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]


Subject: Re: [virtio-comment] Re: [virtio-dev] Re: [virtio-comment] Re: [PATCH v5] virtio-net: device does not deliver partially checksummed packet and may validate the checksum


On Thu, Dec 21, 2023 at 11:43âAM Heng Qi <hengqi@linux.alibaba.com> wrote:
>
>
>
> å 2023/12/21 äå9:34, Jason Wang åé:
> > On Wed, Dec 20, 2023 at 3:42âPM Heng Qi <hengqi@linux.alibaba.com> wrote:
> >>
> >>
> >> å 2023/12/20 äå2:59, Jason Wang åé:
> >>> On Wed, Dec 20, 2023 at 2:30âPM Heng Qi <hengqi@linux.alibaba.com> wrote:
> >>>>
> >>>> å 2023/12/20 äå1:48, Jason Wang åé:
> >>>>> On Wed, Dec 20, 2023 at 12:07âAM Heng Qi <hengqi@linux.alibaba.com> wrote:
> >>>>>> å 2023/12/19 äå3:53, Jason Wang åé:
> >>>>>>> On Mon, Dec 18, 2023 at 12:54âPM Heng Qi <hengqi@linux.alibaba.com> wrote:
> >>>>>>>> å 2023/12/18 äå11:10, Jason Wang åé:
> >>>>>>>>> On Fri, Dec 15, 2023 at 5:51âPM Heng Qi <hengqi@linux.alibaba.com> wrote:
> >>>>>>>>>> Hi all!
> >>>>>>>>>>
> >>>>>>>>>> I would like to ask if anyone has any comments on this version, if so
> >>>>>>>>>> please let me know!
> >>>>>>>>>> If not, I will collect Michael's comments and publish a new version next
> >>>>>>>>>> Monday.
> >>>>>>>>> I have a dumb question. (And sorry if I asked it before)
> >>>>>>>>>
> >>>>>>>>> Looking at the spec and code. It looks to me DATA_VALID could be set
> >>>>>>>>> without GUEST_CSUM.
> >>>>>>>> I don't see that in the spec.
> >>>>>>>> Am I missing something? [1][2]
> >>>>>>>>
> >>>>>>>> [1] If the VIRTIO_NET_F_GUEST_CSUM feature was negotiated, the
> >>>>>>>> VIRTIO_NET_HDR_F_DATA_VALID bit in flags can be set: if so, device has
> >>>>>>>> validated the packet checksum. In case of multiple encapsulated
> >>>>>>>> protocols, one level of checksums has been validated.
> >>>>>>>> Additionally, VIRTIO_NET_F_GUEST_CSUM, TSO4, TSO6, UDP and ECN features
> >>>>>>>> *enable receive checksum*, large receive offload and ECN support which
> >>>>>>>> are the input equivalents of the transmit checksum, transmit
> >>>>>>>> segmentation *offloading* and ECN features, as described in 5.1.6.2.
> >>>>>>>>
> >>>>>>>> [2] If VIRTIO_NET_F_GUEST_CSUM is not negotiated, the device *MUST set
> >>>>>>>> flags to zero* and SHOULD supply a fully checksummed packet to the driver.
> >>>>>>> So this is kind of ambiguous and seems not what I wanted when I wrote
> >>>>>>> the code for DATA_VALID in 2011.
> >>>>>> Hi Jason, please see below.
> >>>>>>
> >>>>>>> NEEDS_CSUM maps to CHECKSUM_PARTIAL which means the packet checksum is
> >>>>>>> correct.
> >>>>>> Yes. This mapping is because the PARTIAL checksum usually does not go
> >>>>>> through the physical wire,
> >>>>>> so it is considered safe, and the checksum does not need to be verified.
> >>>>>>
> >>>>>>> So spec had
> >>>>>>>
> >>>>>>> """
> >>>>>>> If neither VIRTIO_NET_HDR_F_NEEDS_CSUM nor VIRTIO_NET_HDR_F_DATA_VALID
> >>>>>>> is set, the driver MUST NOT rely on the packet checksum being correct.
> >>>>>>> """
> >>>>>> Yes. The checksum of a packet without NEEDS_CSUM or has not been
> >>>>>> verified (DATA_VALID set) is unreliable.
> >>>>>> This patch doesn't break that.
> >>>>>>
> >>>>>>> For DATA_VALID, it maps to CHECKSUM_UNNECESSARY which is mutually
> >>>>>>> exclusive with CHECKSUM_PARTAIL.
> >>>>>> Yes. Both cannot be set or appear at the same time.
> >>>>> So setting both DATA_VALID and NEEDS_CSUM seems ambiguous.
> >>>>>
> >>>>> NEEDS_CSUM: the data is correct but the packet doesn't contain checksum
> >>>> This is not containing checksum, the pseudo header checksum is saved in
> >>>> the checksum field of the transport header.
> >>> I have a hard time understanding this. But yes, basically I meant the
> >>> checksum is partial. So the device can't do validation.
> >> If the rx device does receive a partially checksummed packet, but the
> >> driver requires a fullly
> >> checksummed packet, then the rx device can help to calculate the full
> >> checksum for packets.
> > So this can only happen for virtual devices as hardware devices can't
> > receive partial csum packets.
>
> YES. It should be.
>
> >
> >>>>> DATA_VALID: the checksum has been validated, this implies the packet
> >>>>> contains a checksum
> >>>> I'm not sure if both are set at the same time, and even if set,
> >>>> CHECKSUM_PARTIAL will still work when forwarded.
> >>>> But why are we discussing this?
> >>> I don't get this question.
> >>>
> >>> As a reviewer, I have the right to raise any issue I spot. This is how
> >>> the community works.
> >> Sorry I wasn't questioning your question, and I think you captured the
> >> concerns very well from a nic perspective.
> > I see, thanks. I want to offer help indeed.
>
> Thanks very much!
>
> >
> >>> It is intended to reply to the past discussion
> >>>
> >>> 1) like your above statement "Both cannot be set or appear at the same time."
> >>> 2) the example in Linux where CHECKSUM_UNNECESSARY and
> >>> CHECKSUM_PARTIAL are mutually exclusive.
> >>>
> >>>>>>> And this is what Linux did right now:
> >>>>>>>
> >>>>>>> For tun_put_user():
> >>>>>>>
> >>>>>>>             if (skb->ip_summed == CHECKSUM_PARTIAL) {
> >>>>>>>                     ...
> >>>>>>>             } else if (has_data_valid &&
> >>>>>>>                        skb->ip_summed == CHECKSUM_UNNECESSARY) {
> >>>>>>>                        hdr->flags = VIRTIO_NET_HDR_F_DATA_VALID;
> >>>>>>>             } /* else everything is zero */
> >>>>>>>
> >>>>>>> This CHECKSUM_UNNECESSARY will work even if GUEST_CSUM is disabled if
> >>>>>>> I was not wrong.
> >>>>>> I think you are talking about this commit:
> >>>>>> 10a8d94a95742bb15b4e617ee9884bb4381362be
> >>>>>>
> >>>>>> But in fact, as your commit log says, I think this is a hack.
> >>>>> It's not, see below.
> >>>>>
> >>>>>> Host nics
> >>>>>> does not fall into the scope of virtio spec?
> >>>>> Seems not, a lot of NIC produces CHECKSUM_UNNECESSARY, I don't see how
> >>>>> virtio-net differs in this case.
> >>>>>
> >>>>>>> And in receive_buf():
> >>>>>>>
> >>>>>>>             if (hdr->hdr.flags & VIRTIO_NET_HDR_F_DATA_VALID)
> >>>>>>>                     skb->ip_summed = CHECKSUM_UNNECESSARY;
> >>>>>>>
> >>>>>>> I think we can fix this by safely removing "*MUST set flags to zero*"
> >>>>>>> in [2] from the spec.
> >>>>>> Sorry. I cannot follow this view.
> >>>>>>
> >>>>>> 1. First of all, VIRTIO_NET_F_GUEST_CSUM (partial csum is not considered
> >>>>>> now, because we have no dispute about it) does represent the device's
> >>>>>> ability to calculate and verify checksums.
> >>>>>> Its ability to handle partial checksums (NEEDS_CSUM) is just a special
> >>>>>> processing of virtio, the Linux kernel never had a netdev feature for
> >>>>>> partial checksum handling.
> >>>>>>
> >>>>>>       1.1 VIRTIO_NET_F_GUEST_{TSO4, TSO6, USO4} etc. depend on
> >>>>>> VIRTIO_NET_F_GUEST_CSUM.
> >>>>>>             The reason for being relied upon is not that they are related
> >>>>>> to NEEDS_CSUM, but that the device needs to recalculate and verify the
> >>>>>> checksum of the packets when merging the packets.
> >>>>>>             See netdev_fix_features:
> >>>>>>            if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_CSUM))
> >>>>>>                      dev->features |= NETIF_F_RXCSUM;
> >>>>>>       - netdev_fix_features ->
> >>>>>>        if (!(features & NETIF_F_RXCSUM)) {
> >>>>>>                      /* NETIF_F_GRO_HW implies doing RXCSUM since every packet
> >>>>>>                       * successfully merged by hardware must also have the
> >>>>>>                       * checksum verified by hardware. If the user does not
> >>>>>>                       * want to enable RXCSUM, logically, we should disable
> >>>>>> GRO_HW.
> >>>>>>                       */
> >>>>>>                      if (features & NETIF_F_GRO_HW) {
> >>>>>>                              netdev_dbg(dev, "Dropping NETIF_F_GRO_HW since
> >>>>>> no RXCSUM feature.\n");
> >>>>>>                              features &= ~NETIF_F_GRO_HW;
> >>>>>>                      }
> >>>>>>              }
> >>>>> Let's leave vitio features just now.
> >>>>>
> >>>>> RX checksum offloading usually means the device can do checksum
> >>>>> validation, so there's no need for the stack to do it again.
> >>>> YES.
> >>>>
> >>>>>     Usually
> >>>>> devices will produce CHECKSUM_UNNECESSARY packets.
> >>>> Why do you assume this?
> >>> It's not an assumption, it's just from the view of how the Linux network did.
> >>>
> >>>> Why do existing virtio devices that comply with virtio 1.0 and later do
> >>>> this?
> >>> I say "Let's leave vitio features just now." It means let's just look
> >>> at what we need for checksumming regardless of virtio.
> >> Ok, virtio nic is also a little different from other Linux nics. For
> >> example,
> >> physical nics do not generate partial checksums. Moreover, the virtio
> >> nics naturally support live migration.
> > Yes, that's why I explain virtio starting from mapping RXCSUM to
> > GUEST_CUSM which accepts partial csum.
>
> YES. The historical reasons are now clear.
>
> Now let me summarize:
> 1. GUEST_CSUM at 0.95 is intended to be compatible with partially
> checksummed packets (NEEDS_CSUM <-> CHECKSUM_PARTIAL).
> So GUEST_CSUM is mapped to NETIF_RXCSUM. And NETIF_RXCSUM exists in
> dev->features instead of dev->hw_features, because
> this is somewhat different from the meaning of rx checksum offload of
> traditional physical network cards, users are not allowed to switch
> this offload by userspace tools such as ethtool (only through the
> virtnet_xdp_set() to switch.)
>
> 2. When DATA_VALID was added to Linux in 2011 and virtio1.0, it was
> actually expected that
> rx checksum offload (whether CHECKSUM_UNNECESSARY was set or not) had
> nothing to do with whether GUEST_CSUM was negotiated.
> But due to an error, below desctiption was added incorrectly:
>          "If VIRTIO_NET_F_GUEST_CSUM is not negotiated, the device
> *MUST* set flags to zero and SHOULD supply a fully checksummed packet to
> the driver."
>
> 3. We now hope to correct this error. Let the setting of DATA_VALID not
> be controlled by whether GUEST_CSUM is negotiated,
> but only controlled by whether rx checksum offload is enabled on the OS
> side. The state of this rx checksum offload is also not aware of the device.
> Is it right?

Right.

>
> 4.1 NETIF_RXCSUM corresponding to rx checksum offload is added to
> dev->hw_features and turned on by default.
> When the user turns off rx checksum offload through ethtool -K, neither
> NEEDS_CSUM nor DATA_VALID should be taken care of, that is, all packets
> will be CHECKSUM_NONE.
> 4.2 NETIF_RXCSUM corresponding to rx checksum offload is noly added to
> dev->features.
> NEEDS_CSUM -> CHECKSUM_PARTIAL
> DATA_VALID -> CHECKSUM_UNNECESSARY
> reset -> CHECKSUM_NONE
>
> ====
> Hi Jason, do I understand the history and what you mean so far?
> ====

Yes.

>
> 5. GUEST_FULLY_CSUM is added to disable NEEDS_CSUM (it doesnât matter
> whether tx checksum offload is turned off or not).
> When a NEEDS_CSUM packet is received, it is either discarded or a fully
> checksummed packet is calculated.
> When the corresponding GUEST_FULLY_CSUM offload is turned off, it is as
> if only GUEST_CSUM was negotiated.
>
> ====
> How about this summary? Anyway, we still need Michael's ACK at this
> critical node.
> ====

Fine.

Thanks

>
> Thanks a lot!
>
> >
> >>>> They(virtio devices) will see if VIRTIO_NET_F_GUEST_CSUM is negotiated
> >>>> and check if the corresponding offload is enabled and if both are YES,
> >>>> they will validate the checksum. Otherwise, they are non-compliant
> >>>> virtio devices. Now, in the implementation of various virtio devices such as
> >>>> cloud vendor scenarios, how to implement live migration will be a disaster.
> >>> How does the above destroy live migration?
> >> Please imagine the following scenario:
> >>
> >> If the checksum capability of the virtio device has nothing to do with
> >> whether the GUEST_CSUM feature is negotiated,
> >> when do we let netdev carry NETIF_F_RXCSUM? and when the user turns off
> >> the corresponding offload, how do we notify the device?
> > As explained. RXCSUM is mostly about mandating validation in the
> > stack. So it's not necessarily require a notification to the device.
> > Most modern NIC drivers don't care about the rx csum offload. You can
> > refer to the source.
> >
> > The reason why virtio is different is that when it can accept partial
> > csum, it must notify the virtual device to disable TX csum offload, so
> > the packet will contain a full csum.
> >
> >> For large-scale application of virtio devices, all their management and
> >> live migration links need to be changed,
> >> and existing hardware devices need to be updated to allow live migration
> >> to occur successfully, and migrated to devices that do not
> >> require GUEST_CSUM instructions.
> > The changes are only required when new features are added.
> >
> > Thanks
> >
> >
> >
> >
> >> Thanks!
> >>
> >>>> How does A know that it can successfully migrate to B?
> >>>> The answer is that the same feature is negotiated and has the same
> >>>> offload status.
> >>>> Otherwise, users will complain why the performance is so much worse
> >>>> after migration.
> >>> There's just too many reasons that can degrade the performance after migration.
> >>
> >>
> >>> Assuming GUEST_CSUM is negotiated, NEEDS_CSUM is not mandated, so the
> >>> destination device can set less NEEDS_CSUM anyhow.
> >>>
> >>>>> Virtio-net wires it to partial csum CHECKSUM_PARTIAL, this is hacky:
> >>>>>
> >>>>> 1) it tries to benefit from the TX csum offloading of e.g tuntap
> >>>>> 2) other path may require hacks or workarounds if it's not a TX path
> >>>>> from the view of the hypervisor or device (e.g macvtap)
> >>>>> 3) may not fit for the case of hardware (that can't do GRO_HW but LRO)
> >>>>>
> >>>>>>       1.2 See NETIF_F_RXCSUM_BIT    /* Receive checksumming offload */
> >>>>>>          Most device drivers use NETIF_RX_CSUM to indicate device checksum
> >>>>>> capabilities,
> >>>>>>          and the corresponding offload can be dynamically switched on and
> >>>>>> off by user tools such as ethtool.
> >>>>>>
> >>>>>> 2. The implementation of vhost-user, large-scale commercial virtio
> >>>>>> device that I know of, and other devices are
> >>>>>> completely designed and implemented in accordance with virtio 1.0 and
> >>>>>> later.
> >>>>> I think we're not talking about a specific implementation but whether
> >>>>> the spec description is good or not.
> >>>> Yes. I'm trying to consider your question from your perspective.
> >>>>
> >>>>> DATA_VALID came before 1.0, so
> >>>>> it's the question whether or not the current description is accurate
> >>>>> enough for people to implement the device.
> >>>> Yes, our hundreds of thousands of virtio devices work just fine when
> >>>> following existing specifications. Migration is no problem either.
> >>>>
> >>>> GRO_HW\LRO is also affected by VIRTIO_NET_F_GUEST_CSUM offload.
> >>> GRO_HW is pretty fine, as GRO can produce partial csum.
> >>>
> >>> But LRO is not.
> >>>
> >>>>>> They are comply with the current
> >>>>>> specifications and the Linux kernel's definition of NETIF_F_RXCSUM
> >>>>>> (VIRTIO_NET_F_GUEST_CSUM).
> >>>>> So what I'm saying is that, the current Linux can produce DATA_VALID
> >>>>> without GUEST_CSUM.
> >>>> I think they need to be fixed.
> >>> It might be too late to fix them.
> >>>
> >>>> Just like when NEEDS_CSUM is set, we
> >>>> still don't check if GUEST_CSUM is negotiated.
> >>>>
> >>>>>     We managed to survive for the past 10+ years.
> >>>>> Allowing DATA_VALID to be set without GUEST_CSUM seems to be easit
> >>>>> way.
> >>>> Live migration can be a disaster.
> >>> In what sense, live migration works for more than a decade on tuntap. No?
> >>>
> >>>>> And when rx checksum offload is disabled, the driver can just not
> >>>>> set CHECKSUM_UNNECESSARY,
> >>>> Device verified checksum resources are wasted.
> >>> True, but it is possible and it is what has been done in some devices.
> >>> You can see a bunch of examples in the Linux source.
> >>>
> >>>> Latency overhead has also been incurred.
> >>> If you need better latency, you should enable rx checksum offload.
> >>>
> >>> Basically, I'm not saying no to your proposal. But we need to figure
> >>> out what happens first and to find out the best way to solve that.
> >>>
> >>> Thanks
> >>>
> >>>> Thanks!
> >>>>
> >>>>> and this seems something we need to do from
> >>>>> the view of hardening regardless of this feature.
> >>>>>
> >>>>> A side effect is that it disables TSO, but it is intended. Or if you
> >>>>> want LRO with DATA_VALID, it looks like another story.
> >>>>>
> >>>>> Thanks
> >>>>>
> >>>>>
> >>>>>
> >>>>>> Thanks!
> >>>>>>
> >>>>>>> Thanks
> >>>>>>>
> >>>>>>>
> >>>>>>>> I think the reason why the feature bit is not checked in the code is
> >>>>>>>> because the check is omitted because it is on a per-packet basis,
> >>>>>>>> just like the reason why supported_valid_types is not needed as
> >>>>>>>> discussed in the v4 version threads. It is not unnecessary.
> >>>>>>>>
> >>>>>>>> Thanks!
> >>>>>>>>
> >>>>>>>>> If yes, why do we need to bother here? If we disable GUEST_CSUM, the
> >>>>>>>>> packet will contain checksum. And if the device sets DATA_VALID, it
> >>>>>>>>> means the checksum is validated.
> >>>>>>>>>
> >>>>>>>>> Thanks
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>> Since Christmas is coming, I think this feature may be in danger of
> >>>>>>>>>> following the pace of
> >>>>>>>>>> our hw version releases, so I sincerely request that you please review
> >>>>>>>>>> it as soon as possible.
> >>>>>>>>>>
> >>>>>>>>>> Thanks!
> >>>>>>>>>>
> >>>>>>>>>> å 2023/12/12 äå5:30, Heng Qi åé:
> >>>>>>>>>>> å 2023/12/12 äå5:23, Heng Qi åé:
> >>>>>>>>>>>> å 2023/12/12 äå4:44, Michael S. Tsirkin åé:
> >>>>>>>>>>>>> On Tue, Dec 12, 2023 at 11:28:21AM +0800, Heng Qi wrote:
> >>>>>>>>>>>>>> å 2023/12/12 äå12:35, Michael S. Tsirkin åé:
> >>>>>>>>>>>>>>> On Mon, Dec 11, 2023 at 05:11:59PM +0800, Heng Qi wrote:
> >>>>>>>>>>>>>>>> virtio-net works in a virtualized system and is somewhat
> >>>>>>>>>>>>>>>> different from
> >>>>>>>>>>>>>>>> physical nics. One of the differences is that to save virtio device
> >>>>>>>>>>>>>>>> resources, rx may receive partially checksummed packets. However,
> >>>>>>>>>>>>>>>> XDP may
> >>>>>>>>>>>>>>>> cause partially checksummed packets to be dropped.
> >>>>>>>>>>>>>>>> So XDP loading currently conflicts with the feature
> >>>>>>>>>>>>>>>> VIRTIO_NET_F_GUEST_CSUM.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> This patch lets the device to supply fully checksummed packets to
> >>>>>>>>>>>>>>>> the driver.
> >>>>>>>>>>>>>>>> Then XDP can coexist with VIRTIO_NET_F_GUEST_CSUM to enjoy the
> >>>>>>>>>>>>>>>> benefits of
> >>>>>>>>>>>>>>>> device validation checksum.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> In addition, implementation of some performant devices always do
> >>>>>>>>>>>>>>>> not generate
> >>>>>>>>>>>>>>>> partially checksummed packets, but the standard driver still need
> >>>>>>>>>>>>>>>> to clear
> >>>>>>>>>>>>>>>> VIRTIO_NET_F_GUEST_CSUM when XDP is there.
> >>>>>>>>>>>>>>>> A new feature VIRTIO_NET_F_GUEST_FULLY_CSUM is added to solve the
> >>>>>>>>>>>>>>>> above
> >>>>>>>>>>>>>>>> situation, which provides the driver with configurable offload.
> >>>>>>>>>>>>>>>> If the offload is enabled, then the device must deliver fully
> >>>>>>>>>>>>>>>> checksummed packets to the driver and may validate the checksum.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> Use case example:
> >>>>>>>>>>>>>>>> If VIRTIO_NET_F_GUEST_FULLY_CSUM is negotiated and the offload is
> >>>>>>>>>>>>>>>> enabled,
> >>>>>>>>>>>>>>>> after XDP processes a fully checksummed packet, the
> >>>>>>>>>>>>>>>> VIRTIO_NET_HDR_F_DATA_VALID bit
> >>>>>>>>>>>>>>>> is retained if the device has validated its checksum, resulting
> >>>>>>>>>>>>>>>> in the guest
> >>>>>>>>>>>>>>>> not needing to validate the checksum again. This is useful for
> >>>>>>>>>>>>>>>> guests:
> >>>>>>>>>>>>>>>>          1. Bring the driver advantages such as cpu savings.
> >>>>>>>>>>>>>>>>          2. For devices that do not generate partially checksummed
> >>>>>>>>>>>>>>>> packets themselves,
> >>>>>>>>>>>>>>>>             XDP can be loaded in the driver without modifying the
> >>>>>>>>>>>>>>>> hardware behavior.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> Several solutions have been discussed in the previous proposal[1].
> >>>>>>>>>>>>>>>> After historical discussion, we have tried the method proposed by
> >>>>>>>>>>>>>>>> Jason[2],
> >>>>>>>>>>>>>>>> but some complex scenarios and challenges are difficult to deal
> >>>>>>>>>>>>>>>> with.
> >>>>>>>>>>>>>>>> We now return to the method suggested in [1].
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> [1]
> >>>>>>>>>>>>>>>> https://lists.oasis-open.org/archives/virtio-dev/202305/msg00291.html
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> [2]
> >>>>>>>>>>>>>>>> https://lore.kernel.org/all/20230628030506.2213-1-hengqi@linux.alibaba.com/
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> Signed-off-by: Heng Qi <hengqi@linux.alibaba.com>
> >>>>>>>>>>>>>>>> Reviewed-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
> >>>>>>>>>>>>>>>> ---
> >>>>>>>>>>>>>>>> v4->v5:
> >>>>>>>>>>>>>>>> - Remove the modification to the GUEST_CSUM.
> >>>>>>>>>>>>>>>> - The description of this feature has been reorganized for
> >>>>>>>>>>>>>>>> greater clarity.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> v3->v4:
> >>>>>>>>>>>>>>>> - Streamline some repetitive descriptions. @Jason
> >>>>>>>>>>>>>>>> - Add how features should work, when to be enabled, and overhead.
> >>>>>>>>>>>>>>>> @Jason @Michael
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> v2->v3:
> >>>>>>>>>>>>>>>> - Add a section named "Driver Handles Fully Checksummed Packets"
> >>>>>>>>>>>>>>>>          and more descriptions. @Michael
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> v1->v2:
> >>>>>>>>>>>>>>>> - Modify full checksum functionality as a configurable offload
> >>>>>>>>>>>>>>>>          that is initially turned off. @Jason
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>         device-types/net/description.tex        | 74
> >>>>>>>>>>>>>>>> +++++++++++++++++++++++--
> >>>>>>>>>>>>>>>>         device-types/net/device-conformance.tex |  1 +
> >>>>>>>>>>>>>>>>         device-types/net/driver-conformance.tex |  1 +
> >>>>>>>>>>>>>>>>         introduction.tex                        |  3 +
> >>>>>>>>>>>>>>>>         4 files changed, 73 insertions(+), 6 deletions(-)
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> diff --git a/device-types/net/description.tex
> >>>>>>>>>>>>>>>> b/device-types/net/description.tex
> >>>>>>>>>>>>>>>> index aff5e08..ab6c13d 100644
> >>>>>>>>>>>>>>>> --- a/device-types/net/description.tex
> >>>>>>>>>>>>>>>> +++ b/device-types/net/description.tex
> >>>>>>>>>>>>>>>> @@ -122,6 +122,9 @@ \subsection{Feature bits}\label{sec:Device
> >>>>>>>>>>>>>>>> Types / Network Device / Feature bits
> >>>>>>>>>>>>>>>>             device with the same MAC address.
> >>>>>>>>>>>>>>>>         \item[VIRTIO_NET_F_SPEED_DUPLEX(63)] Device reports speed and
> >>>>>>>>>>>>>>>> duplex.
> >>>>>>>>>>>>>>>> +
> >>>>>>>>>>>>>>>> +\item[VIRTIO_NET_F_GUEST_FULLY_CSUM (64)] Device delivers fully
> >>>>>>>>>>>>>>>> checksummed packets
> >>>>>>>>>>>>>>>> +    to the driver and may validate the checksum.
> >>>>>>>>>>>>>>>>         \end{description}
> >>>>>>>>>>>>>>> I propose
> >>>>>>>>>>>>>>> VIRTIO_NET_F_GUEST_CSUM_COMPLETE
> >>>>>>>>>>>>>>> instead.
> >>>>>>>>>>>>>> Can I ask here if *complete* in VIRTIO_NET_F_GUEST_CSUM_COMPLETE and
> >>>>>>>>>>>>>> CHECKSUM_COMPLETE mean the same thing?
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> If so, it seems that it's no longer the same as the description of
> >>>>>>>>>>>>>> this
> >>>>>>>>>>>>>> patch.
> >>>>>>>>>>>>> Oh. I thought it is. Then I guess I misunderstand what this patch is
> >>>>>>>>>>>>> supposed to be doing, again.
> >>>>>>>>>>>> Here's some context:
> >>>>>>>>>>>>
> >>>>>>>>>>>>      From the perspective of the Linux kernel, the GUEST_CSUM feature is
> >>>>>>>>>>>> negotiated to support
> >>>>>>>>>>>> (1)  CHECKSUM_NONE, (2) CHECKSUM_UNNECESSARY, (3) CHECKSUM_PARTIAL,
> >>>>>>>>>>>> which
> >>>>>>>>>>>> respectively correspond to (1) the device does not validate the
> >>>>>>>>>>>> packet checksum (may not have
> >>>>>>>>>>>> the ability to validate some protocols or does not recognize the
> >>>>>>>>>>>> packet); (2) the device has verified
> >>>>>>>>>>>> the data packet, then sets DATA_VALID bit in flags; (3) In order to
> >>>>>>>>>>>> save device resources, VMs
> >>>>>>>>>>>> on the same host deliver partially checksummed packets, and
> >>>>>>>>>>>> NEEDS_CSUM bit is set in flags.
> >>>>>>>>>>>>
> >>>>>>>>>>>> GUEST_FULLY_CSUM did not change the above result.
> >>>>>>>>>>> Sorry, GUEST_FULLY_CSUM prohibits the third(3) action.
> >>>>>>>>>>>
> >>>>>>>>>>>>>>>>         \subsubsection{Feature bit requirements}\label{sec:Device
> >>>>>>>>>>>>>>>> Types / Network Device / Feature bits / Feature bit requirements}
> >>>>>>>>>>>>>>>> @@ -136,6 +139,7 @@ \subsubsection{Feature bit
> >>>>>>>>>>>>>>>> requirements}\label{sec:Device Types / Network Device
> >>>>>>>>>>>>>>>>         \item[VIRTIO_NET_F_GUEST_UFO] Requires VIRTIO_NET_F_GUEST_CSUM.
> >>>>>>>>>>>>>>>>         \item[VIRTIO_NET_F_GUEST_USO4] Requires VIRTIO_NET_F_GUEST_CSUM.
> >>>>>>>>>>>>>>>>         \item[VIRTIO_NET_F_GUEST_USO6] Requires VIRTIO_NET_F_GUEST_CSUM.
> >>>>>>>>>>>>>>>> +\item[VIRTIO_NET_F_GUEST_FULLY_CSUM] Requires
> >>>>>>>>>>>>>>>> VIRTIO_NET_F_GUEST_CSUM and VIRTIO_NET_F_CTRL_GUEST_OFFLOADS.
> >>>>>>>>>>>>>>>>         \item[VIRTIO_NET_F_HOST_TSO4] Requires VIRTIO_NET_F_CSUM.
> >>>>>>>>>>>>>>>>         \item[VIRTIO_NET_F_HOST_TSO6] Requires VIRTIO_NET_F_CSUM.
> >>>>>>>>>>>>>>>> @@ -398,6 +402,58 @@ \subsection{Device
> >>>>>>>>>>>>>>>> Initialization}\label{sec:Device Types / Network Device / Dev
> >>>>>>>>>>>>>>>>         A truly minimal driver would only accept VIRTIO_NET_F_MAC and
> >>>>>>>>>>>>>>>> ignore
> >>>>>>>>>>>>>>>>         everything else.
> >>>>>>>>>>>>>>>> +\subsubsection{Device Delivers Fully Checksummed
> >>>>>>>>>>>>>>>> Packets}\label{sec:Device Types / Network Device / Device
> >>>>>>>>>>>>>>>> Initialization / Device Delivers Fully Checksummed Packets}
> >>>>>>>>>>>>>>>> +
> >>>>>>>>>>>>>>>> +If the feature VIRTIO_NET_F_GUEST_FULLY_CSUM is negotiated, the
> >>>>>>>>>>>>>>>> driver can
> >>>>>>>>>>>>>>>> +benefit from the device's ability to calculate and validate the
> >>>>>>>>>>>>>>>> checksum.
> >>>>>>>>>>>>>>>> +
> >>>>>>>>>>>>>>>> +If the feature VIRTIO_NET_F_GUEST_FULLY_CSUM is negotiated,
> >>>>>>>>>>>>>>>> +the device behaves as follows:
> >>>>>>>>>>>>>>>> +\begin{itemize}
> >>>>>>>>>>>>>>>> +  \item The device delivers a fully checksummed packet to the
> >>>>>>>>>>>>>>>> driver rather than a partially checksummed packet.
> >>>>>>>>>>>>>>> where does "partially checksummed packet" come from?
> >>>>>>>>>>>>>>> I think it comes from:
> >>>>>>>>>>>>>> Yes, you are right.
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>           The VIRTIO_NET_F_GUEST_CSUM feature indicates that partially
> >>>>>>>>>>>>>>>          checksummed packets can be received, and if it can do that then
> >>>>>>>>>>>>>>>          the VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6,
> >>>>>>>>>>>>>>>          VIRTIO_NET_F_GUEST_UFO, VIRTIO_NET_F_GUEST_ECN,
> >>>>>>>>>>>>>>> VIRTIO_NET_F_GUEST_USO4
> >>>>>>>>>>>>>>>          and VIRTIO_NET_F_GUEST_USO6 are the input equivalents of the
> >>>>>>>>>>>>>>> features described above.
> >>>>>>>>>>>>>>>          See \ref{sec:Device Types / Network Device / Device Operation /
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> so that one needs to be updated too.
> >>>>>>>>>>>>>> Will update this.
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> +Partially checksummed packets come from TCP/UDP protocols
> >>>>>>>>>>>>>>>> \ref{devicenormative:Device Types / Network Device / Device
> >>>>>>>>>>>>>>>> Operation / Processing of Packets}.
> >>>>>>>>>>>>>>>> +  \item The device may validate the packet checksum before
> >>>>>>>>>>>>>>>> delivering it.
> >>>>>>>>>>>>>>>> +If the packet checksum has been verified, the
> >>>>>>>>>>>>>>>> VIRTIO_NET_HDR_F_DATA_VALID bit
> >>>>>>>>>>>>>>>> +in \field{flags} is set: in case of multiple encapsulated
> >>>>>>>>>>>>>>>> protocols, one
> >>>>>>>>>>>>>>>> +level of checksums has been validated (Just like
> >>>>>>>>>>>>>>>> VIRTIO_NET_F_GUEST_CSUM does.).
> >>>>>>>>>>>>>>>> +  \item The device can not set the VIRTIO_NET_HDR_F_NEEDS_CSUM
> >>>>>>>>>>>>>>>> bit in \field{flags}.
> >>>>>>>>>>>>>>>> +\end{itemize}
> >>>>>>>>>>>>>>>> +
> >>>>>>>>>>>>>>>> +Note that packet types that the driver or device can recognize
> >>>>>>>>>>>>>>>> and the device
> >>>>>>>>>>>>>>>> +may verify will not change due to the additional negotiated
> >>>>>>>>>>>>>>>> VIRTIO_NET_F_GUEST_FULLY_CSUM.
> >>>>>>>>>>>>>>>> +These remain consistent with VIRTIO_NET_F_GUEST_CSUM.
> >>>>>>>>>>>>>>> This part is confusing. "change" and "remain" makes no sense for
> >>>>>>>>>>>>>>> someone reading
> >>>>>>>>>>>>>>> the spec text as opposed to reviewing the patch.
> >>>>>>>>>>>>>>> also it does not matter whether VIRTIO_NET_F_GUEST_FULLY_CSUM
> >>>>>>>>>>>>>>> is negotiated right? it only matters whether it is enabled.
> >>>>>>>>>>>>>> Right! And following your suggestion, I plan to rewrite it as follows:
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> Note that if VIRTIO_NET_F_GUEST_FULLY_CSUM is additionally
> >>>>>>>>>>>>>> negotiated and
> >>>>>>>>>>>>>> its offload is enabled, packet types that the driver or device can
> >>>>>>>>>>>>>> recognize
> >>>>>>>>>>>>>> and the
> >>>>>>>>>>>>>> device may verify are consistent with when VIRTIO_NET_F_GUEST_CSUM is
> >>>>>>>>>>>>>> negotiated.
> >>>>>>>>>>>>> This doesn't really clarify.  If you'd like it put more simply: Never
> >>>>>>>>>>>>> imagine yourself not to be otherwise than what it might appear to
> >>>>>>>>>>>>> others
> >>>>>>>>>>>>> that what you were or might have been was not otherwise than what you
> >>>>>>>>>>>>> had been would have appeared to them to be otherwise.
> >>>>>>>>>>>> Sorry, I'm not a native speaker and didn't quite understand this long
> >>>>>>>>>>>> sentence.
> >>>>>>>>>>>> But I think you suggest that I should not explain something from the
> >>>>>>>>>>>> perspective
> >>>>>>>>>>>> of someone who is already familiar with it, but should try to explain
> >>>>>>>>>>>> it clearly
> >>>>>>>>>>>> for readers who are not familiar with it.
> >>>>>>>>>>>>
> >>>>>>>>>>>> I'll try to explain it more clearly.
> >>>>>>>>>>>>
> >>>>>>>>>>>>>>>> +Specific transport protocols that may have
> >>>>>>>>>>>>>>>> VIRTIO_NET_HDR_F_DATA_VALID set
> >>>>>>>>>>>>>>>> +in \field{flags} include TCP, UDP, GRE (Generic Routing
> >>>>>>>>>>>>>>>> Encapsulation),
> >>>>>>>>>>>>>>>> +and SCTP (Stream Control Transmission Protocol).
> >>>>>>>>>>>>>>>> +A fully checksummed packet's checksum field for each of the
> >>>>>>>>>>>>>>>> above protocols
> >>>>>>>>>>>>>>>> +is set to a calculated value that covers the transport header
> >>>>>>>>>>>>>>>> and payload
> >>>>>>>>>>>>>>>> +(TCP or UDP involves the additional pseudo header) of the packet.
> >>>>>>>>>>>>>>>> +
> >>>>>>>>>>>>>>>> +Delivering fully checksummed packets rather than partially
> >>>>>>>>>>>>>>>> +checksummed packets incurs additional overhead for the device.
> >>>>>>>>>>>>>>>> +The overhead varies from device to device, for example the
> >>>>>>>>>>>>>>>> overhead of
> >>>>>>>>>>>>>>>> +calculating and validating the packet checksum is a few
> >>>>>>>>>>>>>>>> microseconds
> >>>>>>>>>>>>>>>> +for a hardware device.
> >>>>>>>>>>>>>>> wow really is that standard? There are devices that deliver the whole
> >>>>>>>>>>>>>>> packet in a few microseconds. Maybe "for some hardware devices"?
> >>>>>>>>>>>>>> Ok, I think it's more accurate.
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> +
> >>>>>>>>>>>>>>>> +The feature VIRTIO_NET_F_GUEST_FULLY_CSUM has a corresponding
> >>>>>>>>>>>>>>>> offload \ref{sec:Device Types / Network Device / Device Operation
> >>>>>>>>>>>>>>>> / Control Virtqueue / Offloads State Configuration},
> >>>>>>>>>>>>>>>> +which when enabled means that the device delivers fully
> >>>>>>>>>>>>>>>> checksummed packets
> >>>>>>>>>>>>>>>> +to the driver and may validate the checksum.
> >>>>>>>>>>>>>>>> +The offload is disabled by default.
> >>>>>>>>>>>>>>> This is unusual, unlike any other offload. So needs to be stressed
> >>>>>>>>>>>>>>> more.  And what does "default" mean here?
> >>>>>>>>>>>>>>> E.g. "Note: unlike other offloads, this offloads is disabled
> >>>>>>>>>>>>>>> even after VIRTIO_NET_F_GUEST_FULLY_CSUM has been negotiation.
> >>>>>>>>>>>>>> Ok. Will rewrite this following your example.
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> The offload has to be enabled ... "
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> +
> >>>>>>>>>>>>>>>> +The driver can enable the offload by sending the
> >>>>>>>>>>>>>>>> +VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET command with the
> >>>>>>>>>>>>>>>> +VIRTIO_NET_F_GUEST_FULLY_CSUM bit set when, for example,
> >>>>>>>>>>>>>>>> +eXpress Data Path (XDP) \hyperref[intro:xdp]{[XDP]} is functioning.
> >>>>>>>>>>>>>>> It is not worth adding a spec link just to provide an example.
> >>>>>>>>>>>>>>> If you really want to provide it:
> >>>>>>>>>>>>>>> "eXpress Data Path (XDP) in Linux is active".
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> But this is the problem this patch does not solve in my opinion.
> >>>>>>>>>>>>>>> A device might actually provide a full checksum
> >>>>>>>>>>>>>>> at negligeable extra cost and driver will still keep it off by
> >>>>>>>>>>>>>>> default.
> >>>>>>>>>>>>>>> So it slows device down - when does it make sense to enable this
> >>>>>>>>>>>>>>> feature?
> >>>>>>>>>>>>>>> Just giving an example of XDP is not sufficient.
> >>>>>>>>>>>>>> First of all, I think the core purpose of this patch is to support XDP
> >>>>>>>>>>>>>> loading.
> >>>>>>>>>>>>>> Otherwise, I think GUEST_CSUM works just fine.
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> 1. The device is performant, even if only GUEST_CSUM is negotiated,
> >>>>>>>>>>>>>> the
> >>>>>>>>>>>>>> device only provide fully checksummed packets.
> >>>>>>>>>>>>>> If the offload of GUEST_FULLY_CSUM is disabled, it is equivalent to
> >>>>>>>>>>>>>> only
> >>>>>>>>>>>>>> GUEST_CSUM working, and the device still
> >>>>>>>>>>>>>> provides fully checksummed packets. This will not slow the device
> >>>>>>>>>>>>>> down.
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> 2. For example a sw device. If the device only negotiates
> >>>>>>>>>>>>>> GUEST_CSUM, it may
> >>>>>>>>>>>>>> provide partially checksummed packets.
> >>>>>>>>>>>>>> In the absence of XDP loading requirements, the driver does not
> >>>>>>>>>>>>>> need to
> >>>>>>>>>>>>>> enable GUEST_FULLY_CSUM offload.
> >>>>>>>>>>>>> Well first of all I am no longer even sure what this GUEST_FULLY_CSUM
> >>>>>>>>>>>>> does. I thought it is CHECKSUM_COMPLETE.
> >>>>>>>>>>>>> But more generally, is there an assumption driver will not
> >>>>>>>>>>>>> enable this new checksum typically then? Unless what? If we never
> >>>>>>>>>>>>> tell drivers they should not enable it they will, the
> >>>>>>>>>>>>> fact that it's off by default seems to be a hint that it
> >>>>>>>>>>>>> is typically a bad idea to enable it. But when is it a good idea?
> >>>>>>>>>>>> I think the core difference between GUEST_FULLY_CSUM and GUEST_CSUM
> >>>>>>>>>>>> is that
> >>>>>>>>>>>> GUEST_CSUM may generate partially checksummed TCP/UDP packets,
> >>>>>>>>>>>> causing xdp to fail to load.
> >>>>>>>>>>>> GUEST_FULLY_CSUM forces fully checksummed TCP/UDP packets to be
> >>>>>>>>>>>> generated so xdp can load.
> >>>>>>>>>>>> For the rest, I guess there is no difference between GUEST_FULLY_CSUM
> >>>>>>>>>>>> and GUEST_CSUM.
> >>>>>>>>>>>>
> >>>>>>>>>>>> As for when the driver enables the offload, I think I have already
> >>>>>>>>>>>> mentioned:
> >>>>>>>>>>>> Enable this offload in the interface where XDP is loaded,
> >>>>>>>>>>>> Disable this offload in the interfaces where XDP is unloaded.
> >>>>>>>>>>>>
> >>>>>>>>>>>> Thanksï
> >>>>>>>>>>>>
> >>>>>>>>>>>>>>>> +
> >>>>>>>>>>>>>>>> +\drivernormative{\subsubsection}{Device Delivers Fully
> >>>>>>>>>>>>>>>> Checksummed Packets}{sec:Device Types / Network Device / Device
> >>>>>>>>>>>>>>>> Initialization / Device Delivers Fully Checksummed Packets}
> >>>>>>>>>>>>>>>> +
> >>>>>>>>>>>>>>>> +The driver MUST NOT enable the offload for which
> >>>>>>>>>>>>>>>> VIRTIO_NET_F_GUEST_FULLY_CSUM has not been negotiated.
> >>>>>>>>>>>>>>> what does "the offload for which" mean here?
> >>>>>>>>>>>>>> VIRTIO_NET_F_GUEST_FULLY_CSUM's offload
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> and how is this special for VIRTIO_NET_F_GUEST_FULLY_CSUM?
> >>>>>>>>>>>>>> Well, I think this sentence seems a bit redundant and I'll probably
> >>>>>>>>>>>>>> remove
> >>>>>>>>>>>>>> this.
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> +\devicenormative{\subsubsection}{Device Delivers Fully
> >>>>>>>>>>>>>>>> Checksummed Packets}{sec:Device Types / Network Device / Device
> >>>>>>>>>>>>>>>> Initialization / Device Delivers Fully Checksummed Packets}
> >>>>>>>>>>>>>>>> +
> >>>>>>>>>>>>>>>> +Upon the device reset, the device MUST disable the offload.
> >>>>>>>>>>>>>>>> +
> >>>>>>>>>>>>>>> reset has nothing to do with it I think. it's about feature
> >>>>>>>>>>>>>>> negotiation.
> >>>>>>>>>>>>>> Will modify this.
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> Thanks a lot!
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>         \subsection{Device Operation}\label{sec:Device Types / Network
> >>>>>>>>>>>>>>>> Device / Device Operation}
> >>>>>>>>>>>>>>>>         Packets are transmitted by placing them in the
> >>>>>>>>>>>>>>>> @@ -723,7 +779,8 @@ \subsubsection{Processing of Incoming
> >>>>>>>>>>>>>>>> Packets}\label{sec:Device Types / Network
> >>>>>>>>>>>>>>>>           \field{num_buffers} is one, then the entire packet will be
> >>>>>>>>>>>>>>>>           contained within this buffer, immediately following the struct
> >>>>>>>>>>>>>>>>           virtio_net_hdr.
> >>>>>>>>>>>>>>>> -\item If the VIRTIO_NET_F_GUEST_CSUM feature was negotiated, the
> >>>>>>>>>>>>>>>> +\item If the VIRTIO_NET_F_GUEST_CSUM feature (regardless of whether
> >>>>>>>>>>>>>>>> +  VIRTIO_NET_F_GUEST_FULLY_CSUM was negotiated) was negotiated, the
> >>>>>>>>>>>>>>>>           VIRTIO_NET_HDR_F_DATA_VALID bit in \field{flags} can be
> >>>>>>>>>>>>>>>>           set: if so, device has validated the packet checksum.
> >>>>>>>>>>>>>>>>           In case of multiple encapsulated protocols, one level of
> >>>>>>>>>>>>>>>> checksums
> >>>>>>>>>>>>>>>> @@ -747,7 +804,8 @@ \subsubsection{Processing of Incoming
> >>>>>>>>>>>>>>>> Packets}\label{sec:Device Types / Network
> >>>>>>>>>>>>>>>>           number of coalesced TCP segments in \field{csum_start} field
> >>>>>>>>>>>>>>>> and
> >>>>>>>>>>>>>>>>           number of duplicated ACK segments in \field{csum_offset} field
> >>>>>>>>>>>>>>>>           and sets bit VIRTIO_NET_HDR_F_RSC_INFO in \field{flags}.
> >>>>>>>>>>>>>>>> -\item If the VIRTIO_NET_F_GUEST_CSUM feature was negotiated, the
> >>>>>>>>>>>>>>>> +\item If the VIRTIO_NET_F_GUEST_CSUM feature was negotiated but the
> >>>>>>>>>>>>>>>> +  VIRTIO_NET_F_GUEST_FULLY_CSUM feature was not negotiated, the
> >>>>>>>>>>>>>>>>           VIRTIO_NET_HDR_F_NEEDS_CSUM bit in \field{flags} can be
> >>>>>>>>>>>>>>>>           set: if so, the packet checksum at offset \field{csum_offset}
> >>>>>>>>>>>>>>>>           from \field{csum_start} and any preceding checksums
> >>>>>>>>>>>>>>>> @@ -805,8 +863,9 @@ \subsubsection{Processing of Incoming
> >>>>>>>>>>>>>>>> Packets}\label{sec:Device Types / Network
> >>>>>>>>>>>>>>>>         device MUST set the VIRTIO_NET_HDR_GSO_ECN bit in
> >>>>>>>>>>>>>>>>         \field{gso_type}.
> >>>>>>>>>>>>>>>> -If the VIRTIO_NET_F_GUEST_CSUM feature has been negotiated, the
> >>>>>>>>>>>>>>>> -device MAY set the VIRTIO_NET_HDR_F_NEEDS_CSUM bit in
> >>>>>>>>>>>>>>>> +If the VIRTIO_NET_F_GUEST_CSUM feature has been negotiated but
> >>>>>>>>>>>>>>>> +the VIRTIO_NET_F_GUEST_FULLY_CSUM feature has not been negotiated,
> >>>>>>>>>>>>>>>> +the device MAY set the VIRTIO_NET_HDR_F_NEEDS_CSUM bit in
> >>>>>>>>>>>>>>>>         \field{flags}, if so:
> >>>>>>>>>>>>>>>>         \begin{enumerate}
> >>>>>>>>>>>>>>>>         \item the device MUST validate the packet checksum at
> >>>>>>>>>>>>>>>> @@ -826,7 +885,8 @@ \subsubsection{Processing of Incoming
> >>>>>>>>>>>>>>>> Packets}\label{sec:Device Types / Network
> >>>>>>>>>>>>>>>>         been negotiated, the device MUST set \field{gso_type} to
> >>>>>>>>>>>>>>>>         VIRTIO_NET_HDR_GSO_NONE.
> >>>>>>>>>>>>>>>> -If \field{gso_type} differs from VIRTIO_NET_HDR_GSO_NONE, then
> >>>>>>>>>>>>>>>> +If the VIRTIO_NET_F_GUEST_FULLY_CSUM feature has not been
> >>>>>>>>>>>>>>>> negotiated and
> >>>>>>>>>>>>>>>> +\field{gso_type} differs from VIRTIO_NET_HDR_GSO_NONE, then
> >>>>>>>>>>>>>>>>         the device MUST also set the VIRTIO_NET_HDR_F_NEEDS_CSUM bit in
> >>>>>>>>>>>>>>>>         \field{flags} MUST set \field{gso_size} to indicate the
> >>>>>>>>>>>>>>>> desired MSS.
> >>>>>>>>>>>>>>>>         If VIRTIO_NET_F_RSC_EXT was negotiated, the device MUST also
> >>>>>>>>>>>>>>>> @@ -842,7 +902,8 @@ \subsubsection{Processing of Incoming
> >>>>>>>>>>>>>>>> Packets}\label{sec:Device Types / Network
> >>>>>>>>>>>>>>>>         not less than the length of the headers, including the transport
> >>>>>>>>>>>>>>>>         header.
> >>>>>>>>>>>>>>>> -If the VIRTIO_NET_F_GUEST_CSUM feature has been negotiated, the
> >>>>>>>>>>>>>>>> +If the VIRTIO_NET_F_GUEST_CSUM feature (regardless of whether
> >>>>>>>>>>>>>>>> +VIRTIO_NET_F_GUEST_FULLY_CSUM has been negotiated) has been
> >>>>>>>>>>>>>>>> negotiated, the
> >>>>>>>>>>>>>>>>         device MAY set the VIRTIO_NET_HDR_F_DATA_VALID bit in
> >>>>>>>>>>>>>>>>         \field{flags}, if so, the device MUST validate the packet
> >>>>>>>>>>>>>>>>         checksum (in case of multiple encapsulated protocols, one level
> >>>>>>>>>>>>>>>> @@ -1633,6 +1694,7 @@ \subsubsection{Control
> >>>>>>>>>>>>>>>> Virtqueue}\label{sec:Device Types / Network Device / Devi
> >>>>>>>>>>>>>>>>         #define VIRTIO_NET_F_GUEST_UFO        10
> >>>>>>>>>>>>>>>>         #define VIRTIO_NET_F_GUEST_USO4       54
> >>>>>>>>>>>>>>>>         #define VIRTIO_NET_F_GUEST_USO6       55
> >>>>>>>>>>>>>>>> +#define VIRTIO_NET_F_GUEST_FULLY_CSUM 64
> >>>>>>>>>>>>>>>>         #define VIRTIO_NET_CTRL_GUEST_OFFLOADS       5
> >>>>>>>>>>>>>>>>          #define VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET   0
> >>>>>>>>>>>>>>>> diff --git a/device-types/net/device-conformance.tex
> >>>>>>>>>>>>>>>> b/device-types/net/device-conformance.tex
> >>>>>>>>>>>>>>>> index 52526e4..43b3921 100644
> >>>>>>>>>>>>>>>> --- a/device-types/net/device-conformance.tex
> >>>>>>>>>>>>>>>> +++ b/device-types/net/device-conformance.tex
> >>>>>>>>>>>>>>>> @@ -16,4 +16,5 @@
> >>>>>>>>>>>>>>>>         \item \ref{devicenormative:Device Types / Network Device /
> >>>>>>>>>>>>>>>> Device Operation / Control Virtqueue / Notifications Coalescing}
> >>>>>>>>>>>>>>>>         \item \ref{devicenormative:Device Types / Network Device /
> >>>>>>>>>>>>>>>> Device Operation / Control Virtqueue / Inner Header Hash}
> >>>>>>>>>>>>>>>>         \item \ref{devicenormative:Device Types / Network Device /
> >>>>>>>>>>>>>>>> Device Operation / Control Virtqueue / Device Statistics}
> >>>>>>>>>>>>>>>> +\item \ref{devicenormative:Device Types / Network Device /
> >>>>>>>>>>>>>>>> Device Initialization / Device Delivers Fully Checksummed Packets}
> >>>>>>>>>>>>>>>>         \end{itemize}
> >>>>>>>>>>>>>>>> diff --git a/device-types/net/driver-conformance.tex
> >>>>>>>>>>>>>>>> b/device-types/net/driver-conformance.tex
> >>>>>>>>>>>>>>>> index c693c4f..c9b6d1b 100644
> >>>>>>>>>>>>>>>> --- a/device-types/net/driver-conformance.tex
> >>>>>>>>>>>>>>>> +++ b/device-types/net/driver-conformance.tex
> >>>>>>>>>>>>>>>> @@ -16,4 +16,5 @@
> >>>>>>>>>>>>>>>>         \item \ref{drivernormative:Device Types / Network Device /
> >>>>>>>>>>>>>>>> Device Operation / Control Virtqueue / Notifications Coalescing}
> >>>>>>>>>>>>>>>>         \item \ref{drivernormative:Device Types / Network Device /
> >>>>>>>>>>>>>>>> Device Operation / Control Virtqueue / Inner Header Hash}
> >>>>>>>>>>>>>>>>         \item \ref{drivernormative:Device Types / Network Device /
> >>>>>>>>>>>>>>>> Device Operation / Control Virtqueue / Device Statistics}
> >>>>>>>>>>>>>>>> +\item \ref{drivernormative:Device Types / Network Device /
> >>>>>>>>>>>>>>>> Device Initialization / Device Delivers Fully Checksummed Packets}
> >>>>>>>>>>>>>>>>         \end{itemize}
> >>>>>>>>>>>>>>>> diff --git a/introduction.tex b/introduction.tex
> >>>>>>>>>>>>>>>> index cfa6633..fc99597 100644
> >>>>>>>>>>>>>>>> --- a/introduction.tex
> >>>>>>>>>>>>>>>> +++ b/introduction.tex
> >>>>>>>>>>>>>>>> @@ -145,6 +145,9 @@ \section{Normative
> >>>>>>>>>>>>>>>> References}\label{sec:Normative References}
> >>>>>>>>>>>>>>>>             Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
> >>>>>>>>>>>>>>>> 2119 Key Words", BCP
> >>>>>>>>>>>>>>>>             14, RFC 8174, DOI 10.17487/RFC8174, May 2017
> >>>>>>>>>>>>>>>> \newline\url{http://www.ietf.org/rfc/rfc8174.txt}\\
> >>>>>>>>>>>>>>>> +    \phantomsection\label{intro:xdp}\textbf{[XDP]} &
> >>>>>>>>>>>>>>>> +    eXpress Data Path(XDP) provides a high performance,
> >>>>>>>>>>>>>>>> programmable network data path in the Linux kernel.
> >>>>>>>>>>>>>>>> +
> >>>>>>>>>>>>>>>> \newline\url{https://prototype-kernel.readthedocs.io/en/latest/networking/XDP/}\\
> >>>>>>>>>>>>>>>>         \end{longtable}
> >>>>>>>>>>>>>>>>         \section{Non-Normative References}
> >>>>>>>>>>>>>>>> --
> >>>>>>>>>>>>>>>> 2.19.1.6.gb485710b
> >>>>>>>>>>>>> This publicly archived list offers a means to provide input to the
> >>>>>>>>>>>>> OASIS Virtual I/O Device (VIRTIO) TC.
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> In order to verify user consent to the Feedback License terms and
> >>>>>>>>>>>>> to minimize spam in the list archive, subscription is required
> >>>>>>>>>>>>> before posting.
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> Subscribe: virtio-comment-subscribe@lists.oasis-open.org
> >>>>>>>>>>>>> Unsubscribe: virtio-comment-unsubscribe@lists.oasis-open.org
> >>>>>>>>>>>>> List help: virtio-comment-help@lists.oasis-open.org
> >>>>>>>>>>>>> List archive: https://lists.oasis-open.org/archives/virtio-comment/
> >>>>>>>>>>>>> Feedback License:
> >>>>>>>>>>>>> https://www.oasis-open.org/who/ipr/feedback_license.pdf
> >>>>>>>>>>>>> List Guidelines:
> >>>>>>>>>>>>> https://www.oasis-open.org/policies-guidelines/mailing-lists
> >>>>>>>>>>>>> Committee: https://www.oasis-open.org/committees/virtio/
> >>>>>>>>>>>>> Join OASIS: https://www.oasis-open.org/join/
> >>>>>>>>>>>> This publicly archived list offers a means to provide input to the
> >>>>>>>>>>>> OASIS Virtual I/O Device (VIRTIO) TC.
> >>>>>>>>>>>>
> >>>>>>>>>>>> In order to verify user consent to the Feedback License terms and
> >>>>>>>>>>>> to minimize spam in the list archive, subscription is required
> >>>>>>>>>>>> before posting.
> >>>>>>>>>>>>
> >>>>>>>>>>>> Subscribe: virtio-comment-subscribe@lists.oasis-open.org
> >>>>>>>>>>>> Unsubscribe: virtio-comment-unsubscribe@lists.oasis-open.org
> >>>>>>>>>>>> List help: virtio-comment-help@lists.oasis-open.org
> >>>>>>>>>>>> List archive: https://lists.oasis-open.org/archives/virtio-comment/
> >>>>>>>>>>>> Feedback License:
> >>>>>>>>>>>> https://www.oasis-open.org/who/ipr/feedback_license.pdf
> >>>>>>>>>>>> List Guidelines:
> >>>>>>>>>>>> https://www.oasis-open.org/policies-guidelines/mailing-lists
> >>>>>>>>>>>> Committee: https://www.oasis-open.org/committees/virtio/
> >>>>>>>>>>>> Join OASIS: https://www.oasis-open.org/join/
> >>>>>>>>>>> This publicly archived list offers a means to provide input to the
> >>>>>>>>>>> OASIS Virtual I/O Device (VIRTIO) TC.
> >>>>>>>>>>>
> >>>>>>>>>>> In order to verify user consent to the Feedback License terms and
> >>>>>>>>>>> to minimize spam in the list archive, subscription is required
> >>>>>>>>>>> before posting.
> >>>>>>>>>>>
> >>>>>>>>>>> Subscribe: virtio-comment-subscribe@lists.oasis-open.org
> >>>>>>>>>>> Unsubscribe: virtio-comment-unsubscribe@lists.oasis-open.org
> >>>>>>>>>>> List help: virtio-comment-help@lists.oasis-open.org
> >>>>>>>>>>> List archive: https://lists.oasis-open.org/archives/virtio-comment/
> >>>>>>>>>>> Feedback License: https://www.oasis-open.org/who/ipr/feedback_license.pdf
> >>>>>>>>>>> List Guidelines:
> >>>>>>>>>>> https://www.oasis-open.org/policies-guidelines/mailing-lists
> >>>>>>>>>>> Committee: https://www.oasis-open.org/committees/virtio/
> >>>>>>>>>>> Join OASIS: https://www.oasis-open.org/join/
> >>>>>>>>> This publicly archived list offers a means to provide input to the
> >>>>>>>>> OASIS Virtual I/O Device (VIRTIO) TC.
> >>>>>>>>>
> >>>>>>>>> In order to verify user consent to the Feedback License terms and
> >>>>>>>>> to minimize spam in the list archive, subscription is required
> >>>>>>>>> before posting.
> >>>>>>>>>
> >>>>>>>>> Subscribe: virtio-comment-subscribe@lists.oasis-open.org
> >>>>>>>>> Unsubscribe: virtio-comment-unsubscribe@lists.oasis-open.org
> >>>>>>>>> List help: virtio-comment-help@lists.oasis-open.org
> >>>>>>>>> List archive: https://lists.oasis-open.org/archives/virtio-comment/
> >>>>>>>>> Feedback License: https://www.oasis-open.org/who/ipr/feedback_license.pdf
> >>>>>>>>> List Guidelines: https://www.oasis-open.org/policies-guidelines/mailing-lists
> >>>>>>>>> Committee: https://www.oasis-open.org/committees/virtio/
> >>>>>>>>> Join OASIS: https://www.oasis-open.org/join/
> >>>>>>> ---------------------------------------------------------------------
> >>>>>>> To unsubscribe, e-mail: virtio-dev-unsubscribe@lists.oasis-open.org
> >>>>>>> For additional commands, e-mail: virtio-dev-help@lists.oasis-open.org
> >>>>> This publicly archived list offers a means to provide input to the
> >>>>> OASIS Virtual I/O Device (VIRTIO) TC.
> >>>>>
> >>>>> In order to verify user consent to the Feedback License terms and
> >>>>> to minimize spam in the list archive, subscription is required
> >>>>> before posting.
> >>>>>
> >>>>> Subscribe: virtio-comment-subscribe@lists.oasis-open.org
> >>>>> Unsubscribe: virtio-comment-unsubscribe@lists.oasis-open.org
> >>>>> List help: virtio-comment-help@lists.oasis-open.org
> >>>>> List archive: https://lists.oasis-open.org/archives/virtio-comment/
> >>>>> Feedback License: https://www.oasis-open.org/who/ipr/feedback_license.pdf
> >>>>> List Guidelines: https://www.oasis-open.org/policies-guidelines/mailing-lists
> >>>>> Committee: https://www.oasis-open.org/committees/virtio/
> >>>>> Join OASIS: https://www.oasis-open.org/join/
> >>>
> >>> This publicly archived list offers a means to provide input to the
> >>> OASIS Virtual I/O Device (VIRTIO) TC.
> >>>
> >>> In order to verify user consent to the Feedback License terms and
> >>> to minimize spam in the list archive, subscription is required
> >>> before posting.
> >>>
> >>> Subscribe: virtio-comment-subscribe@lists.oasis-open.org
> >>> Unsubscribe: virtio-comment-unsubscribe@lists.oasis-open.org
> >>> List help: virtio-comment-help@lists.oasis-open.org
> >>> List archive: https://lists.oasis-open.org/archives/virtio-comment/
> >>> Feedback License: https://www.oasis-open.org/who/ipr/feedback_license.pdf
> >>> List Guidelines: https://www.oasis-open.org/policies-guidelines/mailing-lists
> >>> Committee: https://www.oasis-open.org/committees/virtio/
> >>> Join OASIS: https://www.oasis-open.org/join/
>



[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]