aggregator
static void ad_agg_selection_logic(struct aggregator *aggregator,
static void ad_clear_agg(struct aggregator *aggregator);
struct aggregator *aggregator;
static void ad_initialize_agg(struct aggregator *aggregator);
aggregator = rcu_dereference(port->aggregator);
__set_agg_ports_ready(aggregator, __agg_ports_are_ready(aggregator));
__set_agg_ports_ready(aggregator, __agg_ports_are_ready(aggregator));
if (aggregator->is_active) {
__set_agg_ports_ready(aggregator, __agg_ports_are_ready(aggregator));
} else if (aggregator->is_active) {
if (aggregator->is_active &&
if (aggregator->is_active &&
if (aggregator &&
aggregator->is_active &&
if (aggregator->is_active)
static inline struct aggregator *__get_first_agg(struct port *port)
struct aggregator *agg;
agg = first_slave ? &(SLAVE_AD_INFO(first_slave)->aggregator) : NULL;
struct aggregator *aggregator, *free_aggregator = NULL, *temp_aggregator;
temp_aggregator = rcu_dereference(port->aggregator);
RCU_INIT_POINTER(port->aggregator, NULL);
aggregator = &(SLAVE_AD_INFO(slave)->aggregator);
if (!aggregator->lag_ports) {
free_aggregator = aggregator;
if (((aggregator->actor_oper_aggregator_key == port->actor_oper_port_key) && /* if all parameters match AND */
MAC_ADDRESS_EQUAL(&(aggregator->partner_system), &(port->partner_oper.system)) &&
(aggregator->partner_system_priority == port->partner_oper.system_priority) &&
(aggregator->partner_oper_aggregator_key == port->partner_oper.key)
((__agg_has_partner(aggregator) && /* partner answers */
!aggregator->is_individual) /* but is not individual OR */
rcu_assign_pointer(port->aggregator, aggregator);
aggregator->aggregator_identifier;
port->next_port_in_aggregator = aggregator->lag_ports;
aggregator->num_of_ports++;
aggregator->lag_ports = port;
aggregator->aggregator_identifier);
static inline int __agg_has_partner(struct aggregator *agg)
rcu_assign_pointer(port->aggregator, free_aggregator);
aggregator = rcu_dereference(port->aggregator);
__set_agg_ports_ready(aggregator, __agg_ports_are_ready(aggregator));
if (!aggregator->is_active)
static struct aggregator *ad_agg_selection_test(struct aggregator *best,
struct aggregator *curr)
static int agg_device_up(const struct aggregator *agg)
static void ad_agg_selection_logic(struct aggregator *agg,
struct aggregator *best, *active, *origin;
agg = &(SLAVE_AD_INFO(slave)->aggregator);
agg = &(SLAVE_AD_INFO(slave)->aggregator);
static void ad_clear_agg(struct aggregator *aggregator)
if (aggregator) {
aggregator->is_individual = false;
aggregator->actor_admin_aggregator_key = 0;
aggregator->actor_oper_aggregator_key = 0;
eth_zero_addr(aggregator->partner_system.mac_addr_value);
aggregator->partner_system_priority = 0;
aggregator->partner_oper_aggregator_key = 0;
aggregator->receive_state = 0;
aggregator->transmit_state = 0;
aggregator->lag_ports = NULL;
aggregator->is_active = 0;
aggregator->num_of_ports = 0;
aggregator->slave ?
aggregator->slave->dev->name : "NULL",
aggregator->aggregator_identifier);
static void ad_initialize_agg(struct aggregator *aggregator)
if (aggregator) {
ad_clear_agg(aggregator);
eth_zero_addr(aggregator->aggregator_mac_address.mac_addr_value);
aggregator->aggregator_identifier = 0;
aggregator->slave = NULL;
port->aggregator = NULL;
struct aggregator *aggregator = rcu_dereference(port->aggregator);
if (aggregator->is_active) {
aggregator->aggregator_identifier);
struct aggregator *aggregator = rcu_dereference(port->aggregator);
if (aggregator && __agg_has_partner(aggregator)) {
aggregator->aggregator_identifier);
struct aggregator *aggregator = rcu_dereference(port->aggregator);
if (aggregator->is_active) {
aggregator->aggregator_identifier);
struct aggregator *aggregator = rcu_dereference(port->aggregator);
if (aggregator && __agg_has_partner(aggregator)) {
aggregator->aggregator_identifier);
struct aggregator *aggregator;
aggregator = &(SLAVE_AD_INFO(slave)->aggregator);
ad_initialize_agg(aggregator);
aggregator->aggregator_mac_address = *((struct mac_addr *)bond->dev->dev_addr);
aggregator->aggregator_identifier = ++BOND_AD_INFO(bond).aggregator_identifier;
aggregator->slave = slave;
aggregator->is_active = 0;
aggregator->num_of_ports = 0;
struct aggregator *aggregator, *new_aggregator, *temp_aggregator;
aggregator = &(SLAVE_AD_INFO(slave)->aggregator);
aggregator->aggregator_identifier);
if (aggregator->lag_ports) {
if ((aggregator->lag_ports != port) ||
(aggregator->lag_ports->next_port_in_aggregator)) {
new_aggregator = &(SLAVE_AD_INFO(slave_iter)->aggregator);
aggregator->aggregator_identifier,
new_aggregator->is_individual = aggregator->is_individual;
new_aggregator->actor_admin_aggregator_key = aggregator->actor_admin_aggregator_key;
new_aggregator->actor_oper_aggregator_key = aggregator->actor_oper_aggregator_key;
new_aggregator->partner_system = aggregator->partner_system;
new_aggregator->partner_system_priority = aggregator->partner_system_priority;
new_aggregator->partner_oper_aggregator_key = aggregator->partner_oper_aggregator_key;
new_aggregator->receive_state = aggregator->receive_state;
new_aggregator->transmit_state = aggregator->transmit_state;
new_aggregator->lag_ports = aggregator->lag_ports;
new_aggregator->is_active = aggregator->is_active;
new_aggregator->num_of_ports = aggregator->num_of_ports;
for (temp_port = aggregator->lag_ports; temp_port;
rcu_assign_pointer(temp_port->aggregator, new_aggregator);
ad_clear_agg(aggregator);
select_new_active_agg = aggregator->is_active;
ad_clear_agg(aggregator);
temp_aggregator = &(SLAVE_AD_INFO(slave_iter)->aggregator);
struct aggregator *aggregator;
aggregator = __get_first_agg(port);
ad_agg_selection_logic(aggregator, &update_slave_arr);
struct aggregator *agg;
struct aggregator *active;
active = __get_active_agg(&(SLAVE_AD_INFO(first_slave)->aggregator));
struct aggregator *aggregator = NULL, *tmp;
tmp = rcu_dereference(port->aggregator);
aggregator = tmp;
if (!aggregator)
ad_info->aggregator_id = aggregator->aggregator_identifier;
ad_info->ports = __agg_active_ports(aggregator);
ad_info->actor_key = aggregator->actor_oper_aggregator_key;
ad_info->partner_key = aggregator->partner_oper_aggregator_key;
aggregator->partner_system.mac_addr_value);
static int __agg_ports_are_ready(struct aggregator *aggregator)
if (aggregator) {
for (port = aggregator->lag_ports;
static void __set_agg_ports_ready(struct aggregator *aggregator, int val)
for (port = aggregator->lag_ports; port;
static int __agg_usable_ports(struct aggregator *agg)
static int __agg_active_ports(struct aggregator *agg)
static unsigned int __agg_ports_priority(const struct aggregator *agg)
static u32 __get_agg_bandwidth(struct aggregator *aggregator)
int nports = __agg_active_ports(aggregator);
switch (__get_link_speed(aggregator->lag_ports)) {
static struct aggregator *__get_active_agg(struct aggregator *aggregator)
struct bonding *bond = aggregator->slave->bond;
if (SLAVE_AD_INFO(slave)->aggregator.is_active)
return &(SLAVE_AD_INFO(slave)->aggregator);
struct aggregator *agg =
rcu_dereference(SLAVE_AD_INFO(slave)->port.aggregator);
const struct aggregator *agg;
agg = rcu_dereference(SLAVE_AD_INFO(slave)->port.aggregator);
const struct aggregator *agg;
agg = rcu_dereference(SLAVE_AD_INFO(slave)->port.aggregator);
const struct aggregator *agg = rcu_dereference(port->aggregator);
if (rcu_access_pointer(ad_port->aggregator))
const struct aggregator *agg;
agg = rcu_dereference(SLAVE_AD_INFO(slave)->port.aggregator);
if (rcu_access_pointer(ad_port->aggregator))
enum psi_aggregators aggregator;
struct aggregator __rcu *aggregator; /* pointer to an aggregator that this port related to */
struct aggregator aggregator; /* 802.3ad aggregator structure */
t->aggregator = privileged ? PSI_POLL : PSI_AVGS;
if (t->aggregator == PSI_AVGS) {
enum psi_aggregators aggregator, u32 *times,
delta = times[s] - groupc->times_prev[aggregator][s];
groupc->times_prev[aggregator][s] = times[s];
enum psi_aggregators aggregator,
get_recent_times(group, cpu, aggregator, times,
group->total[aggregator][s] +=
enum psi_aggregators aggregator)
u64 *total = group->total[aggregator];
if (aggregator == PSI_AVGS) {