net/bonding: fix RSS key config with extended key length
[dpdk.git] / drivers / net / bonding / rte_eth_bond_pmd.c
index 845e8fd..5cbe890 100644 (file)
@@ -1678,14 +1678,10 @@ int
 slave_configure(struct rte_eth_dev *bonded_eth_dev,
                struct rte_eth_dev *slave_eth_dev)
 {
-       struct bond_rx_queue *bd_rx_q;
-       struct bond_tx_queue *bd_tx_q;
        uint16_t nb_rx_queues;
        uint16_t nb_tx_queues;
 
        int errval;
-       uint16_t q_id;
-       struct rte_flow_error flow_error;
 
        struct bond_dev_private *internals = bonded_eth_dev->data->dev_private;
 
@@ -1758,6 +1754,19 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev,
                                slave_eth_dev->data->port_id, errval);
                return errval;
        }
+       return 0;
+}
+
+int
+slave_start(struct rte_eth_dev *bonded_eth_dev,
+               struct rte_eth_dev *slave_eth_dev)
+{
+       int errval = 0;
+       struct bond_rx_queue *bd_rx_q;
+       struct bond_tx_queue *bd_tx_q;
+       uint16_t q_id;
+       struct rte_flow_error flow_error;
+       struct bond_dev_private *internals = bonded_eth_dev->data->dev_private;
 
        /* Setup Rx Queues */
        for (q_id = 0; q_id < bonded_eth_dev->data->nb_rx_queues; q_id++) {
@@ -1806,10 +1815,13 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev,
                        return errval;
                }
 
-               if (internals->mode4.dedicated_queues.flow[slave_eth_dev->data->port_id] != NULL)
-                       rte_flow_destroy(slave_eth_dev->data->port_id,
+               if (internals->mode4.dedicated_queues.flow[slave_eth_dev->data->port_id] != NULL) {
+                       errval = rte_flow_destroy(slave_eth_dev->data->port_id,
                                        internals->mode4.dedicated_queues.flow[slave_eth_dev->data->port_id],
                                        &flow_error);
+                       RTE_BOND_LOG(ERR, "bond_ethdev_8023ad_flow_destroy: port=%d, err (%d)",
+                               slave_eth_dev->data->port_id, errval);
+               }
 
                errval = bond_ethdev_8023ad_flow_set(bonded_eth_dev,
                                slave_eth_dev->data->port_id);
@@ -2001,6 +2013,13 @@ bond_ethdev_start(struct rte_eth_dev *eth_dev)
                                internals->slaves[i].port_id);
                        goto out_err;
                }
+               if (slave_start(eth_dev, slave_ethdev) != 0) {
+                       RTE_BOND_LOG(ERR,
+                               "bonded port (%d) failed to start slave device (%d)",
+                               eth_dev->data->port_id,
+                               internals->slaves[i].port_id);
+                       goto out_err;
+               }
                /* We will need to poll for link status if any slave doesn't
                 * support interrupts
                 */
@@ -3438,8 +3457,10 @@ bond_probe(struct rte_vdev_device *dev)
 
        kvlist = rte_kvargs_parse(rte_vdev_device_args(dev),
                pmd_bond_init_valid_arguments);
-       if (kvlist == NULL)
+       if (kvlist == NULL) {
+               RTE_BOND_LOG(ERR, "Invalid args in %s", rte_vdev_device_args(dev));
                return -1;
+       }
 
        /* Parse link bonding mode */
        if (rte_kvargs_count(kvlist, PMD_BOND_MODE_KVARG) == 1) {
@@ -3596,13 +3617,18 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
                               internals->rss_key_len);
                } else {
                        if (internals->rss_key_len > sizeof(default_rss_key)) {
-                               RTE_BOND_LOG(ERR,
-                                      "There is no suitable default hash key");
-                               return -EINVAL;
+                               /*
+                                * If the rss_key includes standard_rss_key and
+                                * extended_hash_key, the rss key length will be
+                                * larger than default rss key length, so it should
+                                * re-calculate the hash key.
+                                */
+                               for (i = 0; i < internals->rss_key_len; i++)
+                                       internals->rss_key[i] = (uint8_t)rte_rand();
+                       } else {
+                               memcpy(internals->rss_key, default_rss_key,
+                                       internals->rss_key_len);
                        }
-
-                       memcpy(internals->rss_key, default_rss_key,
-                              internals->rss_key_len);
                }
 
                for (i = 0; i < RTE_DIM(internals->reta_conf); i++) {
@@ -3846,6 +3872,18 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
                return -1;
        }
 
+       /* configure slaves so we can pass mtu setting */
+       for (i = 0; i < internals->slave_count; i++) {
+               struct rte_eth_dev *slave_ethdev =
+                               &(rte_eth_devices[internals->slaves[i].port_id]);
+               if (slave_configure(dev, slave_ethdev) != 0) {
+                       RTE_BOND_LOG(ERR,
+                               "bonded port (%d) failed to configure slave device (%d)",
+                               dev->data->port_id,
+                               internals->slaves[i].port_id);
+                       return -1;
+               }
+       }
        return 0;
 }