Lines Matching full:team

3  * drivers/net/team/team.c - Network team device driver
33 #define DRV_NAME "team"
66 static int team_port_set_team_dev_addr(struct team *team, in team_port_set_team_dev_addr() argument
69 return __set_port_dev_addr(port->dev, team->dev->dev_addr); in team_port_set_team_dev_addr()
72 int team_modeop_port_enter(struct team *team, struct team_port *port) in team_modeop_port_enter() argument
74 return team_port_set_team_dev_addr(team, port); in team_modeop_port_enter()
78 void team_modeop_port_change_dev_addr(struct team *team, in team_modeop_port_change_dev_addr() argument
81 team_port_set_team_dev_addr(team, port); in team_modeop_port_change_dev_addr()
119 static struct team_option *__team_find_option(struct team *team, in __team_find_option() argument
124 list_for_each_entry(option, &team->option_list, list) { in __team_find_option()
137 static void __team_option_inst_del_option(struct team *team, in __team_option_inst_del_option() argument
142 list_for_each_entry_safe(opt_inst, tmp, &team->option_inst_list, list) { in __team_option_inst_del_option()
148 static int __team_option_inst_add(struct team *team, struct team_option *option, in __team_option_inst_add() argument
168 list_add_tail(&opt_inst->list, &team->option_inst_list); in __team_option_inst_add()
170 option->init(team, &opt_inst->info); in __team_option_inst_add()
176 static int __team_option_inst_add_option(struct team *team, in __team_option_inst_add_option() argument
182 err = __team_option_inst_add(team, option, NULL); in __team_option_inst_add_option()
189 __team_option_inst_del_option(team, option); in __team_option_inst_add_option()
193 static void __team_option_inst_mark_removed_option(struct team *team, in __team_option_inst_mark_removed_option() argument
198 list_for_each_entry(opt_inst, &team->option_inst_list, list) { in __team_option_inst_mark_removed_option()
206 static void __team_option_inst_del_port(struct team *team, in __team_option_inst_del_port() argument
211 list_for_each_entry_safe(opt_inst, tmp, &team->option_inst_list, list) { in __team_option_inst_del_port()
218 static int __team_option_inst_add_port(struct team *team, in __team_option_inst_add_port() argument
224 list_for_each_entry(option, &team->option_list, list) { in __team_option_inst_add_port()
227 err = __team_option_inst_add(team, option, port); in __team_option_inst_add_port()
234 __team_option_inst_del_port(team, port); in __team_option_inst_add_port()
238 static void __team_option_inst_mark_removed_port(struct team *team, in __team_option_inst_mark_removed_port() argument
243 list_for_each_entry(opt_inst, &team->option_inst_list, list) { in __team_option_inst_mark_removed_port()
251 static int __team_options_register(struct team *team, in __team_options_register() argument
264 if (__team_find_option(team, option->name)) { in __team_options_register()
276 err = __team_option_inst_add_option(team, dst_opts[i]); in __team_options_register()
279 list_add_tail(&dst_opts[i]->list, &team->option_list); in __team_options_register()
287 __team_option_inst_del_option(team, dst_opts[i]); in __team_options_register()
300 static void __team_options_mark_removed(struct team *team, in __team_options_mark_removed() argument
309 del_opt = __team_find_option(team, option->name); in __team_options_mark_removed()
311 __team_option_inst_mark_removed_option(team, del_opt); in __team_options_mark_removed()
315 static void __team_options_unregister(struct team *team, in __team_options_unregister() argument
324 del_opt = __team_find_option(team, option->name); in __team_options_unregister()
326 __team_option_inst_del_option(team, del_opt); in __team_options_unregister()
333 static void __team_options_change_check(struct team *team);
335 int team_options_register(struct team *team, in team_options_register() argument
341 err = __team_options_register(team, option, option_count); in team_options_register()
344 __team_options_change_check(team); in team_options_register()
349 void team_options_unregister(struct team *team, in team_options_unregister() argument
353 __team_options_mark_removed(team, option, option_count); in team_options_unregister()
354 __team_options_change_check(team); in team_options_unregister()
355 __team_options_unregister(team, option, option_count); in team_options_unregister()
359 static int team_option_get(struct team *team, in team_option_get() argument
366 opt_inst->option->getter(team, ctx); in team_option_get()
370 static int team_option_set(struct team *team, in team_option_set() argument
376 return opt_inst->option->setter(team, ctx); in team_option_set()
388 void team_options_change_check(struct team *team) in team_options_change_check() argument
390 __team_options_change_check(team); in team_options_change_check()
481 request_module("team-mode-%s", kind); in team_mode_get()
501 static bool team_dummy_transmit(struct team *team, struct sk_buff *skb) in team_dummy_transmit() argument
507 static rx_handler_result_t team_dummy_receive(struct team *team, in team_dummy_receive() argument
518 static bool team_is_mode_set(struct team *team) in team_is_mode_set() argument
520 return team->mode != &__team_no_mode; in team_is_mode_set()
523 static void team_set_no_mode(struct team *team) in team_set_no_mode() argument
525 team->user_carrier_enabled = false; in team_set_no_mode()
526 team->mode = &__team_no_mode; in team_set_no_mode()
529 static void team_adjust_ops(struct team *team) in team_adjust_ops() argument
536 if (!team->en_port_count || !team_is_mode_set(team) || in team_adjust_ops()
537 !team->mode->ops->transmit) in team_adjust_ops()
538 team->ops.transmit = team_dummy_transmit; in team_adjust_ops()
540 team->ops.transmit = team->mode->ops->transmit; in team_adjust_ops()
542 if (!team->en_port_count || !team_is_mode_set(team) || in team_adjust_ops()
543 !team->mode->ops->receive) in team_adjust_ops()
544 team->ops.receive = team_dummy_receive; in team_adjust_ops()
546 team->ops.receive = team->mode->ops->receive; in team_adjust_ops()
554 static int __team_change_mode(struct team *team, in __team_change_mode() argument
558 if (team_is_mode_set(team)) { in __team_change_mode()
559 void (*exit_op)(struct team *team) = team->ops.exit; in __team_change_mode()
562 memset(&team->ops, 0, sizeof(struct team_mode_ops)); in __team_change_mode()
563 team_adjust_ops(team); in __team_change_mode()
566 exit_op(team); in __team_change_mode()
567 team_mode_put(team->mode); in __team_change_mode()
568 team_set_no_mode(team); in __team_change_mode()
570 memset(&team->mode_priv, 0, in __team_change_mode()
571 sizeof(struct team) - offsetof(struct team, mode_priv)); in __team_change_mode()
580 err = new_mode->ops->init(team); in __team_change_mode()
585 team->mode = new_mode; in __team_change_mode()
586 memcpy(&team->ops, new_mode->ops, sizeof(struct team_mode_ops)); in __team_change_mode()
587 team_adjust_ops(team); in __team_change_mode()
592 static int team_change_mode(struct team *team, const char *kind) in team_change_mode() argument
595 struct net_device *dev = team->dev; in team_change_mode()
598 if (!list_empty(&team->port_list)) { in team_change_mode()
603 if (team_is_mode_set(team) && strcmp(team->mode->kind, kind) == 0) { in team_change_mode()
604 netdev_err(dev, "Unable to change to the same mode the team is in\n"); in team_change_mode()
614 err = __team_change_mode(team, new_mode); in team_change_mode()
632 struct team *team; in team_notify_peers_work() local
635 team = container_of(work, struct team, notify_peers.dw.work); in team_notify_peers_work()
638 schedule_delayed_work(&team->notify_peers.dw, 0); in team_notify_peers_work()
641 val = atomic_dec_if_positive(&team->notify_peers.count_pending); in team_notify_peers_work()
646 call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, team->dev); in team_notify_peers_work()
649 schedule_delayed_work(&team->notify_peers.dw, in team_notify_peers_work()
650 msecs_to_jiffies(team->notify_peers.interval)); in team_notify_peers_work()
653 static void team_notify_peers(struct team *team) in team_notify_peers() argument
655 if (!team->notify_peers.count || !netif_running(team->dev)) in team_notify_peers()
657 atomic_add(team->notify_peers.count, &team->notify_peers.count_pending); in team_notify_peers()
658 schedule_delayed_work(&team->notify_peers.dw, 0); in team_notify_peers()
661 static void team_notify_peers_init(struct team *team) in team_notify_peers_init() argument
663 INIT_DELAYED_WORK(&team->notify_peers.dw, team_notify_peers_work); in team_notify_peers_init()
666 static void team_notify_peers_fini(struct team *team) in team_notify_peers_fini() argument
668 cancel_delayed_work_sync(&team->notify_peers.dw); in team_notify_peers_fini()
678 struct team *team; in team_mcast_rejoin_work() local
681 team = container_of(work, struct team, mcast_rejoin.dw.work); in team_mcast_rejoin_work()
684 schedule_delayed_work(&team->mcast_rejoin.dw, 0); in team_mcast_rejoin_work()
687 val = atomic_dec_if_positive(&team->mcast_rejoin.count_pending); in team_mcast_rejoin_work()
692 call_netdevice_notifiers(NETDEV_RESEND_IGMP, team->dev); in team_mcast_rejoin_work()
695 schedule_delayed_work(&team->mcast_rejoin.dw, in team_mcast_rejoin_work()
696 msecs_to_jiffies(team->mcast_rejoin.interval)); in team_mcast_rejoin_work()
699 static void team_mcast_rejoin(struct team *team) in team_mcast_rejoin() argument
701 if (!team->mcast_rejoin.count || !netif_running(team->dev)) in team_mcast_rejoin()
703 atomic_add(team->mcast_rejoin.count, &team->mcast_rejoin.count_pending); in team_mcast_rejoin()
704 schedule_delayed_work(&team->mcast_rejoin.dw, 0); in team_mcast_rejoin()
707 static void team_mcast_rejoin_init(struct team *team) in team_mcast_rejoin_init() argument
709 INIT_DELAYED_WORK(&team->mcast_rejoin.dw, team_mcast_rejoin_work); in team_mcast_rejoin_init()
712 static void team_mcast_rejoin_fini(struct team *team) in team_mcast_rejoin_fini() argument
714 cancel_delayed_work_sync(&team->mcast_rejoin.dw); in team_mcast_rejoin_fini()
727 struct team *team; in team_handle_frame() local
737 team = port->team; in team_handle_frame()
747 res = team->ops.receive(team, port, skb); in team_handle_frame()
752 pcpu_stats = this_cpu_ptr(team->pcpu_stats); in team_handle_frame()
760 skb->dev = team->dev; in team_handle_frame()
762 this_cpu_inc(team->pcpu_stats->rx_nohandler); in team_handle_frame()
764 this_cpu_inc(team->pcpu_stats->rx_dropped); in team_handle_frame()
775 static int team_queue_override_init(struct team *team) in team_queue_override_init() argument
778 unsigned int queue_cnt = team->dev->num_tx_queues - 1; in team_queue_override_init()
787 team->qom_lists = listarr; in team_queue_override_init()
793 static void team_queue_override_fini(struct team *team) in team_queue_override_fini() argument
795 kfree(team->qom_lists); in team_queue_override_fini()
798 static struct list_head *__team_get_qom_list(struct team *team, u16 queue_id) in __team_get_qom_list() argument
800 return &team->qom_lists[queue_id - 1]; in __team_get_qom_list()
806 static bool team_queue_override_transmit(struct team *team, struct sk_buff *skb) in team_queue_override_transmit() argument
811 if (!team->queue_override_enabled || !skb->queue_mapping) in team_queue_override_transmit()
813 qom_list = __team_get_qom_list(team, skb->queue_mapping); in team_queue_override_transmit()
815 if (!team_dev_queue_xmit(team, port, skb)) in team_queue_override_transmit()
821 static void __team_queue_override_port_del(struct team *team, in __team_queue_override_port_del() argument
841 static void __team_queue_override_port_add(struct team *team, in __team_queue_override_port_add() argument
850 qom_list = __team_get_qom_list(team, port->queue_id); in __team_queue_override_port_add()
860 static void __team_queue_override_enabled_check(struct team *team) in __team_queue_override_enabled_check() argument
865 list_for_each_entry(port, &team->port_list, list) { in __team_queue_override_enabled_check()
871 if (enabled == team->queue_override_enabled) in __team_queue_override_enabled_check()
873 netdev_dbg(team->dev, "%s queue override\n", in __team_queue_override_enabled_check()
875 team->queue_override_enabled = enabled; in __team_queue_override_enabled_check()
878 static void team_queue_override_port_prio_changed(struct team *team, in team_queue_override_port_prio_changed() argument
883 __team_queue_override_port_del(team, port); in team_queue_override_port_prio_changed()
884 __team_queue_override_port_add(team, port); in team_queue_override_port_prio_changed()
885 __team_queue_override_enabled_check(team); in team_queue_override_port_prio_changed()
888 static void team_queue_override_port_change_queue_id(struct team *team, in team_queue_override_port_change_queue_id() argument
893 __team_queue_override_port_del(team, port); in team_queue_override_port_change_queue_id()
895 __team_queue_override_port_add(team, port); in team_queue_override_port_change_queue_id()
896 __team_queue_override_enabled_check(team); in team_queue_override_port_change_queue_id()
902 static void team_queue_override_port_add(struct team *team, in team_queue_override_port_add() argument
905 __team_queue_override_port_add(team, port); in team_queue_override_port_add()
906 __team_queue_override_enabled_check(team); in team_queue_override_port_add()
909 static void team_queue_override_port_del(struct team *team, in team_queue_override_port_del() argument
912 __team_queue_override_port_del(team, port); in team_queue_override_port_del()
913 __team_queue_override_enabled_check(team); in team_queue_override_port_del()
921 static bool team_port_find(const struct team *team, in team_port_find() argument
926 list_for_each_entry(cur, &team->port_list, list) in team_port_find()
936 * by team->lock.
938 static void team_port_enable(struct team *team, in team_port_enable() argument
943 port->index = team->en_port_count++; in team_port_enable()
945 team_port_index_hash(team, port->index)); in team_port_enable()
946 team_adjust_ops(team); in team_port_enable()
947 team_queue_override_port_add(team, port); in team_port_enable()
948 if (team->ops.port_enabled) in team_port_enable()
949 team->ops.port_enabled(team, port); in team_port_enable()
950 team_notify_peers(team); in team_port_enable()
951 team_mcast_rejoin(team); in team_port_enable()
955 static void __reconstruct_port_hlist(struct team *team, int rm_index) in __reconstruct_port_hlist() argument
960 for (i = rm_index + 1; i < team->en_port_count; i++) { in __reconstruct_port_hlist()
961 port = team_get_port_by_index(team, i); in __reconstruct_port_hlist()
965 team_port_index_hash(team, port->index)); in __reconstruct_port_hlist()
969 static void team_port_disable(struct team *team, in team_port_disable() argument
974 if (team->ops.port_disabled) in team_port_disable()
975 team->ops.port_disabled(team, port); in team_port_disable()
977 __reconstruct_port_hlist(team, port->index); in team_port_disable()
979 team->en_port_count--; in team_port_disable()
980 team_queue_override_port_del(team, port); in team_port_disable()
981 team_adjust_ops(team); in team_port_disable()
993 static void __team_compute_features(struct team *team) in __team_compute_features() argument
1003 if (list_empty(&team->port_list)) in __team_compute_features()
1009 list_for_each_entry_rcu(port, &team->port_list, list) { in __team_compute_features()
1025 team->dev->vlan_features = vlan_features; in __team_compute_features()
1026 team->dev->hw_enc_features = enc_features | NETIF_F_GSO_ENCAP_ALL | in __team_compute_features()
1029 team->dev->hard_header_len = max_hard_header_len; in __team_compute_features()
1031 team->dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; in __team_compute_features()
1033 team->dev->priv_flags |= IFF_XMIT_DST_RELEASE; in __team_compute_features()
1036 static void team_compute_features(struct team *team) in team_compute_features() argument
1038 __team_compute_features(team); in team_compute_features()
1039 netdev_change_features(team->dev); in team_compute_features()
1042 static int team_port_enter(struct team *team, struct team_port *port) in team_port_enter() argument
1046 dev_hold(team->dev); in team_port_enter()
1047 if (team->ops.port_enter) { in team_port_enter()
1048 err = team->ops.port_enter(team, port); in team_port_enter()
1050 netdev_err(team->dev, "Device %s failed to enter team mode\n", in team_port_enter()
1059 dev_put(team->dev); in team_port_enter()
1064 static void team_port_leave(struct team *team, struct team_port *port) in team_port_leave() argument
1066 if (team->ops.port_leave) in team_port_leave()
1067 team->ops.port_leave(team, port); in team_port_leave()
1068 dev_put(team->dev); in team_port_leave()
1092 if (!port->team->dev->npinfo) in team_port_enable_netpoll()
1118 static int team_upper_dev_link(struct team *team, struct team_port *port, in team_upper_dev_link() argument
1124 lag_upper_info.tx_type = team->mode->lag_tx_type; in team_upper_dev_link()
1126 err = netdev_master_upper_dev_link(port->dev, team->dev, NULL, in team_upper_dev_link()
1134 static void team_upper_dev_unlink(struct team *team, struct team_port *port) in team_upper_dev_unlink() argument
1136 netdev_upper_dev_unlink(port->dev, team->dev); in team_upper_dev_unlink()
1144 static int team_port_add(struct team *team, struct net_device *port_dev, in team_port_add() argument
1147 struct net_device *dev = team->dev; in team_port_add()
1153 NL_SET_ERR_MSG(extack, "Loopback device can't be added as a team port"); in team_port_add()
1154 netdev_err(dev, "Device %s is loopback device. Loopback devices can't be added as a team port\n", in team_port_add()
1160 NL_SET_ERR_MSG(extack, "Device is already a port of a team device"); in team_port_add()
1162 "of a team device\n", portname); in team_port_add()
1167 NL_SET_ERR_MSG(extack, "Cannot enslave team device to itself"); in team_port_add()
1168 netdev_err(dev, "Cannot enslave team device to itself\n"); in team_port_add()
1173 NL_SET_ERR_MSG(extack, "Device is already an upper device of the team interface"); in team_port_add()
1174 netdev_err(dev, "Device %s is already an upper device of the team interface\n", in team_port_add()
1180 NL_SET_ERR_MSG(extack, "Device is already a lower device of the team interface"); in team_port_add()
1181 netdev_err(dev, "Device %s is already a lower device of the team interface\n", in team_port_add()
1188 NL_SET_ERR_MSG(extack, "Device is VLAN challenged and team device has VLAN set up"); in team_port_add()
1189 netdev_err(dev, "Device %s is VLAN challenged and team device has VLAN set up\n", in team_port_add()
1199 NL_SET_ERR_MSG(extack, "Device is up. Set it down before adding it as a team port"); in team_port_add()
1200 netdev_err(dev, "Device %s is up. Set it down before adding it as a team port\n", in team_port_add()
1205 port = kzalloc(sizeof(struct team_port) + team->mode->port_priv_size, in team_port_add()
1211 port->team = team; in team_port_add()
1223 err = team_port_enter(team, port); in team_port_add()
1225 netdev_err(dev, "Device %s failed to enter team mode\n", in team_port_add()
1262 err = team_upper_dev_link(team, port, extack); in team_port_add()
1269 err = __team_option_inst_add_port(team, port); in team_port_add()
1301 list_add_tail_rcu(&port->list, &team->port_list); in team_port_add()
1302 team_port_enable(team, port); in team_port_add()
1303 __team_compute_features(team); in team_port_add()
1305 __team_options_change_check(team); in team_port_add()
1312 __team_option_inst_del_port(team, port); in team_port_add()
1315 team_upper_dev_unlink(team, port); in team_port_add()
1330 team_port_leave(team, port); in team_port_add()
1344 static int team_port_del(struct team *team, struct net_device *port_dev) in team_port_del() argument
1346 struct net_device *dev = team->dev; in team_port_del()
1351 if (!port || !team_port_find(team, port)) { in team_port_del()
1352 netdev_err(dev, "Device %s does not act as a port of this team\n", in team_port_del()
1357 team_port_disable(team, port); in team_port_del()
1365 team_upper_dev_unlink(team, port); in team_port_del()
1374 team_port_leave(team, port); in team_port_del()
1376 __team_option_inst_mark_removed_port(team, port); in team_port_del()
1377 __team_options_change_check(team); in team_port_del()
1378 __team_option_inst_del_port(team, port); in team_port_del()
1385 __team_compute_features(team); in team_port_del()
1395 static void team_mode_option_get(struct team *team, struct team_gsetter_ctx *ctx) in team_mode_option_get() argument
1397 ctx->data.str_val = team->mode->kind; in team_mode_option_get()
1400 static int team_mode_option_set(struct team *team, struct team_gsetter_ctx *ctx) in team_mode_option_set() argument
1402 return team_change_mode(team, ctx->data.str_val); in team_mode_option_set()
1405 static void team_notify_peers_count_get(struct team *team, in team_notify_peers_count_get() argument
1408 ctx->data.u32_val = team->notify_peers.count; in team_notify_peers_count_get()
1411 static int team_notify_peers_count_set(struct team *team, in team_notify_peers_count_set() argument
1414 team->notify_peers.count = ctx->data.u32_val; in team_notify_peers_count_set()
1418 static void team_notify_peers_interval_get(struct team *team, in team_notify_peers_interval_get() argument
1421 ctx->data.u32_val = team->notify_peers.interval; in team_notify_peers_interval_get()
1424 static int team_notify_peers_interval_set(struct team *team, in team_notify_peers_interval_set() argument
1427 team->notify_peers.interval = ctx->data.u32_val; in team_notify_peers_interval_set()
1431 static void team_mcast_rejoin_count_get(struct team *team, in team_mcast_rejoin_count_get() argument
1434 ctx->data.u32_val = team->mcast_rejoin.count; in team_mcast_rejoin_count_get()
1437 static int team_mcast_rejoin_count_set(struct team *team, in team_mcast_rejoin_count_set() argument
1440 team->mcast_rejoin.count = ctx->data.u32_val; in team_mcast_rejoin_count_set()
1444 static void team_mcast_rejoin_interval_get(struct team *team, in team_mcast_rejoin_interval_get() argument
1447 ctx->data.u32_val = team->mcast_rejoin.interval; in team_mcast_rejoin_interval_get()
1450 static int team_mcast_rejoin_interval_set(struct team *team, in team_mcast_rejoin_interval_set() argument
1453 team->mcast_rejoin.interval = ctx->data.u32_val; in team_mcast_rejoin_interval_set()
1457 static void team_port_en_option_get(struct team *team, in team_port_en_option_get() argument
1465 static int team_port_en_option_set(struct team *team, in team_port_en_option_set() argument
1471 team_port_enable(team, port); in team_port_en_option_set()
1473 team_port_disable(team, port); in team_port_en_option_set()
1477 static void team_user_linkup_option_get(struct team *team, in team_user_linkup_option_get() argument
1485 static void __team_carrier_check(struct team *team);
1487 static int team_user_linkup_option_set(struct team *team, in team_user_linkup_option_set() argument
1494 __team_carrier_check(port->team); in team_user_linkup_option_set()
1498 static void team_user_linkup_en_option_get(struct team *team, in team_user_linkup_en_option_get() argument
1506 static int team_user_linkup_en_option_set(struct team *team, in team_user_linkup_en_option_set() argument
1513 __team_carrier_check(port->team); in team_user_linkup_en_option_set()
1517 static void team_priority_option_get(struct team *team, in team_priority_option_get() argument
1525 static int team_priority_option_set(struct team *team, in team_priority_option_set() argument
1534 team_queue_override_port_prio_changed(team, port); in team_priority_option_set()
1538 static void team_queue_id_option_get(struct team *team, in team_queue_id_option_get() argument
1546 static int team_queue_id_option_set(struct team *team, in team_queue_id_option_set() argument
1554 if (new_queue_id >= team->dev->real_num_tx_queues) in team_queue_id_option_set()
1556 team_queue_override_port_change_queue_id(team, port, new_queue_id); in team_queue_id_option_set()
1631 struct team *team = netdev_priv(dev); in team_init() local
1635 team->dev = dev; in team_init()
1636 team_set_no_mode(team); in team_init()
1637 team->notifier_ctx = false; in team_init()
1639 team->pcpu_stats = netdev_alloc_pcpu_stats(struct team_pcpu_stats); in team_init()
1640 if (!team->pcpu_stats) in team_init()
1644 INIT_HLIST_HEAD(&team->en_port_hlist[i]); in team_init()
1645 INIT_LIST_HEAD(&team->port_list); in team_init()
1646 err = team_queue_override_init(team); in team_init()
1650 team_adjust_ops(team); in team_init()
1652 INIT_LIST_HEAD(&team->option_list); in team_init()
1653 INIT_LIST_HEAD(&team->option_inst_list); in team_init()
1655 team_notify_peers_init(team); in team_init()
1656 team_mcast_rejoin_init(team); in team_init()
1658 err = team_options_register(team, team_options, ARRAY_SIZE(team_options)); in team_init()
1663 lockdep_register_key(&team->team_lock_key); in team_init()
1664 __mutex_init(&team->lock, "team->team_lock_key", &team->team_lock_key); in team_init()
1670 team_mcast_rejoin_fini(team); in team_init()
1671 team_notify_peers_fini(team); in team_init()
1672 team_queue_override_fini(team); in team_init()
1674 free_percpu(team->pcpu_stats); in team_init()
1681 struct team *team = netdev_priv(dev); in team_uninit() local
1685 mutex_lock(&team->lock); in team_uninit()
1686 list_for_each_entry_safe(port, tmp, &team->port_list, list) in team_uninit()
1687 team_port_del(team, port->dev); in team_uninit()
1689 __team_change_mode(team, NULL); /* cleanup */ in team_uninit()
1690 __team_options_unregister(team, team_options, ARRAY_SIZE(team_options)); in team_uninit()
1691 team_mcast_rejoin_fini(team); in team_uninit()
1692 team_notify_peers_fini(team); in team_uninit()
1693 team_queue_override_fini(team); in team_uninit()
1694 mutex_unlock(&team->lock); in team_uninit()
1696 lockdep_unregister_key(&team->team_lock_key); in team_uninit()
1701 struct team *team = netdev_priv(dev); in team_destructor() local
1703 free_percpu(team->pcpu_stats); in team_destructor()
1713 struct team *team = netdev_priv(dev); in team_close() local
1716 list_for_each_entry(port, &team->port_list, list) { in team_close()
1729 struct team *team = netdev_priv(dev); in team_xmit() local
1733 tx_success = team_queue_override_transmit(team, skb); in team_xmit()
1735 tx_success = team->ops.transmit(team, skb); in team_xmit()
1739 pcpu_stats = this_cpu_ptr(team->pcpu_stats); in team_xmit()
1745 this_cpu_inc(team->pcpu_stats->tx_dropped); in team_xmit()
1758 * way down to the team driver. in team_select_queue()
1777 struct team *team = netdev_priv(dev); in team_change_rx_flags() local
1781 mutex_lock(&team->lock); in team_change_rx_flags()
1782 list_for_each_entry(port, &team->port_list, list) { in team_change_rx_flags()
1792 mutex_unlock(&team->lock); in team_change_rx_flags()
1797 struct team *team = netdev_priv(dev); in team_set_rx_mode() local
1801 list_for_each_entry_rcu(port, &team->port_list, list) { in team_set_rx_mode()
1811 struct team *team = netdev_priv(dev); in team_set_mac_address() local
1817 mutex_lock(&team->lock); in team_set_mac_address()
1818 list_for_each_entry(port, &team->port_list, list) in team_set_mac_address()
1819 if (team->ops.port_change_dev_addr) in team_set_mac_address()
1820 team->ops.port_change_dev_addr(team, port); in team_set_mac_address()
1821 mutex_unlock(&team->lock); in team_set_mac_address()
1827 struct team *team = netdev_priv(dev); in team_change_mtu() local
1832 * Alhough this is reader, it's guarded by team lock. It's not possible in team_change_mtu()
1835 mutex_lock(&team->lock); in team_change_mtu()
1836 team->port_mtu_change_allowed = true; in team_change_mtu()
1837 list_for_each_entry(port, &team->port_list, list) { in team_change_mtu()
1845 team->port_mtu_change_allowed = false; in team_change_mtu()
1846 mutex_unlock(&team->lock); in team_change_mtu()
1853 list_for_each_entry_continue_reverse(port, &team->port_list, list) in team_change_mtu()
1855 team->port_mtu_change_allowed = false; in team_change_mtu()
1856 mutex_unlock(&team->lock); in team_change_mtu()
1864 struct team *team = netdev_priv(dev); in team_get_stats64() local
1872 p = per_cpu_ptr(team->pcpu_stats, i); in team_get_stats64()
1902 struct team *team = netdev_priv(dev); in team_vlan_rx_add_vid() local
1907 * Alhough this is reader, it's guarded by team lock. It's not possible in team_vlan_rx_add_vid()
1910 mutex_lock(&team->lock); in team_vlan_rx_add_vid()
1911 list_for_each_entry(port, &team->port_list, list) { in team_vlan_rx_add_vid()
1916 mutex_unlock(&team->lock); in team_vlan_rx_add_vid()
1921 list_for_each_entry_continue_reverse(port, &team->port_list, list) in team_vlan_rx_add_vid()
1923 mutex_unlock(&team->lock); in team_vlan_rx_add_vid()
1930 struct team *team = netdev_priv(dev); in team_vlan_rx_kill_vid() local
1933 mutex_lock(&team->lock); in team_vlan_rx_kill_vid()
1934 list_for_each_entry(port, &team->port_list, list) in team_vlan_rx_kill_vid()
1936 mutex_unlock(&team->lock); in team_vlan_rx_kill_vid()
1946 static void __team_netpoll_cleanup(struct team *team) in __team_netpoll_cleanup() argument
1950 list_for_each_entry(port, &team->port_list, list) in __team_netpoll_cleanup()
1956 struct team *team = netdev_priv(dev); in team_netpoll_cleanup() local
1958 mutex_lock(&team->lock); in team_netpoll_cleanup()
1959 __team_netpoll_cleanup(team); in team_netpoll_cleanup()
1960 mutex_unlock(&team->lock); in team_netpoll_cleanup()
1965 struct team *team = netdev_priv(dev); in team_netpoll_setup() local
1969 mutex_lock(&team->lock); in team_netpoll_setup()
1970 list_for_each_entry(port, &team->port_list, list) { in team_netpoll_setup()
1973 __team_netpoll_cleanup(team); in team_netpoll_setup()
1977 mutex_unlock(&team->lock); in team_netpoll_setup()
1985 struct team *team = netdev_priv(dev); in team_add_slave() local
1988 mutex_lock(&team->lock); in team_add_slave()
1989 err = team_port_add(team, port_dev, extack); in team_add_slave()
1990 mutex_unlock(&team->lock); in team_add_slave()
2000 struct team *team = netdev_priv(dev); in team_del_slave() local
2003 mutex_lock(&team->lock); in team_del_slave()
2004 err = team_port_del(team, port_dev); in team_del_slave()
2005 mutex_unlock(&team->lock); in team_del_slave()
2011 lockdep_unregister_key(&team->team_lock_key); in team_del_slave()
2012 lockdep_register_key(&team->team_lock_key); in team_del_slave()
2013 lockdep_set_class(&team->lock, &team->team_lock_key); in team_del_slave()
2024 struct team *team = netdev_priv(dev); in team_fix_features() local
2031 list_for_each_entry_rcu(port, &team->port_list, list) { in team_fix_features()
2045 struct team *team = netdev_priv(dev); in team_change_carrier() local
2047 team->user_carrier_enabled = true; in team_change_carrier()
2095 struct team *team= netdev_priv(dev); in team_ethtool_get_link_ksettings() local
2103 list_for_each_entry_rcu(port, &team->port_list, list) { in team_ethtool_get_link_ksettings()
2132 struct team *team = netdev_priv(dev); in team_setup_by_port() local
2135 dev->header_ops = team->header_ops_cache; in team_setup_by_port()
2159 struct team *team = netdev_priv(dev); in team_dev_type_check_change() local
2165 if (!list_empty(&team->port_list)) { in team_dev_type_check_change()
2184 struct team *team = netdev_priv(dev); in team_setup() local
2188 team->header_ops_cache = dev->header_ops; in team_setup()
2206 /* Don't allow team devices to change network namespaces. */ in team_setup()
2258 .priv_size = sizeof(struct team),
2304 static struct team *team_nl_team_get(struct genl_info *info) in team_nl_team_get()
2309 struct team *team; in team_nl_team_get() local
2321 team = netdev_priv(dev); in team_nl_team_get()
2322 mutex_lock(&team->lock); in team_nl_team_get()
2323 return team; in team_nl_team_get()
2326 static void team_nl_team_put(struct team *team) in team_nl_team_put() argument
2328 mutex_unlock(&team->lock); in team_nl_team_put()
2329 dev_put(team->dev); in team_nl_team_put()
2333 struct team *team, u32 portid);
2335 static int team_nl_send_unicast(struct sk_buff *skb, struct team *team, u32 portid) in team_nl_send_unicast() argument
2337 return genlmsg_unicast(dev_net(team->dev), skb, portid); in team_nl_send_unicast()
2340 static int team_nl_fill_one_option_get(struct sk_buff *skb, struct team *team, in team_nl_fill_one_option_get() argument
2350 err = team_option_get(team, opt_inst, &ctx); in team_nl_fill_one_option_get()
2422 struct team *team, u32 portid, in __send_and_alloc_skb() argument
2428 err = send_func(*pskb, team, portid); in __send_and_alloc_skb()
2438 static int team_nl_send_options_get(struct team *team, u32 portid, u32 seq, in team_nl_send_options_get() argument
2455 err = __send_and_alloc_skb(&skb, team, portid, send_func); in team_nl_send_options_get()
2466 if (nla_put_u32(skb, TEAM_ATTR_TEAM_IFINDEX, team->dev->ifindex)) in team_nl_send_options_get()
2475 err = team_nl_fill_one_option_get(skb, team, opt_inst); in team_nl_send_options_get()
2496 err = __send_and_alloc_skb(&skb, team, portid, send_func); in team_nl_send_options_get()
2502 return send_func(skb, team, portid); in team_nl_send_options_get()
2513 struct team *team; in team_nl_options_get_doit() local
2518 team = team_nl_team_get(info); in team_nl_options_get_doit()
2519 if (!team) in team_nl_options_get_doit()
2522 list_for_each_entry(opt_inst, &team->option_inst_list, list) in team_nl_options_get_doit()
2524 err = team_nl_send_options_get(team, info->snd_portid, info->snd_seq, in team_nl_options_get_doit()
2528 team_nl_team_put(team); in team_nl_options_get_doit()
2533 static int team_nl_send_event_options_get(struct team *team,
2538 struct team *team; in team_nl_options_set_doit() local
2545 team = team_nl_team_get(info); in team_nl_options_set_doit()
2546 if (!team) { in team_nl_options_set_doit()
2623 list_for_each_entry(opt_inst, &team->option_inst_list, list) { in team_nl_options_set_doit()
2666 err = team_option_set(team, opt_inst, &ctx); in team_nl_options_set_doit()
2677 err = team_nl_send_event_options_get(team, &opt_inst_list); in team_nl_options_set_doit()
2683 team_nl_team_put(team); in team_nl_options_set_doit()
2719 static int team_nl_send_port_list_get(struct team *team, u32 portid, u32 seq, in team_nl_send_port_list_get() argument
2732 port = list_first_entry_or_null(&team->port_list, in team_nl_send_port_list_get()
2736 err = __send_and_alloc_skb(&skb, team, portid, send_func); in team_nl_send_port_list_get()
2747 if (nla_put_u32(skb, TEAM_ATTR_TEAM_IFINDEX, team->dev->ifindex)) in team_nl_send_port_list_get()
2764 list_for_each_entry_from(port, &team->port_list, list) { in team_nl_send_port_list_get()
2787 err = __send_and_alloc_skb(&skb, team, portid, send_func); in team_nl_send_port_list_get()
2793 return send_func(skb, team, portid); in team_nl_send_port_list_get()
2805 struct team *team; in team_nl_port_list_get_doit() local
2808 team = team_nl_team_get(info); in team_nl_port_list_get_doit()
2809 if (!team) in team_nl_port_list_get_doit()
2812 err = team_nl_send_port_list_get(team, info->snd_portid, info->snd_seq, in team_nl_port_list_get_doit()
2815 team_nl_team_put(team); in team_nl_port_list_get_doit()
2839 struct team *team, u32 portid) in team_nl_send_multicast() argument
2841 return genlmsg_multicast_netns(&team_nl_family, dev_net(team->dev), in team_nl_send_multicast()
2845 static int team_nl_send_event_options_get(struct team *team, in team_nl_send_event_options_get() argument
2848 return team_nl_send_options_get(team, 0, 0, 0, team_nl_send_multicast, in team_nl_send_event_options_get()
2852 static int team_nl_send_event_port_get(struct team *team, in team_nl_send_event_port_get() argument
2855 return team_nl_send_port_list_get(team, 0, 0, 0, team_nl_send_multicast, in team_nl_send_event_port_get()
2874 static void __team_options_change_check(struct team *team) in __team_options_change_check() argument
2880 list_for_each_entry(opt_inst, &team->option_inst_list, list) { in __team_options_change_check()
2884 err = team_nl_send_event_options_get(team, &sel_opt_inst_list); in __team_options_change_check()
2886 netdev_warn(team->dev, "Failed to send options change via netlink (err %d)\n", in __team_options_change_check()
2913 err = team_nl_send_event_port_get(port->team, port); in __team_port_change_send()
2915 netdev_warn(port->team->dev, "Failed to send port change of device %s via netlink (err %d)\n", in __team_port_change_send()
2920 static void __team_carrier_check(struct team *team) in __team_carrier_check() argument
2925 if (team->user_carrier_enabled) in __team_carrier_check()
2929 list_for_each_entry(port, &team->port_list, list) { in __team_carrier_check()
2937 netif_carrier_on(team->dev); in __team_carrier_check()
2939 netif_carrier_off(team->dev); in __team_carrier_check()
2946 __team_carrier_check(port->team); in __team_port_change_check()
2952 __team_carrier_check(port->team); in __team_port_change_port_added()
2959 __team_carrier_check(port->team); in __team_port_change_port_removed()
2964 struct team *team = port->team; in team_port_change_check() local
2966 mutex_lock(&team->lock); in team_port_change_check()
2968 mutex_unlock(&team->lock); in team_port_change_check()
3000 team_del_slave(port->team->dev, dev); in team_device_event()
3003 if (!port->team->notifier_ctx) { in team_device_event()
3004 port->team->notifier_ctx = true; in team_device_event()
3005 team_compute_features(port->team); in team_device_event()
3006 port->team->notifier_ctx = false; in team_device_event()
3011 if (!port->team->port_mtu_change_allowed) in team_device_event()
3019 call_netdevice_notifiers(event, port->team->dev); in team_device_event()
3071 MODULE_DESCRIPTION("Ethernet team device driver");