On Wed, Sep 17, 2014 at 03:21:52PM +0100, Pawel Wodkowski wrote:
> 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,
I think you intended for this to be deactivate, not deactive, yes?


> +     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)
Static?

>  {
> @@ -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