[ovs-dev,RFC,v3,2/8] lib/dp-packet: init specific mbuf fields to 0

Message ID 1511288957-68599-3-git-send-email-mark.b.kavanagh@intel.com
State New
Delegated to: Ian Stokes
Headers show
Series
  • netdev-dpdk: support multi-segment mbufs
Related show

Commit Message

Kavanagh, Mark B Nov. 21, 2017, 6:29 p.m.
dp_packets are created using xmalloc(); in the case of OvS-DPDK, it's
possible the the resultant mbuf portion of the dp_packet contains
random data. For some mbuf fields, specifically those related to
multi-segment mbufs and/or offload features, random values may cause
unexpected behaviour, should the dp_packet's contents be later copied
to a DPDK mbuf. It is critical therefore, that these fields should be
initialized to 0.

This patch ensures that the following mbuf fields are initialized to 0,
on creation of a new dp_packet:
   - ol_flags
   - nb_segs
   - tx_offload
   - packet_type

Adapted from an idea by Michael Qiu <qiudayu@chinac.com>:
https://patchwork.ozlabs.org/patch/777570/

Signed-off-by: Mark Kavanagh <mark.b.kavanagh@intel.com>
---
 lib/dp-packet.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

Comments

Michael Qiu Dec. 8, 2017, 2:34 a.m. | #1
2017/11/22 2:29, Mark Kavanagh :

> dp_packets are created using xmalloc(); in the case of OvS-DPDK, it's
> possible the the resultant mbuf portion of the dp_packet contains
> random data. For some mbuf fields, specifically those related to
> multi-segment mbufs and/or offload features, random values may cause
> unexpected behaviour, should the dp_packet's contents be later copied
> to a DPDK mbuf. It is critical therefore, that these fields should be
> initialized to 0.
>
> This patch ensures that the following mbuf fields are initialized to 0,
> on creation of a new dp_packet:
>     - ol_flags
>     - nb_segs
>     - tx_offload
>     - packet_type
>
> Adapted from an idea by Michael Qiu <qiudayu@chinac.com>:
> https://patchwork.ozlabs.org/patch/777570/
>
> Signed-off-by: Mark Kavanagh <mark.b.kavanagh@intel.com>

Acked-by: Michael Qiu <qiudayu@chinac.com>

> ---
>   lib/dp-packet.h | 6 +++---
>   1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/lib/dp-packet.h b/lib/dp-packet.h
> index b4b721c..7aa440f 100644
> --- a/lib/dp-packet.h
> +++ b/lib/dp-packet.h
> @@ -626,13 +626,13 @@ dp_packet_mbuf_rss_flag_reset(struct dp_packet *p OVS_UNUSED)
>   
>   /* This initialization is needed for packets that do not come
>    * from DPDK interfaces, when vswitchd is built with --with-dpdk.
> - * The DPDK rte library will still otherwise manage the mbuf.
> - * We only need to initialize the mbuf ol_flags. */
> + * The DPDK rte library will still otherwise manage the mbuf. */
>   static inline void
>   dp_packet_mbuf_init(struct dp_packet *p OVS_UNUSED)
>   {
>   #ifdef DPDK_NETDEV
> -    p->mbuf.ol_flags = 0;
> +    struct rte_mbuf *mbuf = &(p->mbuf);
> +    mbuf->ol_flags = mbuf->nb_segs = mbuf->tx_offload = mbuf->packet_type = 0;
>   #endif
>   }
>

Patch

diff --git a/lib/dp-packet.h b/lib/dp-packet.h
index b4b721c..7aa440f 100644
--- a/lib/dp-packet.h
+++ b/lib/dp-packet.h
@@ -626,13 +626,13 @@  dp_packet_mbuf_rss_flag_reset(struct dp_packet *p OVS_UNUSED)
 
 /* This initialization is needed for packets that do not come
  * from DPDK interfaces, when vswitchd is built with --with-dpdk.
- * The DPDK rte library will still otherwise manage the mbuf.
- * We only need to initialize the mbuf ol_flags. */
+ * The DPDK rte library will still otherwise manage the mbuf. */
 static inline void
 dp_packet_mbuf_init(struct dp_packet *p OVS_UNUSED)
 {
 #ifdef DPDK_NETDEV
-    p->mbuf.ol_flags = 0;
+    struct rte_mbuf *mbuf = &(p->mbuf);
+    mbuf->ol_flags = mbuf->nb_segs = mbuf->tx_offload = mbuf->packet_type = 0;
 #endif
 }