Commit 3b17aa13 authored by Paolo Abeni's avatar Paolo Abeni
Browse files

virtio_net: add supports for extended offloads



The virtio_net driver needs it to implement GSO over UDP tunnel
offload.

The only missing piece is mapping them to/from the extended
features.

Acked-by: default avatarJason Wang <jasowang@redhat.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 333c515d
Loading
Loading
Loading
Loading
+23 −2
Original line number Diff line number Diff line
@@ -35,6 +35,23 @@ module_param(csum, bool, 0444);
module_param(gso, bool, 0444);
module_param(napi_tx, bool, 0644);

#define VIRTIO_OFFLOAD_MAP_MIN	46
#define VIRTIO_OFFLOAD_MAP_MAX	47
#define VIRTIO_FEATURES_MAP_MIN	65
#define VIRTIO_O2F_DELTA	(VIRTIO_FEATURES_MAP_MIN - \
				 VIRTIO_OFFLOAD_MAP_MIN)

static bool virtio_is_mapped_offload(unsigned int obit)
{
	return obit >= VIRTIO_OFFLOAD_MAP_MIN &&
	       obit <= VIRTIO_OFFLOAD_MAP_MAX;
}

static unsigned int virtio_offload_to_feature(unsigned int obit)
{
	return virtio_is_mapped_offload(obit) ? obit + VIRTIO_O2F_DELTA : obit;
}

/* FIXME: MTU in config. */
#define GOOD_PACKET_LEN (ETH_HLEN + VLAN_HLEN + ETH_DATA_LEN)
#define GOOD_COPY_LEN	128
@@ -7066,9 +7083,13 @@ static int virtnet_probe(struct virtio_device *vdev)
		netif_carrier_on(dev);
	}

	for (i = 0; i < ARRAY_SIZE(guest_offloads); i++)
		if (virtio_has_feature(vi->vdev, guest_offloads[i]))
	for (i = 0; i < ARRAY_SIZE(guest_offloads); i++) {
		unsigned int fbit;

		fbit = virtio_offload_to_feature(guest_offloads[i]);
		if (virtio_has_feature(vi->vdev, fbit))
			set_bit(guest_offloads[i], &vi->guest_offloads);
	}
	vi->guest_offloads_capable = vi->guest_offloads;

	rtnl_unlock();