On Thu, Apr 18, 2019 at 03:11:26PM +0200, Adrien Mazarguil wrote: > When passed to the application, Rx packets retain the port ID value > originally set by slave devices. Unfortunately these IDs have no meaning to > applications, which are typically unaware of their existence. > > This confuses those caring about the source port field in mbufs (m->port) > which experience issues ranging from traffic drop to crashes. > > Fixes: a46f8d584eb8 ("net/failsafe: add fail-safe PMD") > Signed-off-by: Adrien Mazarguil Missing a Cc: stable@dpdk.org no? Given that no one saw that until a slightly heavier application was used with the fail-safe, I guess few people will care, but still. Acked-by: Gaetan Rivet > --- > drivers/net/failsafe/failsafe_rxtx.c | 21 +++++++++++++++++++++ > 1 file changed, 21 insertions(+) > > diff --git a/drivers/net/failsafe/failsafe_rxtx.c b/drivers/net/failsafe/failsafe_rxtx.c > index 231c83291..e78624127 100644 > --- a/drivers/net/failsafe/failsafe_rxtx.c > +++ b/drivers/net/failsafe/failsafe_rxtx.c > @@ -61,6 +61,21 @@ failsafe_set_burst_fn(struct rte_eth_dev *dev, int force_safe) > rte_wmb(); > } > > +/* > + * Override source port in Rx packets. > + * > + * Make Rx packets originate from this PMD instance instead of one of its > + * slaves. This is mandatory to avoid breaking applications. > + */ > +static void > +failsafe_rx_set_port(struct rte_mbuf **rx_pkts, uint16_t nb_pkts, uint16_t port) > +{ > + unsigned int i; > + > + for (i = 0; i != nb_pkts; ++i) > + rx_pkts[i]->port = port; > +} > + > uint16_t > failsafe_rx_burst(void *queue, > struct rte_mbuf **rx_pkts, > @@ -87,6 +102,9 @@ failsafe_rx_burst(void *queue, > sdev = sdev->next; > } while (nb_rx == 0 && sdev != rxq->sdev); > rxq->sdev = sdev; > + if (nb_rx) > + failsafe_rx_set_port(rx_pkts, nb_rx, > + rxq->priv->dev->data->port_id); > return nb_rx; > } > > @@ -112,6 +130,9 @@ failsafe_rx_burst_fast(void *queue, > sdev = sdev->next; > } while (nb_rx == 0 && sdev != rxq->sdev); > rxq->sdev = sdev; > + if (nb_rx) > + failsafe_rx_set_port(rx_pkts, nb_rx, > + rxq->priv->dev->data->port_id); > return nb_rx; > } > > -- > 2.11.0 -- Gaëtan Rivet 6WIND