* [dpdk-dev] [PATCH] vhost: Fix packet length issue @ 2014-10-30 9:00 Ouyang Changchun 2014-10-30 14:59 ` [dpdk-dev] [PATCH v2] " Ouyang Changchun 0 siblings, 1 reply; 16+ messages in thread From: Ouyang Changchun @ 2014-10-30 9:00 UTC (permalink / raw) To: dev 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(-) diff --git a/examples/vhost/main.c b/examples/vhost/main.c index 0566124..dc32fa9 100644 --- a/examples/vhost/main.c +++ b/examples/vhost/main.c @@ -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; -- 1.8.4.2 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH v2] vhost: Fix packet length issue 2014-10-30 9:00 [dpdk-dev] [PATCH] vhost: Fix packet length issue Ouyang Changchun @ 2014-10-30 14:59 ` Ouyang Changchun 2014-11-04 7:05 ` [dpdk-dev] [PATCH v3 0/2] " Ouyang Changchun 0 siblings, 1 reply; 16+ messages in thread From: Ouyang Changchun @ 2014-10-30 14:59 UTC (permalink / raw) To: dev 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> --- v2 change: Update data length by plus offset in first segment instead of last segment. v1 change: Update the packet length by plus offset. Use macro to replace constant; examples/vhost/main.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/examples/vhost/main.c b/examples/vhost/main.c index 0566124..9ed48fc 100644 --- a/examples/vhost/main.c +++ b/examples/vhost/main.c @@ -1097,7 +1097,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 +1127,10 @@ 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; + m->pkt_len += offset; + m->vlan_tci = vlan_tag; tx_q->m_table[len] = m; -- 1.8.4.2 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH v3 0/2] Fix packet length issue 2014-10-30 14:59 ` [dpdk-dev] [PATCH v2] " Ouyang Changchun @ 2014-11-04 7:05 ` Ouyang Changchun 2014-11-04 7:05 ` [dpdk-dev] [PATCH v3 1/2] vhost: " Ouyang Changchun ` (2 more replies) 0 siblings, 3 replies; 16+ messages in thread From: Ouyang Changchun @ 2014-11-04 7:05 UTC (permalink / raw) To: dev This patch set fix packet length issue in vhost app, and enhance code by extracting a function to replace duplicated codes in one copy and zero copy TX function. -v3 change: Extract a function to replace duplicated codes in one copy and zero copy TX function -v2 change: Update data length by plus offset in first segment instead of last segment. -v1 change: Update the packet length by plus offset; Use macro to replace constant. Changchun Ouyang (2): Fix packet length issue in vhost. Extract a function to replace duplicated codes in vhost. examples/vhost/main.c | 137 ++++++++++++++++++++++---------------------------- 1 file changed, 61 insertions(+), 76 deletions(-) -- 1.8.4.2 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH v3 1/2] vhost: Fix packet length issue 2014-11-04 7:05 ` [dpdk-dev] [PATCH v3 0/2] " Ouyang Changchun @ 2014-11-04 7:05 ` Ouyang Changchun 2014-11-04 7:05 ` [dpdk-dev] [PATCH v3 2/2] vhost: Remove duplicated codes Ouyang Changchun 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 0/3] Fix packet length issue Ouyang Changchun 2 siblings, 0 replies; 16+ messages in thread From: Ouyang Changchun @ 2014-11-04 7:05 UTC (permalink / raw) To: dev 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 | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/examples/vhost/main.c b/examples/vhost/main.c index 57ef464..5ca8dce 100644 --- a/examples/vhost/main.c +++ b/examples/vhost/main.c @@ -1078,7 +1078,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]; @@ -1102,8 +1108,10 @@ 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; + m->pkt_len += offset; + m->vlan_tci = vlan_tag; tx_q->m_table[len] = m; -- 1.8.4.2 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH v3 2/2] vhost: Remove duplicated codes 2014-11-04 7:05 ` [dpdk-dev] [PATCH v3 0/2] " Ouyang Changchun 2014-11-04 7:05 ` [dpdk-dev] [PATCH v3 1/2] vhost: " Ouyang Changchun @ 2014-11-04 7:05 ` Ouyang Changchun 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 0/3] Fix packet length issue Ouyang Changchun 2 siblings, 0 replies; 16+ messages in thread From: Ouyang Changchun @ 2014-11-04 7:05 UTC (permalink / raw) To: dev Extract a function to replace duplicated codes in one copy and zero copy TX function. Signed-off-by: Changchun Ouyang <changchun.ouyang@intel.com> --- examples/vhost/main.c | 139 +++++++++++++++++++++----------------------------- 1 file changed, 58 insertions(+), 81 deletions(-) diff --git a/examples/vhost/main.c b/examples/vhost/main.c index 5ca8dce..2916313 100644 --- a/examples/vhost/main.c +++ b/examples/vhost/main.c @@ -1040,6 +1040,57 @@ virtio_tx_local(struct vhost_dev *vdev, struct rte_mbuf *m) } /* + * Check if the destination MAC of a packet is one local VM, + * and get its vlan tag, and offset if it is. + */ +static inline int __attribute__((always_inline)) +find_local_dest(struct virtio_net *dev, struct rte_mbuf *m, + uint32_t *offset, uint16_t *vlan_tag) +{ + struct virtio_net_data_ll *dev_ll = ll_root_used; + struct ether_hdr *pkt_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *); + + while (dev_ll != NULL) { + if ((dev_ll->vdev->ready == DEVICE_RX) + && ether_addr_cmp(&(pkt_hdr->d_addr), + &dev_ll->vdev->mac_address)) { + /* + * Drop the packet if the TX packet is + * destined for the TX device. + */ + if (dev_ll->vdev->dev->device_fh == dev->device_fh) { + LOG_DEBUG(VHOST_DATA, + "(%"PRIu64") TX: Source and destination" + " MAC addresses are the same. Dropping " + "packet.\n", + dev_ll->vdev->dev->device_fh); + return -1; + } + + /* + * 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]; + + LOG_DEBUG(VHOST_DATA, + "(%"PRIu64") TX: pkt to local VM device id:" + "(%"PRIu64") vlan tag: %d.\n", + dev->device_fh, dev_ll->vdev->dev->device_fh, + vlan_tag); + + break; + } + dev_ll = dev_ll->next; + } + return 0; +} + +/* * This function routes the TX packet to the correct interface. This may be a local device * or the physical port. */ @@ -1050,8 +1101,6 @@ virtio_tx_route(struct vhost_dev *vdev, struct rte_mbuf *m, uint16_t vlan_tag) struct rte_mbuf **m_table; unsigned len, ret, offset = 0; const uint16_t lcore_id = rte_lcore_id(); - struct virtio_net_data_ll *dev_ll = ll_root_used; - struct ether_hdr *pkt_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *); struct virtio_net *dev = vdev->dev; /*check if destination is local VM*/ @@ -1061,43 +1110,9 @@ virtio_tx_route(struct vhost_dev *vdev, struct rte_mbuf *m, uint16_t vlan_tag) } if (vm2vm_mode == VM2VM_HARDWARE) { - while (dev_ll != NULL) { - if ((dev_ll->vdev->ready == DEVICE_RX) - && ether_addr_cmp(&(pkt_hdr->d_addr), - &dev_ll->vdev->mac_address)) { - /* - * Drop the packet if the TX packet is - * destined for the TX device. - */ - if (dev_ll->vdev->dev->device_fh == dev->device_fh) { - LOG_DEBUG(VHOST_DATA, - "(%"PRIu64") TX: Source and destination" - " MAC addresses are the same. Dropping " - "packet.\n", - dev_ll->vdev->dev->device_fh); - rte_pktmbuf_free(m); - return; - } - - /* - * 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]; - - LOG_DEBUG(VHOST_DATA, - "(%"PRIu64") TX: pkt to local VM device id:" - "(%"PRIu64") vlan tag: %d.\n", - dev->device_fh, dev_ll->vdev->dev->device_fh, - vlan_tag); - - break; - } - dev_ll = dev_ll->next; + if (find_local_dest(dev, m, &offset, &vlan_tag) != 0) { + rte_pktmbuf_free(m); + return; } } @@ -1726,8 +1741,6 @@ virtio_tx_route_zcp(struct virtio_net *dev, struct rte_mbuf *m, struct rte_mbuf *mbuf = NULL; unsigned len, ret, offset = 0; struct vpool *vpool; - struct virtio_net_data_ll *dev_ll = ll_root_used; - struct ether_hdr *pkt_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *); uint16_t vlan_tag = (uint16_t)vlan_tags[(uint16_t)dev->device_fh]; uint16_t vmdq_rx_q = ((struct vhost_dev *)dev->priv)->vmdq_rx_q; @@ -1756,46 +1769,10 @@ virtio_tx_route_zcp(struct virtio_net *dev, struct rte_mbuf *m, * such a ambiguous situation, so pkt will lost. */ vlan_tag = external_pkt_default_vlan_tag; - while (dev_ll != NULL) { - if (likely(dev_ll->vdev->ready == DEVICE_RX) && - ether_addr_cmp(&(pkt_hdr->d_addr), - &dev_ll->vdev->mac_address)) { - - /* - * Drop the packet if the TX packet is destined - * for the TX device. - */ - if (unlikely(dev_ll->vdev->dev->device_fh - == dev->device_fh)) { - LOG_DEBUG(VHOST_DATA, - "(%"PRIu64") TX: Source and destination" - "MAC addresses are the same. Dropping " - "packet.\n", - dev_ll->vdev->dev->device_fh); - MBUF_HEADROOM_UINT32(mbuf) - = (uint32_t)desc_idx; - __rte_mbuf_raw_free(mbuf); - return; - } - - /* - * Packet length offset 4 bytes for HW vlan - * strip when L2 switch back. - */ - offset = 4; - vlan_tag = - (uint16_t) - vlan_tags[(uint16_t)dev_ll->vdev->dev->device_fh]; - - LOG_DEBUG(VHOST_DATA, - "(%"PRIu64") TX: pkt to local VM device id:" - "(%"PRIu64") vlan tag: %d.\n", - dev->device_fh, dev_ll->vdev->dev->device_fh, - vlan_tag); - - break; - } - dev_ll = dev_ll->next; + if (find_local_dest(dev, m, &offset, &vlan_tag) != 0) { + MBUF_HEADROOM_UINT32(mbuf) = (uint32_t)desc_idx; + __rte_mbuf_raw_free(mbuf); + return; } } -- 1.8.4.2 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH v4 0/3] Fix packet length issue 2014-11-04 7:05 ` [dpdk-dev] [PATCH v3 0/2] " Ouyang Changchun 2014-11-04 7:05 ` [dpdk-dev] [PATCH v3 1/2] vhost: " Ouyang Changchun 2014-11-04 7:05 ` [dpdk-dev] [PATCH v3 2/2] vhost: Remove duplicated codes Ouyang Changchun @ 2014-11-05 7:10 ` Ouyang Changchun 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 1/3] vhost: " Ouyang Changchun ` (3 more replies) 2 siblings, 4 replies; 16+ messages in thread From: Ouyang Changchun @ 2014-11-05 7:10 UTC (permalink / raw) To: dev This patch set fix packet length issue in vhost app, and enhance code by extracting a function to replace duplicated codes in one copy and zero copy TX function. -v4 chang: Check offset value and extra bytes inside packet buffer cross page boundary. -v3 change: Extract a function to replace duplicated codes in one copy and zero copy TX function. -v2 change: Update data length by plus offset in first segment instead of last segment. -v1 change: Update the packet length by plus offset; Use macro to replace constant. Changchun Ouyang (3): Fix packet length issue in vhost. Extract a function to replace duplicated codes in vhost. Check offset value in vhost examples/vhost/main.c | 142 +++++++++++++++++++++++--------------------------- 1 file changed, 65 insertions(+), 77 deletions(-) -- 1.8.4.2 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH v4 1/3] vhost: Fix packet length issue 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 0/3] Fix packet length issue Ouyang Changchun @ 2014-11-05 7:10 ` Ouyang Changchun 2014-11-05 16:46 ` Xie, Huawei 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 2/3] vhost: Remove duplicated codes Ouyang Changchun ` (2 subsequent siblings) 3 siblings, 1 reply; 16+ messages in thread From: Ouyang Changchun @ 2014-11-05 7:10 UTC (permalink / raw) To: dev 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 | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/examples/vhost/main.c b/examples/vhost/main.c index 57ef464..5ca8dce 100644 --- a/examples/vhost/main.c +++ b/examples/vhost/main.c @@ -1078,7 +1078,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]; @@ -1102,8 +1108,10 @@ 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; + m->pkt_len += offset; + m->vlan_tci = vlan_tag; tx_q->m_table[len] = m; -- 1.8.4.2 ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [dpdk-dev] [PATCH v4 1/3] vhost: Fix packet length issue 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 1/3] vhost: " Ouyang Changchun @ 2014-11-05 16:46 ` Xie, Huawei 0 siblings, 0 replies; 16+ messages in thread From: Xie, Huawei @ 2014-11-05 16:46 UTC (permalink / raw) To: Ouyang, Changchun, dev > -----Original Message----- > From: Ouyang, Changchun > Sent: Wednesday, November 05, 2014 12:11 AM > To: dev@dpdk.org > Cc: Xie, Huawei; Ananyev, Konstantin; Cao, Waterman; Ouyang, Changchun > Subject: [PATCH v4 1/3] vhost: Fix packet length issue > > 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 | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/examples/vhost/main.c b/examples/vhost/main.c > index 57ef464..5ca8dce 100644 > --- a/examples/vhost/main.c > +++ b/examples/vhost/main.c > @@ -1078,7 +1078,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]; > @@ -1102,8 +1108,10 @@ 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; > + m->pkt_len += offset; > + > m->vlan_tci = vlan_tag; > > tx_q->m_table[len] = m; > -- > 1.8.4.2 Only one thing, I feel "by minus/plus" has grammar problem. :). Acked-by: Huawei Xie <huawei.xie@intel.com>. ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH v4 2/3] vhost: Remove duplicated codes 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 0/3] Fix packet length issue Ouyang Changchun 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 1/3] vhost: " Ouyang Changchun @ 2014-11-05 7:10 ` Ouyang Changchun 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 3/3] vhost: Check offset value Ouyang Changchun 2014-11-05 9:28 ` [dpdk-dev] [PATCH v4 0/3] Fix packet length issue Ananyev, Konstantin 3 siblings, 0 replies; 16+ messages in thread From: Ouyang Changchun @ 2014-11-05 7:10 UTC (permalink / raw) To: dev Extract a function to replace duplicated codes in one copy and zero copy TX function. Signed-off-by: Changchun Ouyang <changchun.ouyang@intel.com> --- examples/vhost/main.c | 139 +++++++++++++++++++++----------------------------- 1 file changed, 58 insertions(+), 81 deletions(-) diff --git a/examples/vhost/main.c b/examples/vhost/main.c index 5ca8dce..2916313 100644 --- a/examples/vhost/main.c +++ b/examples/vhost/main.c @@ -1040,6 +1040,57 @@ virtio_tx_local(struct vhost_dev *vdev, struct rte_mbuf *m) } /* + * Check if the destination MAC of a packet is one local VM, + * and get its vlan tag, and offset if it is. + */ +static inline int __attribute__((always_inline)) +find_local_dest(struct virtio_net *dev, struct rte_mbuf *m, + uint32_t *offset, uint16_t *vlan_tag) +{ + struct virtio_net_data_ll *dev_ll = ll_root_used; + struct ether_hdr *pkt_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *); + + while (dev_ll != NULL) { + if ((dev_ll->vdev->ready == DEVICE_RX) + && ether_addr_cmp(&(pkt_hdr->d_addr), + &dev_ll->vdev->mac_address)) { + /* + * Drop the packet if the TX packet is + * destined for the TX device. + */ + if (dev_ll->vdev->dev->device_fh == dev->device_fh) { + LOG_DEBUG(VHOST_DATA, + "(%"PRIu64") TX: Source and destination" + " MAC addresses are the same. Dropping " + "packet.\n", + dev_ll->vdev->dev->device_fh); + return -1; + } + + /* + * 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]; + + LOG_DEBUG(VHOST_DATA, + "(%"PRIu64") TX: pkt to local VM device id:" + "(%"PRIu64") vlan tag: %d.\n", + dev->device_fh, dev_ll->vdev->dev->device_fh, + vlan_tag); + + break; + } + dev_ll = dev_ll->next; + } + return 0; +} + +/* * This function routes the TX packet to the correct interface. This may be a local device * or the physical port. */ @@ -1050,8 +1101,6 @@ virtio_tx_route(struct vhost_dev *vdev, struct rte_mbuf *m, uint16_t vlan_tag) struct rte_mbuf **m_table; unsigned len, ret, offset = 0; const uint16_t lcore_id = rte_lcore_id(); - struct virtio_net_data_ll *dev_ll = ll_root_used; - struct ether_hdr *pkt_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *); struct virtio_net *dev = vdev->dev; /*check if destination is local VM*/ @@ -1061,43 +1110,9 @@ virtio_tx_route(struct vhost_dev *vdev, struct rte_mbuf *m, uint16_t vlan_tag) } if (vm2vm_mode == VM2VM_HARDWARE) { - while (dev_ll != NULL) { - if ((dev_ll->vdev->ready == DEVICE_RX) - && ether_addr_cmp(&(pkt_hdr->d_addr), - &dev_ll->vdev->mac_address)) { - /* - * Drop the packet if the TX packet is - * destined for the TX device. - */ - if (dev_ll->vdev->dev->device_fh == dev->device_fh) { - LOG_DEBUG(VHOST_DATA, - "(%"PRIu64") TX: Source and destination" - " MAC addresses are the same. Dropping " - "packet.\n", - dev_ll->vdev->dev->device_fh); - rte_pktmbuf_free(m); - return; - } - - /* - * 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]; - - LOG_DEBUG(VHOST_DATA, - "(%"PRIu64") TX: pkt to local VM device id:" - "(%"PRIu64") vlan tag: %d.\n", - dev->device_fh, dev_ll->vdev->dev->device_fh, - vlan_tag); - - break; - } - dev_ll = dev_ll->next; + if (find_local_dest(dev, m, &offset, &vlan_tag) != 0) { + rte_pktmbuf_free(m); + return; } } @@ -1726,8 +1741,6 @@ virtio_tx_route_zcp(struct virtio_net *dev, struct rte_mbuf *m, struct rte_mbuf *mbuf = NULL; unsigned len, ret, offset = 0; struct vpool *vpool; - struct virtio_net_data_ll *dev_ll = ll_root_used; - struct ether_hdr *pkt_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *); uint16_t vlan_tag = (uint16_t)vlan_tags[(uint16_t)dev->device_fh]; uint16_t vmdq_rx_q = ((struct vhost_dev *)dev->priv)->vmdq_rx_q; @@ -1756,46 +1769,10 @@ virtio_tx_route_zcp(struct virtio_net *dev, struct rte_mbuf *m, * such a ambiguous situation, so pkt will lost. */ vlan_tag = external_pkt_default_vlan_tag; - while (dev_ll != NULL) { - if (likely(dev_ll->vdev->ready == DEVICE_RX) && - ether_addr_cmp(&(pkt_hdr->d_addr), - &dev_ll->vdev->mac_address)) { - - /* - * Drop the packet if the TX packet is destined - * for the TX device. - */ - if (unlikely(dev_ll->vdev->dev->device_fh - == dev->device_fh)) { - LOG_DEBUG(VHOST_DATA, - "(%"PRIu64") TX: Source and destination" - "MAC addresses are the same. Dropping " - "packet.\n", - dev_ll->vdev->dev->device_fh); - MBUF_HEADROOM_UINT32(mbuf) - = (uint32_t)desc_idx; - __rte_mbuf_raw_free(mbuf); - return; - } - - /* - * Packet length offset 4 bytes for HW vlan - * strip when L2 switch back. - */ - offset = 4; - vlan_tag = - (uint16_t) - vlan_tags[(uint16_t)dev_ll->vdev->dev->device_fh]; - - LOG_DEBUG(VHOST_DATA, - "(%"PRIu64") TX: pkt to local VM device id:" - "(%"PRIu64") vlan tag: %d.\n", - dev->device_fh, dev_ll->vdev->dev->device_fh, - vlan_tag); - - break; - } - dev_ll = dev_ll->next; + if (find_local_dest(dev, m, &offset, &vlan_tag) != 0) { + MBUF_HEADROOM_UINT32(mbuf) = (uint32_t)desc_idx; + __rte_mbuf_raw_free(mbuf); + return; } } -- 1.8.4.2 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [dpdk-dev] [PATCH v4 3/3] vhost: Check offset value 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 0/3] Fix packet length issue Ouyang Changchun 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 1/3] vhost: " Ouyang Changchun 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 2/3] vhost: Remove duplicated codes Ouyang Changchun @ 2014-11-05 7:10 ` Ouyang Changchun 2014-11-05 16:52 ` Xie, Huawei 2014-11-05 9:28 ` [dpdk-dev] [PATCH v4 0/3] Fix packet length issue Ananyev, Konstantin 3 siblings, 1 reply; 16+ messages in thread From: Ouyang Changchun @ 2014-11-05 7:10 UTC (permalink / raw) To: dev This patch checks the packet length offset value, and checks if the extra bytes inside buffer cross page boundary. Signed-off-by: Changchun Ouyang <changchun.ouyang@intel.com> --- examples/vhost/main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/vhost/main.c b/examples/vhost/main.c index 2916313..a93f7a0 100644 --- a/examples/vhost/main.c +++ b/examples/vhost/main.c @@ -1110,7 +1110,8 @@ virtio_tx_route(struct vhost_dev *vdev, struct rte_mbuf *m, uint16_t vlan_tag) } if (vm2vm_mode == VM2VM_HARDWARE) { - if (find_local_dest(dev, m, &offset, &vlan_tag) != 0) { + if (find_local_dest(dev, m, &offset, &vlan_tag) != 0 || + offset > rte_pktmbuf_tailroom(m)) { rte_pktmbuf_free(m); return; } @@ -1896,7 +1897,9 @@ virtio_dev_tx_zcp(struct virtio_net *dev) /* Buffer address translation. */ buff_addr = gpa_to_vva(dev, desc->addr); - phys_addr = gpa_to_hpa(vdev, desc->addr, desc->len, &addr_type); + /* Need check extra VLAN_HLEN size for inserting VLAN tag */ + phys_addr = gpa_to_hpa(vdev, desc->addr, desc->len + VLAN_HLEN, + &addr_type); if (likely(packet_success < (free_entries - 1))) /* Prefetch descriptor index. */ -- 1.8.4.2 ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [dpdk-dev] [PATCH v4 3/3] vhost: Check offset value 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 3/3] vhost: Check offset value Ouyang Changchun @ 2014-11-05 16:52 ` Xie, Huawei 2014-11-05 17:00 ` Thomas Monjalon 0 siblings, 1 reply; 16+ messages in thread From: Xie, Huawei @ 2014-11-05 16:52 UTC (permalink / raw) To: Ouyang, Changchun, dev > -----Original Message----- > From: Ouyang, Changchun > Sent: Wednesday, November 05, 2014 12:11 AM > To: dev@dpdk.org > Cc: Xie, Huawei; Ananyev, Konstantin; Cao, Waterman; Ouyang, Changchun > Subject: [PATCH v4 3/3] vhost: Check offset value > > This patch checks the packet length offset value, and checks if the extra bytes > inside buffer > cross page boundary. > > Signed-off-by: Changchun Ouyang <changchun.ouyang@intel.com> > --- > examples/vhost/main.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/examples/vhost/main.c b/examples/vhost/main.c > index 2916313..a93f7a0 100644 > --- a/examples/vhost/main.c > +++ b/examples/vhost/main.c > @@ -1110,7 +1110,8 @@ virtio_tx_route(struct vhost_dev *vdev, struct > rte_mbuf *m, uint16_t vlan_tag) > } > > if (vm2vm_mode == VM2VM_HARDWARE) { > - if (find_local_dest(dev, m, &offset, &vlan_tag) != 0) { > + if (find_local_dest(dev, m, &offset, &vlan_tag) != 0 || > + offset > rte_pktmbuf_tailroom(m)) { > rte_pktmbuf_free(m); > return; > } > @@ -1896,7 +1897,9 @@ virtio_dev_tx_zcp(struct virtio_net *dev) > > /* Buffer address translation. */ > buff_addr = gpa_to_vva(dev, desc->addr); > - phys_addr = gpa_to_hpa(vdev, desc->addr, desc->len, > &addr_type); > + /* Need check extra VLAN_HLEN size for inserting VLAN tag */ > + phys_addr = gpa_to_hpa(vdev, desc->addr, desc->len + > VLAN_HLEN, > + &addr_type); > > if (likely(packet_success < (free_entries - 1))) > /* Prefetch descriptor index. */ > -- > 1.8.4.2 Why don't we merge 1,2,3 patches? ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [dpdk-dev] [PATCH v4 3/3] vhost: Check offset value 2014-11-05 16:52 ` Xie, Huawei @ 2014-11-05 17:00 ` Thomas Monjalon 2014-11-05 17:05 ` Xie, Huawei 2014-11-06 0:44 ` Ouyang, Changchun 0 siblings, 2 replies; 16+ messages in thread From: Thomas Monjalon @ 2014-11-05 17:00 UTC (permalink / raw) To: Xie, Huawei; +Cc: dev 2014-11-05 16:52, Xie, Huawei: > Why don't we merge 1,2,3 patches? Because it's simpler to understand small patches with a dedicated explanation in the commit log of each patch. Why do you want to merge them? -- Thomas ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [dpdk-dev] [PATCH v4 3/3] vhost: Check offset value 2014-11-05 17:00 ` Thomas Monjalon @ 2014-11-05 17:05 ` Xie, Huawei 2014-11-06 0:44 ` Ouyang, Changchun 1 sibling, 0 replies; 16+ messages in thread From: Xie, Huawei @ 2014-11-05 17:05 UTC (permalink / raw) To: Thomas Monjalon; +Cc: dev > -----Original Message----- > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com] > Sent: Wednesday, November 05, 2014 10:01 AM > To: Xie, Huawei > Cc: dev@dpdk.org; Ouyang, Changchun > Subject: Re: [dpdk-dev] [PATCH v4 3/3] vhost: Check offset value > > 2014-11-05 16:52, Xie, Huawei: > > Why don't we merge 1,2,3 patches? > > Because it's simpler to understand small patches with a dedicated > explanation in the commit log of each patch. > Why do you want to merge them? > > -- > Thomas Got it, so we prefer each patch fixes one dedicated thing. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [dpdk-dev] [PATCH v4 3/3] vhost: Check offset value 2014-11-05 17:00 ` Thomas Monjalon 2014-11-05 17:05 ` Xie, Huawei @ 2014-11-06 0:44 ` Ouyang, Changchun 1 sibling, 0 replies; 16+ messages in thread From: Ouyang, Changchun @ 2014-11-06 0:44 UTC (permalink / raw) To: Thomas Monjalon, Xie, Huawei; +Cc: dev Agree with Thomas! using small patches is for easily understanding. Merging and mixing things together is not a good thing. Changchun > -----Original Message----- > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com] > Sent: Thursday, November 6, 2014 1:01 AM > To: Xie, Huawei > Cc: dev@dpdk.org; Ouyang, Changchun > Subject: Re: [dpdk-dev] [PATCH v4 3/3] vhost: Check offset value > > 2014-11-05 16:52, Xie, Huawei: > > Why don't we merge 1,2,3 patches? > > Because it's simpler to understand small patches with a dedicated > explanation in the commit log of each patch. > Why do you want to merge them? > > -- > Thomas ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [dpdk-dev] [PATCH v4 0/3] Fix packet length issue 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 0/3] Fix packet length issue Ouyang Changchun ` (2 preceding siblings ...) 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 3/3] vhost: Check offset value Ouyang Changchun @ 2014-11-05 9:28 ` Ananyev, Konstantin 2014-11-05 22:07 ` Thomas Monjalon 3 siblings, 1 reply; 16+ messages in thread From: Ananyev, Konstantin @ 2014-11-05 9:28 UTC (permalink / raw) To: Ouyang, Changchun, dev > From: Ouyang, Changchun > Sent: Wednesday, November 05, 2014 7:11 AM > To: dev@dpdk.org > Cc: Xie, Huawei; Ananyev, Konstantin; Cao, Waterman; Ouyang, Changchun > Subject: [PATCH v4 0/3] Fix packet length issue > > This patch set fix packet length issue in vhost app, and enhance code by > extracting a function to replace duplicated codes in one copy and zero copy > TX function. > > -v4 chang: > Check offset value and extra bytes inside packet buffer cross page boundary. > > -v3 change: > Extract a function to replace duplicated codes in one copy and zero copy TX function. > > -v2 change: > Update data length by plus offset in first segment instead of last segment. > > -v1 change: > Update the packet length by plus offset; > Use macro to replace constant. > > Changchun Ouyang (3): > Fix packet length issue in vhost. > Extract a function to replace duplicated codes in vhost. > Check offset value in vhost > > examples/vhost/main.c | 142 +++++++++++++++++++++++--------------------------- > 1 file changed, 65 insertions(+), 77 deletions(-) > > -- > 1.8.4.2 Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com> ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [dpdk-dev] [PATCH v4 0/3] Fix packet length issue 2014-11-05 9:28 ` [dpdk-dev] [PATCH v4 0/3] Fix packet length issue Ananyev, Konstantin @ 2014-11-05 22:07 ` Thomas Monjalon 0 siblings, 0 replies; 16+ messages in thread From: Thomas Monjalon @ 2014-11-05 22:07 UTC (permalink / raw) To: Ouyang, Changchun; +Cc: dev > > This patch set fix packet length issue in vhost app, and enhance code by > > extracting a function to replace duplicated codes in one copy and zero copy > > TX function. > > > > -v4 chang: > > Check offset value and extra bytes inside packet buffer cross page boundary. > > > > -v3 change: > > Extract a function to replace duplicated codes in one copy and zero copy TX function. > > > > -v2 change: > > Update data length by plus offset in first segment instead of last segment. > > > > -v1 change: > > Update the packet length by plus offset; > > Use macro to replace constant. > > > > Changchun Ouyang (3): > > Fix packet length issue in vhost. > > Extract a function to replace duplicated codes in vhost. > > Check offset value in vhost > > > > examples/vhost/main.c | 142 +++++++++++++++++++++++--------------------------- > > 1 file changed, 65 insertions(+), 77 deletions(-) > > > > -- > > 1.8.4.2 > > Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com> Applied Thanks -- Thomas ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2014-11-06 0:37 UTC | newest] Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2014-10-30 9:00 [dpdk-dev] [PATCH] vhost: Fix packet length issue Ouyang Changchun 2014-10-30 14:59 ` [dpdk-dev] [PATCH v2] " Ouyang Changchun 2014-11-04 7:05 ` [dpdk-dev] [PATCH v3 0/2] " Ouyang Changchun 2014-11-04 7:05 ` [dpdk-dev] [PATCH v3 1/2] vhost: " Ouyang Changchun 2014-11-04 7:05 ` [dpdk-dev] [PATCH v3 2/2] vhost: Remove duplicated codes Ouyang Changchun 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 0/3] Fix packet length issue Ouyang Changchun 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 1/3] vhost: " Ouyang Changchun 2014-11-05 16:46 ` Xie, Huawei 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 2/3] vhost: Remove duplicated codes Ouyang Changchun 2014-11-05 7:10 ` [dpdk-dev] [PATCH v4 3/3] vhost: Check offset value Ouyang Changchun 2014-11-05 16:52 ` Xie, Huawei 2014-11-05 17:00 ` Thomas Monjalon 2014-11-05 17:05 ` Xie, Huawei 2014-11-06 0:44 ` Ouyang, Changchun 2014-11-05 9:28 ` [dpdk-dev] [PATCH v4 0/3] Fix packet length issue Ananyev, Konstantin 2014-11-05 22:07 ` Thomas Monjalon
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).