• Jiri Pirko's avatar
    net: virtio_net: implement exact header length guest feature · be50da3e
    Jiri Pirko authored
    Virtio spec introduced a feature VIRTIO_NET_F_GUEST_HDRLEN which when
    set implicates that device benefits from knowing the exact size
    of the header. For compatibility, to signal to the device that
    the header is reliable driver also needs to set this feature.
    Without this feature set by driver, device has to figure
    out the header size itself.
    
    Quoting the original virtio spec:
    "hdr_len is a hint to the device as to how much of the header needs to
     be kept to copy into each packet"
    
    "a hint" might not be clear for the reader what does it mean, if it is
    "maybe like that" of "exactly like that". This feature just makes it
    crystal clear and let the device count on the hdr_len being filled up
    by the exact length of header.
    
    Also note the spec already has following note about hdr_len:
    "Due to various bugs in implementations, this field is not useful
     as a guarantee of the transport header size."
    
    Without this feature the device needs to parse the header in core
    data path handling. Accurate information helps the device to eliminate
    such header parsing and directly use the hardware accelerators
    for GSO operation.
    
    virtio_net_hdr_from_skb() fills up hdr_len to skb_headlen(skb).
    The driver already complies to fill the correct value. Introduce the
    feature and advertise it.
    
    Note that virtio spec also includes following note for device
    implementation:
    "Caution should be taken by the implementation so as to prevent
     a malicious driver from attacking the device by setting
     an incorrect hdr_len."
    
    There is a plan to support this feature in our emulated device.
    A device of SolidRun offers this feature bit. They claim this feature
    will save the device a few cycles for every GSO packet.
    
    Link: https://docs.oasis-open.org/virtio/virtio/v1.2/cs01/virtio-v1.2-cs01.html#x1-230006x3Signed-off-by: default avatarJiri Pirko <jiri@nvidia.com>
    Reviewed-by: default avatarParav Pandit <parav@nvidia.com>
    Reviewed-by: default avatarAlvaro Karsz <alvaro.karsz@solid-run.com>
    Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Acked-by: default avatarWillem de Bruijn <willemb@google.com>
    Link: https://lore.kernel.org/r/20230309094559.917857-1-jiri@resnulli.usSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    be50da3e
virtio_net.c 112 KB