Signed-off-by: Pawel Wodkowski <pawelx.wodkowski at intel.com>
Reviewed-by: Declan Doherty <declan.doherty at intel.com>
---
 lib/librte_pmd_bond/rte_eth_bond_api.c     |   59 +++++++++++++++++++++-------
 lib/librte_pmd_bond/rte_eth_bond_pmd.c     |   47 ++++++++++++++--------
 lib/librte_pmd_bond/rte_eth_bond_private.h |   30 ++++++++++++--
 3 files changed, 102 insertions(+), 34 deletions(-)

diff --git a/lib/librte_pmd_bond/rte_eth_bond_api.c 
b/lib/librte_pmd_bond/rte_eth_bond_api.c
index dd33119..460df65 100644
--- a/lib/librte_pmd_bond/rte_eth_bond_api.c
+++ b/lib/librte_pmd_bond/rte_eth_bond_api.c
@@ -31,6 +31,8 @@
  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */

+#include <string.h>
+
 #include <rte_mbuf.h>
 #include <rte_malloc.h>
 #include <rte_ethdev.h>
@@ -104,6 +106,39 @@ valid_slave_port_id(uint8_t port_id)
        return 0;
 }

+void
+rte_eth_bond_activate_slave(struct rte_eth_dev *eth_dev, uint8_t port_id )
+{
+       struct bond_dev_private *internals = eth_dev->data->dev_private;
+       uint8_t active_count = internals->active_slave_count;
+
+       internals->active_slaves[active_count] = port_id;
+
+
+       internals->active_slave_count = active_count + 1;
+}
+
+void
+rte_eth_bond_deactive_slave(struct rte_eth_dev *eth_dev,
+       uint8_t slave_pos )
+{
+       struct bond_dev_private *internals = eth_dev->data->dev_private;
+       uint8_t active_count = internals->active_slave_count;
+
+       active_count--;
+
+       /* If slave was not at the end of the list
+        * shift active slaves up active array list */
+       if (slave_pos < active_count) {
+               memmove(internals->active_slaves + slave_pos,
+                               internals->active_slaves + slave_pos + 1,
+                               (active_count - slave_pos) *
+                                       sizeof(internals->active_slaves[0]));
+       }
+
+       internals->active_slave_count = active_count;
+}
+
 uint8_t
 number_of_sockets(void)
 {
@@ -356,10 +391,8 @@ rte_eth_bond_slave_add(uint8_t bonded_port_id, uint8_t 
slave_port_id)
        if (bonded_eth_dev->data->dev_started) {
                rte_eth_link_get_nowait(slave_port_id, &link_props);

-                if (link_props.link_status == 1) {
-                       
internals->active_slaves[internals->active_slave_count++] =
-                                       slave_port_id;
-               }
+                if (link_props.link_status == 1)
+                       rte_eth_bond_activate_slave(bonded_eth_dev, 
slave_port_id);
        }

        return 0;
@@ -373,6 +406,7 @@ err_add:
 int
 rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t slave_port_id)
 {
+       struct rte_eth_dev *eth_dev;
        struct bond_dev_private *internals;
        struct slave_conf *slave_conf;

@@ -386,20 +420,15 @@ rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t 
slave_port_id)
        if (valid_slave_port_id(slave_port_id) != 0)
                goto err_del;

-       internals = rte_eth_devices[bonded_port_id].data->dev_private;
+       eth_dev = &rte_eth_devices[bonded_port_id];
+       internals = eth_dev->data->dev_private;

        /* first remove from active slave list */
-       for (i = 0; i < internals->active_slave_count; i++) {
-               if (internals->active_slaves[i] == slave_port_id)
-                       pos = i;
-
-               /* shift active slaves up active array list */
-               if (pos >= 0 && i < (internals->active_slave_count - 1))
-                       internals->active_slaves[i] = 
internals->active_slaves[i+1];
-       }
+       pos = find_slave_by_id(internals->active_slaves, 
internals->active_slave_count,
+                       slave_port_id);

-       if (pos >= 0)
-               internals->active_slave_count--;
+       if (pos < internals->active_slave_count)
+               rte_eth_bond_deactive_slave(eth_dev, pos);

        pos = -1;
        /* now remove from slave list */
diff --git a/lib/librte_pmd_bond/rte_eth_bond_pmd.c 
b/lib/librte_pmd_bond/rte_eth_bond_pmd.c
index 38cc1ae..482ddb8 100644
--- a/lib/librte_pmd_bond/rte_eth_bond_pmd.c
+++ b/lib/librte_pmd_bond/rte_eth_bond_pmd.c
@@ -447,6 +447,27 @@ link_properties_valid(struct rte_eth_link *bonded_dev_link,
 }

 int
+mac_address_get(struct rte_eth_dev *eth_dev, struct ether_addr *dst_mac_addr)
+{
+       struct ether_addr *mac_addr;
+
+       mac_addr = eth_dev->data->mac_addrs;
+
+       if (eth_dev == NULL) {
+               RTE_LOG(ERR, PMD, "%s: NULL pointer eth_dev specified\n", 
__func__);
+               return -1;
+       }
+
+       if (dst_mac_addr == NULL) {
+               RTE_LOG(ERR, PMD, "%s: NULL pointer MAC specified\n", __func__);
+               return -1;
+       }
+
+       ether_addr_copy(mac_addr, dst_mac_addr);
+       return 0;
+}
+
+int
 mac_address_set(struct rte_eth_dev *eth_dev, struct ether_addr *new_mac_addr)
 {
        struct ether_addr *mac_addr;
@@ -817,7 +838,7 @@ bond_ethdev_tx_queue_setup(struct rte_eth_dev *dev, 
uint16_t tx_queue_id,
                                        0, dev->pci_dev->numa_node);

        if (bd_tx_q == NULL)
-                       return -1;
+               return -1;

        bd_tx_q->queue_id = tx_queue_id;
        bd_tx_q->dev_private = dev->data->dev_private;
@@ -940,7 +961,6 @@ bond_ethdev_promiscuous_enable(struct rte_eth_dev *eth_dev)
        case BONDING_MODE_ACTIVE_BACKUP:
        default:
                rte_eth_promiscuous_enable(internals->current_primary_port);
-
        }
 }

@@ -975,7 +995,8 @@ bond_ethdev_lsc_event_callback(uint8_t port_id, enum 
rte_eth_event_type type,
        struct bond_dev_private *internals;
        struct rte_eth_link link;

-       int i, valid_slave = 0, active_pos = -1;
+       int i, valid_slave = 0;
+       uint8_t active_pos;
        uint8_t lsc_flag = 0;

        if (type != RTE_ETH_EVENT_INTR_LSC || param == NULL)
@@ -1005,16 +1026,12 @@ bond_ethdev_lsc_event_callback(uint8_t port_id, enum 
rte_eth_event_type type,
                return;

        /* Search for port in active port list */
-       for (i = 0; i < internals->active_slave_count; i++) {
-               if (port_id == internals->active_slaves[i]) {
-                       active_pos = i;
-                       break;
-               }
-       }
+       active_pos = find_slave_by_id(internals->active_slaves,
+                       internals->active_slave_count, port_id);

        rte_eth_link_get_nowait(port_id, &link);
        if (link.link_status) {
-               if (active_pos >= 0)
+               if (active_pos < internals->active_slave_count)
                        return;

                /* if no active slave ports then set this port to be primary 
port */
@@ -1028,21 +1045,19 @@ bond_ethdev_lsc_event_callback(uint8_t port_id, enum 
rte_eth_event_type type,
                        link_properties_set(bonded_eth_dev,
                                        &(slave_eth_dev->data->dev_link));
                }
-               internals->active_slaves[internals->active_slave_count++] = 
port_id;
+
+               rte_eth_bond_activate_slave(bonded_eth_dev, port_id);

                /* If user has defined the primary port then default to using 
it */
                if (internals->user_defined_primary_port &&
                                internals->primary_port == port_id)
                        bond_ethdev_primary_set(internals, port_id);
        } else {
-               if (active_pos < 0)
+               if (active_pos == internals->active_slave_count)
                        return;

                /* Remove from active slave list */
-               for (i = active_pos; i < (internals->active_slave_count - 1); 
i++)
-                       internals->active_slaves[i] = 
internals->active_slaves[i+1];
-
-               internals->active_slave_count--;
+               rte_eth_bond_deactive_slave(bonded_eth_dev, active_pos);

                /* No active slaves, change link status to down and reset other
                 * link properties */
diff --git a/lib/librte_pmd_bond/rte_eth_bond_private.h 
b/lib/librte_pmd_bond/rte_eth_bond_private.h
index 60f1e8d..6742a4c 100644
--- a/lib/librte_pmd_bond/rte_eth_bond_private.h
+++ b/lib/librte_pmd_bond/rte_eth_bond_private.h
@@ -115,11 +115,11 @@ struct bond_dev_private {
        uint16_t nb_rx_queues;                  /**< Total number of rx queues 
*/
        uint16_t nb_tx_queues;                  /**< Total number of tx queues*/

-       uint8_t slave_count;                    /**< Number of active slaves */
-       uint8_t active_slave_count;             /**< Number of slaves */
+       uint8_t slave_count;                    /**< Number of slaves */
+       uint8_t active_slave_count;             /**< Number of active slaves */

-       uint8_t active_slaves[RTE_MAX_ETHPORTS];        /**< Active slave list 
*/
        uint8_t slaves[RTE_MAX_ETHPORTS];                       /**< Slave list 
*/
+       uint8_t active_slaves[RTE_MAX_ETHPORTS];        /**< Active slave list 
*/

        /** Persisted configuration of slaves */
        struct slave_conf presisted_slaves_conf[RTE_MAX_ETHPORTS];
@@ -130,6 +130,19 @@ extern struct eth_dev_ops default_dev_ops;
 int
 valid_bonded_ethdev(struct rte_eth_dev *eth_dev);

+static inline uint8_t
+find_slave_by_id(uint8_t *slaves, uint8_t slaves_count,
+       uint8_t slave_id ) {
+
+       uint8_t pos;
+       for (pos = 0; pos < slaves_count; pos++) {
+               if (slave_id == slaves[pos])
+                       break;
+       }
+
+       return pos;
+}
+
 int
 valid_port_id(uint8_t port_id);

@@ -140,6 +153,14 @@ int
 valid_slave_port_id(uint8_t port_id);

 void
+rte_eth_bond_deactive_slave(struct rte_eth_dev *eth_dev,
+       uint8_t slave_pos );
+
+void
+rte_eth_bond_activate_slave(struct rte_eth_dev *eth_dev,
+       uint8_t port_id );
+
+void
 link_properties_set(struct rte_eth_dev *bonded_eth_dev,
                struct rte_eth_link *slave_dev_link);
 void
@@ -153,6 +174,9 @@ int
 mac_address_set(struct rte_eth_dev *eth_dev, struct ether_addr *new_mac_addr);

 int
+mac_address_get(struct rte_eth_dev *eth_dev, struct ether_addr *dst_mac_addr);
+
+int
 mac_address_slaves_update(struct rte_eth_dev *bonded_eth_dev);

 uint8_t
-- 
1.7.9.5

Reply via email to