app/testpmd: fix device mcast list error handling
authorCiara Power <ciara.power@intel.com>
Wed, 4 Dec 2019 16:38:15 +0000 (16:38 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 17 Jan 2020 18:45:23 +0000 (19:45 +0100)
The multicast set list function now has a return value, which is checked
by the calling functions. A rollback occurs on detection of failure, to
realign local config with the device config.

The error print statement in the function had included the port_id and
mc_addr_nb values in the wrong order, these are now swapped.

Fixes: 8fff667578a7 ("app/testpmd: new command to add/remove multicast MAC addresses")
Cc: stable@dpdk.org
Signed-off-by: Ciara Power <ciara.power@intel.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
app/test-pmd/config.c

index 4e1c3ca..9da1ffb 100644 (file)
@@ -3707,6 +3707,14 @@ mcast_addr_pool_extend(struct rte_port *port)
 
 }
 
+static void
+mcast_addr_pool_append(struct rte_port *port, struct rte_ether_addr *mc_addr)
+{
+       if (mcast_addr_pool_extend(port) != 0)
+               return;
+       rte_ether_addr_copy(mc_addr, &port->mc_addr_pool[port->mc_addr_nb - 1]);
+}
+
 static void
 mcast_addr_pool_remove(struct rte_port *port, uint32_t addr_idx)
 {
@@ -3725,7 +3733,7 @@ mcast_addr_pool_remove(struct rte_port *port, uint32_t addr_idx)
                sizeof(struct rte_ether_addr) * (port->mc_addr_nb - addr_idx));
 }
 
-static void
+static int
 eth_port_multicast_addr_list_set(portid_t port_id)
 {
        struct rte_port *port;
@@ -3734,10 +3742,11 @@ eth_port_multicast_addr_list_set(portid_t port_id)
        port = &ports[port_id];
        diag = rte_eth_dev_set_mc_addr_list(port_id, port->mc_addr_pool,
                                            port->mc_addr_nb);
-       if (diag == 0)
-               return;
-       printf("rte_eth_dev_set_mc_addr_list(port=%d, nb=%u) failed. diag=%d\n",
-              port->mc_addr_nb, port_id, -diag);
+       if (diag < 0)
+               printf("rte_eth_dev_set_mc_addr_list(port=%d, nb=%u) failed. diag=%d\n",
+                       port_id, port->mc_addr_nb, diag);
+
+       return diag;
 }
 
 void
@@ -3762,10 +3771,10 @@ mcast_addr_add(portid_t port_id, struct rte_ether_addr *mc_addr)
                }
        }
 
-       if (mcast_addr_pool_extend(port) != 0)
-               return;
-       rte_ether_addr_copy(mc_addr, &port->mc_addr_pool[i]);
-       eth_port_multicast_addr_list_set(port_id);
+       mcast_addr_pool_append(port, mc_addr);
+       if (eth_port_multicast_addr_list_set(port_id) < 0)
+               /* Rollback on failure, remove the address from the pool */
+               mcast_addr_pool_remove(port, i);
 }
 
 void
@@ -3792,7 +3801,9 @@ mcast_addr_remove(portid_t port_id, struct rte_ether_addr *mc_addr)
        }
 
        mcast_addr_pool_remove(port, i);
-       eth_port_multicast_addr_list_set(port_id);
+       if (eth_port_multicast_addr_list_set(port_id) < 0)
+               /* Rollback on failure, add the address back into the pool */
+               mcast_addr_pool_append(port, mc_addr);
 }
 
 void