net/mlx5: fix invalid network interface index
authorAdrien Mazarguil <adrien.mazarguil@6wind.com>
Wed, 25 Jul 2018 11:24:33 +0000 (13:24 +0200)
committerThomas Monjalon <thomas@monjalon.net>
Thu, 26 Jul 2018 12:05:52 +0000 (14:05 +0200)
Network interface indices being unsigned, an invalid index or error is
normally expressed through a zero value (see if_nametoindex()).

mlx5_ifindex() has a signed return type for negative values in case of
error. Since mlx5_nl.c does not check for errors, these may be fed back as
invalid interfaces indices to subsequent system calls. This usage would
have been correct if mlx5_ifindex() returned a zero value instead.

This patch makes mlx5_ifindex() unsigned for convenience.

Fixes: ccdcba53a3f4 ("net/mlx5: use Netlink to add/remove MAC addresses")
Cc: stable@dpdk.org
Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
Acked-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
Acked-by: Yongseok Koh <yskoh@mellanox.com>
drivers/net/mlx5/mlx5.h
drivers/net/mlx5/mlx5_ethdev.c
drivers/net/mlx5/mlx5_nl.c

index 05da0d4..a3a34cf 100644 (file)
@@ -243,7 +243,7 @@ int mlx5_getenv_int(const char *);
 int mlx5_get_master_ifname(const struct rte_eth_dev *dev,
                           char (*ifname)[IF_NAMESIZE]);
 int mlx5_get_ifname(const struct rte_eth_dev *dev, char (*ifname)[IF_NAMESIZE]);
-int mlx5_ifindex(const struct rte_eth_dev *dev);
+unsigned int mlx5_ifindex(const struct rte_eth_dev *dev);
 int mlx5_ifreq(const struct rte_eth_dev *dev, int req, struct ifreq *ifr,
               int master);
 int mlx5_get_mtu(struct rte_eth_dev *dev, uint16_t *mtu);
index 4a24f80..34c5b95 100644 (file)
@@ -245,24 +245,20 @@ mlx5_get_ifname(const struct rte_eth_dev *dev, char (*ifname)[IF_NAMESIZE])
  *   Pointer to Ethernet device.
  *
  * @return
- *   Interface index on success, a negative errno value otherwise and
- *   rte_errno is set.
+ *   Nonzero interface index on success, zero otherwise and rte_errno is set.
  */
-int
+unsigned int
 mlx5_ifindex(const struct rte_eth_dev *dev)
 {
        char ifname[IF_NAMESIZE];
-       unsigned int ret;
+       unsigned int ifindex;
 
-       ret = mlx5_get_ifname(dev, &ifname);
-       if (ret)
-               return ret;
-       ret = if_nametoindex(ifname);
-       if (ret == 0) {
+       if (mlx5_get_ifname(dev, &ifname))
+               return 0;
+       ifindex = if_nametoindex(ifname);
+       if (!ifindex)
                rte_errno = errno;
-               return -rte_errno;
-       }
-       return ret;
+       return ifindex;
 }
 
 /**
index 0cc26f9..d61826a 100644 (file)
@@ -362,7 +362,7 @@ mlx5_nl_mac_addr_list(struct rte_eth_dev *dev, struct ether_addr (*mac)[],
                      int *mac_n)
 {
        struct priv *priv = dev->data->dev_private;
-       int iface_idx = mlx5_ifindex(dev);
+       unsigned int iface_idx = mlx5_ifindex(dev);
        struct {
                struct nlmsghdr hdr;
                struct ifinfomsg ifm;
@@ -421,7 +421,7 @@ mlx5_nl_mac_addr_modify(struct rte_eth_dev *dev, struct ether_addr *mac,
                        int add)
 {
        struct priv *priv = dev->data->dev_private;
-       int iface_idx = mlx5_ifindex(dev);
+       unsigned int iface_idx = mlx5_ifindex(dev);
        struct {
                struct nlmsghdr hdr;
                struct ndmsg ndm;
@@ -600,7 +600,7 @@ static int
 mlx5_nl_device_flags(struct rte_eth_dev *dev, uint32_t flags, int enable)
 {
        struct priv *priv = dev->data->dev_private;
-       int iface_idx = mlx5_ifindex(dev);
+       unsigned int iface_idx = mlx5_ifindex(dev);
        struct {
                struct nlmsghdr hdr;
                struct ifinfomsg ifi;