Message ID | AM2PR07MB10426D433D8ED83EDFE072A88A680@AM2PR07MB1042.eurprd07.prod.outlook.com |
---|---|
State | Accepted |
Headers | show |
Series | [ovs-dev,v5] netdev-dpdk: reset packet_type for reused dp_packets | expand |
I applied the patch to dpdk_merge here https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_darball_ovs_commits_dpdk-5Fmerge&d=DwIGaQ&c=uilaK90D4TOVoH58JNXRgQ&r=BVhFA09CGX7JQ5Ih-uZnsw&m=A2_FCacqbp2moAo3HGFlTuxsjONUGhlN42OBcAuQQ6w&s=b6btPKhgvOFr2GOUYvktND6kaC6jc3fXI-mXfvNgXOU&e= On 9/11/17, 12:56 AM, "ovs-dev-bounces@openvswitch.org on behalf of Zoltán Balogh" <ovs-dev-bounces@openvswitch.org on behalf of zoltan.balogh@ericsson.com> wrote: DPDK uses dp-packet pool for storing received packets. The pool is reused by rxq_recv funcions of the DPDK netdevs. The datapath is capable to modify the packet_type property of packets. For instance when encapsulated L3 packets are received on a ptap gre port. In this case the packet_type property of struct dp_packet can be modified and later the same dp_packet with the modified packet_type can be reused in the rxq_rec function, so it can contain corrupted data. The dp_packet_batch_init_cutlen() in the rxq_recv functions iterates over dp_packets and sets their cutlen. So I modified this function to set packet_type to Ethernet for the dp_packets as well. I also renamed this function because of the added functionality. The dp_packet_batch_init_cutlen() iterates over batch->count dp_packet. Therefore setting of batch->count = nb_rx needs to be done before the former function is invoked. This is an additional fix. Signed-off-by: Zoltan Balogh <zoltan.balogh@ericsson.com> Signed-off-by: Laszlo Suru <laszlo.suru@ericsson.com> Co-authored-by: Laszlo Suru <laszlo.suru@ericsson.com> CC: Jan Scheurich <jan.scheurich@ericsson.com> CC: Sugesh Chandran <sugesh.chandran@intel.com> CC: Darrell Ball <dlu998@gmail.com> --- lib/dp-packet.c | 1 - lib/dp-packet.h | 3 ++- lib/netdev-dpdk.c | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/dp-packet.c b/lib/dp-packet.c index e5d16a6..443c225 100644 --- a/lib/dp-packet.c +++ b/lib/dp-packet.c @@ -103,7 +103,6 @@ dp_packet_init_dpdk(struct dp_packet *b, size_t allocated) { dp_packet_set_allocated(b, allocated); b->source = DPBUF_DPDK; - b->packet_type = htonl(PT_ETH); } /* Initializes 'b' as an empty dp_packet with an initial capacity of 'size' diff --git a/lib/dp-packet.h b/lib/dp-packet.h index 046f3ab..b4b721c 100644 --- a/lib/dp-packet.h +++ b/lib/dp-packet.h @@ -805,12 +805,13 @@ dp_packet_delete_batch(struct dp_packet_batch *batch, bool may_steal) } static inline void -dp_packet_batch_init_cutlen(struct dp_packet_batch *batch) +dp_packet_batch_init_packet_fields(struct dp_packet_batch *batch) { struct dp_packet *packet; DP_PACKET_BATCH_FOR_EACH (packet, batch) { dp_packet_reset_cutlen(packet); + packet->packet_type = htonl(PT_ETH); } } diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index f58e9be..ccccb9a 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -1644,8 +1644,9 @@ netdev_dpdk_vhost_rxq_recv(struct netdev_rxq *rxq, nb_rx, dropped); rte_spinlock_unlock(&dev->stats_lock); - dp_packet_batch_init_cutlen(batch); - batch->count = (int) nb_rx; + batch->count = nb_rx; + dp_packet_batch_init_packet_fields(batch); + return 0; } @@ -1684,8 +1685,8 @@ netdev_dpdk_rxq_recv(struct netdev_rxq *rxq, struct dp_packet_batch *batch) rte_spinlock_unlock(&dev->stats_lock); } - dp_packet_batch_init_cutlen(batch); batch->count = nb_rx; + dp_packet_batch_init_packet_fields(batch); return 0; } -- 1.9.1 _______________________________________________ dev mailing list dev@openvswitch.org https://urldefense.proofpoint.com/v2/url?u=https-3A__mail.openvswitch.org_mailman_listinfo_ovs-2Ddev&d=DwICAg&c=uilaK90D4TOVoH58JNXRgQ&r=BVhFA09CGX7JQ5Ih-uZnsw&m=mikkQtxEB-CKcT9w1J9VcbwWh2_d17ZEzHLNJ0TkysI&s=tZEt9c3UB5rQfDIbdzn_BMEp2HupOscOgnc3Q6SDJqI&e=
diff --git a/lib/dp-packet.c b/lib/dp-packet.c index e5d16a6..443c225 100644 --- a/lib/dp-packet.c +++ b/lib/dp-packet.c @@ -103,7 +103,6 @@ dp_packet_init_dpdk(struct dp_packet *b, size_t allocated) { dp_packet_set_allocated(b, allocated); b->source = DPBUF_DPDK; - b->packet_type = htonl(PT_ETH); } /* Initializes 'b' as an empty dp_packet with an initial capacity of 'size' diff --git a/lib/dp-packet.h b/lib/dp-packet.h index 046f3ab..b4b721c 100644 --- a/lib/dp-packet.h +++ b/lib/dp-packet.h @@ -805,12 +805,13 @@ dp_packet_delete_batch(struct dp_packet_batch *batch, bool may_steal) } static inline void -dp_packet_batch_init_cutlen(struct dp_packet_batch *batch) +dp_packet_batch_init_packet_fields(struct dp_packet_batch *batch) { struct dp_packet *packet; DP_PACKET_BATCH_FOR_EACH (packet, batch) { dp_packet_reset_cutlen(packet); + packet->packet_type = htonl(PT_ETH); } } diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index f58e9be..ccccb9a 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -1644,8 +1644,9 @@ netdev_dpdk_vhost_rxq_recv(struct netdev_rxq *rxq, nb_rx, dropped); rte_spinlock_unlock(&dev->stats_lock); - dp_packet_batch_init_cutlen(batch); - batch->count = (int) nb_rx; + batch->count = nb_rx; + dp_packet_batch_init_packet_fields(batch); + return 0; } @@ -1684,8 +1685,8 @@ netdev_dpdk_rxq_recv(struct netdev_rxq *rxq, struct dp_packet_batch *batch) rte_spinlock_unlock(&dev->stats_lock); } - dp_packet_batch_init_cutlen(batch); batch->count = nb_rx; + dp_packet_batch_init_packet_fields(batch); return 0; }