Lines Matching refs:slave
83 static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[],
116 static inline void tlb_init_slave(struct slave *slave) in tlb_init_slave() argument
118 SLAVE_TLB_INFO(slave).load = 0; in tlb_init_slave()
119 SLAVE_TLB_INFO(slave).head = TLB_NULL_INDEX; in tlb_init_slave()
122 static void __tlb_clear_slave(struct bonding *bond, struct slave *slave, in __tlb_clear_slave() argument
133 index = SLAVE_TLB_INFO(slave).head; in __tlb_clear_slave()
141 tlb_init_slave(slave); in __tlb_clear_slave()
144 static void tlb_clear_slave(struct bonding *bond, struct slave *slave, in tlb_clear_slave() argument
148 __tlb_clear_slave(bond, slave, save_load); in tlb_clear_slave()
189 static long long compute_gap(struct slave *slave) in compute_gap() argument
191 return (s64) (slave->speed << 20) - /* Convert to Megabit per sec */ in compute_gap()
192 (s64) (SLAVE_TLB_INFO(slave).load << 3); /* Bytes to bits */ in compute_gap()
195 static struct slave *tlb_get_least_loaded_slave(struct bonding *bond) in tlb_get_least_loaded_slave()
197 struct slave *slave, *least_loaded; in tlb_get_least_loaded_slave() local
205 bond_for_each_slave_rcu(bond, slave, iter) { in tlb_get_least_loaded_slave()
206 if (bond_slave_can_tx(slave)) { in tlb_get_least_loaded_slave()
207 long long gap = compute_gap(slave); in tlb_get_least_loaded_slave()
210 least_loaded = slave; in tlb_get_least_loaded_slave()
219 static struct slave *__tlb_choose_channel(struct bonding *bond, u32 hash_index, in __tlb_choose_channel()
224 struct slave *assigned_slave; in __tlb_choose_channel()
255 static struct slave *tlb_choose_channel(struct bonding *bond, u32 hash_index, in tlb_choose_channel()
258 struct slave *tx_slave; in tlb_choose_channel()
301 struct slave *slave) in rlb_arp_recv() argument
334 static struct slave *__rlb_next_rx_slave(struct bonding *bond) in __rlb_next_rx_slave()
337 struct slave *before = NULL, *rx_slave = NULL, *slave; in __rlb_next_rx_slave() local
341 bond_for_each_slave_rcu(bond, slave, iter) { in __rlb_next_rx_slave()
342 if (!bond_slave_can_tx(slave)) in __rlb_next_rx_slave()
345 if (!before || before->speed < slave->speed) in __rlb_next_rx_slave()
346 before = slave; in __rlb_next_rx_slave()
348 if (!rx_slave || rx_slave->speed < slave->speed) in __rlb_next_rx_slave()
349 rx_slave = slave; in __rlb_next_rx_slave()
351 if (slave == bond_info->rx_slave) in __rlb_next_rx_slave()
367 static struct slave *rlb_next_rx_slave(struct bonding *bond) in rlb_next_rx_slave()
369 struct slave *rx_slave; in rlb_next_rx_slave()
387 struct slave *curr_active = rtnl_dereference(bond->curr_active_slave); in rlb_teach_disabled_mac_on_primary()
408 static void rlb_clear_slave(struct bonding *bond, struct slave *slave) in rlb_clear_slave() argument
421 if (rx_hash_table[index].slave == slave) { in rlb_clear_slave()
422 struct slave *assigned_slave = rlb_next_rx_slave(bond); in rlb_clear_slave()
425 rx_hash_table[index].slave = assigned_slave; in rlb_clear_slave()
441 rx_hash_table[index].slave = NULL; in rlb_clear_slave()
448 if (slave != rtnl_dereference(bond->curr_active_slave)) in rlb_clear_slave()
449 rlb_teach_disabled_mac_on_primary(bond, slave->dev->dev_addr); in rlb_clear_slave()
456 if (!client_info->slave) in rlb_update_client()
464 client_info->slave->dev, in rlb_update_client()
467 client_info->slave->dev->dev_addr, in rlb_update_client()
470 netdev_err(client_info->slave->bond->dev, in rlb_update_client()
475 skb->dev = client_info->slave->dev; in rlb_update_client()
515 static void rlb_req_update_slave_clients(struct bonding *bond, struct slave *slave) in rlb_req_update_slave_clients() argument
529 if ((client_info->slave == slave) && in rlb_req_update_slave_clients()
560 if (!client_info->slave) { in rlb_req_update_subnet_clients()
569 !ether_addr_equal_64bits(client_info->slave->dev->dev_addr, in rlb_req_update_subnet_clients()
580 static struct slave *rlb_choose_channel(struct sk_buff *skb, struct bonding *bond) in rlb_choose_channel()
584 struct slave *assigned_slave, *curr_active_slave; in rlb_choose_channel()
605 assigned_slave = client_info->slave; in rlb_choose_channel()
616 client_info->slave != curr_active_slave) { in rlb_choose_channel()
617 client_info->slave = curr_active_slave; in rlb_choose_channel()
645 client_info->slave = assigned_slave; in rlb_choose_channel()
678 static struct slave *rlb_arp_xmit(struct sk_buff *skb, struct bonding *bond) in rlb_arp_xmit()
681 struct slave *tx_slave = NULL; in rlb_arp_xmit()
723 struct slave *assigned_slave; in rlb_rebalance()
736 if (assigned_slave && (client_info->slave != assigned_slave)) { in rlb_rebalance()
737 client_info->slave = assigned_slave; in rlb_rebalance()
755 entry->slave = NULL; in rlb_init_table_entry_dst()
924 static void alb_send_lp_vid(struct slave *slave, u8 mac_addr[], in alb_send_lp_vid() argument
948 skb->dev = slave->dev; in alb_send_lp_vid()
956 static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[], in alb_send_learning_packets() argument
959 struct bonding *bond = bond_get_bond_by_slave(slave); in alb_send_learning_packets()
965 alb_send_lp_vid(slave, mac_addr, 0, 0); in alb_send_learning_packets()
976 alb_send_lp_vid(slave, mac_addr, in alb_send_learning_packets()
980 alb_send_lp_vid(slave, upper->dev_addr, in alb_send_learning_packets()
993 alb_send_lp_vid(slave, upper->dev_addr, in alb_send_learning_packets()
1001 static int alb_set_slave_mac_addr(struct slave *slave, u8 addr[]) in alb_set_slave_mac_addr() argument
1003 struct net_device *dev = slave->dev; in alb_set_slave_mac_addr()
1006 if (BOND_MODE(slave->bond) == BOND_MODE_TLB) { in alb_set_slave_mac_addr()
1017 …netdev_err(slave->bond->dev, "dev_set_mac_address of dev %s failed! ALB mode requires that the bas… in alb_set_slave_mac_addr()
1028 static void alb_swap_mac_addr(struct slave *slave1, struct slave *slave2) in alb_swap_mac_addr()
1042 static void alb_fasten_mac_swap(struct bonding *bond, struct slave *slave1, in alb_fasten_mac_swap()
1043 struct slave *slave2) in alb_fasten_mac_swap()
1046 struct slave *disabled_slave = NULL; in alb_fasten_mac_swap()
1096 static void alb_change_hw_addr_on_detach(struct bonding *bond, struct slave *slave) in alb_change_hw_addr_on_detach() argument
1100 struct slave *found_slave; in alb_change_hw_addr_on_detach()
1102 perm_curr_diff = !ether_addr_equal_64bits(slave->perm_hwaddr, in alb_change_hw_addr_on_detach()
1103 slave->dev->dev_addr); in alb_change_hw_addr_on_detach()
1104 perm_bond_diff = !ether_addr_equal_64bits(slave->perm_hwaddr, in alb_change_hw_addr_on_detach()
1108 found_slave = bond_slave_has_mac(bond, slave->perm_hwaddr); in alb_change_hw_addr_on_detach()
1111 alb_swap_mac_addr(slave, found_slave); in alb_change_hw_addr_on_detach()
1112 alb_fasten_mac_swap(bond, slave, found_slave); in alb_change_hw_addr_on_detach()
1139 static int alb_handle_addr_collision_on_attach(struct bonding *bond, struct slave *slave) in alb_handle_addr_collision_on_attach() argument
1141 struct slave *has_bond_addr = rcu_access_pointer(bond->curr_active_slave); in alb_handle_addr_collision_on_attach()
1142 struct slave *tmp_slave1, *free_mac_slave = NULL; in alb_handle_addr_collision_on_attach()
1154 if (!ether_addr_equal_64bits(slave->perm_hwaddr, bond->dev->dev_addr)) { in alb_handle_addr_collision_on_attach()
1155 if (!bond_slave_has_mac(bond, slave->dev->dev_addr)) in alb_handle_addr_collision_on_attach()
1161 alb_set_slave_mac_addr(slave, bond->dev->dev_addr); in alb_handle_addr_collision_on_attach()
1186 alb_set_slave_mac_addr(slave, free_mac_slave->perm_hwaddr); in alb_handle_addr_collision_on_attach()
1189 slave->dev->name, free_mac_slave->dev->name); in alb_handle_addr_collision_on_attach()
1193 slave->dev->name); in alb_handle_addr_collision_on_attach()
1216 struct slave *slave, *rollback_slave; in alb_set_mac_address() local
1225 bond_for_each_slave(bond, slave, iter) { in alb_set_mac_address()
1227 ether_addr_copy(tmp_addr, slave->dev->dev_addr); in alb_set_mac_address()
1229 res = dev_set_mac_address(slave->dev, addr); in alb_set_mac_address()
1232 ether_addr_copy(slave->dev->dev_addr, tmp_addr); in alb_set_mac_address()
1246 if (rollback_slave == slave) in alb_set_mac_address()
1291 struct slave *tx_slave) in bond_do_alb_xmit()
1329 struct slave *tx_slave = NULL; in bond_tlb_xmit()
1368 struct slave *tx_slave = NULL; in bond_alb_xmit()
1466 struct slave *slave; in bond_alb_monitor() local
1483 bond_for_each_slave_rcu(bond, slave, iter) { in bond_alb_monitor()
1489 strict_match = (slave != rcu_access_pointer(bond->curr_active_slave) || in bond_alb_monitor()
1491 alb_send_learning_packets(slave, slave->dev->dev_addr, in bond_alb_monitor()
1499 bond_for_each_slave_rcu(bond, slave, iter) { in bond_alb_monitor()
1500 tlb_clear_slave(bond, slave, 1); in bond_alb_monitor()
1501 if (slave == rcu_access_pointer(bond->curr_active_slave)) { in bond_alb_monitor()
1502 SLAVE_TLB_INFO(slave).load = in bond_alb_monitor()
1562 int bond_alb_init_slave(struct bonding *bond, struct slave *slave) in bond_alb_init_slave() argument
1566 res = alb_set_slave_mac_addr(slave, slave->perm_hwaddr); in bond_alb_init_slave()
1570 res = alb_handle_addr_collision_on_attach(bond, slave); in bond_alb_init_slave()
1574 tlb_init_slave(slave); in bond_alb_init_slave()
1590 void bond_alb_deinit_slave(struct bonding *bond, struct slave *slave) in bond_alb_deinit_slave() argument
1593 alb_change_hw_addr_on_detach(bond, slave); in bond_alb_deinit_slave()
1595 tlb_clear_slave(bond, slave, 0); in bond_alb_deinit_slave()
1599 rlb_clear_slave(bond, slave); in bond_alb_deinit_slave()
1604 void bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, char link) in bond_alb_handle_link_change() argument
1609 tlb_clear_slave(bond, slave, 0); in bond_alb_handle_link_change()
1611 rlb_clear_slave(bond, slave); in bond_alb_handle_link_change()
1641 void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave) in bond_alb_handle_active_change()
1643 struct slave *swap_slave; in bond_alb_handle_active_change()
1644 struct slave *curr_active; in bond_alb_handle_active_change()
1711 struct slave *curr_active; in bond_alb_set_mac_address()
1712 struct slave *swap_slave; in bond_alb_set_mac_address()