Add a rte APIs to set/get the timeout for LACP signed-off-by: Kiran KN <kira...@juniper.net>
--- drivers/net/bonding/eth_bond_private.h | 8 ++++++++ drivers/net/bonding/rte_eth_bond.h | 26 ++++++++++++++++++++++++++ drivers/net/bonding/rte_eth_bond_8023ad.c | 6 ++++++ drivers/net/bonding/rte_eth_bond_8023ad.h | 9 +++++++++ drivers/net/bonding/rte_eth_bond_api.c | 27 +++++++++++++++++++++++++++ drivers/net/bonding/rte_eth_bond_args.c | 25 +++++++++++++++++++++++++ drivers/net/bonding/rte_eth_bond_pmd.c | 30 +++++++++++++++++++++++++++++- 7 files changed, 130 insertions(+), 1 deletion(-) diff --git a/drivers/net/bonding/eth_bond_private.h b/drivers/net/bonding/eth_bond_private.h index c9b2d0fe4..8bab10ee1 100644 --- a/drivers/net/bonding/eth_bond_private.h +++ b/drivers/net/bonding/eth_bond_private.h @@ -28,11 +28,14 @@ #define PMD_BOND_LSC_POLL_PERIOD_KVARG ("lsc_poll_period_ms") #define PMD_BOND_LINK_UP_PROP_DELAY_KVARG ("up_delay") #define PMD_BOND_LINK_DOWN_PROP_DELAY_KVARG ("down_delay") +#define PMD_BOND_LACP_RATE_KVARG ("lacp_rate") #define PMD_BOND_XMIT_POLICY_LAYER2_KVARG ("l2") #define PMD_BOND_XMIT_POLICY_LAYER23_KVARG ("l23") #define PMD_BOND_XMIT_POLICY_LAYER34_KVARG ("l34") +#define PMD_BOND_LACP_RATE_FAST_KVARG ("fast") +#define PMD_BOND_LACP_RATE_SLOW_KVARG ("slow") extern int bond_logtype; #define RTE_BOND_LOG(lvl, msg, ...) \ @@ -180,6 +183,7 @@ struct bond_dev_private { void *vlan_filter_bmpmem; /* enabled vlan filter bitmap */ struct rte_bitmap *vlan_filter_bmp; + uint8_t lacp_rate; }; extern const struct eth_dev_ops default_dev_ops; @@ -306,6 +310,10 @@ int bond_ethdev_parse_time_ms_kvarg(const char *key, const char *value, void *extra_args); +int +bond_ethdev_parse_lacp_rate_kvarg(const char *key, + const char *value, void *extra_args); + void bond_tlb_disable(struct bond_dev_private *internals); diff --git a/drivers/net/bonding/rte_eth_bond.h b/drivers/net/bonding/rte_eth_bond.h index 874aa91a5..0e90ba2cf 100644 --- a/drivers/net/bonding/rte_eth_bond.h +++ b/drivers/net/bonding/rte_eth_bond.h @@ -88,6 +88,10 @@ extern "C" { #define BALANCE_XMIT_POLICY_LAYER34 (2) /**< Layer 3+4 (IP Addresses + UDP Ports) transmit load balancing */ +/* LACP Rate */ +#define LACP_RATE_SLOW (0) +#define LACP_RATE_FAST (1) + /** * Create a bonded rte_eth_dev device * @@ -343,6 +347,28 @@ rte_eth_bond_link_up_prop_delay_set(uint16_t bonded_port_id, int rte_eth_bond_link_up_prop_delay_get(uint16_t bonded_port_id); +/** + * Set the lacp rate for the slave interface + * + * @param bonded_port_id Port ID of bonded device. + * @param lacp_rate 0 - slow, 1 - fast + * + * @return + * 0 on success, negative value otherwise. + */ +int +rte_eth_bond_lacp_rate_set(uint16_t bonded_port_id, uint8_t lacp_rate); + +/** + * Get the lacp rate for the slave device + * + * @param bonded_port_id Port ID of bonded device. + * + * @return + * lacp rate on success, negative value otherwise. + */ +int +rte_eth_bond_lacp_rate_get(uint16_t bonded_port_id); #ifdef __cplusplus } diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c index b77a37ddb..e3159004a 100644 --- a/drivers/net/bonding/rte_eth_bond_8023ad.c +++ b/drivers/net/bonding/rte_eth_bond_8023ad.c @@ -491,6 +491,12 @@ mux_machine(struct bond_dev_private *internals, uint16_t slave_id) MODE4_DEBUG("Out of sync -> ATTACHED\n"); } + if (internals->lacp_rate) + ACTOR_STATE_SET(port, LACP_SHORT_TIMEOUT); + else + ACTOR_STATE_CLR(port, LACP_SHORT_TIMEOUT); + + if (!ACTOR_STATE(port, SYNCHRONIZATION)) { /* attach mux to aggregator */ RTE_ASSERT((port->actor_state & (STATE_COLLECTING | diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.h b/drivers/net/bonding/rte_eth_bond_8023ad.h index 62265f449..5623e1424 100644 --- a/drivers/net/bonding/rte_eth_bond_8023ad.h +++ b/drivers/net/bonding/rte_eth_bond_8023ad.h @@ -331,4 +331,13 @@ rte_eth_bond_8023ad_agg_selection_get(uint16_t port_id); int rte_eth_bond_8023ad_agg_selection_set(uint16_t port_id, enum rte_bond_8023ad_agg_selection agg_selection); + +/** + * Set slave to use fast lacp timeout + * @param port_id Bonding device id + * @return + * 0 on success, negative value otherwise + */ +int +rte_eth_bond_8023ad_ext_set_fast(uint16_t port_id, uint16_t slave_id); #endif /* RTE_ETH_BOND_8023AD_H_ */ diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c index f38eb3b47..9157a7295 100644 --- a/drivers/net/bonding/rte_eth_bond_api.c +++ b/drivers/net/bonding/rte_eth_bond_api.c @@ -1050,3 +1050,30 @@ rte_eth_bond_link_up_prop_delay_get(uint16_t bonded_port_id) return internals->link_up_delay_ms; } + +int +rte_eth_bond_lacp_rate_set(uint16_t bonded_port_id, uint8_t lacp_rate) +{ + struct bond_dev_private *internals; + + if (valid_bonded_port_id(bonded_port_id) != 0) + return -1; + + internals = rte_eth_devices[bonded_port_id].data->dev_private; + internals->lacp_rate = lacp_rate; + + return 0; +} + +int +rte_eth_bond_lacp_rate_get(uint16_t bonded_port_id) +{ + struct bond_dev_private *internals; + + if (valid_bonded_port_id(bonded_port_id) != 0) + return -1; + + internals = rte_eth_devices[bonded_port_id].data->dev_private; + + return internals->lacp_rate; +} diff --git a/drivers/net/bonding/rte_eth_bond_args.c b/drivers/net/bonding/rte_eth_bond_args.c index abdf55261..732685198 100644 --- a/drivers/net/bonding/rte_eth_bond_args.c +++ b/drivers/net/bonding/rte_eth_bond_args.c @@ -18,6 +18,7 @@ const char *pmd_bond_init_valid_arguments[] = { PMD_BOND_SOCKET_ID_KVARG, PMD_BOND_MAC_ADDR_KVARG, PMD_BOND_AGG_MODE_KVARG, + PMD_BOND_LACP_RATE_KVARG, "driver", NULL }; @@ -299,3 +300,27 @@ bond_ethdev_parse_time_ms_kvarg(const char *key __rte_unused, return 0; } + +int +bond_ethdev_parse_lacp_rate_kvarg(const char *key __rte_unused, + const char *value, void *extra_args) +{ + uint8_t lacp_rate; + + if (value == NULL || extra_args == NULL) + return -1; + + if (strcmp(PMD_BOND_LACP_RATE_FAST_KVARG, value) == 0) + lacp_rate = LACP_RATE_FAST; + else if (strcmp("1", value) == 0) + lacp_rate = LACP_RATE_FAST; + else if (strcmp(PMD_BOND_LACP_RATE_SLOW_KVARG, value) == 0) + lacp_rate = LACP_RATE_SLOW; + else if (strcmp("0", value) == 0) + lacp_rate = LACP_RATE_SLOW; + else + return -1; + + *(uint8_t *)extra_args = lacp_rate; + return 0; +} diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c index 707a0f3cd..e1f105233 100644 --- a/drivers/net/bonding/rte_eth_bond_pmd.c +++ b/drivers/net/bonding/rte_eth_bond_pmd.c @@ -3727,6 +3727,33 @@ bond_ethdev_configure(struct rte_eth_dev *dev) return -1; } + /* Parse/set lacp rate */ + arg_count = rte_kvargs_count(kvlist, PMD_BOND_LACP_RATE_KVARG); + if (arg_count == 1) { + uint8_t lacp_rate; + + if (rte_kvargs_process(kvlist, PMD_BOND_LACP_RATE_KVARG, + &bond_ethdev_parse_lacp_rate_kvarg, &lacp_rate) != + 0) { + RTE_LOG(INFO, EAL, + "Invalid lacp rate specified for bonded device %s\n", + name); + return -1; + } + + /* Set balance mode transmit policy*/ + if (rte_eth_bond_lacp_rate_set(port_id, lacp_rate) + != 0) { + RTE_LOG(ERR, EAL, + "Failed to set lacp rate on bonded device %s\n", name); + return -1; + } + } else if (arg_count > 1) { + RTE_LOG(INFO, EAL, + "Lacp rate can be specified only once for bonded device %s\n", name); + return -1; + } + return 0; } @@ -3748,7 +3775,8 @@ RTE_PMD_REGISTER_PARAM_STRING(net_bonding, "mac=<mac addr> " "lsc_poll_period_ms=<int> " "up_delay=<int> " - "down_delay=<int>"); + "down_delay=<int> " + "lacp_rate=[fast | slow]"); int bond_logtype; -- 2.16.6