Lines Matching refs:bond
258 static bool bond_time_in_interval(struct bonding *bond, unsigned long last_act,
289 netdev_tx_t bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb, in bond_dev_queue_xmit() argument
298 if (unlikely(netpoll_tx_running(bond->dev))) in bond_dev_queue_xmit()
299 return bond_netpoll_send_skb(bond_get_slave_by_dev(bond, slave_dev), skb); in bond_dev_queue_xmit()
331 struct bonding *bond = netdev_priv(bond_dev); in bond_vlan_rx_add_vid() local
336 bond_for_each_slave(bond, slave, iter) { in bond_vlan_rx_add_vid()
346 bond_for_each_slave(bond, rollback_slave, iter) { in bond_vlan_rx_add_vid()
365 struct bonding *bond = netdev_priv(bond_dev); in bond_vlan_rx_kill_vid() local
369 bond_for_each_slave(bond, slave, iter) in bond_vlan_rx_kill_vid()
372 if (bond_is_lb(bond)) in bond_vlan_rx_kill_vid()
373 bond_alb_clear_vlan(bond, vid); in bond_vlan_rx_kill_vid()
389 struct bonding *bond; in bond_ipsec_add_sa() local
397 bond = netdev_priv(bond_dev); in bond_ipsec_add_sa()
398 slave = rcu_dereference(bond->curr_active_slave); in bond_ipsec_add_sa()
423 spin_lock_bh(&bond->ipsec_lock); in bond_ipsec_add_sa()
424 list_add(&ipsec->list, &bond->ipsec_list); in bond_ipsec_add_sa()
425 spin_unlock_bh(&bond->ipsec_lock); in bond_ipsec_add_sa()
433 static void bond_ipsec_add_sa_all(struct bonding *bond) in bond_ipsec_add_sa_all() argument
435 struct net_device *bond_dev = bond->dev; in bond_ipsec_add_sa_all()
440 slave = rcu_dereference(bond->curr_active_slave); in bond_ipsec_add_sa_all()
447 spin_lock_bh(&bond->ipsec_lock); in bond_ipsec_add_sa_all()
448 if (!list_empty(&bond->ipsec_list)) in bond_ipsec_add_sa_all()
452 spin_unlock_bh(&bond->ipsec_lock); in bond_ipsec_add_sa_all()
456 spin_lock_bh(&bond->ipsec_lock); in bond_ipsec_add_sa_all()
457 list_for_each_entry(ipsec, &bond->ipsec_list, list) { in bond_ipsec_add_sa_all()
464 spin_unlock_bh(&bond->ipsec_lock); in bond_ipsec_add_sa_all()
477 struct bonding *bond; in bond_ipsec_del_sa() local
484 bond = netdev_priv(bond_dev); in bond_ipsec_del_sa()
485 slave = rcu_dereference(bond->curr_active_slave); in bond_ipsec_del_sa()
504 spin_lock_bh(&bond->ipsec_lock); in bond_ipsec_del_sa()
505 list_for_each_entry(ipsec, &bond->ipsec_list, list) { in bond_ipsec_del_sa()
512 spin_unlock_bh(&bond->ipsec_lock); in bond_ipsec_del_sa()
516 static void bond_ipsec_del_sa_all(struct bonding *bond) in bond_ipsec_del_sa_all() argument
518 struct net_device *bond_dev = bond->dev; in bond_ipsec_del_sa_all()
523 slave = rcu_dereference(bond->curr_active_slave); in bond_ipsec_del_sa_all()
529 spin_lock_bh(&bond->ipsec_lock); in bond_ipsec_del_sa_all()
530 list_for_each_entry(ipsec, &bond->ipsec_list, list) { in bond_ipsec_del_sa_all()
545 spin_unlock_bh(&bond->ipsec_lock); in bond_ipsec_del_sa_all()
559 struct bonding *bond; in bond_ipsec_offload_ok() local
562 bond = netdev_priv(bond_dev); in bond_ipsec_offload_ok()
564 curr_active = rcu_dereference(bond->curr_active_slave); in bond_ipsec_offload_ok()
567 if (BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP) { in bond_ipsec_offload_ok()
605 int bond_set_carrier(struct bonding *bond) in bond_set_carrier() argument
610 if (!bond_has_slaves(bond)) in bond_set_carrier()
613 if (BOND_MODE(bond) == BOND_MODE_8023AD) in bond_set_carrier()
614 return bond_3ad_set_carrier(bond); in bond_set_carrier()
616 bond_for_each_slave(bond, slave, iter) { in bond_set_carrier()
618 if (!netif_carrier_ok(bond->dev)) { in bond_set_carrier()
619 netif_carrier_on(bond->dev); in bond_set_carrier()
627 if (netif_carrier_ok(bond->dev)) { in bond_set_carrier()
628 netif_carrier_off(bond->dev); in bond_set_carrier()
699 static int bond_check_dev_link(struct bonding *bond, in bond_check_dev_link() argument
710 if (bond->params.use_carrier) in bond_check_dev_link()
754 static int bond_set_promiscuity(struct bonding *bond, int inc) in bond_set_promiscuity() argument
759 if (bond_uses_primary(bond)) { in bond_set_promiscuity()
760 struct slave *curr_active = rtnl_dereference(bond->curr_active_slave); in bond_set_promiscuity()
767 bond_for_each_slave(bond, slave, iter) { in bond_set_promiscuity()
777 static int bond_set_allmulti(struct bonding *bond, int inc) in bond_set_allmulti() argument
782 if (bond_uses_primary(bond)) { in bond_set_allmulti()
783 struct slave *curr_active = rtnl_dereference(bond->curr_active_slave); in bond_set_allmulti()
790 bond_for_each_slave(bond, slave, iter) { in bond_set_allmulti()
805 struct bonding *bond = container_of(work, struct bonding, in bond_resend_igmp_join_requests_delayed() local
809 queue_delayed_work(bond->wq, &bond->mcast_work, 1); in bond_resend_igmp_join_requests_delayed()
812 call_netdevice_notifiers(NETDEV_RESEND_IGMP, bond->dev); in bond_resend_igmp_join_requests_delayed()
814 if (bond->igmp_retrans > 1) { in bond_resend_igmp_join_requests_delayed()
815 bond->igmp_retrans--; in bond_resend_igmp_join_requests_delayed()
816 queue_delayed_work(bond->wq, &bond->mcast_work, HZ/5); in bond_resend_igmp_join_requests_delayed()
825 struct bonding *bond = netdev_priv(bond_dev); in bond_hw_addr_flush() local
830 if (BOND_MODE(bond) == BOND_MODE_8023AD) in bond_hw_addr_flush()
841 static void bond_hw_addr_swap(struct bonding *bond, struct slave *new_active, in bond_hw_addr_swap() argument
845 if (bond->dev->flags & IFF_PROMISC) in bond_hw_addr_swap()
848 if (bond->dev->flags & IFF_ALLMULTI) in bond_hw_addr_swap()
851 if (bond->dev->flags & IFF_UP) in bond_hw_addr_swap()
852 bond_hw_addr_flush(bond->dev, old_active->dev); in bond_hw_addr_swap()
857 if (bond->dev->flags & IFF_PROMISC) in bond_hw_addr_swap()
860 if (bond->dev->flags & IFF_ALLMULTI) in bond_hw_addr_swap()
863 if (bond->dev->flags & IFF_UP) { in bond_hw_addr_swap()
864 netif_addr_lock_bh(bond->dev); in bond_hw_addr_swap()
865 dev_uc_sync(new_active->dev, bond->dev); in bond_hw_addr_swap()
866 dev_mc_sync(new_active->dev, bond->dev); in bond_hw_addr_swap()
867 netif_addr_unlock_bh(bond->dev); in bond_hw_addr_swap()
896 static struct slave *bond_get_old_active(struct bonding *bond, in bond_get_old_active() argument
902 bond_for_each_slave(bond, slave, iter) { in bond_get_old_active()
906 if (ether_addr_equal(bond->dev->dev_addr, slave->dev->dev_addr)) in bond_get_old_active()
919 static void bond_do_fail_over_mac(struct bonding *bond, in bond_do_fail_over_mac() argument
927 switch (bond->params.fail_over_mac) { in bond_do_fail_over_mac()
930 rv = bond_set_dev_addr(bond->dev, new_active->dev); in bond_do_fail_over_mac()
932 slave_err(bond->dev, new_active->dev, "Error %d setting bond MAC from slave\n", in bond_do_fail_over_mac()
945 old_active = bond_get_old_active(bond, new_active); in bond_do_fail_over_mac()
955 bond_hw_addr_copy(ss.__data, bond->dev->dev_addr, in bond_do_fail_over_mac()
956 bond->dev->addr_len); in bond_do_fail_over_mac()
957 ss.ss_family = bond->dev->type; in bond_do_fail_over_mac()
963 slave_err(bond->dev, new_active->dev, "Error %d setting MAC of new active slave\n", in bond_do_fail_over_mac()
978 slave_err(bond->dev, old_active->dev, "Error %d setting MAC of old active slave\n", in bond_do_fail_over_mac()
983 netdev_err(bond->dev, "bond_do_fail_over_mac impossible: bad policy %d\n", in bond_do_fail_over_mac()
984 bond->params.fail_over_mac); in bond_do_fail_over_mac()
990 static struct slave *bond_choose_primary_or_current(struct bonding *bond) in bond_choose_primary_or_current() argument
992 struct slave *prim = rtnl_dereference(bond->primary_slave); in bond_choose_primary_or_current()
993 struct slave *curr = rtnl_dereference(bond->curr_active_slave); in bond_choose_primary_or_current()
1001 if (bond->force_primary) { in bond_choose_primary_or_current()
1002 bond->force_primary = false; in bond_choose_primary_or_current()
1010 switch (bond->params.primary_reselect) { in bond_choose_primary_or_current()
1022 netdev_err(bond->dev, "impossible primary_reselect %d\n", in bond_choose_primary_or_current()
1023 bond->params.primary_reselect); in bond_choose_primary_or_current()
1032 static struct slave *bond_find_best_slave(struct bonding *bond) in bond_find_best_slave() argument
1036 int mintime = bond->params.updelay; in bond_find_best_slave()
1038 slave = bond_choose_primary_or_current(bond); in bond_find_best_slave()
1042 bond_for_each_slave(bond, slave, iter) { in bond_find_best_slave()
1055 static bool bond_should_notify_peers(struct bonding *bond) in bond_should_notify_peers() argument
1060 slave = rcu_dereference(bond->curr_active_slave); in bond_should_notify_peers()
1063 if (!slave || !bond->send_peer_notif || in bond_should_notify_peers()
1064 bond->send_peer_notif % in bond_should_notify_peers()
1065 max(1, bond->params.peer_notif_delay) != 0 || in bond_should_notify_peers()
1066 !netif_carrier_ok(bond->dev) || in bond_should_notify_peers()
1070 netdev_dbg(bond->dev, "bond_should_notify_peers: slave %s\n", in bond_should_notify_peers()
1091 void bond_change_active_slave(struct bonding *bond, struct slave *new_active) in bond_change_active_slave() argument
1097 old_active = rtnl_dereference(bond->curr_active_slave); in bond_change_active_slave()
1103 bond_ipsec_del_sa_all(bond); in bond_change_active_slave()
1110 if (bond_uses_primary(bond)) { in bond_change_active_slave()
1111 slave_info(bond->dev, new_active->dev, "making interface the new active one %d ms earlier\n", in bond_change_active_slave()
1112 (bond->params.updelay - new_active->delay) * bond->params.miimon); in bond_change_active_slave()
1119 if (BOND_MODE(bond) == BOND_MODE_8023AD) in bond_change_active_slave()
1122 if (bond_is_lb(bond)) in bond_change_active_slave()
1123 bond_alb_handle_link_change(bond, new_active, BOND_LINK_UP); in bond_change_active_slave()
1125 if (bond_uses_primary(bond)) { in bond_change_active_slave()
1126 slave_info(bond->dev, new_active->dev, "making interface the new active one\n"); in bond_change_active_slave()
1131 if (bond_uses_primary(bond)) in bond_change_active_slave()
1132 bond_hw_addr_swap(bond, new_active, old_active); in bond_change_active_slave()
1134 if (bond_is_lb(bond)) { in bond_change_active_slave()
1135 bond_alb_handle_active_change(bond, new_active); in bond_change_active_slave()
1143 rcu_assign_pointer(bond->curr_active_slave, new_active); in bond_change_active_slave()
1146 if (BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP) { in bond_change_active_slave()
1157 if (bond->params.fail_over_mac) in bond_change_active_slave()
1158 bond_do_fail_over_mac(bond, new_active, in bond_change_active_slave()
1161 if (netif_running(bond->dev)) { in bond_change_active_slave()
1162 bond->send_peer_notif = in bond_change_active_slave()
1163 bond->params.num_peer_notif * in bond_change_active_slave()
1164 max(1, bond->params.peer_notif_delay); in bond_change_active_slave()
1166 bond_should_notify_peers(bond); in bond_change_active_slave()
1169 call_netdevice_notifiers(NETDEV_BONDING_FAILOVER, bond->dev); in bond_change_active_slave()
1171 bond->send_peer_notif--; in bond_change_active_slave()
1173 bond->dev); in bond_change_active_slave()
1179 bond_ipsec_add_sa_all(bond); in bond_change_active_slave()
1187 if (netif_running(bond->dev) && (bond->params.resend_igmp > 0) && in bond_change_active_slave()
1188 ((bond_uses_primary(bond) && new_active) || in bond_change_active_slave()
1189 BOND_MODE(bond) == BOND_MODE_ROUNDROBIN)) { in bond_change_active_slave()
1190 bond->igmp_retrans = bond->params.resend_igmp; in bond_change_active_slave()
1191 queue_delayed_work(bond->wq, &bond->mcast_work, 1); in bond_change_active_slave()
1206 void bond_select_active_slave(struct bonding *bond) in bond_select_active_slave() argument
1213 best_slave = bond_find_best_slave(bond); in bond_select_active_slave()
1214 if (best_slave != rtnl_dereference(bond->curr_active_slave)) { in bond_select_active_slave()
1215 bond_change_active_slave(bond, best_slave); in bond_select_active_slave()
1216 rv = bond_set_carrier(bond); in bond_select_active_slave()
1220 if (netif_carrier_ok(bond->dev)) in bond_select_active_slave()
1221 netdev_info(bond->dev, "active interface up!\n"); in bond_select_active_slave()
1223 netdev_info(bond->dev, "now running without any active interface!\n"); in bond_select_active_slave()
1261 struct bonding *bond = netdev_priv(bond_dev); in bond_poll_controller() local
1266 if (BOND_MODE(bond) == BOND_MODE_8023AD) in bond_poll_controller()
1267 if (bond_3ad_get_active_agg_info(bond, &ad_info)) in bond_poll_controller()
1270 bond_for_each_slave_rcu(bond, slave, iter) { in bond_poll_controller()
1274 if (BOND_MODE(bond) == BOND_MODE_8023AD) { in bond_poll_controller()
1289 struct bonding *bond = netdev_priv(bond_dev); in bond_netpoll_cleanup() local
1293 bond_for_each_slave(bond, slave, iter) in bond_netpoll_cleanup()
1300 struct bonding *bond = netdev_priv(dev); in bond_netpoll_setup() local
1305 bond_for_each_slave(bond, slave, iter) { in bond_netpoll_setup()
1332 struct bonding *bond = netdev_priv(dev); in bond_fix_features() local
1342 bond_for_each_slave(bond, slave, iter) { in bond_fix_features()
1363 static void bond_compute_features(struct bonding *bond) in bond_compute_features() argument
1373 struct net_device *bond_dev = bond->dev; in bond_compute_features()
1380 if (!bond_has_slaves(bond)) in bond_compute_features()
1385 bond_for_each_slave(bond, slave, iter) { in bond_compute_features()
1452 struct bonding *bond) in bond_should_deliver_exact_match() argument
1455 if (BOND_MODE(bond) == BOND_MODE_ALB && in bond_should_deliver_exact_match()
1468 struct bonding *bond; in bond_handle_frame() local
1480 bond = slave->bond; in bond_handle_frame()
1482 recv_probe = READ_ONCE(bond->recv_probe); in bond_handle_frame()
1484 ret = recv_probe(skb, bond, slave); in bond_handle_frame()
1502 if (bond_should_deliver_exact_match(skb, slave, bond)) { in bond_handle_frame()
1508 skb->dev = bond->dev; in bond_handle_frame()
1510 if (BOND_MODE(bond) == BOND_MODE_ALB && in bond_handle_frame()
1511 netif_is_bridge_port(bond->dev) && in bond_handle_frame()
1519 bond_hw_addr_copy(eth_hdr(skb)->h_dest, bond->dev->dev_addr, in bond_handle_frame()
1520 bond->dev->addr_len); in bond_handle_frame()
1526 static enum netdev_lag_tx_type bond_lag_tx_type(struct bonding *bond) in bond_lag_tx_type() argument
1528 switch (BOND_MODE(bond)) { in bond_lag_tx_type()
1543 static enum netdev_lag_hash bond_lag_hash_type(struct bonding *bond, in bond_lag_hash_type() argument
1549 switch (bond->params.xmit_policy) { in bond_lag_hash_type()
1565 static int bond_master_upper_dev_link(struct bonding *bond, struct slave *slave, in bond_master_upper_dev_link() argument
1571 type = bond_lag_tx_type(bond); in bond_master_upper_dev_link()
1573 lag_upper_info.hash_type = bond_lag_hash_type(bond, type); in bond_master_upper_dev_link()
1575 return netdev_master_upper_dev_link(slave->dev, bond->dev, slave, in bond_master_upper_dev_link()
1579 static void bond_upper_dev_unlink(struct bonding *bond, struct slave *slave) in bond_upper_dev_unlink() argument
1581 netdev_upper_dev_unlink(slave->dev, bond->dev); in bond_upper_dev_unlink()
1588 struct bonding *bond = bond_get_bond_by_slave(slave); in slave_kobj_release() local
1591 if (BOND_MODE(bond) == BOND_MODE_8023AD) in slave_kobj_release()
1616 static struct slave *bond_alloc_slave(struct bonding *bond, in bond_alloc_slave() argument
1625 slave->bond = bond; in bond_alloc_slave()
1632 if (BOND_MODE(bond) == BOND_MODE_8023AD) { in bond_alloc_slave()
1644 static void bond_fill_ifbond(struct bonding *bond, struct ifbond *info) in bond_fill_ifbond() argument
1646 info->bond_mode = BOND_MODE(bond); in bond_fill_ifbond()
1647 info->miimon = bond->params.miimon; in bond_fill_ifbond()
1648 info->num_slaves = bond->slave_cnt; in bond_fill_ifbond()
1668 bond_fill_ifbond(slave->bond, &binfo.master); in bond_netdev_notify_work()
1672 queue_delayed_work(slave->bond->wq, &slave->notify_work, 1); in bond_netdev_notify_work()
1678 queue_delayed_work(slave->bond->wq, &slave->notify_work, 0); in bond_queue_slave_event()
1695 struct bonding *bond = netdev_priv(bond_dev); in bond_enslave() local
1702 if (!bond->params.use_carrier && in bond_enslave()
1758 if (!bond_has_slaves(bond)) { in bond_enslave()
1793 BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP) { in bond_enslave()
1804 if (BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP && in bond_enslave()
1805 bond->params.fail_over_mac != BOND_FOM_ACTIVE) { in bond_enslave()
1806 if (!bond_has_slaves(bond)) { in bond_enslave()
1807 bond->params.fail_over_mac = BOND_FOM_ACTIVE; in bond_enslave()
1823 if (!bond_has_slaves(bond) && in bond_enslave()
1824 bond->dev->addr_assign_type == NET_ADDR_RANDOM) { in bond_enslave()
1825 res = bond_set_dev_addr(bond->dev, slave_dev); in bond_enslave()
1830 new_slave = bond_alloc_slave(bond, slave_dev); in bond_enslave()
1843 res = dev_set_mtu(slave_dev, bond->dev->mtu); in bond_enslave()
1856 if (!bond->params.fail_over_mac || in bond_enslave()
1857 BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP) { in bond_enslave()
1885 if (bond_is_lb(bond)) { in bond_enslave()
1889 res = bond_alb_init_slave(bond, new_slave); in bond_enslave()
1900 prev_slave = bond_last_slave(bond); in bond_enslave()
1906 bond_needs_speed_duplex(bond)) in bond_enslave()
1910 (msecs_to_jiffies(bond->params.arp_interval) + 1); in bond_enslave()
1914 if (bond->params.miimon && !bond->params.use_carrier) { in bond_enslave()
1915 link_reporting = bond_check_dev_link(bond, slave_dev, 1); in bond_enslave()
1917 if ((link_reporting == -1) && !bond->params.arp_interval) { in bond_enslave()
1935 if (bond->params.miimon) { in bond_enslave()
1936 if (bond_check_dev_link(bond, slave_dev, 0) == BMSR_LSTATUS) { in bond_enslave()
1937 if (bond->params.updelay) { in bond_enslave()
1941 new_slave->delay = bond->params.updelay; in bond_enslave()
1951 } else if (bond->params.arp_interval) { in bond_enslave()
1967 if (bond_uses_primary(bond) && bond->params.primary[0]) { in bond_enslave()
1969 if (strcmp(bond->params.primary, new_slave->dev->name) == 0) { in bond_enslave()
1970 rcu_assign_pointer(bond->primary_slave, new_slave); in bond_enslave()
1971 bond->force_primary = true; in bond_enslave()
1975 switch (BOND_MODE(bond)) { in bond_enslave()
1992 bond_3ad_initialize(bond, 1000/AD_TIMER_INTERVAL); in bond_enslave()
2015 if (!rcu_access_pointer(bond->curr_active_slave) && in bond_enslave()
2017 rcu_assign_pointer(bond->curr_active_slave, new_slave); in bond_enslave()
2023 if (bond->dev->npinfo) { in bond_enslave()
2042 res = bond_master_upper_dev_link(bond, new_slave, extack); in bond_enslave()
2057 if (!bond_uses_primary(bond)) { in bond_enslave()
2081 if (BOND_MODE(bond) == BOND_MODE_8023AD) in bond_enslave()
2086 bond->slave_cnt++; in bond_enslave()
2087 bond_compute_features(bond); in bond_enslave()
2088 bond_set_carrier(bond); in bond_enslave()
2090 if (bond_uses_primary(bond)) { in bond_enslave()
2092 bond_select_active_slave(bond); in bond_enslave()
2096 if (bond_mode_can_use_xmit_hash(bond)) in bond_enslave()
2097 bond_update_slave_arr(bond, NULL); in bond_enslave()
2113 bond_upper_dev_unlink(bond, new_slave); in bond_enslave()
2120 if (rcu_access_pointer(bond->primary_slave) == new_slave) in bond_enslave()
2121 RCU_INIT_POINTER(bond->primary_slave, NULL); in bond_enslave()
2122 if (rcu_access_pointer(bond->curr_active_slave) == new_slave) { in bond_enslave()
2124 bond_change_active_slave(bond, NULL); in bond_enslave()
2125 bond_select_active_slave(bond); in bond_enslave()
2139 if (!bond->params.fail_over_mac || in bond_enslave()
2140 BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP) { in bond_enslave()
2159 if (!bond_has_slaves(bond)) { in bond_enslave()
2189 struct bonding *bond = netdev_priv(bond_dev); in __bond_release_one() local
2204 slave = bond_get_slave_by_dev(bond, slave_dev); in __bond_release_one()
2217 bond_get_stats(bond->dev, &bond->bond_stats); in __bond_release_one()
2224 if (BOND_MODE(bond) == BOND_MODE_8023AD) in __bond_release_one()
2227 bond_upper_dev_unlink(bond, slave); in __bond_release_one()
2229 if (bond_mode_can_use_xmit_hash(bond)) in __bond_release_one()
2230 bond_update_slave_arr(bond, slave); in __bond_release_one()
2235 oldcurrent = rcu_access_pointer(bond->curr_active_slave); in __bond_release_one()
2237 RCU_INIT_POINTER(bond->current_arp_slave, NULL); in __bond_release_one()
2239 if (!all && (!bond->params.fail_over_mac || in __bond_release_one()
2240 BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP)) { in __bond_release_one()
2242 bond_has_slaves(bond)) in __bond_release_one()
2247 if (rtnl_dereference(bond->primary_slave) == slave) in __bond_release_one()
2248 RCU_INIT_POINTER(bond->primary_slave, NULL); in __bond_release_one()
2251 bond_change_active_slave(bond, NULL); in __bond_release_one()
2253 if (bond_is_lb(bond)) { in __bond_release_one()
2259 bond_alb_deinit_slave(bond, slave); in __bond_release_one()
2263 RCU_INIT_POINTER(bond->curr_active_slave, NULL); in __bond_release_one()
2269 bond_select_active_slave(bond); in __bond_release_one()
2272 bond_set_carrier(bond); in __bond_release_one()
2273 if (!bond_has_slaves(bond)) in __bond_release_one()
2278 bond->slave_cnt--; in __bond_release_one()
2280 if (!bond_has_slaves(bond)) { in __bond_release_one()
2281 call_netdevice_notifiers(NETDEV_CHANGEADDR, bond->dev); in __bond_release_one()
2282 call_netdevice_notifiers(NETDEV_RELEASE, bond->dev); in __bond_release_one()
2285 bond_compute_features(bond); in __bond_release_one()
2295 if (!bond_uses_primary(bond)) { in __bond_release_one()
2319 if (bond->params.fail_over_mac != BOND_FOM_ACTIVE || in __bond_release_one()
2320 BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP) { in __bond_release_one()
2353 struct bonding *bond = netdev_priv(bond_dev); in bond_release_and_destroy() local
2357 if (ret == 0 && !bond_has_slaves(bond) && in bond_release_and_destroy()
2361 bond_remove_proc_entry(bond); in bond_release_and_destroy()
2369 struct bonding *bond = netdev_priv(bond_dev); in bond_info_query() local
2370 bond_fill_ifbond(bond, info); in bond_info_query()
2375 struct bonding *bond = netdev_priv(bond_dev); in bond_slave_info_query() local
2380 bond_for_each_slave(bond, slave, iter) { in bond_slave_info_query()
2394 static int bond_miimon_inspect(struct bonding *bond) in bond_miimon_inspect() argument
2401 ignore_updelay = !rcu_dereference(bond->curr_active_slave); in bond_miimon_inspect()
2403 bond_for_each_slave_rcu(bond, slave, iter) { in bond_miimon_inspect()
2406 link_state = bond_check_dev_link(bond, slave->dev, 0); in bond_miimon_inspect()
2415 slave->delay = bond->params.downdelay; in bond_miimon_inspect()
2417 slave_info(bond->dev, slave->dev, "link status down for %sinterface, disabling it in %d ms\n", in bond_miimon_inspect()
2418 (BOND_MODE(bond) == in bond_miimon_inspect()
2422 bond->params.downdelay * bond->params.miimon); in bond_miimon_inspect()
2430 slave_info(bond->dev, slave->dev, "link status up again after %d ms\n", in bond_miimon_inspect()
2431 (bond->params.downdelay - slave->delay) * in bond_miimon_inspect()
2432 bond->params.miimon); in bond_miimon_inspect()
2452 slave->delay = bond->params.updelay; in bond_miimon_inspect()
2455 slave_info(bond->dev, slave->dev, "link status up, enabling it in %d ms\n", in bond_miimon_inspect()
2457 bond->params.updelay * in bond_miimon_inspect()
2458 bond->params.miimon); in bond_miimon_inspect()
2464 slave_info(bond->dev, slave->dev, "link status down again after %d ms\n", in bond_miimon_inspect()
2465 (bond->params.updelay - slave->delay) * in bond_miimon_inspect()
2466 bond->params.miimon); in bond_miimon_inspect()
2489 static void bond_miimon_link_change(struct bonding *bond, in bond_miimon_link_change() argument
2493 switch (BOND_MODE(bond)) { in bond_miimon_link_change()
2499 bond_alb_handle_link_change(bond, slave, link); in bond_miimon_link_change()
2502 bond_update_slave_arr(bond, NULL); in bond_miimon_link_change()
2507 static void bond_miimon_commit(struct bonding *bond) in bond_miimon_commit() argument
2512 bond_for_each_slave(bond, slave, iter) { in bond_miimon_commit()
2521 if (BOND_MODE(bond) == BOND_MODE_8023AD && in bond_miimon_commit()
2528 bond_needs_speed_duplex(bond)) { in bond_miimon_commit()
2531 slave_warn(bond->dev, slave->dev, in bond_miimon_commit()
2539 primary = rtnl_dereference(bond->primary_slave); in bond_miimon_commit()
2540 if (BOND_MODE(bond) == BOND_MODE_8023AD) { in bond_miimon_commit()
2543 } else if (BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP) { in bond_miimon_commit()
2548 slave_info(bond->dev, slave->dev, "link status definitely up, %u Mbps %s duplex\n", in bond_miimon_commit()
2552 bond_miimon_link_change(bond, slave, BOND_LINK_UP); in bond_miimon_commit()
2554 if (!bond->curr_active_slave || slave == primary) in bond_miimon_commit()
2566 if (BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP || in bond_miimon_commit()
2567 BOND_MODE(bond) == BOND_MODE_8023AD) in bond_miimon_commit()
2571 slave_info(bond->dev, slave->dev, "link status definitely down, disabling slave\n"); in bond_miimon_commit()
2573 bond_miimon_link_change(bond, slave, BOND_LINK_DOWN); in bond_miimon_commit()
2575 if (slave == rcu_access_pointer(bond->curr_active_slave)) in bond_miimon_commit()
2581 slave_err(bond->dev, slave->dev, "invalid new link %d on slave\n", in bond_miimon_commit()
2590 bond_select_active_slave(bond); in bond_miimon_commit()
2594 bond_set_carrier(bond); in bond_miimon_commit()
2606 struct bonding *bond = container_of(work, struct bonding, in bond_mii_monitor() local
2614 delay = msecs_to_jiffies(bond->params.miimon); in bond_mii_monitor()
2616 if (!bond_has_slaves(bond)) in bond_mii_monitor()
2620 should_notify_peers = bond_should_notify_peers(bond); in bond_mii_monitor()
2621 commit = !!bond_miimon_inspect(bond); in bond_mii_monitor()
2622 if (bond->send_peer_notif) { in bond_mii_monitor()
2625 bond->send_peer_notif--; in bond_mii_monitor()
2640 bond_for_each_slave(bond, slave, iter) { in bond_mii_monitor()
2643 bond_miimon_commit(bond); in bond_mii_monitor()
2649 if (bond->params.miimon) in bond_mii_monitor()
2650 queue_delayed_work(bond->wq, &bond->mii_work, delay); in bond_mii_monitor()
2655 call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, bond->dev); in bond_mii_monitor()
2668 static bool bond_has_this_ip(struct bonding *bond, __be32 ip) in bond_has_this_ip() argument
2675 if (ip == bond_confirm_addr(bond->dev, 0, ip)) in bond_has_this_ip()
2679 if (netdev_walk_all_upper_dev_rcu(bond->dev, bond_upper_dev_walk, &priv)) in bond_has_this_ip()
2696 struct net_device *bond_dev = slave->bond->dev; in bond_arp_send()
2784 static void bond_arp_send_all(struct bonding *bond, struct slave *slave) in bond_arp_send_all() argument
2788 __be32 *targets = bond->params.arp_targets, addr; in bond_arp_send_all()
2792 slave_dbg(bond->dev, slave->dev, "%s: target %pI4\n", in bond_arp_send_all()
2797 rt = ip_route_output(dev_net(bond->dev), targets[i], 0, in bond_arp_send_all()
2803 if (bond->params.arp_validate) in bond_arp_send_all()
2805 bond->dev->name, in bond_arp_send_all()
2813 if (rt->dst.dev == bond->dev) in bond_arp_send_all()
2817 tags = bond_verify_device_path(bond->dev, rt->dst.dev, 0); in bond_arp_send_all()
2824 slave_dbg(bond->dev, slave->dev, "no path to arp_ip_target %pI4 via rt.dev %s\n", in bond_arp_send_all()
2838 static void bond_validate_arp(struct bonding *bond, struct slave *slave, __be32 sip, __be32 tip) in bond_validate_arp() argument
2842 if (!sip || !bond_has_this_ip(bond, tip)) { in bond_validate_arp()
2843 slave_dbg(bond->dev, slave->dev, "%s: sip %pI4 tip %pI4 not found\n", in bond_validate_arp()
2848 i = bond_get_targets_ip(bond->params.arp_targets, sip); in bond_validate_arp()
2850 slave_dbg(bond->dev, slave->dev, "%s: sip %pI4 not found in targets\n", in bond_validate_arp()
2858 int bond_arp_rcv(const struct sk_buff *skb, struct bonding *bond, in bond_arp_rcv() argument
2868 if (!slave_do_arp_validate(bond, slave)) { in bond_arp_rcv()
2869 if ((slave_do_arp_validate_only(bond) && is_arp) || in bond_arp_rcv()
2870 !slave_do_arp_validate_only(bond)) in bond_arp_rcv()
2877 alen = arp_hdr_len(bond->dev); in bond_arp_rcv()
2879 slave_dbg(bond->dev, slave->dev, "%s: skb->dev %s\n", in bond_arp_rcv()
2890 if (arp->ar_hln != bond->dev->addr_len || in bond_arp_rcv()
2899 arp_ptr += bond->dev->addr_len; in bond_arp_rcv()
2901 arp_ptr += 4 + bond->dev->addr_len; in bond_arp_rcv()
2904 slave_dbg(bond->dev, slave->dev, "%s: %s/%d av %d sv %d sip %pI4 tip %pI4\n", in bond_arp_rcv()
2906 bond->params.arp_validate, slave_do_arp_validate(bond, slave), in bond_arp_rcv()
2909 curr_active_slave = rcu_dereference(bond->curr_active_slave); in bond_arp_rcv()
2910 curr_arp_slave = rcu_dereference(bond->current_arp_slave); in bond_arp_rcv()
2936 bond_validate_arp(bond, slave, sip, tip); in bond_arp_rcv()
2938 time_after(slave_last_rx(bond, curr_active_slave), in bond_arp_rcv()
2940 bond_validate_arp(bond, slave, tip, sip); in bond_arp_rcv()
2942 bond_time_in_interval(bond, in bond_arp_rcv()
2944 bond_validate_arp(bond, slave, sip, tip); in bond_arp_rcv()
2956 static bool bond_time_in_interval(struct bonding *bond, unsigned long last_act, in bond_time_in_interval() argument
2959 int delta_in_ticks = msecs_to_jiffies(bond->params.arp_interval); in bond_time_in_interval()
2972 static void bond_loadbalance_arp_mon(struct bonding *bond) in bond_loadbalance_arp_mon() argument
2978 if (!bond_has_slaves(bond)) in bond_loadbalance_arp_mon()
2983 oldcurrent = rcu_dereference(bond->curr_active_slave); in bond_loadbalance_arp_mon()
2992 bond_for_each_slave_rcu(bond, slave, iter) { in bond_loadbalance_arp_mon()
2998 if (bond_time_in_interval(bond, trans_start, 1) && in bond_loadbalance_arp_mon()
2999 bond_time_in_interval(bond, slave->last_rx, 1)) { in bond_loadbalance_arp_mon()
3010 slave_info(bond->dev, slave->dev, "link status definitely up\n"); in bond_loadbalance_arp_mon()
3013 slave_info(bond->dev, slave->dev, "interface is now up\n"); in bond_loadbalance_arp_mon()
3023 if (!bond_time_in_interval(bond, trans_start, 2) || in bond_loadbalance_arp_mon()
3024 !bond_time_in_interval(bond, slave->last_rx, 2)) { in bond_loadbalance_arp_mon()
3032 slave_info(bond->dev, slave->dev, "interface is now down\n"); in bond_loadbalance_arp_mon()
3047 bond_arp_send_all(bond, slave); in bond_loadbalance_arp_mon()
3056 bond_for_each_slave(bond, slave, iter) { in bond_loadbalance_arp_mon()
3062 bond_slave_state_change(bond); in bond_loadbalance_arp_mon()
3063 if (BOND_MODE(bond) == BOND_MODE_XOR) in bond_loadbalance_arp_mon()
3064 bond_update_slave_arr(bond, NULL); in bond_loadbalance_arp_mon()
3068 bond_select_active_slave(bond); in bond_loadbalance_arp_mon()
3075 if (bond->params.arp_interval) in bond_loadbalance_arp_mon()
3076 queue_delayed_work(bond->wq, &bond->arp_work, in bond_loadbalance_arp_mon()
3077 msecs_to_jiffies(bond->params.arp_interval)); in bond_loadbalance_arp_mon()
3087 static int bond_ab_arp_inspect(struct bonding *bond) in bond_ab_arp_inspect() argument
3094 bond_for_each_slave_rcu(bond, slave, iter) { in bond_ab_arp_inspect()
3096 last_rx = slave_last_rx(bond, slave); in bond_ab_arp_inspect()
3099 if (bond_time_in_interval(bond, last_rx, 1)) { in bond_ab_arp_inspect()
3113 if (bond_time_in_interval(bond, slave->last_link_up, 2)) in bond_ab_arp_inspect()
3129 !rcu_access_pointer(bond->current_arp_slave) && in bond_ab_arp_inspect()
3130 !bond_time_in_interval(bond, last_rx, 3)) { in bond_ab_arp_inspect()
3142 (!bond_time_in_interval(bond, trans_start, 2) || in bond_ab_arp_inspect()
3143 !bond_time_in_interval(bond, last_rx, 2))) { in bond_ab_arp_inspect()
3157 static void bond_ab_arp_commit(struct bonding *bond) in bond_ab_arp_commit() argument
3163 bond_for_each_slave(bond, slave, iter) { in bond_ab_arp_commit()
3170 if (rtnl_dereference(bond->curr_active_slave) != slave || in bond_ab_arp_commit()
3171 (!rtnl_dereference(bond->curr_active_slave) && in bond_ab_arp_commit()
3172 bond_time_in_interval(bond, trans_start, 1))) { in bond_ab_arp_commit()
3175 current_arp_slave = rtnl_dereference(bond->current_arp_slave); in bond_ab_arp_commit()
3182 RCU_INIT_POINTER(bond->current_arp_slave, NULL); in bond_ab_arp_commit()
3185 slave_info(bond->dev, slave->dev, "link status definitely up\n"); in bond_ab_arp_commit()
3187 if (!rtnl_dereference(bond->curr_active_slave) || in bond_ab_arp_commit()
3188 slave == rtnl_dereference(bond->primary_slave)) in bond_ab_arp_commit()
3204 slave_info(bond->dev, slave->dev, "link status definitely down, disabling slave\n"); in bond_ab_arp_commit()
3206 if (slave == rtnl_dereference(bond->curr_active_slave)) { in bond_ab_arp_commit()
3207 RCU_INIT_POINTER(bond->current_arp_slave, NULL); in bond_ab_arp_commit()
3222 if (rtnl_dereference(bond->curr_active_slave)) in bond_ab_arp_commit()
3223 RCU_INIT_POINTER(bond->current_arp_slave, NULL); in bond_ab_arp_commit()
3227 slave_err(bond->dev, slave->dev, in bond_ab_arp_commit()
3235 bond_select_active_slave(bond); in bond_ab_arp_commit()
3239 bond_set_carrier(bond); in bond_ab_arp_commit()
3246 static bool bond_ab_arp_probe(struct bonding *bond) in bond_ab_arp_probe() argument
3249 *curr_arp_slave = rcu_dereference(bond->current_arp_slave), in bond_ab_arp_probe()
3250 *curr_active_slave = rcu_dereference(bond->curr_active_slave); in bond_ab_arp_probe()
3256 netdev_info(bond->dev, "PROBE: c_arp %s && cas %s BAD\n", in bond_ab_arp_probe()
3261 bond_arp_send_all(bond, curr_active_slave); in bond_ab_arp_probe()
3271 curr_arp_slave = bond_first_slave_rcu(bond); in bond_ab_arp_probe()
3276 bond_for_each_slave_rcu(bond, slave, iter) { in bond_ab_arp_probe()
3298 slave_info(bond->dev, slave->dev, "backup interface is now down\n"); in bond_ab_arp_probe()
3313 bond_arp_send_all(bond, new_slave); in bond_ab_arp_probe()
3315 rcu_assign_pointer(bond->current_arp_slave, new_slave); in bond_ab_arp_probe()
3318 bond_for_each_slave_rcu(bond, slave, iter) { in bond_ab_arp_probe()
3327 static void bond_activebackup_arp_mon(struct bonding *bond) in bond_activebackup_arp_mon() argument
3333 delta_in_ticks = msecs_to_jiffies(bond->params.arp_interval); in bond_activebackup_arp_mon()
3335 if (!bond_has_slaves(bond)) in bond_activebackup_arp_mon()
3340 should_notify_peers = bond_should_notify_peers(bond); in bond_activebackup_arp_mon()
3342 if (bond_ab_arp_inspect(bond)) { in bond_activebackup_arp_mon()
3352 bond_ab_arp_commit(bond); in bond_activebackup_arp_mon()
3358 should_notify_rtnl = bond_ab_arp_probe(bond); in bond_activebackup_arp_mon()
3362 if (bond->params.arp_interval) in bond_activebackup_arp_mon()
3363 queue_delayed_work(bond->wq, &bond->arp_work, delta_in_ticks); in bond_activebackup_arp_mon()
3370 bond->send_peer_notif--; in bond_activebackup_arp_mon()
3372 bond->dev); in bond_activebackup_arp_mon()
3375 bond_slave_state_notify(bond); in bond_activebackup_arp_mon()
3376 bond_slave_link_notify(bond); in bond_activebackup_arp_mon()
3385 struct bonding *bond = container_of(work, struct bonding, in bond_arp_monitor() local
3388 if (BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP) in bond_arp_monitor()
3389 bond_activebackup_arp_mon(bond); in bond_arp_monitor()
3391 bond_loadbalance_arp_mon(bond); in bond_arp_monitor()
3397 static int bond_event_changename(struct bonding *bond) in bond_event_changename() argument
3399 bond_remove_proc_entry(bond); in bond_event_changename()
3400 bond_create_proc_entry(bond); in bond_event_changename()
3402 bond_debug_reregister(bond); in bond_event_changename()
3437 struct bonding *bond; in bond_slave_netdev_event() local
3449 bond_dev = slave->bond->dev; in bond_slave_netdev_event()
3450 bond = slave->bond; in bond_slave_netdev_event()
3451 primary = rtnl_dereference(bond->primary_slave); in bond_slave_netdev_event()
3472 BOND_MODE(bond) == BOND_MODE_8023AD) { in bond_slave_netdev_event()
3479 if (BOND_MODE(bond) == BOND_MODE_8023AD) in bond_slave_netdev_event()
3491 if (bond_mode_can_use_xmit_hash(bond)) in bond_slave_netdev_event()
3492 bond_update_slave_arr(bond, NULL); in bond_slave_netdev_event()
3509 if (!bond_uses_primary(bond) || in bond_slave_netdev_event()
3510 !bond->params.primary[0]) in bond_slave_netdev_event()
3515 RCU_INIT_POINTER(bond->primary_slave, NULL); in bond_slave_netdev_event()
3516 } else if (!strcmp(slave_dev->name, bond->params.primary)) { in bond_slave_netdev_event()
3518 rcu_assign_pointer(bond->primary_slave, slave); in bond_slave_netdev_event()
3523 netdev_info(bond->dev, "Primary slave changed to %s, reselecting active slave\n", in bond_slave_netdev_event()
3527 bond_select_active_slave(bond); in bond_slave_netdev_event()
3531 bond_compute_features(bond); in bond_slave_netdev_event()
3535 call_netdevice_notifiers(event, slave->bond->dev); in bond_slave_netdev_event()
3625 static bool bond_flow_dissect(struct bonding *bond, struct sk_buff *skb, in bond_flow_dissect() argument
3628 bool l34 = bond->params.xmit_policy == BOND_XMIT_POLICY_LAYER34; in bond_flow_dissect()
3631 if (bond->params.xmit_policy > BOND_XMIT_POLICY_LAYER23) { in bond_flow_dissect()
3677 u32 bond_xmit_hash(struct bonding *bond, struct sk_buff *skb) in bond_xmit_hash() argument
3682 if (bond->params.xmit_policy == BOND_XMIT_POLICY_ENCAP34 && in bond_xmit_hash()
3686 if (bond->params.xmit_policy == BOND_XMIT_POLICY_LAYER2 || in bond_xmit_hash()
3687 !bond_flow_dissect(bond, skb, &flow)) in bond_xmit_hash()
3690 if (bond->params.xmit_policy == BOND_XMIT_POLICY_LAYER23 || in bond_xmit_hash()
3691 bond->params.xmit_policy == BOND_XMIT_POLICY_ENCAP23) { in bond_xmit_hash()
3709 void bond_work_init_all(struct bonding *bond) in bond_work_init_all() argument
3711 INIT_DELAYED_WORK(&bond->mcast_work, in bond_work_init_all()
3713 INIT_DELAYED_WORK(&bond->alb_work, bond_alb_monitor); in bond_work_init_all()
3714 INIT_DELAYED_WORK(&bond->mii_work, bond_mii_monitor); in bond_work_init_all()
3715 INIT_DELAYED_WORK(&bond->arp_work, bond_arp_monitor); in bond_work_init_all()
3716 INIT_DELAYED_WORK(&bond->ad_work, bond_3ad_state_machine_handler); in bond_work_init_all()
3717 INIT_DELAYED_WORK(&bond->slave_arr_work, bond_slave_arr_handler); in bond_work_init_all()
3720 static void bond_work_cancel_all(struct bonding *bond) in bond_work_cancel_all() argument
3722 cancel_delayed_work_sync(&bond->mii_work); in bond_work_cancel_all()
3723 cancel_delayed_work_sync(&bond->arp_work); in bond_work_cancel_all()
3724 cancel_delayed_work_sync(&bond->alb_work); in bond_work_cancel_all()
3725 cancel_delayed_work_sync(&bond->ad_work); in bond_work_cancel_all()
3726 cancel_delayed_work_sync(&bond->mcast_work); in bond_work_cancel_all()
3727 cancel_delayed_work_sync(&bond->slave_arr_work); in bond_work_cancel_all()
3732 struct bonding *bond = netdev_priv(bond_dev); in bond_open() local
3737 if (bond_has_slaves(bond)) { in bond_open()
3738 bond_for_each_slave(bond, slave, iter) { in bond_open()
3739 if (bond_uses_primary(bond) && in bond_open()
3740 slave != rcu_access_pointer(bond->curr_active_slave)) { in bond_open()
3743 } else if (BOND_MODE(bond) != BOND_MODE_8023AD) { in bond_open()
3750 if (bond_is_lb(bond)) { in bond_open()
3754 if (bond_alb_initialize(bond, (BOND_MODE(bond) == BOND_MODE_ALB))) in bond_open()
3756 if (bond->params.tlb_dynamic_lb || BOND_MODE(bond) == BOND_MODE_ALB) in bond_open()
3757 queue_delayed_work(bond->wq, &bond->alb_work, 0); in bond_open()
3760 if (bond->params.miimon) /* link check interval, in milliseconds. */ in bond_open()
3761 queue_delayed_work(bond->wq, &bond->mii_work, 0); in bond_open()
3763 if (bond->params.arp_interval) { /* arp interval, in milliseconds. */ in bond_open()
3764 queue_delayed_work(bond->wq, &bond->arp_work, 0); in bond_open()
3765 bond->recv_probe = bond_arp_rcv; in bond_open()
3768 if (BOND_MODE(bond) == BOND_MODE_8023AD) { in bond_open()
3769 queue_delayed_work(bond->wq, &bond->ad_work, 0); in bond_open()
3771 bond->recv_probe = bond_3ad_lacpdu_recv; in bond_open()
3772 bond_3ad_initiate_agg_selection(bond, 1); in bond_open()
3774 bond_for_each_slave(bond, slave, iter) in bond_open()
3778 if (bond_mode_can_use_xmit_hash(bond)) in bond_open()
3779 bond_update_slave_arr(bond, NULL); in bond_open()
3786 struct bonding *bond = netdev_priv(bond_dev); in bond_close() local
3789 bond_work_cancel_all(bond); in bond_close()
3790 bond->send_peer_notif = 0; in bond_close()
3791 if (bond_is_lb(bond)) in bond_close()
3792 bond_alb_deinitialize(bond); in bond_close()
3793 bond->recv_probe = NULL; in bond_close()
3795 if (bond_uses_primary(bond)) { in bond_close()
3797 slave = rcu_dereference(bond->curr_active_slave); in bond_close()
3804 bond_for_each_slave(bond, slave, iter) in bond_close()
3884 struct bonding *bond = netdev_priv(bond_dev); in bond_get_stats() local
3896 spin_lock_nested(&bond->stats_lock, nest_level); in bond_get_stats()
3897 memcpy(stats, &bond->bond_stats, sizeof(*stats)); in bond_get_stats()
3899 bond_for_each_slave_rcu(bond, slave, iter) { in bond_get_stats()
3909 memcpy(&bond->bond_stats, stats, sizeof(*stats)); in bond_get_stats()
3910 spin_unlock(&bond->stats_lock); in bond_get_stats()
3916 struct bonding *bond = netdev_priv(bond_dev); in bond_do_ioctl() local
3947 if (netif_carrier_ok(bond->dev)) in bond_do_ioctl()
4009 res = __bond_opt_set_notify(bond, BOND_OPT_ACTIVE_SLAVE, in bond_do_ioctl()
4021 struct bonding *bond = netdev_priv(bond_dev); in bond_change_rx_flags() local
4024 bond_set_promiscuity(bond, in bond_change_rx_flags()
4028 bond_set_allmulti(bond, in bond_change_rx_flags()
4034 struct bonding *bond = netdev_priv(bond_dev); in bond_set_rx_mode() local
4039 if (bond_uses_primary(bond)) { in bond_set_rx_mode()
4040 slave = rcu_dereference(bond->curr_active_slave); in bond_set_rx_mode()
4046 bond_for_each_slave_rcu(bond, slave, iter) { in bond_set_rx_mode()
4056 struct bonding *bond = netdev_priv(n->dev); in bond_neigh_init() local
4063 slave = bond_first_slave_rcu(bond); in bond_neigh_init()
4112 struct bonding *bond = netdev_priv(bond_dev); in bond_change_mtu() local
4117 netdev_dbg(bond_dev, "bond=%p, new_mtu=%d\n", bond, new_mtu); in bond_change_mtu()
4119 bond_for_each_slave(bond, slave, iter) { in bond_change_mtu()
4146 bond_for_each_slave(bond, rollback_slave, iter) { in bond_change_mtu()
4169 struct bonding *bond = netdev_priv(bond_dev); in bond_set_mac_address() local
4175 if (BOND_MODE(bond) == BOND_MODE_ALB) in bond_set_mac_address()
4179 netdev_dbg(bond_dev, "%s: bond=%p\n", __func__, bond); in bond_set_mac_address()
4184 if (bond->params.fail_over_mac && in bond_set_mac_address()
4185 BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP) in bond_set_mac_address()
4191 bond_for_each_slave(bond, slave, iter) { in bond_set_mac_address()
4217 bond_for_each_slave(bond, rollback_slave, iter) { in bond_set_mac_address()
4242 static struct slave *bond_get_slave_by_id(struct bonding *bond, in bond_get_slave_by_id() argument
4250 bond_for_each_slave_rcu(bond, slave, iter) { in bond_get_slave_by_id()
4259 bond_for_each_slave_rcu(bond, slave, iter) { in bond_get_slave_by_id()
4277 static u32 bond_rr_gen_slave_id(struct bonding *bond) in bond_rr_gen_slave_id() argument
4281 int packets_per_slave = bond->params.packets_per_slave; in bond_rr_gen_slave_id()
4288 slave_id = bond->rr_tx_counter; in bond_rr_gen_slave_id()
4292 bond->params.reciprocal_packets_per_slave; in bond_rr_gen_slave_id()
4293 slave_id = reciprocal_divide(bond->rr_tx_counter, in bond_rr_gen_slave_id()
4297 bond->rr_tx_counter++; in bond_rr_gen_slave_id()
4302 static struct slave *bond_xmit_roundrobin_slave_get(struct bonding *bond, in bond_xmit_roundrobin_slave_get() argument
4324 slave = rcu_dereference(bond->curr_active_slave); in bond_xmit_roundrobin_slave_get()
4327 return bond_get_slave_by_id(bond, 0); in bond_xmit_roundrobin_slave_get()
4332 slave_cnt = READ_ONCE(bond->slave_cnt); in bond_xmit_roundrobin_slave_get()
4334 slave_id = bond_rr_gen_slave_id(bond) % slave_cnt; in bond_xmit_roundrobin_slave_get()
4335 return bond_get_slave_by_id(bond, slave_id); in bond_xmit_roundrobin_slave_get()
4343 struct bonding *bond = netdev_priv(bond_dev); in bond_xmit_roundrobin() local
4346 slave = bond_xmit_roundrobin_slave_get(bond, skb); in bond_xmit_roundrobin()
4348 return bond_dev_queue_xmit(bond, skb, slave->dev); in bond_xmit_roundrobin()
4353 static struct slave *bond_xmit_activebackup_slave_get(struct bonding *bond, in bond_xmit_activebackup_slave_get() argument
4356 return rcu_dereference(bond->curr_active_slave); in bond_xmit_activebackup_slave_get()
4365 struct bonding *bond = netdev_priv(bond_dev); in bond_xmit_activebackup() local
4368 slave = bond_xmit_activebackup_slave_get(bond, skb); in bond_xmit_activebackup()
4370 return bond_dev_queue_xmit(bond, skb, slave->dev); in bond_xmit_activebackup()
4379 void bond_slave_arr_work_rearm(struct bonding *bond, unsigned long delay) in bond_slave_arr_work_rearm() argument
4381 queue_delayed_work(bond->wq, &bond->slave_arr_work, delay); in bond_slave_arr_work_rearm()
4387 struct bonding *bond = container_of(work, struct bonding, in bond_slave_arr_handler() local
4394 ret = bond_update_slave_arr(bond, NULL); in bond_slave_arr_handler()
4403 bond_slave_arr_work_rearm(bond, 1); in bond_slave_arr_handler()
4429 static void bond_set_slave_arr(struct bonding *bond, in bond_set_slave_arr() argument
4435 usable = rtnl_dereference(bond->usable_slaves); in bond_set_slave_arr()
4436 rcu_assign_pointer(bond->usable_slaves, usable_slaves); in bond_set_slave_arr()
4439 all = rtnl_dereference(bond->all_slaves); in bond_set_slave_arr()
4440 rcu_assign_pointer(bond->all_slaves, all_slaves); in bond_set_slave_arr()
4444 static void bond_reset_slave_arr(struct bonding *bond) in bond_reset_slave_arr() argument
4448 usable = rtnl_dereference(bond->usable_slaves); in bond_reset_slave_arr()
4450 RCU_INIT_POINTER(bond->usable_slaves, NULL); in bond_reset_slave_arr()
4454 all = rtnl_dereference(bond->all_slaves); in bond_reset_slave_arr()
4456 RCU_INIT_POINTER(bond->all_slaves, NULL); in bond_reset_slave_arr()
4469 int bond_update_slave_arr(struct bonding *bond, struct slave *skipslave) in bond_update_slave_arr() argument
4478 WARN_ON(lockdep_is_held(&bond->mode_lock)); in bond_update_slave_arr()
4482 bond->slave_cnt), GFP_KERNEL); in bond_update_slave_arr()
4484 bond->slave_cnt), GFP_KERNEL); in bond_update_slave_arr()
4489 if (BOND_MODE(bond) == BOND_MODE_8023AD) { in bond_update_slave_arr()
4492 if (bond_3ad_get_active_agg_info(bond, &ad_info)) { in bond_update_slave_arr()
4497 bond_reset_slave_arr(bond); in bond_update_slave_arr()
4502 bond_for_each_slave(bond, slave, iter) { in bond_update_slave_arr()
4507 if (BOND_MODE(bond) == BOND_MODE_8023AD) { in bond_update_slave_arr()
4517 slave_dbg(bond->dev, slave->dev, "Adding slave to tx hash array[%d]\n", in bond_update_slave_arr()
4523 bond_set_slave_arr(bond, usable_slaves, all_slaves); in bond_update_slave_arr()
4527 bond_skip_slave(rtnl_dereference(bond->all_slaves), in bond_update_slave_arr()
4529 bond_skip_slave(rtnl_dereference(bond->usable_slaves), in bond_update_slave_arr()
4538 static struct slave *bond_xmit_3ad_xor_slave_get(struct bonding *bond, in bond_xmit_3ad_xor_slave_get() argument
4546 hash = bond_xmit_hash(bond, skb); in bond_xmit_3ad_xor_slave_get()
4562 struct bonding *bond = netdev_priv(dev); in bond_3ad_xor_xmit() local
4566 slaves = rcu_dereference(bond->usable_slaves); in bond_3ad_xor_xmit()
4567 slave = bond_xmit_3ad_xor_slave_get(bond, skb, slaves); in bond_3ad_xor_xmit()
4569 return bond_dev_queue_xmit(bond, skb, slave->dev); in bond_3ad_xor_xmit()
4578 struct bonding *bond = netdev_priv(bond_dev); in bond_xmit_broadcast() local
4584 bond_for_each_slave_rcu(bond, slave, iter) { in bond_xmit_broadcast()
4590 if (bond_is_last_slave(bond, slave)) { in bond_xmit_broadcast()
4602 if (bond_dev_queue_xmit(bond, skb2, slave->dev) == NETDEV_TX_OK) in bond_xmit_broadcast()
4619 static inline int bond_slave_override(struct bonding *bond, in bond_slave_override() argument
4629 bond_for_each_slave_rcu(bond, slave, iter) { in bond_slave_override()
4633 bond_dev_queue_xmit(bond, skb, slave->dev); in bond_slave_override()
4670 struct bonding *bond = netdev_priv(master_dev); in bond_xmit_get_slave() local
4674 switch (BOND_MODE(bond)) { in bond_xmit_get_slave()
4676 slave = bond_xmit_roundrobin_slave_get(bond, skb); in bond_xmit_get_slave()
4679 slave = bond_xmit_activebackup_slave_get(bond, skb); in bond_xmit_get_slave()
4684 slaves = rcu_dereference(bond->all_slaves); in bond_xmit_get_slave()
4686 slaves = rcu_dereference(bond->usable_slaves); in bond_xmit_get_slave()
4687 slave = bond_xmit_3ad_xor_slave_get(bond, skb, slaves); in bond_xmit_get_slave()
4692 slave = bond_xmit_alb_slave_get(bond, skb); in bond_xmit_get_slave()
4695 slave = bond_xmit_tlb_slave_get(bond, skb); in bond_xmit_get_slave()
4710 struct bonding *bond = netdev_priv(dev); in __bond_start_xmit() local
4712 if (bond_should_override_tx_queue(bond) && in __bond_start_xmit()
4713 !bond_slave_override(bond, skb)) in __bond_start_xmit()
4716 switch (BOND_MODE(bond)) { in __bond_start_xmit()
4732 netdev_err(dev, "Unknown bonding mode %d\n", BOND_MODE(bond)); in __bond_start_xmit()
4740 struct bonding *bond = netdev_priv(dev); in bond_start_xmit() local
4750 if (bond_has_slaves(bond)) in bond_start_xmit()
4772 struct bonding *bond = netdev_priv(bond_dev); in bond_ethtool_get_link_ksettings() local
4785 bond_for_each_slave(bond, slave, iter) { in bond_ethtool_get_link_ksettings()
4788 if (BOND_MODE(bond) == BOND_MODE_BROADCAST) in bond_ethtool_get_link_ksettings()
4852 struct bonding *bond = netdev_priv(bond_dev); in bond_destructor() local
4853 if (bond->wq) in bond_destructor()
4854 destroy_workqueue(bond->wq); in bond_destructor()
4859 struct bonding *bond = netdev_priv(bond_dev); in bond_setup() local
4861 spin_lock_init(&bond->mode_lock); in bond_setup()
4862 bond->params = bonding_defaults; in bond_setup()
4865 bond->dev = bond_dev; in bond_setup()
4886 INIT_LIST_HEAD(&bond->ipsec_list); in bond_setup()
4887 spin_lock_init(&bond->ipsec_lock); in bond_setup()
4915 if (BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP) in bond_setup()
4925 struct bonding *bond = netdev_priv(bond_dev); in bond_uninit() local
4933 bond_for_each_slave(bond, slave, iter) in bond_uninit()
4937 usable = rtnl_dereference(bond->usable_slaves); in bond_uninit()
4939 RCU_INIT_POINTER(bond->usable_slaves, NULL); in bond_uninit()
4943 all = rtnl_dereference(bond->all_slaves); in bond_uninit()
4945 RCU_INIT_POINTER(bond->all_slaves, NULL); in bond_uninit()
4949 list_del(&bond->bond_list); in bond_uninit()
4951 bond_debug_unregister(bond); in bond_uninit()
5345 struct bonding *bond = netdev_priv(bond_dev); in bond_init() local
5350 bond->wq = alloc_ordered_workqueue(bond_dev->name, WQ_MEM_RECLAIM); in bond_init()
5351 if (!bond->wq) in bond_init()
5354 spin_lock_init(&bond->stats_lock); in bond_init()
5357 list_add_tail(&bond->bond_list, &bn->dev_list); in bond_init()
5359 bond_prepare_sysfs_group(bond); in bond_init()
5361 bond_debug_register(bond); in bond_init()
5384 struct bonding *bond; in bond_create() local
5403 bond = netdev_priv(bond_dev); in bond_create()
5404 bond_info = &(BOND_ALB_INFO(bond)); in bond_create()
5420 bond_work_init_all(bond); in bond_create()
5442 struct bonding *bond, *tmp_bond; in bond_net_exit() local
5449 list_for_each_entry_safe(bond, tmp_bond, &bn->dev_list, bond_list) in bond_net_exit()
5450 unregister_netdevice_queue(bond->dev, &list); in bond_net_exit()