If the af_packet transmit is sending a VLAN packet,
and the transmit path to the kernel os full, then it would
mismanage the outgoing mbuf. The original mbuf would end up
being freed twice, once by AF_PACKET PMD and once by caller.

Reported-by: Chas Williams <3ch...@gmail.com>
Signed-off-by: Stephen Hemminger <step...@networkplumber.org>
---
 drivers/net/af_packet/rte_eth_af_packet.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/net/af_packet/rte_eth_af_packet.c 
b/drivers/net/af_packet/rte_eth_af_packet.c
index 99e13fe48a30..24a68c26d665 100644
--- a/drivers/net/af_packet/rte_eth_af_packet.c
+++ b/drivers/net/af_packet/rte_eth_af_packet.c
@@ -200,6 +200,12 @@ eth_af_packet_tx(void *queue, struct rte_mbuf **bufs, 
uint16_t nb_pkts)
                        continue;
                }
 
+               /* point at the next incoming frame */
+               if ((ppd->tp_status != TP_STATUS_AVAILABLE) &&
+                   (poll(&pfd, 1, -1) < 0))
+                       break;
+
+
                /* insert vlan info if necessary */
                if (mbuf->ol_flags & PKT_TX_VLAN_PKT) {
                        if (rte_vlan_insert(&mbuf)) {
@@ -208,11 +214,6 @@ eth_af_packet_tx(void *queue, struct rte_mbuf **bufs, 
uint16_t nb_pkts)
                        }
                }
 
-               /* point at the next incoming frame */
-               if ((ppd->tp_status != TP_STATUS_AVAILABLE) &&
-                   (poll(&pfd, 1, -1) < 0))
-                       break;
-
                /* copy the tx frame data */
                pbuf = (uint8_t *) ppd + TPACKET2_HDRLEN -
                        sizeof(struct sockaddr_ll);
-- 
2.17.1

Reply via email to