|
@@ -491,8 +491,17 @@ static void receive_buf(struct receive_queue *rq, void *buf, unsigned int len)
|
|
|
skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
|
|
|
break;
|
|
|
case VIRTIO_NET_HDR_GSO_UDP:
|
|
|
+ {
|
|
|
+ static bool warned;
|
|
|
+
|
|
|
+ if (!warned) {
|
|
|
+ warned = true;
|
|
|
+ netdev_warn(dev,
|
|
|
+ "host using disabled UFO feature; please fix it\n");
|
|
|
+ }
|
|
|
skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
|
|
|
break;
|
|
|
+ }
|
|
|
case VIRTIO_NET_HDR_GSO_TCPV6:
|
|
|
skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
|
|
|
break;
|
|
@@ -881,8 +890,6 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb)
|
|
|
hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV4;
|
|
|
else if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6)
|
|
|
hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV6;
|
|
|
- else if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP)
|
|
|
- hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_UDP;
|
|
|
else
|
|
|
BUG();
|
|
|
if (skb_shinfo(skb)->gso_type & SKB_GSO_TCP_ECN)
|
|
@@ -1705,7 +1712,7 @@ static int virtnet_probe(struct virtio_device *vdev)
|
|
|
dev->features |= NETIF_F_HW_CSUM|NETIF_F_SG|NETIF_F_FRAGLIST;
|
|
|
|
|
|
if (virtio_has_feature(vdev, VIRTIO_NET_F_GSO)) {
|
|
|
- dev->hw_features |= NETIF_F_TSO | NETIF_F_UFO
|
|
|
+ dev->hw_features |= NETIF_F_TSO
|
|
|
| NETIF_F_TSO_ECN | NETIF_F_TSO6;
|
|
|
}
|
|
|
/* Individual feature bits: what can host handle? */
|
|
@@ -1715,11 +1722,9 @@ static int virtnet_probe(struct virtio_device *vdev)
|
|
|
dev->hw_features |= NETIF_F_TSO6;
|
|
|
if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_ECN))
|
|
|
dev->hw_features |= NETIF_F_TSO_ECN;
|
|
|
- if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_UFO))
|
|
|
- dev->hw_features |= NETIF_F_UFO;
|
|
|
|
|
|
if (gso)
|
|
|
- dev->features |= dev->hw_features & (NETIF_F_ALL_TSO|NETIF_F_UFO);
|
|
|
+ dev->features |= dev->hw_features & NETIF_F_ALL_TSO;
|
|
|
/* (!csum && gso) case will be fixed by register_netdev() */
|
|
|
}
|
|
|
if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_CSUM))
|
|
@@ -1757,8 +1762,7 @@ static int virtnet_probe(struct virtio_device *vdev)
|
|
|
/* If we can receive ANY GSO packets, we must allocate large ones. */
|
|
|
if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) ||
|
|
|
virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6) ||
|
|
|
- virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN) ||
|
|
|
- virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_UFO))
|
|
|
+ virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN))
|
|
|
vi->big_packets = true;
|
|
|
|
|
|
if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF))
|
|
@@ -1952,9 +1956,9 @@ static struct virtio_device_id id_table[] = {
|
|
|
static unsigned int features[] = {
|
|
|
VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM,
|
|
|
VIRTIO_NET_F_GSO, VIRTIO_NET_F_MAC,
|
|
|
- VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6,
|
|
|
+ VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_TSO6,
|
|
|
VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6,
|
|
|
- VIRTIO_NET_F_GUEST_ECN, VIRTIO_NET_F_GUEST_UFO,
|
|
|
+ VIRTIO_NET_F_GUEST_ECN,
|
|
|
VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ,
|
|
|
VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN,
|
|
|
VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ,
|