On 9/9/2019 12:58 PM, Andrew Rybchenko wrote:
> Enabling/disabling of promiscuous mode is not always successful and
> it should be taken into account to be able to handle it properly.
> 
> When correct return status is unclear from driver code, -EAGAIN is used.
> 
> Signed-off-by: Andrew Rybchenko <arybche...@solarflare.com>

<...>

> diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
> index b97dd8aa85..f2e6b4c83b 100644
> --- a/lib/librte_ethdev/rte_ethdev.c
> +++ b/lib/librte_ethdev/rte_ethdev.c
> @@ -1892,30 +1892,38 @@ int
>  rte_eth_promiscuous_enable(uint16_t port_id)
>  {
>       struct rte_eth_dev *dev;
> +     uint8_t old_promiscuous;
> +     int diag;
>  
>       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
>       dev = &rte_eth_devices[port_id];
>  
>       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->promiscuous_enable, -ENOTSUP);
> -     (*dev->dev_ops->promiscuous_enable)(dev);
> -     dev->data->promiscuous = 1;
> +     old_promiscuous = dev->data->promiscuous;
> +     diag = (*dev->dev_ops->promiscuous_enable)(dev);
> +     dev->data->promiscuous = (diag == 0) ? 1 : old_promiscuous;
>  
> -     return 0;
> +     return eth_err(port_id, diag);
>  }
>  
>  int
>  rte_eth_promiscuous_disable(uint16_t port_id)
>  {
>       struct rte_eth_dev *dev;
> +     uint8_t old_promiscuous;
> +     int diag;
>  
>       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
>       dev = &rte_eth_devices[port_id];
>  
>       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->promiscuous_disable, -ENOTSUP);
> +     old_promiscuous = dev->data->promiscuous;
>       dev->data->promiscuous = 0;
> -     (*dev->dev_ops->promiscuous_disable)(dev);
> +     diag = (*dev->dev_ops->promiscuous_disable)(dev);
> +     if (diag != 0)
> +             dev->data->promiscuous = old_promiscuous;

Not a real issue, but the enable/disable does exact same thing, slightly
different way, it makes double check if logic is different,
can you adapt one of them for both please.

"
diag = foo();
dev->data->promiscuous = (diag == 0) ? 1 : old_promiscuous;
"
vs

"
dev->data->promiscuous = 0;
diag = bar();
if (diag != 0)
        dev->data->promiscuous = old_promiscuous;
"

>  
> -     return 0;
> +     return eth_err(port_id, diag);
>  }
>  
>  int
> diff --git a/lib/librte_ethdev/rte_ethdev_core.h 
> b/lib/librte_ethdev/rte_ethdev_core.h
> index 2394b32c83..6322348d17 100644
> --- a/lib/librte_ethdev/rte_ethdev_core.h
> +++ b/lib/librte_ethdev/rte_ethdev_core.h
> @@ -52,10 +52,10 @@ typedef int (*eth_dev_reset_t)(struct rte_eth_dev *dev);
>  typedef int (*eth_is_removed_t)(struct rte_eth_dev *dev);
>  /**< @internal Function used to detect an Ethernet device removal. */
>  
> -typedef void (*eth_promiscuous_enable_t)(struct rte_eth_dev *dev);
> +typedef int (*eth_promiscuous_enable_t)(struct rte_eth_dev *dev);
>  /**< @internal Function used to enable the RX promiscuous mode of an 
> Ethernet device. */
>  
> -typedef void (*eth_promiscuous_disable_t)(struct rte_eth_dev *dev);
> +typedef int (*eth_promiscuous_disable_t)(struct rte_eth_dev *dev);
>  /**< @internal Function used to disable the RX promiscuous mode of an 
> Ethernet device. */

Should we add a note what is expected return value? This information is not
available anyplace, it may help driver developers.

Reply via email to