[dpdk-dev] vhost: Fix packet length issue
Commit Message
As HW vlan strip will reduce the packet length by minus length of vlan tag,
so it need restore the packet length by plus it.
Signed-off-by: Changchun Ouyang <changchun.ouyang@intel.com>
---
examples/vhost/main.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
@@ -1067,6 +1067,7 @@ virtio_tx_route(struct vhost_dev *vdev, struct rte_mbuf *m, uint16_t vlan_tag)
{
struct mbuf_table *tx_q;
struct rte_mbuf **m_table;
+ struct rte_mbuf *last_seg = m;
unsigned len, ret, offset = 0;
const uint16_t lcore_id = rte_lcore_id();
struct virtio_net_data_ll *dev_ll = ll_root_used;
@@ -1097,7 +1098,13 @@ virtio_tx_route(struct vhost_dev *vdev, struct rte_mbuf *m, uint16_t vlan_tag)
rte_pktmbuf_free(m);
return;
}
- offset = 4;
+
+ /*
+ * HW vlan strip will reduce the packet length
+ * by minus length of vlan tag, so need restore
+ * the packet length by plus it.
+ */
+ offset = VLAN_HLEN;
vlan_tag =
(uint16_t)
vlan_tags[(uint16_t)dev_ll->vdev->dev->device_fh];
@@ -1121,8 +1128,12 @@ virtio_tx_route(struct vhost_dev *vdev, struct rte_mbuf *m, uint16_t vlan_tag)
len = tx_q->len;
m->ol_flags = PKT_TX_VLAN_PKT;
- /*FIXME: offset*/
- m->data_len += offset;
+
+ while (last_seg->next)
+ last_seg = last_seg->next;
+ last_seg->data_len += offset;
+ m->pkt_len += offset;
+
m->vlan_tci = vlan_tag;
tx_q->m_table[len] = m;