From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jijiang Liu Subject: [PATCH 7/8] examples/vhost:support TSO in vhost sample Date: Thu, 17 Sep 2015 01:10:37 +0800 Message-ID: <1442423438-10578-8-git-send-email-jijiang.liu@intel.com> References: <1442423438-10578-1-git-send-email-jijiang.liu@intel.com> To: dev@dpdk.org Return-path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id D00118E65 for ; Wed, 16 Sep 2015 19:11:42 +0200 (CEST) In-Reply-To: <1442423438-10578-1-git-send-email-jijiang.liu@intel.com> List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Change the vhost sample in order to support and test TSO offload. Signed-off-by: Jijiang Liu --- examples/vhost/main.c | 20 ++++++++++++++++++-- 1 files changed, 18 insertions(+), 2 deletions(-) diff --git a/examples/vhost/main.c b/examples/vhost/main.c index 1b137b9..482f7af 100644 --- a/examples/vhost/main.c +++ b/examples/vhost/main.c @@ -50,6 +50,7 @@ #include #include #include +#include #include "main.h" @@ -441,6 +442,9 @@ port_init(uint8_t port) if (port >= rte_eth_dev_count()) return -1; + if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) + rte_vhost_feature_enable(1ULL << VIRTIO_NET_F_HOST_TSO4); + rx_rings = (uint16_t)dev_info.max_rx_queues; /* Configure ethernet device. */ retval = rte_eth_dev_configure(port, rx_rings, tx_rings, &port_conf); @@ -1148,6 +1152,13 @@ virtio_tx_route(struct vhost_dev *vdev, struct rte_mbuf *m, uint16_t vlan_tag) len = tx_q->len; nh = rte_pktmbuf_mtod(m, struct ether_hdr *); + m->l2_len = sizeof(struct ether_hdr); + m->l3_len = sizeof(struct ipv4_hdr); + if (m->tso_segsz) { + m->l4_len = sizeof(struct tcp_hdr); + m->ol_flags |= PKT_TX_IP_CKSUM; + } + if (unlikely(nh->ether_type == rte_cpu_to_be_16(ETHER_TYPE_VLAN))) { /* Guest has inserted the vlan tag. */ struct vlan_hdr *vh = (struct vlan_hdr *) (nh + 1); @@ -1155,8 +1166,9 @@ virtio_tx_route(struct vhost_dev *vdev, struct rte_mbuf *m, uint16_t vlan_tag) if ((vm2vm_mode == VM2VM_HARDWARE) && (vh->vlan_tci != vlan_tag_be)) vh->vlan_tci = vlan_tag_be; + m->l2_len += sizeof(struct vlan_hdr); } else { - m->ol_flags = PKT_TX_VLAN_PKT; + m->ol_flags |= PKT_TX_VLAN_PKT; /* * Find the right seg to adjust the data len when offset is @@ -1841,10 +1853,14 @@ virtio_tx_route_zcp(struct virtio_net *dev, struct rte_mbuf *m, mbuf->buf_physaddr = m->buf_physaddr; mbuf->buf_addr = m->buf_addr; } - mbuf->ol_flags = PKT_TX_VLAN_PKT; + mbuf->ol_flags |= PKT_TX_VLAN_PKT; mbuf->vlan_tci = vlan_tag; mbuf->l2_len = sizeof(struct ether_hdr); mbuf->l3_len = sizeof(struct ipv4_hdr); + if (mbuf->tso_segsz) { + mbuf->l4_len = sizeof(struct tcp_hdr); + mbuf->ol_flags |= PKT_TX_IP_CKSUM; + } MBUF_HEADROOM_UINT32(mbuf) = (uint32_t)desc_idx; tx_q->m_table[len] = mbuf; -- 1.7.7.6