Lines Matching refs:bond

85 static void rlb_purge_src_ip(struct bonding *bond, struct arp_pkt *arp);
86 static void rlb_src_unlink(struct bonding *bond, u32 index);
87 static void rlb_src_link(struct bonding *bond, u32 ip_src_hash,
122 static void __tlb_clear_slave(struct bonding *bond, struct slave *slave, in __tlb_clear_slave() argument
129 tx_hash_table = BOND_ALB_INFO(bond).tx_hashtbl; in __tlb_clear_slave()
144 static void tlb_clear_slave(struct bonding *bond, struct slave *slave, in tlb_clear_slave() argument
147 spin_lock_bh(&bond->mode_lock); in tlb_clear_slave()
148 __tlb_clear_slave(bond, slave, save_load); in tlb_clear_slave()
149 spin_unlock_bh(&bond->mode_lock); in tlb_clear_slave()
153 static int tlb_initialize(struct bonding *bond) in tlb_initialize() argument
155 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in tlb_initialize()
164 spin_lock_bh(&bond->mode_lock); in tlb_initialize()
171 spin_unlock_bh(&bond->mode_lock); in tlb_initialize()
177 static void tlb_deinitialize(struct bonding *bond) in tlb_deinitialize() argument
179 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in tlb_deinitialize()
181 spin_lock_bh(&bond->mode_lock); in tlb_deinitialize()
186 spin_unlock_bh(&bond->mode_lock); in tlb_deinitialize()
195 static struct slave *tlb_get_least_loaded_slave(struct bonding *bond) in tlb_get_least_loaded_slave() argument
205 bond_for_each_slave_rcu(bond, slave, iter) { in tlb_get_least_loaded_slave()
219 static struct slave *__tlb_choose_channel(struct bonding *bond, u32 hash_index, in __tlb_choose_channel() argument
222 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in __tlb_choose_channel()
229 assigned_slave = tlb_get_least_loaded_slave(bond); in __tlb_choose_channel()
255 static struct slave *tlb_choose_channel(struct bonding *bond, u32 hash_index, in tlb_choose_channel() argument
264 spin_lock(&bond->mode_lock); in tlb_choose_channel()
265 tx_slave = __tlb_choose_channel(bond, hash_index, skb_len); in tlb_choose_channel()
266 spin_unlock(&bond->mode_lock); in tlb_choose_channel()
276 static void rlb_update_entry_from_arp(struct bonding *bond, struct arp_pkt *arp) in rlb_update_entry_from_arp() argument
278 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in rlb_update_entry_from_arp()
282 spin_lock_bh(&bond->mode_lock); in rlb_update_entry_from_arp()
297 spin_unlock_bh(&bond->mode_lock); in rlb_update_entry_from_arp()
300 static int rlb_arp_recv(const struct sk_buff *skb, struct bonding *bond, in rlb_arp_recv() argument
322 rlb_purge_src_ip(bond, arp); in rlb_arp_recv()
326 rlb_update_entry_from_arp(bond, arp); in rlb_arp_recv()
327 netdev_dbg(bond->dev, "Server received an ARP Reply from client\n"); in rlb_arp_recv()
334 static struct slave *__rlb_next_rx_slave(struct bonding *bond) in __rlb_next_rx_slave() argument
336 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in __rlb_next_rx_slave()
341 bond_for_each_slave_rcu(bond, slave, iter) { in __rlb_next_rx_slave()
367 static struct slave *rlb_next_rx_slave(struct bonding *bond) in rlb_next_rx_slave() argument
374 rx_slave = __rlb_next_rx_slave(bond); in rlb_next_rx_slave()
385 static void rlb_teach_disabled_mac_on_primary(struct bonding *bond, u8 addr[]) in rlb_teach_disabled_mac_on_primary() argument
387 struct slave *curr_active = rtnl_dereference(bond->curr_active_slave); in rlb_teach_disabled_mac_on_primary()
392 if (!bond->alb_info.primary_is_promisc) { in rlb_teach_disabled_mac_on_primary()
394 bond->alb_info.primary_is_promisc = 1; in rlb_teach_disabled_mac_on_primary()
396 bond->alb_info.primary_is_promisc = 0; in rlb_teach_disabled_mac_on_primary()
399 bond->alb_info.rlb_promisc_timeout_counter = 0; in rlb_teach_disabled_mac_on_primary()
408 static void rlb_clear_slave(struct bonding *bond, struct slave *slave) in rlb_clear_slave() argument
410 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in rlb_clear_slave()
415 spin_lock_bh(&bond->mode_lock); in rlb_clear_slave()
422 struct slave *assigned_slave = rlb_next_rx_slave(bond); in rlb_clear_slave()
446 spin_unlock_bh(&bond->mode_lock); 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()
470 netdev_err(client_info->slave->bond->dev, in rlb_update_client()
487 static void rlb_update_rx_clients(struct bonding *bond) in rlb_update_rx_clients() argument
489 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in rlb_update_rx_clients()
493 spin_lock_bh(&bond->mode_lock); in rlb_update_rx_clients()
511 spin_unlock_bh(&bond->mode_lock); in rlb_update_rx_clients()
515 static void rlb_req_update_slave_clients(struct bonding *bond, struct slave *slave) in rlb_req_update_slave_clients() argument
517 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in rlb_req_update_slave_clients()
522 spin_lock_bh(&bond->mode_lock); in rlb_req_update_slave_clients()
543 spin_unlock_bh(&bond->mode_lock); in rlb_req_update_slave_clients()
547 static void rlb_req_update_subnet_clients(struct bonding *bond, __be32 src_ip) in rlb_req_update_subnet_clients() argument
549 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in rlb_req_update_subnet_clients()
553 spin_lock(&bond->mode_lock); in rlb_req_update_subnet_clients()
561 netdev_err(bond->dev, "found a client with no channel in the client's hash table\n"); in rlb_req_update_subnet_clients()
570 bond->dev->dev_addr) && in rlb_req_update_subnet_clients()
577 spin_unlock(&bond->mode_lock); in rlb_req_update_subnet_clients()
580 static struct slave *rlb_choose_channel(struct sk_buff *skb, struct bonding *bond) in rlb_choose_channel() argument
582 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in rlb_choose_channel()
588 spin_lock(&bond->mode_lock); in rlb_choose_channel()
590 curr_active_slave = rcu_dereference(bond->curr_active_slave); in rlb_choose_channel()
607 spin_unlock(&bond->mode_lock); in rlb_choose_channel()
623 assigned_slave = __rlb_next_rx_slave(bond); in rlb_choose_channel()
633 rlb_src_unlink(bond, hash_index); in rlb_choose_channel()
634 rlb_src_link(bond, hash_src, hash_index); in rlb_choose_channel()
649 bond->alb_info.rx_ntt = 1; in rlb_choose_channel()
669 spin_unlock(&bond->mode_lock); in rlb_choose_channel()
678 static struct slave *rlb_arp_xmit(struct sk_buff *skb, struct bonding *bond) in rlb_arp_xmit() argument
686 if (!bond_slave_has_mac_rx(bond, arp->mac_src)) in rlb_arp_xmit()
691 tx_slave = rlb_choose_channel(skb, bond); in rlb_arp_xmit()
694 netdev_dbg(bond->dev, "Server sent ARP Reply packet\n"); in rlb_arp_xmit()
701 rlb_choose_channel(skb, bond); in rlb_arp_xmit()
706 bond->alb_info.rlb_update_delay_counter = RLB_UPDATE_DELAY; in rlb_arp_xmit()
713 rlb_req_update_subnet_clients(bond, arp->ip_src); in rlb_arp_xmit()
714 netdev_dbg(bond->dev, "Server sent ARP Request packet\n"); in rlb_arp_xmit()
720 static void rlb_rebalance(struct bonding *bond) in rlb_rebalance() argument
722 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in rlb_rebalance()
728 spin_lock_bh(&bond->mode_lock); in rlb_rebalance()
735 assigned_slave = __rlb_next_rx_slave(bond); in rlb_rebalance()
746 spin_unlock_bh(&bond->mode_lock); in rlb_rebalance()
772 static void rlb_delete_table_entry_dst(struct bonding *bond, u32 index) in rlb_delete_table_entry_dst() argument
774 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in rlb_delete_table_entry_dst()
787 static void rlb_src_unlink(struct bonding *bond, u32 index) in rlb_src_unlink() argument
789 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in rlb_src_unlink()
810 static void rlb_delete_table_entry(struct bonding *bond, u32 index) in rlb_delete_table_entry() argument
812 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in rlb_delete_table_entry()
815 rlb_delete_table_entry_dst(bond, index); in rlb_delete_table_entry()
818 rlb_src_unlink(bond, index); in rlb_delete_table_entry()
824 static void rlb_src_link(struct bonding *bond, u32 ip_src_hash, u32 ip_dst_hash) in rlb_src_link() argument
826 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in rlb_src_link()
840 static void rlb_purge_src_ip(struct bonding *bond, struct arp_pkt *arp) in rlb_purge_src_ip() argument
842 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in rlb_purge_src_ip()
846 spin_lock_bh(&bond->mode_lock); in rlb_purge_src_ip()
854 rlb_delete_table_entry(bond, index); in rlb_purge_src_ip()
857 spin_unlock_bh(&bond->mode_lock); in rlb_purge_src_ip()
860 static int rlb_initialize(struct bonding *bond) in rlb_initialize() argument
862 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in rlb_initialize()
871 spin_lock_bh(&bond->mode_lock); in rlb_initialize()
880 spin_unlock_bh(&bond->mode_lock); in rlb_initialize()
883 bond->recv_probe = rlb_arp_recv; in rlb_initialize()
888 static void rlb_deinitialize(struct bonding *bond) in rlb_deinitialize() argument
890 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in rlb_deinitialize()
892 spin_lock_bh(&bond->mode_lock); in rlb_deinitialize()
898 spin_unlock_bh(&bond->mode_lock); in rlb_deinitialize()
901 static void rlb_clear_vlan(struct bonding *bond, unsigned short vlan_id) in rlb_clear_vlan() argument
903 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in rlb_clear_vlan()
906 spin_lock_bh(&bond->mode_lock); in rlb_clear_vlan()
914 rlb_delete_table_entry(bond, curr_index); in rlb_clear_vlan()
919 spin_unlock_bh(&bond->mode_lock); in rlb_clear_vlan()
959 struct bonding *bond = bond_get_bond_by_slave(slave); in alb_send_learning_packets() local
971 netdev_for_each_all_upper_dev_rcu(bond->dev, upper, iter) { in alb_send_learning_packets()
990 tags = bond_verify_device_path(bond->dev, upper, 0); in alb_send_learning_packets()
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()
1042 static void alb_fasten_mac_swap(struct bonding *bond, struct slave *slave1, in alb_fasten_mac_swap() argument
1053 if (bond->alb_info.rlb_enabled) { in alb_fasten_mac_swap()
1057 rlb_req_update_slave_clients(bond, slave1); in alb_fasten_mac_swap()
1065 if (bond->alb_info.rlb_enabled) { in alb_fasten_mac_swap()
1069 rlb_req_update_slave_clients(bond, slave2); in alb_fasten_mac_swap()
1075 if (bond->alb_info.rlb_enabled && slaves_state_differ) { in alb_fasten_mac_swap()
1077 rlb_teach_disabled_mac_on_primary(bond, 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
1105 bond->dev->dev_addr); 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()
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()
1145 if (!bond_has_slaves(bond)) { 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()
1167 bond_for_each_slave(bond, tmp_slave1, iter) { in alb_handle_addr_collision_on_attach()
1168 if (!bond_slave_has_mac(bond, tmp_slave1->perm_hwaddr)) { in alb_handle_addr_collision_on_attach()
1178 bond->dev->dev_addr)) { in alb_handle_addr_collision_on_attach()
1188 …netdev_warn(bond->dev, "the hw address of slave %s is in use by the bond; giving it the hw address… in alb_handle_addr_collision_on_attach()
1192 …netdev_err(bond->dev, "the hw address of slave %s is in use by the bond; couldn't find a slave wit… in alb_handle_addr_collision_on_attach()
1214 static int alb_set_mac_address(struct bonding *bond, void *addr) in alb_set_mac_address() argument
1222 if (bond->alb_info.rlb_enabled) in alb_set_mac_address()
1225 bond_for_each_slave(bond, slave, iter) { in alb_set_mac_address()
1241 memcpy(sa.sa_data, bond->dev->dev_addr, bond->dev->addr_len); in alb_set_mac_address()
1242 sa.sa_family = bond->dev->type; in alb_set_mac_address()
1245 bond_for_each_slave(bond, rollback_slave, iter) { in alb_set_mac_address()
1258 int bond_alb_initialize(struct bonding *bond, int rlb_enabled) in bond_alb_initialize() argument
1262 res = tlb_initialize(bond); in bond_alb_initialize()
1267 bond->alb_info.rlb_enabled = 1; in bond_alb_initialize()
1268 res = rlb_initialize(bond); in bond_alb_initialize()
1270 tlb_deinitialize(bond); in bond_alb_initialize()
1274 bond->alb_info.rlb_enabled = 0; in bond_alb_initialize()
1280 void bond_alb_deinitialize(struct bonding *bond) in bond_alb_deinitialize() argument
1282 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in bond_alb_deinitialize()
1284 tlb_deinitialize(bond); in bond_alb_deinitialize()
1287 rlb_deinitialize(bond); in bond_alb_deinitialize()
1290 static int bond_do_alb_xmit(struct sk_buff *skb, struct bonding *bond, in bond_do_alb_xmit() argument
1293 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in bond_do_alb_xmit()
1298 tx_slave = rcu_dereference(bond->curr_active_slave); in bond_do_alb_xmit()
1299 if (bond->params.tlb_dynamic_lb) in bond_do_alb_xmit()
1304 if (tx_slave != rcu_access_pointer(bond->curr_active_slave)) { in bond_do_alb_xmit()
1309 bond_dev_queue_xmit(bond, skb, tx_slave->dev); in bond_do_alb_xmit()
1313 if (tx_slave && bond->params.tlb_dynamic_lb) { in bond_do_alb_xmit()
1314 spin_lock(&bond->mode_lock); in bond_do_alb_xmit()
1315 __tlb_clear_slave(bond, tx_slave, 0); in bond_do_alb_xmit()
1316 spin_unlock(&bond->mode_lock); in bond_do_alb_xmit()
1320 bond_tx_drop(bond->dev, skb); in bond_do_alb_xmit()
1327 struct bonding *bond = netdev_priv(bond_dev); in bond_tlb_xmit() local
1342 hash_index = bond_xmit_hash(bond, skb); in bond_tlb_xmit()
1343 if (bond->params.tlb_dynamic_lb) { in bond_tlb_xmit()
1344 tx_slave = tlb_choose_channel(bond, in bond_tlb_xmit()
1351 slaves = rcu_dereference(bond->slave_arr); in bond_tlb_xmit()
1360 return bond_do_alb_xmit(skb, bond, tx_slave); in bond_tlb_xmit()
1365 struct bonding *bond = netdev_priv(bond_dev); in bond_alb_xmit() local
1367 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in bond_alb_xmit()
1445 tx_slave = rlb_arp_xmit(skb, bond); in bond_alb_xmit()
1454 tx_slave = tlb_choose_channel(bond, hash_index, skb->len); in bond_alb_xmit()
1457 return bond_do_alb_xmit(skb, bond, tx_slave); in bond_alb_xmit()
1462 struct bonding *bond = container_of(work, struct bonding, in bond_alb_monitor() local
1464 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in bond_alb_monitor()
1468 if (!bond_has_slaves(bond)) { in bond_alb_monitor()
1480 if (bond_info->lp_counter >= BOND_ALB_LP_TICKS(bond)) { in bond_alb_monitor()
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()
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()
1528 dev_set_promiscuity(rtnl_dereference(bond->curr_active_slave)->dev, in bond_alb_monitor()
1538 rlb_rebalance(bond); in bond_alb_monitor()
1546 rlb_update_rx_clients(bond); in bond_alb_monitor()
1556 queue_delayed_work(bond->wq, &bond->alb_work, alb_delta_in_ticks); in bond_alb_monitor()
1562 int bond_alb_init_slave(struct bonding *bond, struct slave *slave) in bond_alb_init_slave() argument
1570 res = alb_handle_addr_collision_on_attach(bond, slave); in bond_alb_init_slave()
1577 bond->alb_info.tx_rebalance_counter = BOND_TLB_REBALANCE_TICKS; in bond_alb_init_slave()
1579 if (bond->alb_info.rlb_enabled) in bond_alb_init_slave()
1580 bond->alb_info.rlb_rebalance = 1; in bond_alb_init_slave()
1590 void bond_alb_deinit_slave(struct bonding *bond, struct slave *slave) in bond_alb_deinit_slave() argument
1592 if (bond_has_slaves(bond)) in bond_alb_deinit_slave()
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()
1597 if (bond->alb_info.rlb_enabled) { in bond_alb_deinit_slave()
1598 bond->alb_info.rx_slave = NULL; 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
1606 struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); in bond_alb_handle_link_change()
1609 tlb_clear_slave(bond, slave, 0); in bond_alb_handle_link_change()
1610 if (bond->alb_info.rlb_enabled) in bond_alb_handle_link_change()
1611 rlb_clear_slave(bond, slave); in bond_alb_handle_link_change()
1615 if (bond->alb_info.rlb_enabled) { in bond_alb_handle_link_change()
1616 bond->alb_info.rlb_rebalance = 1; in bond_alb_handle_link_change()
1625 if (bond_is_nondyn_tlb(bond)) { in bond_alb_handle_link_change()
1626 if (bond_update_slave_arr(bond, NULL)) 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() argument
1646 curr_active = rtnl_dereference(bond->curr_active_slave); in bond_alb_handle_active_change()
1650 if (curr_active && bond->alb_info.primary_is_promisc) { in bond_alb_handle_active_change()
1652 bond->alb_info.primary_is_promisc = 0; in bond_alb_handle_active_change()
1653 bond->alb_info.rlb_promisc_timeout_counter = 0; in bond_alb_handle_active_change()
1657 rcu_assign_pointer(bond->curr_active_slave, new_slave); in bond_alb_handle_active_change()
1659 if (!new_slave || !bond_has_slaves(bond)) in bond_alb_handle_active_change()
1666 swap_slave = bond_slave_has_mac(bond, bond->dev->dev_addr); in bond_alb_handle_active_change()
1673 tlb_clear_slave(bond, swap_slave, 1); in bond_alb_handle_active_change()
1674 tlb_clear_slave(bond, new_slave, 1); in bond_alb_handle_active_change()
1679 if (BOND_MODE(bond) == BOND_MODE_TLB) { in bond_alb_handle_active_change()
1685 memcpy(sa.sa_data, bond->dev->dev_addr, bond->dev->addr_len); in bond_alb_handle_active_change()
1686 sa.sa_family = bond->dev->type; in bond_alb_handle_active_change()
1697 alb_fasten_mac_swap(bond, swap_slave, new_slave); in bond_alb_handle_active_change()
1700 alb_set_slave_mac_addr(new_slave, bond->dev->dev_addr); in bond_alb_handle_active_change()
1701 alb_send_learning_packets(new_slave, bond->dev->dev_addr, in bond_alb_handle_active_change()
1709 struct bonding *bond = netdev_priv(bond_dev); in bond_alb_set_mac_address() local
1718 res = alb_set_mac_address(bond, addr); in bond_alb_set_mac_address()
1728 curr_active = rtnl_dereference(bond->curr_active_slave); in bond_alb_set_mac_address()
1732 swap_slave = bond_slave_has_mac(bond, bond_dev->dev_addr); in bond_alb_set_mac_address()
1736 alb_fasten_mac_swap(bond, swap_slave, curr_active); in bond_alb_set_mac_address()
1742 if (bond->alb_info.rlb_enabled) { in bond_alb_set_mac_address()
1744 rlb_req_update_slave_clients(bond, curr_active); in bond_alb_set_mac_address()
1751 void bond_alb_clear_vlan(struct bonding *bond, unsigned short vlan_id) in bond_alb_clear_vlan() argument
1753 if (bond->alb_info.rlb_enabled) in bond_alb_clear_vlan()
1754 rlb_clear_vlan(bond, vlan_id); in bond_alb_clear_vlan()