xsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget./translations/zh_CN/networking/netdev-featuresmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/zh_TW/networking/netdev-featuresmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/it_IT/networking/netdev-featuresmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/ja_JP/networking/netdev-featuresmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/ko_KR/networking/netdev-featuresmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/sp_SP/networking/netdev-featuresmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhH/var/lib/git/docbuild/linux/Documentation/networking/netdev-features.rsthKubhsection)}(hhh](htitle)}(h5Netdev features mess and how to get out from it aliveh]h5Netdev features mess and how to get out from it alive}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhdefinition_list)}(hhh]hdefinition_list_item)}(h6Author: Michał Mirosław h](hterm)}(hAuthor:h]hAuthor:}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhubh definition)}(hhh]h paragraph)}(h+Michał Mirosław h](hMichał Mirosław <}(hhhhhNhNubh reference)}(hmirq-linux@rere.qmqm.plh]hmirq-linux@rere.qmqm.pl}(hhhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:mirq-linux@rere.qmqm.pluh1hhhubh>}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhK hhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh)}(hhh](h)}(hPart I: Feature setsh]hPart I: Feature sets}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hhhhhK ubh)}(hXnLong gone are the days when a network card would just take and give packets verbatim. Today's devices add multiple features and bugs (read: offloads) that relieve an OS of various tasks like generating and checking checksums, splitting packets, classifying them. Those capabilities and their state are commonly referred to as netdev features in Linux kernel world.h]hXpLong gone are the days when a network card would just take and give packets verbatim. Today’s devices add multiple features and bugs (read: offloads) that relieve an OS of various tasks like generating and checking checksums, splitting packets, classifying them. Those capabilities and their state are commonly referred to as netdev features in Linux kernel world.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj!hhubh)}(hkThere are currently three sets of features relevant to the driver, and one used internally by network core:h]hkThere are currently three sets of features relevant to the driver, and one used internally by network core:}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj!hhubh block_quote)}(hX1. netdev->hw_features set contains features whose state may possibly be changed (enabled or disabled) for a particular device by user's request. This set should be initialized in ndo_init callback and not changed later. 2. netdev->features set contains features which are currently enabled for a device. This should be changed only by network core or in error paths of ndo_set_features callback. 3. netdev->vlan_features set contains features whose state is inherited by child VLAN devices (limits netdev->features set). This is currently used for all VLAN devices whether tags are stripped or inserted in hardware or software. 4. netdev->wanted_features set contains feature set requested by user. This set is filtered by ndo_fix_features callback whenever it or some device-specific conditions change. This set is internal to networking core and should not be referenced in drivers. h]henumerated_list)}(hhh](h list_item)}(hnetdev->hw_features set contains features whose state may possibly be changed (enabled or disabled) for a particular device by user's request. This set should be initialized in ndo_init callback and not changed later. h]h)}(hnetdev->hw_features set contains features whose state may possibly be changed (enabled or disabled) for a particular device by user's request. This set should be initialized in ndo_init callback and not changed later.h]hnetdev->hw_features set contains features whose state may possibly be changed (enabled or disabled) for a particular device by user’s request. This set should be initialized in ndo_init callback and not changed later.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj[ubah}(h]h ]h"]h$]h&]uh1jYhjVubjZ)}(hnetdev->features set contains features which are currently enabled for a device. This should be changed only by network core or in error paths of ndo_set_features callback. h]h)}(hnetdev->features set contains features which are currently enabled for a device. This should be changed only by network core or in error paths of ndo_set_features callback.h]hnetdev->features set contains features which are currently enabled for a device. This should be changed only by network core or in error paths of ndo_set_features callback.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjsubah}(h]h ]h"]h$]h&]uh1jYhjVubjZ)}(hnetdev->vlan_features set contains features whose state is inherited by child VLAN devices (limits netdev->features set). This is currently used for all VLAN devices whether tags are stripped or inserted in hardware or software. h]h)}(hnetdev->vlan_features set contains features whose state is inherited by child VLAN devices (limits netdev->features set). This is currently used for all VLAN devices whether tags are stripped or inserted in hardware or software.h]hnetdev->vlan_features set contains features whose state is inherited by child VLAN devices (limits netdev->features set). This is currently used for all VLAN devices whether tags are stripped or inserted in hardware or software.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK!hjubah}(h]h ]h"]h$]h&]uh1jYhjVubjZ)}(hXnetdev->wanted_features set contains feature set requested by user. This set is filtered by ndo_fix_features callback whenever it or some device-specific conditions change. This set is internal to networking core and should not be referenced in drivers. h]h)}(hnetdev->wanted_features set contains feature set requested by user. This set is filtered by ndo_fix_features callback whenever it or some device-specific conditions change. This set is internal to networking core and should not be referenced in drivers.h]hnetdev->wanted_features set contains feature set requested by user. This set is filtered by ndo_fix_features callback whenever it or some device-specific conditions change. This set is internal to networking core and should not be referenced in drivers.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjubah}(h]h ]h"]h$]h&]uh1jYhjVubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1jThjPubah}(h]h ]h"]h$]h&]uh1jNhhhKhj!hhubeh}(h]part-i-feature-setsah ]h"]part i: feature setsah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(h%Part II: Controlling enabled featuresh]h%Part II: Controlling enabled features}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK.ubh)}(hXWhen current feature set (netdev->features) is to be changed, new set is calculated and filtered by calling ndo_fix_features callback and netdev_fix_features(). If the resulting set differs from current set, it is passed to ndo_set_features callback and (if the callback returns success) replaces value stored in netdev->features. NETDEV_FEAT_CHANGE notification is issued after that whenever current set might have changed.h]hXWhen current feature set (netdev->features) is to be changed, new set is calculated and filtered by calling ndo_fix_features callback and netdev_fix_features(). If the resulting set differs from current set, it is passed to ndo_set_features callback and (if the callback returns success) replaces value stored in netdev->features. NETDEV_FEAT_CHANGE notification is issued after that whenever current set might have changed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjhhubh)}(hhh]h)}(hThe following events trigger recalculation: 1. device's registration, after ndo_init returned success 2. user requested changes in features state 3. netdev_update_features() is called h](h)}(h+The following events trigger recalculation:h]h+The following events trigger recalculation:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hjubh)}(hhh]jU)}(hhh](jZ)}(h6device's registration, after ndo_init returned successh]h)}(hjh]h8device’s registration, after ndo_init returned success}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK9hjubah}(h]h ]h"]h$]h&]uh1jYhj ubjZ)}(h(user requested changes in features stateh]h)}(hj'h]h(user requested changes in features state}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hj%ubah}(h]h ]h"]h$]h&]uh1jYhj ubjZ)}(h#netdev_update_features() is called h]h)}(h"netdev_update_features() is calledh]h"netdev_update_features() is called}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hj<ubah}(h]h ]h"]h$]h&]uh1jYhj ubeh}(h]h ]h"]h$]h&]jjjhjjuh1jThjubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhK;hjubah}(h]h ]h"]h$]h&]uh1hhjhhhNhNubh)}(hsndo_*_features callbacks are called with rtnl_lock held. Missing callbacks are treated as always returning success.h]hsndo_*_features callbacks are called with rtnl_lock held. Missing callbacks are treated as always returning success.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK=hjhhubh)}(hX A driver that wants to trigger recalculation must do so by calling netdev_update_features() while holding rtnl_lock. This should not be done from ndo_*_features callbacks. netdev->features should not be modified by driver except by means of ndo_fix_features callback.h]hX A driver that wants to trigger recalculation must do so by calling netdev_update_features() while holding rtnl_lock. This should not be done from ndo_*_features callbacks. netdev->features should not be modified by driver except by means of ndo_fix_features callback.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK@hjhhubeh}(h]$part-ii-controlling-enabled-featuresah ]h"]%part ii: controlling enabled featuresah$]h&]uh1hhhhhhhhK.ubh)}(hhh](h)}(hPart III: Implementation hintsh]hPart III: Implementation hints}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKHubjO)}(h* ndo_fix_features: h]h bullet_list)}(hhh]jZ)}(hndo_fix_features: h]h)}(hndo_fix_features:h]hndo_fix_features:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKJhjubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]bullet*uh1jhhhKJhjubah}(h]h ]h"]h$]h&]uh1jNhhhKJhjhhubh)}(hX(All dependencies between features should be resolved here. The resulting set can be reduced further by networking core imposed limitations (as coded in netdev_fix_features()). For this reason it is safer to disable a feature when its dependencies are not met instead of forcing the dependency on.h]hX(All dependencies between features should be resolved here. The resulting set can be reduced further by networking core imposed limitations (as coded in netdev_fix_features()). For this reason it is safer to disable a feature when its dependencies are not met instead of forcing the dependency on.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKLhjhhubh)}(hThis callback should not modify hardware nor driver state (should be stateless). It can be called multiple times between successive ndo_set_features calls.h]hThis callback should not modify hardware nor driver state (should be stateless). It can be called multiple times between successive ndo_set_features calls.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKQhjhhubh)}(hCallback must not alter features contained in NETIF_F_SOFT_FEATURES or NETIF_F_NEVER_CHANGE sets. The exception is NETIF_F_VLAN_CHALLENGED but care must be taken as the change won't affect already configured VLANs.h]hCallback must not alter features contained in NETIF_F_SOFT_FEATURES or NETIF_F_NEVER_CHANGE sets. The exception is NETIF_F_VLAN_CHALLENGED but care must be taken as the change won’t affect already configured VLANs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKUhjhhubjO)}(h* ndo_set_features: h]j)}(hhh]jZ)}(hndo_set_features: h]h)}(hndo_set_features:h]hndo_set_features:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKYhjubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]jjuh1jhhhKYhjubah}(h]h ]h"]h$]h&]uh1jNhhhKYhjhhubh)}(hXHardware should be reconfigured to match passed feature set. The set should not be altered unless some error condition happens that can't be reliably detected in ndo_fix_features. In this case, the callback should update netdev->features to match resulting hardware state. Errors returned are not (and cannot be) propagated anywhere except dmesg. (Note: successful return is zero, >0 means silent error.)h]hXHardware should be reconfigured to match passed feature set. The set should not be altered unless some error condition happens that can’t be reliably detected in ndo_fix_features. In this case, the callback should update netdev->features to match resulting hardware state. Errors returned are not (and cannot be) propagated anywhere except dmesg. (Note: successful return is zero, >0 means silent error.)}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK[hjhhubeh}(h]part-iii-implementation-hintsah ]h"]part iii: implementation hintsah$]h&]uh1hhhhhhhhKHubh)}(hhh](h)}(hPart IV: Featuresh]hPart IV: Features}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hhhhhKeubh)}(htFor current list of features, see include/linux/netdev_features.h. This section describes semantics of some of them.h]htFor current list of features, see include/linux/netdev_features.h. This section describes semantics of some of them.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKghj;hhubjO)}(h* Transmit checksumming h]j)}(hhh]jZ)}(hTransmit checksumming h]h)}(hTransmit checksummingh]hTransmit checksumming}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKjhjaubah}(h]h ]h"]h$]h&]uh1jYhj^ubah}(h]h ]h"]h$]h&]jjuh1jhhhKjhjZubah}(h]h ]h"]h$]h&]uh1jNhhhKjhj;hhubh)}(hNFor complete description, see comments near the top of include/linux/skbuff.h.h]hNFor complete description, see comments near the top of include/linux/skbuff.h.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKlhj;hhubh)}(hNote: NETIF_F_HW_CSUM is a superset of NETIF_F_IP_CSUM + NETIF_F_IPV6_CSUM. It means that device can fill TCP/UDP-like checksum anywhere in the packets whatever headers there might be.h]hNote: NETIF_F_HW_CSUM is a superset of NETIF_F_IP_CSUM + NETIF_F_IPV6_CSUM. It means that device can fill TCP/UDP-like checksum anywhere in the packets whatever headers there might be.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKnhj;hhubjO)}(h$* Transmit TCP segmentation offload h]j)}(hhh]jZ)}(h"Transmit TCP segmentation offload h]h)}(h!Transmit TCP segmentation offloadh]h!Transmit TCP segmentation offload}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKrhjubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]jjuh1jhhhKrhjubah}(h]h ]h"]h$]h&]uh1jNhhhKrhj;hhubh)}(hNETIF_F_TSO_ECN means that hardware can properly split packets with CWR bit set, be it TCPv4 (when NETIF_F_TSO is enabled) or TCPv6 (NETIF_F_TSO6).h]hNETIF_F_TSO_ECN means that hardware can properly split packets with CWR bit set, be it TCPv4 (when NETIF_F_TSO is enabled) or TCPv6 (NETIF_F_TSO6).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKthj;hhubjO)}(h$* Transmit UDP segmentation offload h]j)}(hhh]jZ)}(h"Transmit UDP segmentation offload h]h)}(h!Transmit UDP segmentation offloadh]h!Transmit UDP segmentation offload}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKwhjubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]jjuh1jhhhKwhjubah}(h]h ]h"]h$]h&]uh1jNhhhKwhj;hhubh)}(hNETIF_F_GSO_UDP_L4 accepts a single UDP header with a payload that exceeds gso_size. On segmentation, it segments the payload on gso_size boundaries and replicates the network and UDP headers (fixing up the last one if less than gso_size).h]hNETIF_F_GSO_UDP_L4 accepts a single UDP header with a payload that exceeds gso_size. On segmentation, it segments the payload on gso_size boundaries and replicates the network and UDP headers (fixing up the last one if less than gso_size).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKyhj;hhubjO)}(h * Transmit DMA from high memory h]j)}(hhh]jZ)}(hTransmit DMA from high memory h]h)}(hTransmit DMA from high memoryh]hTransmit DMA from high memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK~hjubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]jjuh1jhhhK~hjubah}(h]h ]h"]h$]h&]uh1jNhhhK~hj;hhubh)}(h{On platforms where this is relevant, NETIF_F_HIGHDMA signals that ndo_start_xmit can handle skbs with frags in high memory.h]h{On platforms where this is relevant, NETIF_F_HIGHDMA signals that ndo_start_xmit can handle skbs with frags in high memory.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj;hhubjO)}(h* Transmit scatter-gather h]j)}(hhh]jZ)}(hTransmit scatter-gather h]h)}(hTransmit scatter-gatherh]hTransmit scatter-gather}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjSubah}(h]h ]h"]h$]h&]uh1jYhjPubah}(h]h ]h"]h$]h&]jjuh1jhhhKhjLubah}(h]h ]h"]h$]h&]uh1jNhhhKhj;hhubh)}(hThose features say that ndo_start_xmit can handle fragmented skbs: NETIF_F_SG --- paged skbs (skb_shinfo()->frags), NETIF_F_FRAGLIST --- chained skbs (skb->next/prev list).h]hThose features say that ndo_start_xmit can handle fragmented skbs: NETIF_F_SG --- paged skbs (skb_shinfo()->frags), NETIF_F_FRAGLIST --- chained skbs (skb->next/prev list).}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj;hhubjO)}(h* Software features h]j)}(hhh]jZ)}(hSoftware features h]h)}(hSoftware featuresh]hSoftware features}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]jjuh1jhhhKhjubah}(h]h ]h"]h$]h&]uh1jNhhhKhj;hhubh)}(hFeatures contained in NETIF_F_SOFT_FEATURES are features of networking stack. Driver should not change behaviour based on them.h]hFeatures contained in NETIF_F_SOFT_FEATURES are features of networking stack. Driver should not change behaviour based on them.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj;hhubjO)}(h* VLAN challenged h]j)}(hhh]jZ)}(hVLAN challenged h]h)}(hVLAN challengedh]hVLAN challenged}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]jjuh1jhhhKhjubah}(h]h ]h"]h$]h&]uh1jNhhhKhj;hhubh)}(hXNETIF_F_VLAN_CHALLENGED should be set for devices which can't cope with VLAN headers. Some drivers set this because the cards can't handle the bigger MTU. [FIXME: Those cases could be fixed in VLAN code by allowing only reduced-MTU VLANs. This may be not useful, though.]h]hXNETIF_F_VLAN_CHALLENGED should be set for devices which can’t cope with VLAN headers. Some drivers set this because the cards can’t handle the bigger MTU. [FIXME: Those cases could be fixed in VLAN code by allowing only reduced-MTU VLANs. This may be not useful, though.]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj;hhubj)}(hhh]jZ)}(hrx-fcs h]h)}(hrx-fcsh]hrx-fcs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jYhjhhhhhNubah}(h]h ]h"]h$]h&]jjuh1jhhhKhj;hhubh)}(hThis requests that the NIC append the Ethernet Frame Checksum (FCS) to the end of the skb data. This allows sniffers and other tools to read the CRC recorded by the NIC on receipt of the packet.h]hThis requests that the NIC append the Ethernet Frame Checksum (FCS) to the end of the skb data. This allows sniffers and other tools to read the CRC recorded by the NIC on receipt of the packet.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj;hhubj)}(hhh]jZ)}(hrx-all h]h)}(hrx-allh]hrx-all}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj)ubah}(h]h ]h"]h$]h&]uh1jYhj&hhhhhNubah}(h]h ]h"]h$]h&]jjuh1jhhhKhj;hhubh)}(hThis requests that the NIC receive all possible frames, including errored frames (such as bad FCS, etc). This can be helpful when sniffing a link with bad packets on it. Some NICs may receive more packets if also put into normal PROMISC mode.h]hThis requests that the NIC receive all possible frames, including errored frames (such as bad FCS, etc). This can be helpful when sniffing a link with bad packets on it. Some NICs may receive more packets if also put into normal PROMISC mode.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj;hhubj)}(hhh]jZ)}(h rx-gro-hw h]h)}(h rx-gro-hwh]h rx-gro-hw}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjXubah}(h]h ]h"]h$]h&]uh1jYhjUhhhhhNubah}(h]h ]h"]h$]h&]jjuh1jhhhKhj;hhubh)}(hXThis requests that the NIC enables Hardware GRO (generic receive offload). Hardware GRO is basically the exact reverse of TSO, and is generally stricter than Hardware LRO. A packet stream merged by Hardware GRO must be re-segmentable by GSO or TSO back to the exact original packet stream. Hardware GRO is dependent on RXCSUM since every packet successfully merged by hardware must also have the checksum verified by hardware.h]hXThis requests that the NIC enables Hardware GRO (generic receive offload). Hardware GRO is basically the exact reverse of TSO, and is generally stricter than Hardware LRO. A packet stream merged by Hardware GRO must be re-segmentable by GSO or TSO back to the exact original packet stream. Hardware GRO is dependent on RXCSUM since every packet successfully merged by hardware must also have the checksum verified by hardware.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj;hhubj)}(hhh]jZ)}(hhsr-tag-ins-offload h]h)}(hhsr-tag-ins-offloadh]hhsr-tag-ins-offload}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jYhjhhhhhNubah}(h]h ]h"]h$]h&]jjuh1jhhhKhj;hhubh)}(hThis should be set for devices which insert an HSR (High-availability Seamless Redundancy) or PRP (Parallel Redundancy Protocol) tag automatically.h]hThis should be set for devices which insert an HSR (High-availability Seamless Redundancy) or PRP (Parallel Redundancy Protocol) tag automatically.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj;hhubj)}(hhh]jZ)}(hhsr-tag-rm-offload h]h)}(hhsr-tag-rm-offloadh]hhsr-tag-rm-offload}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jYhjhhhhhNubah}(h]h ]h"]h$]h&]jjuh1jhhhKhj;hhubh)}(hThis should be set for devices which remove HSR (High-availability Seamless Redundancy) or PRP (Parallel Redundancy Protocol) tags automatically.h]hThis should be set for devices which remove HSR (High-availability Seamless Redundancy) or PRP (Parallel Redundancy Protocol) tags automatically.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj;hhubj)}(hhh]jZ)}(hhsr-fwd-offload h]h)}(hhsr-fwd-offloadh]hhsr-fwd-offload}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jYhjhhhhhNubah}(h]h ]h"]h$]h&]jjuh1jhhhKhj;hhubh)}(hThis should be set for devices which forward HSR (High-availability Seamless Redundancy) frames from one port to another in hardware.h]hThis should be set for devices which forward HSR (High-availability Seamless Redundancy) frames from one port to another in hardware.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj;hhubj)}(hhh]jZ)}(hhsr-dup-offload h]h)}(hhsr-dup-offloadh]hhsr-dup-offload}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jYhjhhhhhNubah}(h]h ]h"]h$]h&]jjuh1jhhhKhj;hhubh)}(hThis should be set for devices which duplicate outgoing HSR (High-availability Seamless Redundancy) or PRP (Parallel Redundancy Protocol) tags automatically frames in hardware.h]hThis should be set for devices which duplicate outgoing HSR (High-availability Seamless Redundancy) or PRP (Parallel Redundancy Protocol) tags automatically frames in hardware.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj;hhubeh}(h]part-iv-featuresah ]h"]part iv: featuresah$]h&]uh1hhhhhhhhKeubeh}(h]5netdev-features-mess-and-how-to-get-out-from-it-aliveah ]h"]5netdev features mess and how to get out from it aliveah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjserror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jMjJjjjjj8j5jEjBu nametypes}(jMjjj8jEuh}(jJhjj!jjj5jjBj;u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.