net/virtio: support LRO
Signed-off-by: Olivier Matz <olivier.matz@6wind.com> Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com> Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
This commit is contained in:
parent
58169a9c81
commit
86d59b2146
@ -86,6 +86,7 @@ New Features
|
||||
* **Supported offloads with virtio.**
|
||||
|
||||
* Rx/Tx checksums
|
||||
* LRO
|
||||
|
||||
* **Added virtio NEON support for ARM.**
|
||||
|
||||
|
@ -1369,6 +1369,10 @@ virtio_dev_configure(struct rte_eth_dev *dev)
|
||||
req_features = VIRTIO_PMD_DEFAULT_GUEST_FEATURES;
|
||||
if (rxmode->hw_ip_checksum)
|
||||
req_features |= (1ULL << VIRTIO_NET_F_GUEST_CSUM);
|
||||
if (rxmode->enable_lro)
|
||||
req_features |=
|
||||
(1ULL << VIRTIO_NET_F_GUEST_TSO4) |
|
||||
(1ULL << VIRTIO_NET_F_GUEST_TSO6);
|
||||
|
||||
/* if request features changed, reinit the device */
|
||||
if (req_features != hw->req_guest_features) {
|
||||
@ -1384,6 +1388,14 @@ virtio_dev_configure(struct rte_eth_dev *dev)
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
if (rxmode->enable_lro &&
|
||||
(!vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4) ||
|
||||
!vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4))) {
|
||||
PMD_DRV_LOG(NOTICE,
|
||||
"lro not available on this host");
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
/* Setup and start control queue */
|
||||
if (vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_VQ)) {
|
||||
ret = virtio_dev_cq_queue_setup(dev,
|
||||
@ -1599,7 +1611,8 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
|
||||
};
|
||||
dev_info->rx_offload_capa =
|
||||
DEV_RX_OFFLOAD_TCP_CKSUM |
|
||||
DEV_RX_OFFLOAD_UDP_CKSUM;
|
||||
DEV_RX_OFFLOAD_UDP_CKSUM |
|
||||
DEV_RX_OFFLOAD_TCP_LRO;
|
||||
dev_info->tx_offload_capa = 0;
|
||||
|
||||
if (hw->guest_features & (1ULL << VIRTIO_NET_F_CSUM)) {
|
||||
|
@ -118,13 +118,4 @@ uint16_t virtio_xmit_pkts_simple(void *tx_queue, struct rte_mbuf **tx_pkts,
|
||||
|
||||
int eth_virtio_dev_init(struct rte_eth_dev *eth_dev);
|
||||
|
||||
/*
|
||||
* The VIRTIO_NET_F_GUEST_TSO[46] features permit the host to send us
|
||||
* frames larger than 1514 bytes. We do not yet support software LRO
|
||||
* via tcp_lro_rx().
|
||||
*/
|
||||
#define VTNET_LRO_FEATURES (VIRTIO_NET_F_GUEST_TSO4 | \
|
||||
VIRTIO_NET_F_GUEST_TSO6 | VIRTIO_NET_F_GUEST_ECN)
|
||||
|
||||
|
||||
#endif /* _VIRTIO_ETHDEV_H_ */
|
||||
|
@ -715,13 +715,36 @@ virtio_rx_offload(struct rte_mbuf *m, struct virtio_net_hdr *hdr)
|
||||
m->ol_flags |= PKT_RX_L4_CKSUM_GOOD;
|
||||
}
|
||||
|
||||
/* GSO request, save required information in mbuf */
|
||||
if (hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) {
|
||||
/* Check unsupported modes */
|
||||
if ((hdr->gso_type & VIRTIO_NET_HDR_GSO_ECN) ||
|
||||
(hdr->gso_size == 0)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Update mss lengthes in mbuf */
|
||||
m->tso_segsz = hdr->gso_size;
|
||||
switch (hdr->gso_type & ~VIRTIO_NET_HDR_GSO_ECN) {
|
||||
case VIRTIO_NET_HDR_GSO_TCPV4:
|
||||
case VIRTIO_NET_HDR_GSO_TCPV6:
|
||||
m->ol_flags |= PKT_RX_LRO | \
|
||||
PKT_RX_L4_CKSUM_NONE;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
rx_offload_enabled(struct virtio_hw *hw)
|
||||
{
|
||||
return vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_CSUM);
|
||||
return vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_CSUM) ||
|
||||
vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4) ||
|
||||
vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO6);
|
||||
}
|
||||
|
||||
#define VIRTIO_MBUF_BURST_SZ 64
|
||||
|
Loading…
Reference in New Issue
Block a user