xref: /linux/drivers/net/team/team_core.c (revision 9043be310c6a4c5e57f7bba4b9870554eac7aa96)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * drivers/net/team/team.c - Network team device driver
4  * Copyright (c) 2011 Jiri Pirko <jpirko@redhat.com>
5  */
6 
7 #include <linux/ethtool.h>
8 #include <linux/kernel.h>
9 #include <linux/types.h>
10 #include <linux/module.h>
11 #include <linux/init.h>
12 #include <linux/slab.h>
13 #include <linux/rcupdate.h>
14 #include <linux/errno.h>
15 #include <linux/ctype.h>
16 #include <linux/notifier.h>
17 #include <linux/netdevice.h>
18 #include <linux/netpoll.h>
19 #include <linux/if_vlan.h>
20 #include <linux/if_arp.h>
21 #include <linux/socket.h>
22 #include <linux/etherdevice.h>
23 #include <linux/rtnetlink.h>
24 #include <net/rtnetlink.h>
25 #include <net/genetlink.h>
26 #include <net/netdev_lock.h>
27 #include <net/netlink.h>
28 #include <net/sch_generic.h>
29 #include <linux/if_team.h>
30 
31 #include "team_nl.h"
32 
33 #define DRV_NAME "team"
34 
35 
36 /**********
37  * Helpers
38  **********/
39 
40 static struct team_port *team_port_get_rtnl(const struct net_device *dev)
41 {
42 	struct team_port *port = rtnl_dereference(dev->rx_handler_data);
43 
44 	return netif_is_team_port(dev) ? port : NULL;
45 }
46 
47 /*
48  * Since the ability to change device address for open port device is tested in
49  * team_port_add, this function can be called without control of return value
50  */
51 static int __set_port_dev_addr(struct net_device *port_dev,
52 			       const unsigned char *dev_addr)
53 {
54 	struct sockaddr_storage addr;
55 
56 	memcpy(addr.__data, dev_addr, port_dev->addr_len);
57 	addr.ss_family = port_dev->type;
58 	return dev_set_mac_address(port_dev, &addr, NULL);
59 }
60 
61 static int team_port_set_orig_dev_addr(struct team_port *port)
62 {
63 	return __set_port_dev_addr(port->dev, port->orig.dev_addr);
64 }
65 
66 static int team_port_set_team_dev_addr(struct team *team,
67 				       struct team_port *port)
68 {
69 	return __set_port_dev_addr(port->dev, netdev_from_priv(team)->dev_addr);
70 }
71 
72 int team_modeop_port_enter(struct team *team, struct team_port *port)
73 {
74 	return team_port_set_team_dev_addr(team, port);
75 }
76 EXPORT_SYMBOL(team_modeop_port_enter);
77 
78 void team_modeop_port_change_dev_addr(struct team *team,
79 				      struct team_port *port)
80 {
81 	team_port_set_team_dev_addr(team, port);
82 }
83 EXPORT_SYMBOL(team_modeop_port_change_dev_addr);
84 
85 static void team_lower_state_changed(struct team_port *port)
86 {
87 	struct netdev_lag_lower_state_info info;
88 
89 	info.link_up = port->linkup;
90 	info.tx_enabled = team_port_tx_enabled(port);
91 	netdev_lower_state_changed(port->dev, &info);
92 }
93 
94 static void team_refresh_port_linkup(struct team_port *port)
95 {
96 	bool new_linkup = port->user.linkup_enabled ? port->user.linkup :
97 						      port->state.linkup;
98 
99 	if (port->linkup != new_linkup) {
100 		port->linkup = new_linkup;
101 		team_lower_state_changed(port);
102 	}
103 }
104 
105 
106 /*******************
107  * Options handling
108  *******************/
109 
110 struct team_option_inst { /* One for each option instance */
111 	struct list_head list;
112 	struct list_head tmp_list;
113 	struct team_option *option;
114 	struct team_option_inst_info info;
115 	bool changed;
116 	bool removed;
117 };
118 
119 static struct team_option *__team_find_option(struct team *team,
120 					      const char *opt_name)
121 {
122 	struct team_option *option;
123 
124 	list_for_each_entry(option, &team->option_list, list) {
125 		if (strcmp(option->name, opt_name) == 0)
126 			return option;
127 	}
128 	return NULL;
129 }
130 
131 static void __team_option_inst_del(struct team_option_inst *opt_inst)
132 {
133 	list_del(&opt_inst->list);
134 	kfree(opt_inst);
135 }
136 
137 static void __team_option_inst_del_option(struct team *team,
138 					  struct team_option *option)
139 {
140 	struct team_option_inst *opt_inst, *tmp;
141 
142 	list_for_each_entry_safe(opt_inst, tmp, &team->option_inst_list, list) {
143 		if (opt_inst->option == option)
144 			__team_option_inst_del(opt_inst);
145 	}
146 }
147 
148 static int __team_option_inst_add(struct team *team, struct team_option *option,
149 				  struct team_port *port)
150 {
151 	struct team_option_inst *opt_inst;
152 	unsigned int array_size;
153 	unsigned int i;
154 
155 	array_size = option->array_size;
156 	if (!array_size)
157 		array_size = 1; /* No array but still need one instance */
158 
159 	for (i = 0; i < array_size; i++) {
160 		opt_inst = kmalloc_obj(*opt_inst);
161 		if (!opt_inst)
162 			return -ENOMEM;
163 		opt_inst->option = option;
164 		opt_inst->info.port = port;
165 		opt_inst->info.array_index = i;
166 		opt_inst->changed = true;
167 		opt_inst->removed = false;
168 		list_add_tail(&opt_inst->list, &team->option_inst_list);
169 		if (option->init)
170 			option->init(team, &opt_inst->info);
171 
172 	}
173 	return 0;
174 }
175 
176 static int __team_option_inst_add_option(struct team *team,
177 					 struct team_option *option)
178 {
179 	int err;
180 
181 	if (!option->per_port) {
182 		err = __team_option_inst_add(team, option, NULL);
183 		if (err)
184 			goto inst_del_option;
185 	}
186 	return 0;
187 
188 inst_del_option:
189 	__team_option_inst_del_option(team, option);
190 	return err;
191 }
192 
193 static void __team_option_inst_mark_removed_option(struct team *team,
194 						   struct team_option *option)
195 {
196 	struct team_option_inst *opt_inst;
197 
198 	list_for_each_entry(opt_inst, &team->option_inst_list, list) {
199 		if (opt_inst->option == option) {
200 			opt_inst->changed = true;
201 			opt_inst->removed = true;
202 		}
203 	}
204 }
205 
206 static void __team_option_inst_del_port(struct team *team,
207 					struct team_port *port)
208 {
209 	struct team_option_inst *opt_inst, *tmp;
210 
211 	list_for_each_entry_safe(opt_inst, tmp, &team->option_inst_list, list) {
212 		if (opt_inst->option->per_port &&
213 		    opt_inst->info.port == port)
214 			__team_option_inst_del(opt_inst);
215 	}
216 }
217 
218 static int __team_option_inst_add_port(struct team *team,
219 				       struct team_port *port)
220 {
221 	struct team_option *option;
222 	int err;
223 
224 	list_for_each_entry(option, &team->option_list, list) {
225 		if (!option->per_port)
226 			continue;
227 		err = __team_option_inst_add(team, option, port);
228 		if (err)
229 			goto inst_del_port;
230 	}
231 	return 0;
232 
233 inst_del_port:
234 	__team_option_inst_del_port(team, port);
235 	return err;
236 }
237 
238 static void __team_option_inst_mark_removed_port(struct team *team,
239 						 struct team_port *port)
240 {
241 	struct team_option_inst *opt_inst;
242 
243 	list_for_each_entry(opt_inst, &team->option_inst_list, list) {
244 		if (opt_inst->info.port == port) {
245 			opt_inst->changed = true;
246 			opt_inst->removed = true;
247 		}
248 	}
249 }
250 
251 static int __team_options_register(struct team *team,
252 				   const struct team_option *option,
253 				   size_t option_count)
254 {
255 	int i;
256 	struct team_option **dst_opts;
257 	int err;
258 
259 	dst_opts = kzalloc_objs(struct team_option *, option_count);
260 	if (!dst_opts)
261 		return -ENOMEM;
262 	for (i = 0; i < option_count; i++, option++) {
263 		if (__team_find_option(team, option->name)) {
264 			err = -EEXIST;
265 			goto alloc_rollback;
266 		}
267 		dst_opts[i] = kmemdup(option, sizeof(*option), GFP_KERNEL);
268 		if (!dst_opts[i]) {
269 			err = -ENOMEM;
270 			goto alloc_rollback;
271 		}
272 	}
273 
274 	for (i = 0; i < option_count; i++) {
275 		err = __team_option_inst_add_option(team, dst_opts[i]);
276 		if (err)
277 			goto inst_rollback;
278 		list_add_tail(&dst_opts[i]->list, &team->option_list);
279 	}
280 
281 	kfree(dst_opts);
282 	return 0;
283 
284 inst_rollback:
285 	for (i--; i >= 0; i--) {
286 		__team_option_inst_del_option(team, dst_opts[i]);
287 		list_del(&dst_opts[i]->list);
288 	}
289 
290 	i = option_count;
291 alloc_rollback:
292 	for (i--; i >= 0; i--)
293 		kfree(dst_opts[i]);
294 
295 	kfree(dst_opts);
296 	return err;
297 }
298 
299 static void __team_options_mark_removed(struct team *team,
300 					const struct team_option *option,
301 					size_t option_count)
302 {
303 	int i;
304 
305 	for (i = 0; i < option_count; i++, option++) {
306 		struct team_option *del_opt;
307 
308 		del_opt = __team_find_option(team, option->name);
309 		if (del_opt)
310 			__team_option_inst_mark_removed_option(team, del_opt);
311 	}
312 }
313 
314 static void __team_options_unregister(struct team *team,
315 				      const struct team_option *option,
316 				      size_t option_count)
317 {
318 	int i;
319 
320 	for (i = 0; i < option_count; i++, option++) {
321 		struct team_option *del_opt;
322 
323 		del_opt = __team_find_option(team, option->name);
324 		if (del_opt) {
325 			__team_option_inst_del_option(team, del_opt);
326 			list_del(&del_opt->list);
327 			kfree(del_opt);
328 		}
329 	}
330 }
331 
332 static void __team_options_change_check(struct team *team);
333 
334 int team_options_register(struct team *team,
335 			  const struct team_option *option,
336 			  size_t option_count)
337 {
338 	int err;
339 
340 	err = __team_options_register(team, option, option_count);
341 	if (err)
342 		return err;
343 	__team_options_change_check(team);
344 	return 0;
345 }
346 EXPORT_SYMBOL(team_options_register);
347 
348 void team_options_unregister(struct team *team,
349 			     const struct team_option *option,
350 			     size_t option_count)
351 {
352 	__team_options_mark_removed(team, option, option_count);
353 	__team_options_change_check(team);
354 	__team_options_unregister(team, option, option_count);
355 }
356 EXPORT_SYMBOL(team_options_unregister);
357 
358 static int team_option_get(struct team *team,
359 			   struct team_option_inst *opt_inst,
360 			   struct team_gsetter_ctx *ctx)
361 {
362 	if (!opt_inst->option->getter)
363 		return -EOPNOTSUPP;
364 
365 	opt_inst->option->getter(team, ctx);
366 	return 0;
367 }
368 
369 static int team_option_set(struct team *team,
370 			   struct team_option_inst *opt_inst,
371 			   struct team_gsetter_ctx *ctx)
372 {
373 	if (!opt_inst->option->setter)
374 		return -EOPNOTSUPP;
375 	return opt_inst->option->setter(team, ctx);
376 }
377 
378 void team_option_inst_set_change(struct team_option_inst_info *opt_inst_info)
379 {
380 	struct team_option_inst *opt_inst;
381 
382 	opt_inst = container_of(opt_inst_info, struct team_option_inst, info);
383 	opt_inst->changed = true;
384 }
385 EXPORT_SYMBOL(team_option_inst_set_change);
386 
387 void team_options_change_check(struct team *team)
388 {
389 	__team_options_change_check(team);
390 }
391 EXPORT_SYMBOL(team_options_change_check);
392 
393 
394 /****************
395  * Mode handling
396  ****************/
397 
398 static LIST_HEAD(mode_list);
399 static DEFINE_SPINLOCK(mode_list_lock);
400 
401 struct team_mode_item {
402 	struct list_head list;
403 	const struct team_mode *mode;
404 };
405 
406 static struct team_mode_item *__find_mode(const char *kind)
407 {
408 	struct team_mode_item *mitem;
409 
410 	list_for_each_entry(mitem, &mode_list, list) {
411 		if (strcmp(mitem->mode->kind, kind) == 0)
412 			return mitem;
413 	}
414 	return NULL;
415 }
416 
417 static bool is_good_mode_name(const char *name)
418 {
419 	while (*name != '\0') {
420 		if (!isalpha(*name) && !isdigit(*name) && *name != '_')
421 			return false;
422 		name++;
423 	}
424 	return true;
425 }
426 
427 int team_mode_register(const struct team_mode *mode)
428 {
429 	int err = 0;
430 	struct team_mode_item *mitem;
431 
432 	if (!is_good_mode_name(mode->kind) ||
433 	    mode->priv_size > TEAM_MODE_PRIV_SIZE)
434 		return -EINVAL;
435 
436 	mitem = kmalloc_obj(*mitem);
437 	if (!mitem)
438 		return -ENOMEM;
439 
440 	spin_lock(&mode_list_lock);
441 	if (__find_mode(mode->kind)) {
442 		err = -EEXIST;
443 		kfree(mitem);
444 		goto unlock;
445 	}
446 	mitem->mode = mode;
447 	list_add_tail(&mitem->list, &mode_list);
448 unlock:
449 	spin_unlock(&mode_list_lock);
450 	return err;
451 }
452 EXPORT_SYMBOL(team_mode_register);
453 
454 void team_mode_unregister(const struct team_mode *mode)
455 {
456 	struct team_mode_item *mitem;
457 
458 	spin_lock(&mode_list_lock);
459 	mitem = __find_mode(mode->kind);
460 	if (mitem) {
461 		list_del_init(&mitem->list);
462 		kfree(mitem);
463 	}
464 	spin_unlock(&mode_list_lock);
465 }
466 EXPORT_SYMBOL(team_mode_unregister);
467 
468 static const struct team_mode *team_mode_get(const char *kind)
469 {
470 	struct team_mode_item *mitem;
471 	const struct team_mode *mode = NULL;
472 
473 	if (!try_module_get(THIS_MODULE))
474 		return NULL;
475 
476 	spin_lock(&mode_list_lock);
477 	mitem = __find_mode(kind);
478 	if (!mitem) {
479 		spin_unlock(&mode_list_lock);
480 		request_module("team-mode-%s", kind);
481 		spin_lock(&mode_list_lock);
482 		mitem = __find_mode(kind);
483 	}
484 	if (mitem) {
485 		mode = mitem->mode;
486 		if (!try_module_get(mode->owner))
487 			mode = NULL;
488 	}
489 
490 	spin_unlock(&mode_list_lock);
491 	module_put(THIS_MODULE);
492 	return mode;
493 }
494 
495 static void team_mode_put(const struct team_mode *mode)
496 {
497 	module_put(mode->owner);
498 }
499 
500 static bool team_dummy_transmit(struct team *team, struct sk_buff *skb)
501 {
502 	dev_kfree_skb_any(skb);
503 	return false;
504 }
505 
506 static rx_handler_result_t team_dummy_receive(struct team *team,
507 					      struct team_port *port,
508 					      struct sk_buff *skb)
509 {
510 	return RX_HANDLER_ANOTHER;
511 }
512 
513 static const struct team_mode __team_no_mode = {
514 	.kind		= "*NOMODE*",
515 };
516 
517 static bool team_is_mode_set(struct team *team)
518 {
519 	return team->mode != &__team_no_mode;
520 }
521 
522 static void team_set_no_mode(struct team *team)
523 {
524 	team->user_carrier_enabled = false;
525 	team->mode = &__team_no_mode;
526 }
527 
528 static void team_adjust_ops(struct team *team)
529 {
530 	/*
531 	 * To avoid checks in rx/tx skb paths, ensure here that non-null and
532 	 * correct ops are always set.
533 	 */
534 
535 	if (!team->tx_en_port_count || !team_is_mode_set(team) ||
536 	    !team->mode->ops->transmit)
537 		WRITE_ONCE(team->ops.transmit, team_dummy_transmit);
538 	else
539 		WRITE_ONCE(team->ops.transmit, team->mode->ops->transmit);
540 
541 	if (!team->rx_en_port_count || !team_is_mode_set(team) ||
542 	    !team->mode->ops->receive)
543 		WRITE_ONCE(team->ops.receive, team_dummy_receive);
544 	else
545 		WRITE_ONCE(team->ops.receive, team->mode->ops->receive);
546 }
547 
548 /*
549  * team_change_mode() ensures no ports are present during mode change,
550  * but lockless readers can still reach team_xmit().  Avoid touching
551  * transmit/receive -- they are already set to dummies by
552  * team_adjust_ops() since no ports are enabled.  synchronize_net()
553  * drains in-flight readers before destroying old mode state.
554  */
555 static int __team_change_mode(struct team *team,
556 			      const struct team_mode *new_mode)
557 {
558 	/* Check if mode was previously set and do cleanup if so */
559 	if (team_is_mode_set(team)) {
560 		void (*exit_op)(struct team *team) = team->ops.exit;
561 
562 		/* Clear cold-path ops used only under RTNL.  transmit and
563 		 * receive are already dummies (no ports) so leave them
564 		 * alone -- overwriting them is the source of the race.
565 		 */
566 		team->ops.init = NULL;
567 		team->ops.exit = NULL;
568 		team->ops.port_enter = NULL;
569 		team->ops.port_leave = NULL;
570 		team->ops.port_change_dev_addr = NULL;
571 		team->ops.port_tx_disabled = NULL;
572 
573 		/* Wait for in-flight readers before tearing down mode
574 		 * state they may reference.
575 		 */
576 		synchronize_net();
577 
578 		if (exit_op)
579 			exit_op(team);
580 		team_mode_put(team->mode);
581 		team_set_no_mode(team);
582 		/* zero private data area */
583 		memset(&team->mode_priv, 0,
584 		       sizeof(struct team) - offsetof(struct team, mode_priv));
585 	}
586 
587 	if (!new_mode)
588 		return 0;
589 
590 	if (new_mode->ops->init) {
591 		int err;
592 
593 		err = new_mode->ops->init(team);
594 		if (err)
595 			return err;
596 	}
597 
598 	team->mode = new_mode;
599 	team->ops.init = new_mode->ops->init;
600 	team->ops.exit = new_mode->ops->exit;
601 	team->ops.port_enter = new_mode->ops->port_enter;
602 	team->ops.port_leave = new_mode->ops->port_leave;
603 	team->ops.port_change_dev_addr = new_mode->ops->port_change_dev_addr;
604 	team->ops.port_tx_disabled = new_mode->ops->port_tx_disabled;
605 	team_adjust_ops(team);
606 
607 	return 0;
608 }
609 
610 static int team_change_mode(struct team *team, const char *kind)
611 {
612 	const struct team_mode *new_mode;
613 	struct net_device *dev = netdev_from_priv(team);
614 	int err;
615 
616 	if (!list_empty(&team->port_list)) {
617 		netdev_err(dev, "No ports can be present during mode change\n");
618 		return -EBUSY;
619 	}
620 
621 	if (team_is_mode_set(team) && strcmp(team->mode->kind, kind) == 0) {
622 		netdev_err(dev, "Unable to change to the same mode the team is in\n");
623 		return -EINVAL;
624 	}
625 
626 	new_mode = team_mode_get(kind);
627 	if (!new_mode) {
628 		netdev_err(dev, "Mode \"%s\" not found\n", kind);
629 		return -EINVAL;
630 	}
631 
632 	err = __team_change_mode(team, new_mode);
633 	if (err) {
634 		netdev_err(dev, "Failed to change to mode \"%s\"\n", kind);
635 		team_mode_put(new_mode);
636 		return err;
637 	}
638 
639 	netdev_info(dev, "Mode changed to \"%s\"\n", kind);
640 	return 0;
641 }
642 
643 
644 /*********************
645  * Peers notification
646  *********************/
647 
648 static void team_notify_peers_work(struct work_struct *work)
649 {
650 	struct team *team;
651 	int val;
652 
653 	team = container_of(work, struct team, notify_peers.dw.work);
654 
655 	if (!rtnl_trylock()) {
656 		schedule_delayed_work(&team->notify_peers.dw, 0);
657 		return;
658 	}
659 	val = atomic_dec_if_positive(&team->notify_peers.count_pending);
660 	if (val < 0) {
661 		rtnl_unlock();
662 		return;
663 	}
664 	call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, netdev_from_priv(team));
665 	rtnl_unlock();
666 	if (val)
667 		schedule_delayed_work(&team->notify_peers.dw,
668 				      msecs_to_jiffies(team->notify_peers.interval));
669 }
670 
671 static void team_notify_peers(struct team *team)
672 {
673 	if (!team->notify_peers.count || !netif_running(netdev_from_priv(team)))
674 		return;
675 	atomic_add(team->notify_peers.count, &team->notify_peers.count_pending);
676 	schedule_delayed_work(&team->notify_peers.dw, 0);
677 }
678 
679 static void team_notify_peers_init(struct team *team)
680 {
681 	INIT_DELAYED_WORK(&team->notify_peers.dw, team_notify_peers_work);
682 }
683 
684 static void team_notify_peers_fini(struct team *team)
685 {
686 	cancel_delayed_work_sync(&team->notify_peers.dw);
687 }
688 
689 
690 /*******************************
691  * Send multicast group rejoins
692  *******************************/
693 
694 static void team_mcast_rejoin_work(struct work_struct *work)
695 {
696 	struct team *team;
697 	int val;
698 
699 	team = container_of(work, struct team, mcast_rejoin.dw.work);
700 
701 	if (!rtnl_trylock()) {
702 		schedule_delayed_work(&team->mcast_rejoin.dw, 0);
703 		return;
704 	}
705 	val = atomic_dec_if_positive(&team->mcast_rejoin.count_pending);
706 	if (val < 0) {
707 		rtnl_unlock();
708 		return;
709 	}
710 	call_netdevice_notifiers(NETDEV_RESEND_IGMP, netdev_from_priv(team));
711 	rtnl_unlock();
712 	if (val)
713 		schedule_delayed_work(&team->mcast_rejoin.dw,
714 				      msecs_to_jiffies(team->mcast_rejoin.interval));
715 }
716 
717 static void team_mcast_rejoin(struct team *team)
718 {
719 	if (!team->mcast_rejoin.count || !netif_running(netdev_from_priv(team)))
720 		return;
721 	atomic_add(team->mcast_rejoin.count, &team->mcast_rejoin.count_pending);
722 	schedule_delayed_work(&team->mcast_rejoin.dw, 0);
723 }
724 
725 static void team_mcast_rejoin_init(struct team *team)
726 {
727 	INIT_DELAYED_WORK(&team->mcast_rejoin.dw, team_mcast_rejoin_work);
728 }
729 
730 static void team_mcast_rejoin_fini(struct team *team)
731 {
732 	cancel_delayed_work_sync(&team->mcast_rejoin.dw);
733 }
734 
735 
736 /************************
737  * Rx path frame handler
738  ************************/
739 
740 /* note: already called with rcu_read_lock */
741 static rx_handler_result_t team_handle_frame(struct sk_buff **pskb)
742 {
743 	struct sk_buff *skb = *pskb;
744 	struct team_port *port;
745 	struct team *team;
746 	rx_handler_result_t res;
747 
748 	skb = skb_share_check(skb, GFP_ATOMIC);
749 	if (!skb)
750 		return RX_HANDLER_CONSUMED;
751 
752 	*pskb = skb;
753 
754 	port = team_port_get_rcu(skb->dev);
755 	team = port->team;
756 	if (!team_port_rx_enabled(port)) {
757 		if (is_link_local_ether_addr(eth_hdr(skb)->h_dest))
758 			/* link-local packets are mostly useful when stack receives them
759 			 * with the link they arrive on.
760 			 */
761 			return RX_HANDLER_PASS;
762 		/* allow exact match delivery for disabled ports */
763 		res = RX_HANDLER_EXACT;
764 	} else {
765 		res = READ_ONCE(team->ops.receive)(team, port, skb);
766 	}
767 	if (res == RX_HANDLER_ANOTHER) {
768 		struct team_pcpu_stats *pcpu_stats;
769 
770 		pcpu_stats = this_cpu_ptr(team->pcpu_stats);
771 		u64_stats_update_begin(&pcpu_stats->syncp);
772 		u64_stats_inc(&pcpu_stats->rx_packets);
773 		u64_stats_add(&pcpu_stats->rx_bytes, skb->len);
774 		if (skb->pkt_type == PACKET_MULTICAST)
775 			u64_stats_inc(&pcpu_stats->rx_multicast);
776 		u64_stats_update_end(&pcpu_stats->syncp);
777 
778 		skb->dev = netdev_from_priv(team);
779 	} else if (res == RX_HANDLER_EXACT) {
780 		this_cpu_inc(team->pcpu_stats->rx_nohandler);
781 	} else {
782 		this_cpu_inc(team->pcpu_stats->rx_dropped);
783 	}
784 
785 	return res;
786 }
787 
788 
789 /*************************************
790  * Multiqueue Tx port select override
791  *************************************/
792 
793 static int team_queue_override_init(struct team *team)
794 {
795 	struct list_head *listarr;
796 	unsigned int queue_cnt = netdev_from_priv(team)->num_tx_queues - 1;
797 	unsigned int i;
798 
799 	if (!queue_cnt)
800 		return 0;
801 	listarr = kmalloc_objs(struct list_head, queue_cnt);
802 	if (!listarr)
803 		return -ENOMEM;
804 	team->qom_lists = listarr;
805 	for (i = 0; i < queue_cnt; i++)
806 		INIT_LIST_HEAD(listarr++);
807 	return 0;
808 }
809 
810 static void team_queue_override_fini(struct team *team)
811 {
812 	kfree(team->qom_lists);
813 }
814 
815 static struct list_head *__team_get_qom_list(struct team *team, u16 queue_id)
816 {
817 	return &team->qom_lists[queue_id - 1];
818 }
819 
820 /*
821  * note: already called with rcu_read_lock
822  */
823 static bool team_queue_override_transmit(struct team *team, struct sk_buff *skb,
824 					 bool *tx_success)
825 {
826 	struct list_head *qom_list;
827 	struct team_port *port;
828 
829 	if (!team->queue_override_enabled || !skb->queue_mapping)
830 		return false;
831 	qom_list = __team_get_qom_list(team, skb->queue_mapping);
832 	port = list_first_or_null_rcu(qom_list, struct team_port, qom_list);
833 	if (!port)
834 		return false;
835 	*tx_success = !team_dev_queue_xmit(team, port, skb);
836 	return true;
837 }
838 
839 static void __team_queue_override_port_del(struct team *team,
840 					   struct team_port *port)
841 {
842 	if (!port->queue_id)
843 		return;
844 	list_del_rcu(&port->qom_list);
845 }
846 
847 static bool team_queue_override_port_has_gt_prio_than(struct team_port *port,
848 						      struct team_port *cur)
849 {
850 	if (port->priority < cur->priority)
851 		return true;
852 	if (port->priority > cur->priority)
853 		return false;
854 	if (port->tx_index < cur->tx_index)
855 		return true;
856 	return false;
857 }
858 
859 static void __team_queue_override_port_add(struct team *team,
860 					   struct team_port *port)
861 {
862 	struct team_port *cur;
863 	struct list_head *qom_list;
864 	struct list_head *node;
865 
866 	if (!port->queue_id)
867 		return;
868 	qom_list = __team_get_qom_list(team, port->queue_id);
869 	node = qom_list;
870 	list_for_each_entry(cur, qom_list, qom_list) {
871 		if (team_queue_override_port_has_gt_prio_than(port, cur))
872 			break;
873 		node = &cur->qom_list;
874 	}
875 	list_add_tail_rcu(&port->qom_list, node);
876 }
877 
878 static void __team_queue_override_enabled_check(struct team *team)
879 {
880 	struct team_port *port;
881 	bool enabled = false;
882 
883 	list_for_each_entry(port, &team->port_list, list) {
884 		if (port->queue_id) {
885 			enabled = true;
886 			break;
887 		}
888 	}
889 	if (enabled == team->queue_override_enabled)
890 		return;
891 	netdev_dbg(netdev_from_priv(team), "%s queue override\n",
892 		   enabled ? "Enabling" : "Disabling");
893 	team->queue_override_enabled = enabled;
894 }
895 
896 static void team_queue_override_port_prio_changed(struct team *team,
897 						  struct team_port *port)
898 {
899 	if (!port->queue_id || !team_port_tx_enabled(port))
900 		return;
901 	__team_queue_override_port_del(team, port);
902 	__team_queue_override_port_add(team, port);
903 	__team_queue_override_enabled_check(team);
904 }
905 
906 static void team_queue_override_port_change_queue_id(struct team *team,
907 						     struct team_port *port,
908 						     u16 new_queue_id)
909 {
910 	if (team_port_tx_enabled(port)) {
911 		__team_queue_override_port_del(team, port);
912 		port->queue_id = new_queue_id;
913 		__team_queue_override_port_add(team, port);
914 		__team_queue_override_enabled_check(team);
915 	} else {
916 		port->queue_id = new_queue_id;
917 	}
918 }
919 
920 static void team_queue_override_port_add(struct team *team,
921 					 struct team_port *port)
922 {
923 	__team_queue_override_port_add(team, port);
924 	__team_queue_override_enabled_check(team);
925 }
926 
927 static void team_queue_override_port_del(struct team *team,
928 					 struct team_port *port)
929 {
930 	__team_queue_override_port_del(team, port);
931 	__team_queue_override_enabled_check(team);
932 }
933 
934 
935 /****************
936  * Port handling
937  ****************/
938 
939 static bool team_port_find(const struct team *team,
940 			   const struct team_port *port)
941 {
942 	struct team_port *cur;
943 
944 	list_for_each_entry(cur, &team->port_list, list)
945 		if (cur == port)
946 			return true;
947 	return false;
948 }
949 
950 static void __team_port_enable_rx(struct team *team,
951 				  struct team_port *port)
952 {
953 	team->rx_en_port_count++;
954 	WRITE_ONCE(port->rx_enabled, true);
955 }
956 
957 static void __team_port_disable_rx(struct team *team,
958 				   struct team_port *port)
959 {
960 	team->rx_en_port_count--;
961 	WRITE_ONCE(port->rx_enabled, false);
962 }
963 
964 static void team_port_enable_rx(struct team *team,
965 				struct team_port *port)
966 {
967 	if (team_port_rx_enabled(port))
968 		return;
969 
970 	__team_port_enable_rx(team, port);
971 	team_adjust_ops(team);
972 	team_notify_peers(team);
973 	team_mcast_rejoin(team);
974 }
975 
976 static void team_port_disable_rx(struct team *team,
977 				 struct team_port *port)
978 {
979 	if (!team_port_rx_enabled(port))
980 		return;
981 
982 	__team_port_disable_rx(team, port);
983 	team_adjust_ops(team);
984 }
985 
986 /*
987  * Enable just TX on the port by adding to tx-enabled port hashlist and
988  * setting port->tx_index (Might be racy so reader could see incorrect
989  * ifindex when processing a flying packet, but that is not a problem).
990  * Write guarded by RTNL.
991  */
992 static void __team_port_enable_tx(struct team *team,
993 				  struct team_port *port)
994 {
995 	WRITE_ONCE(port->tx_index, team->tx_en_port_count);
996 	WRITE_ONCE(team->tx_en_port_count, team->tx_en_port_count + 1);
997 	hlist_add_head_rcu(&port->tx_hlist,
998 			   team_tx_port_index_hash(team, port->tx_index));
999 }
1000 
1001 static void team_port_enable_tx(struct team *team,
1002 				struct team_port *port)
1003 {
1004 	if (team_port_tx_enabled(port))
1005 		return;
1006 
1007 	__team_port_enable_tx(team, port);
1008 	team_adjust_ops(team);
1009 	team_queue_override_port_add(team, port);
1010 
1011 	/* Don't rejoin multicast, since this port might not be receiving. */
1012 	team_notify_peers(team);
1013 	team_lower_state_changed(port);
1014 }
1015 
1016 static void __reconstruct_port_hlist(struct team *team, int rm_index)
1017 {
1018 	struct hlist_head *tx_port_index_hash;
1019 	struct team_port *port;
1020 	int i;
1021 
1022 	for (i = rm_index + 1; i < team->tx_en_port_count; i++) {
1023 		port = team_get_port_by_tx_index(team, i);
1024 		hlist_del_rcu(&port->tx_hlist);
1025 		WRITE_ONCE(port->tx_index, port->tx_index - 1);
1026 		tx_port_index_hash = team_tx_port_index_hash(team,
1027 							     port->tx_index);
1028 		hlist_add_head_rcu(&port->tx_hlist, tx_port_index_hash);
1029 	}
1030 }
1031 
1032 static void __team_port_disable_tx(struct team *team,
1033 				   struct team_port *port)
1034 {
1035 	if (team->ops.port_tx_disabled)
1036 		team->ops.port_tx_disabled(team, port);
1037 
1038 	hlist_del_rcu(&port->tx_hlist);
1039 	__reconstruct_port_hlist(team, port->tx_index);
1040 
1041 	WRITE_ONCE(port->tx_index, -1);
1042 	WRITE_ONCE(team->tx_en_port_count, team->tx_en_port_count - 1);
1043 }
1044 
1045 static void team_port_disable_tx(struct team *team,
1046 				 struct team_port *port)
1047 {
1048 	if (!team_port_tx_enabled(port))
1049 		return;
1050 
1051 	__team_port_disable_tx(team, port);
1052 
1053 	team_queue_override_port_del(team, port);
1054 	team_adjust_ops(team);
1055 	team_lower_state_changed(port);
1056 }
1057 
1058 /*
1059  * Enable TX AND RX on the port.
1060  */
1061 static void team_port_enable(struct team *team,
1062 			     struct team_port *port)
1063 {
1064 	bool rx_was_enabled;
1065 	bool tx_was_enabled;
1066 
1067 	if (team_port_enabled(port))
1068 		return;
1069 
1070 	rx_was_enabled = team_port_rx_enabled(port);
1071 	tx_was_enabled = team_port_tx_enabled(port);
1072 
1073 	if (!rx_was_enabled)
1074 		__team_port_enable_rx(team, port);
1075 	if (!tx_was_enabled)
1076 		__team_port_enable_tx(team, port);
1077 
1078 	team_adjust_ops(team);
1079 	if (!tx_was_enabled)
1080 		team_queue_override_port_add(team, port);
1081 	team_notify_peers(team);
1082 	if (!rx_was_enabled)
1083 		team_mcast_rejoin(team);
1084 	if (!tx_was_enabled)
1085 		team_lower_state_changed(port);
1086 }
1087 
1088 static void team_port_disable(struct team *team,
1089 			      struct team_port *port)
1090 {
1091 	bool rx_was_enabled = team_port_rx_enabled(port);
1092 	bool tx_was_enabled = team_port_tx_enabled(port);
1093 
1094 	if (!tx_was_enabled && !rx_was_enabled)
1095 		return;
1096 
1097 	if (tx_was_enabled) {
1098 		__team_port_disable_tx(team, port);
1099 		team_queue_override_port_del(team, port);
1100 	}
1101 	if (rx_was_enabled)
1102 		__team_port_disable_rx(team, port);
1103 
1104 	team_adjust_ops(team);
1105 
1106 	if (tx_was_enabled)
1107 		team_lower_state_changed(port);
1108 }
1109 
1110 static int team_port_enter(struct team *team, struct team_port *port)
1111 {
1112 	int err = 0;
1113 
1114 	dev_hold(netdev_from_priv(team));
1115 	if (team->ops.port_enter) {
1116 		err = team->ops.port_enter(team, port);
1117 		if (err) {
1118 			netdev_err(netdev_from_priv(team),
1119 				   "Device %s failed to enter team mode\n",
1120 				   port->dev->name);
1121 			goto err_port_enter;
1122 		}
1123 	}
1124 
1125 	return 0;
1126 
1127 err_port_enter:
1128 	dev_put(netdev_from_priv(team));
1129 
1130 	return err;
1131 }
1132 
1133 static void team_port_leave(struct team *team, struct team_port *port)
1134 {
1135 	if (team->ops.port_leave)
1136 		team->ops.port_leave(team, port);
1137 	dev_put(netdev_from_priv(team));
1138 }
1139 
1140 #ifdef CONFIG_NET_POLL_CONTROLLER
1141 static int __team_port_enable_netpoll(struct team_port *port)
1142 {
1143 	struct netpoll *np;
1144 	int err;
1145 
1146 	np = kzalloc_obj(*np);
1147 	if (!np)
1148 		return -ENOMEM;
1149 
1150 	err = __netpoll_setup(np, port->dev);
1151 	if (err) {
1152 		kfree(np);
1153 		return err;
1154 	}
1155 	port->np = np;
1156 	return err;
1157 }
1158 
1159 static int team_port_enable_netpoll(struct team_port *port)
1160 {
1161 	if (!netdev_from_priv(port->team)->npinfo)
1162 		return 0;
1163 
1164 	return __team_port_enable_netpoll(port);
1165 }
1166 
1167 static void team_port_disable_netpoll(struct team_port *port)
1168 {
1169 	struct netpoll *np = port->np;
1170 
1171 	if (!np)
1172 		return;
1173 	port->np = NULL;
1174 
1175 	__netpoll_free(np);
1176 }
1177 #else
1178 static int team_port_enable_netpoll(struct team_port *port)
1179 {
1180 	return 0;
1181 }
1182 static void team_port_disable_netpoll(struct team_port *port)
1183 {
1184 }
1185 #endif
1186 
1187 static int team_upper_dev_link(struct team *team, struct team_port *port,
1188 			       struct netlink_ext_ack *extack)
1189 {
1190 	struct netdev_lag_upper_info lag_upper_info;
1191 	int err;
1192 
1193 	lag_upper_info.tx_type = team->mode->lag_tx_type;
1194 	lag_upper_info.hash_type = NETDEV_LAG_HASH_UNKNOWN;
1195 	err = netdev_master_upper_dev_link(port->dev, netdev_from_priv(team),
1196 					   NULL, &lag_upper_info, extack);
1197 	if (err)
1198 		return err;
1199 	port->dev->priv_flags |= IFF_TEAM_PORT;
1200 	return 0;
1201 }
1202 
1203 static void team_upper_dev_unlink(struct team *team, struct team_port *port)
1204 {
1205 	netdev_upper_dev_unlink(port->dev, netdev_from_priv(team));
1206 	port->dev->priv_flags &= ~IFF_TEAM_PORT;
1207 }
1208 
1209 static void __team_port_change_port_added(struct team_port *port, bool linkup);
1210 static int team_dev_type_check_change(struct net_device *dev,
1211 				      struct net_device *port_dev);
1212 
1213 static int team_port_add(struct team *team, struct net_device *port_dev,
1214 			 struct netlink_ext_ack *extack)
1215 {
1216 	struct net_device *dev = netdev_from_priv(team);
1217 	struct team_port *port;
1218 	char *portname = port_dev->name;
1219 	int err;
1220 
1221 	if (port_dev->flags & IFF_LOOPBACK) {
1222 		NL_SET_ERR_MSG(extack, "Loopback device can't be added as a team port");
1223 		netdev_err(dev, "Device %s is loopback device. Loopback devices can't be added as a team port\n",
1224 			   portname);
1225 		return -EINVAL;
1226 	}
1227 
1228 	if (port_dev->type == ARPHRD_CAN ||
1229 	    port_dev->type == ARPHRD_IEEE802154 ||
1230 	    port_dev->type == ARPHRD_IEEE802154_MONITOR ||
1231 	    port_dev->type == ARPHRD_6LOWPAN) {
1232 		NL_SET_ERR_MSG(extack,
1233 			       "CAN, IEEE 802.15.4 and 6LoWPAN devices can't be added as a team port");
1234 		netdev_err(dev, "Device %s is CAN, IEEE 802.15.4 or 6LoWPAN. These device types can't be added as a team port\n",
1235 			   portname);
1236 		return -EINVAL;
1237 	}
1238 
1239 	if (netif_is_team_port(port_dev)) {
1240 		NL_SET_ERR_MSG(extack, "Device is already a port of a team device");
1241 		netdev_err(dev, "Device %s is already a port "
1242 				"of a team device\n", portname);
1243 		return -EBUSY;
1244 	}
1245 
1246 	if (dev == port_dev) {
1247 		NL_SET_ERR_MSG(extack, "Cannot enslave team device to itself");
1248 		netdev_err(dev, "Cannot enslave team device to itself\n");
1249 		return -EINVAL;
1250 	}
1251 
1252 	if (netdev_has_upper_dev(dev, port_dev)) {
1253 		NL_SET_ERR_MSG(extack, "Device is already an upper device of the team interface");
1254 		netdev_err(dev, "Device %s is already an upper device of the team interface\n",
1255 			   portname);
1256 		return -EBUSY;
1257 	}
1258 
1259 	if (netdev_has_upper_dev(port_dev, dev)) {
1260 		NL_SET_ERR_MSG(extack, "Device is already a lower device of the team interface");
1261 		netdev_err(dev, "Device %s is already a lower device of the team interface\n",
1262 			   portname);
1263 		return -EBUSY;
1264 	}
1265 
1266 	if (port_dev->features & NETIF_F_VLAN_CHALLENGED &&
1267 	    vlan_uses_dev(dev)) {
1268 		NL_SET_ERR_MSG(extack, "Device is VLAN challenged and team device has VLAN set up");
1269 		netdev_err(dev, "Device %s is VLAN challenged and team device has VLAN set up\n",
1270 			   portname);
1271 		return -EPERM;
1272 	}
1273 
1274 	if (port_dev->flags & IFF_UP) {
1275 		NL_SET_ERR_MSG(extack, "Device is up. Set it down before adding it as a team port");
1276 		netdev_err(dev, "Device %s is up. Set it down before adding it as a team port\n",
1277 			   portname);
1278 		return -EBUSY;
1279 	}
1280 
1281 	port = kzalloc(sizeof(struct team_port) + team->mode->port_priv_size,
1282 		       GFP_KERNEL);
1283 	if (!port)
1284 		return -ENOMEM;
1285 
1286 	port->dev = port_dev;
1287 	port->team = team;
1288 	INIT_LIST_HEAD(&port->qom_list);
1289 
1290 	port->orig.mtu = port_dev->mtu;
1291 	/*
1292 	 * MTU assignment will be handled in team_dev_type_check_change
1293 	 * if dev and port_dev are of different types
1294 	 */
1295 	if (dev->type == port_dev->type) {
1296 		err = dev_set_mtu(port_dev, dev->mtu);
1297 		if (err) {
1298 			netdev_dbg(dev, "Error %d calling dev_set_mtu\n", err);
1299 			goto err_set_mtu;
1300 		}
1301 	}
1302 
1303 	memcpy(port->orig.dev_addr, port_dev->dev_addr, port_dev->addr_len);
1304 
1305 	err = team_port_enter(team, port);
1306 	if (err) {
1307 		netdev_err(dev, "Device %s failed to enter team mode\n",
1308 			   portname);
1309 		goto err_port_enter;
1310 	}
1311 
1312 	err = dev_open(port_dev, extack);
1313 	if (err) {
1314 		netdev_dbg(dev, "Device %s opening failed\n",
1315 			   portname);
1316 		goto err_dev_open;
1317 	}
1318 
1319 	err = vlan_vids_add_by_dev(port_dev, dev);
1320 	if (err) {
1321 		netdev_err(dev, "Failed to add vlan ids to device %s\n",
1322 				portname);
1323 		goto err_vids_add;
1324 	}
1325 
1326 	err = team_port_enable_netpoll(port);
1327 	if (err) {
1328 		netdev_err(dev, "Failed to enable netpoll on device %s\n",
1329 			   portname);
1330 		goto err_enable_netpoll;
1331 	}
1332 
1333 	if (!(dev->features & NETIF_F_LRO))
1334 		dev_disable_lro(port_dev);
1335 
1336 	err = netdev_rx_handler_register(port_dev, team_handle_frame,
1337 					 port);
1338 	if (err) {
1339 		netdev_err(dev, "Device %s failed to register rx_handler\n",
1340 			   portname);
1341 		goto err_handler_register;
1342 	}
1343 
1344 	err = team_upper_dev_link(team, port, extack);
1345 	if (err) {
1346 		netdev_err(dev, "Device %s failed to set upper link\n",
1347 			   portname);
1348 		goto err_set_upper_link;
1349 	}
1350 
1351 	err = __team_option_inst_add_port(team, port);
1352 	if (err) {
1353 		netdev_err(dev, "Device %s failed to add per-port options\n",
1354 			   portname);
1355 		goto err_option_port_add;
1356 	}
1357 
1358 	/* set promiscuity level to new slave */
1359 	if (dev->flags & IFF_PROMISC) {
1360 		err = dev_set_promiscuity(port_dev, 1);
1361 		if (err)
1362 			goto err_set_slave_promisc;
1363 	}
1364 
1365 	/* set allmulti level to new slave */
1366 	if (dev->flags & IFF_ALLMULTI) {
1367 		err = dev_set_allmulti(port_dev, 1);
1368 		if (err) {
1369 			if (dev->flags & IFF_PROMISC)
1370 				dev_set_promiscuity(port_dev, -1);
1371 			goto err_set_slave_allmulti;
1372 		}
1373 	}
1374 
1375 	err = team_dev_type_check_change(dev, port_dev);
1376 	if (err)
1377 		goto err_set_dev_type;
1378 
1379 	if (dev->flags & IFF_UP) {
1380 		netif_addr_lock_bh(dev);
1381 		dev_uc_sync_multiple(port_dev, dev);
1382 		dev_mc_sync_multiple(port_dev, dev);
1383 		netif_addr_unlock_bh(dev);
1384 	}
1385 
1386 	WRITE_ONCE(port->tx_index, -1);
1387 	list_add_tail_rcu(&port->list, &team->port_list);
1388 	team_port_enable(team, port);
1389 	netdev_compute_master_upper_features(dev, true);
1390 	netdev_lock_ops(port_dev);
1391 	__team_port_change_port_added(port, !!netif_oper_up(port_dev));
1392 	netdev_unlock_ops(port_dev);
1393 	__team_options_change_check(team);
1394 
1395 	netdev_info(dev, "Port device %s added\n", portname);
1396 
1397 	return 0;
1398 
1399 err_set_dev_type:
1400 err_set_slave_allmulti:
1401 err_set_slave_promisc:
1402 	__team_option_inst_del_port(team, port);
1403 
1404 err_option_port_add:
1405 	team_upper_dev_unlink(team, port);
1406 
1407 err_set_upper_link:
1408 	netdev_rx_handler_unregister(port_dev);
1409 
1410 err_handler_register:
1411 	team_port_disable_netpoll(port);
1412 
1413 err_enable_netpoll:
1414 	vlan_vids_del_by_dev(port_dev, dev);
1415 
1416 err_vids_add:
1417 	dev_close(port_dev);
1418 
1419 err_dev_open:
1420 	team_port_leave(team, port);
1421 	team_port_set_orig_dev_addr(port);
1422 
1423 err_port_enter:
1424 	dev_set_mtu(port_dev, port->orig.mtu);
1425 
1426 err_set_mtu:
1427 	kfree(port);
1428 
1429 	return err;
1430 }
1431 
1432 static void __team_port_change_port_removed(struct team_port *port);
1433 
1434 static int team_port_del(struct team *team, struct net_device *port_dev, bool unregister)
1435 {
1436 	struct net_device *dev = netdev_from_priv(team);
1437 	struct team_port *port;
1438 	char *portname = port_dev->name;
1439 
1440 	port = team_port_get_rtnl(port_dev);
1441 	if (!port || !team_port_find(team, port)) {
1442 		netdev_err(dev, "Device %s does not act as a port of this team\n",
1443 			   portname);
1444 		return -ENOENT;
1445 	}
1446 
1447 	team_port_disable(team, port);
1448 	list_del_rcu(&port->list);
1449 
1450 	if (dev->flags & IFF_PROMISC)
1451 		dev_set_promiscuity(port_dev, -1);
1452 	if (dev->flags & IFF_ALLMULTI)
1453 		dev_set_allmulti(port_dev, -1);
1454 
1455 	team_upper_dev_unlink(team, port);
1456 	netdev_rx_handler_unregister(port_dev);
1457 	team_port_disable_netpoll(port);
1458 	vlan_vids_del_by_dev(port_dev, dev);
1459 	if (dev->flags & IFF_UP) {
1460 		dev_uc_unsync(port_dev, dev);
1461 		dev_mc_unsync(port_dev, dev);
1462 	}
1463 	dev_close(port_dev);
1464 	team_port_leave(team, port);
1465 
1466 	__team_option_inst_mark_removed_port(team, port);
1467 	__team_options_change_check(team);
1468 	__team_option_inst_del_port(team, port);
1469 	__team_port_change_port_removed(port);
1470 
1471 	team_port_set_orig_dev_addr(port);
1472 	if (unregister) {
1473 		netdev_lock_ops(port_dev);
1474 		__netif_set_mtu(port_dev, port->orig.mtu);
1475 		netdev_unlock_ops(port_dev);
1476 	} else {
1477 		dev_set_mtu(port_dev, port->orig.mtu);
1478 	}
1479 	kfree_rcu(port, rcu);
1480 	netdev_info(dev, "Port device %s removed\n", portname);
1481 	netdev_compute_master_upper_features(dev, true);
1482 
1483 	return 0;
1484 }
1485 
1486 
1487 /*****************
1488  * Net device ops
1489  *****************/
1490 
1491 static void team_mode_option_get(struct team *team, struct team_gsetter_ctx *ctx)
1492 {
1493 	ctx->data.str_val = team->mode->kind;
1494 }
1495 
1496 static int team_mode_option_set(struct team *team, struct team_gsetter_ctx *ctx)
1497 {
1498 	return team_change_mode(team, ctx->data.str_val);
1499 }
1500 
1501 static void team_notify_peers_count_get(struct team *team,
1502 					struct team_gsetter_ctx *ctx)
1503 {
1504 	ctx->data.u32_val = team->notify_peers.count;
1505 }
1506 
1507 static int team_notify_peers_count_set(struct team *team,
1508 				       struct team_gsetter_ctx *ctx)
1509 {
1510 	team->notify_peers.count = ctx->data.u32_val;
1511 	return 0;
1512 }
1513 
1514 static void team_notify_peers_interval_get(struct team *team,
1515 					   struct team_gsetter_ctx *ctx)
1516 {
1517 	ctx->data.u32_val = team->notify_peers.interval;
1518 }
1519 
1520 static int team_notify_peers_interval_set(struct team *team,
1521 					  struct team_gsetter_ctx *ctx)
1522 {
1523 	team->notify_peers.interval = ctx->data.u32_val;
1524 	return 0;
1525 }
1526 
1527 static void team_mcast_rejoin_count_get(struct team *team,
1528 					struct team_gsetter_ctx *ctx)
1529 {
1530 	ctx->data.u32_val = team->mcast_rejoin.count;
1531 }
1532 
1533 static int team_mcast_rejoin_count_set(struct team *team,
1534 				       struct team_gsetter_ctx *ctx)
1535 {
1536 	team->mcast_rejoin.count = ctx->data.u32_val;
1537 	return 0;
1538 }
1539 
1540 static void team_mcast_rejoin_interval_get(struct team *team,
1541 					   struct team_gsetter_ctx *ctx)
1542 {
1543 	ctx->data.u32_val = team->mcast_rejoin.interval;
1544 }
1545 
1546 static int team_mcast_rejoin_interval_set(struct team *team,
1547 					  struct team_gsetter_ctx *ctx)
1548 {
1549 	team->mcast_rejoin.interval = ctx->data.u32_val;
1550 	return 0;
1551 }
1552 
1553 static void team_port_en_option_get(struct team *team,
1554 				    struct team_gsetter_ctx *ctx)
1555 {
1556 	struct team_port *port = ctx->info->port;
1557 
1558 	ctx->data.bool_val = team_port_enabled(port);
1559 }
1560 
1561 static int team_port_en_option_set(struct team *team,
1562 				   struct team_gsetter_ctx *ctx)
1563 {
1564 	struct team_port *port = ctx->info->port;
1565 
1566 	if (ctx->data.bool_val)
1567 		team_port_enable(team, port);
1568 	else
1569 		team_port_disable(team, port);
1570 	return 0;
1571 }
1572 
1573 static void team_port_rx_en_option_get(struct team *team,
1574 				       struct team_gsetter_ctx *ctx)
1575 {
1576 	struct team_port *port = ctx->info->port;
1577 
1578 	ctx->data.bool_val = team_port_rx_enabled(port);
1579 }
1580 
1581 static int team_port_rx_en_option_set(struct team *team,
1582 				      struct team_gsetter_ctx *ctx)
1583 {
1584 	struct team_port *port = ctx->info->port;
1585 
1586 	if (ctx->data.bool_val)
1587 		team_port_enable_rx(team, port);
1588 	else
1589 		team_port_disable_rx(team, port);
1590 	return 0;
1591 }
1592 
1593 static void team_port_tx_en_option_get(struct team *team,
1594 				       struct team_gsetter_ctx *ctx)
1595 {
1596 	struct team_port *port = ctx->info->port;
1597 
1598 	ctx->data.bool_val = team_port_tx_enabled(port);
1599 }
1600 
1601 static int team_port_tx_en_option_set(struct team *team,
1602 				      struct team_gsetter_ctx *ctx)
1603 {
1604 	struct team_port *port = ctx->info->port;
1605 
1606 	if (ctx->data.bool_val)
1607 		team_port_enable_tx(team, port);
1608 	else
1609 		team_port_disable_tx(team, port);
1610 	return 0;
1611 }
1612 
1613 static void team_user_linkup_option_get(struct team *team,
1614 					struct team_gsetter_ctx *ctx)
1615 {
1616 	struct team_port *port = ctx->info->port;
1617 
1618 	ctx->data.bool_val = port->user.linkup;
1619 }
1620 
1621 static void __team_carrier_check(struct team *team);
1622 
1623 static int team_user_linkup_option_set(struct team *team,
1624 				       struct team_gsetter_ctx *ctx)
1625 {
1626 	struct team_port *port = ctx->info->port;
1627 
1628 	port->user.linkup = ctx->data.bool_val;
1629 	team_refresh_port_linkup(port);
1630 	__team_carrier_check(port->team);
1631 	return 0;
1632 }
1633 
1634 static void team_user_linkup_en_option_get(struct team *team,
1635 					   struct team_gsetter_ctx *ctx)
1636 {
1637 	struct team_port *port = ctx->info->port;
1638 
1639 	ctx->data.bool_val = port->user.linkup_enabled;
1640 }
1641 
1642 static int team_user_linkup_en_option_set(struct team *team,
1643 					  struct team_gsetter_ctx *ctx)
1644 {
1645 	struct team_port *port = ctx->info->port;
1646 
1647 	port->user.linkup_enabled = ctx->data.bool_val;
1648 	team_refresh_port_linkup(port);
1649 	__team_carrier_check(port->team);
1650 	return 0;
1651 }
1652 
1653 static void team_priority_option_get(struct team *team,
1654 				     struct team_gsetter_ctx *ctx)
1655 {
1656 	struct team_port *port = ctx->info->port;
1657 
1658 	ctx->data.s32_val = port->priority;
1659 }
1660 
1661 static int team_priority_option_set(struct team *team,
1662 				    struct team_gsetter_ctx *ctx)
1663 {
1664 	struct team_port *port = ctx->info->port;
1665 	s32 priority = ctx->data.s32_val;
1666 
1667 	if (port->priority == priority)
1668 		return 0;
1669 	port->priority = priority;
1670 	team_queue_override_port_prio_changed(team, port);
1671 	return 0;
1672 }
1673 
1674 static void team_queue_id_option_get(struct team *team,
1675 				     struct team_gsetter_ctx *ctx)
1676 {
1677 	struct team_port *port = ctx->info->port;
1678 
1679 	ctx->data.u32_val = port->queue_id;
1680 }
1681 
1682 static int team_queue_id_option_set(struct team *team,
1683 				    struct team_gsetter_ctx *ctx)
1684 {
1685 	struct team_port *port = ctx->info->port;
1686 	u16 new_queue_id = ctx->data.u32_val;
1687 
1688 	if (port->queue_id == new_queue_id)
1689 		return 0;
1690 	if (new_queue_id >= netdev_from_priv(team)->real_num_tx_queues)
1691 		return -EINVAL;
1692 	team_queue_override_port_change_queue_id(team, port, new_queue_id);
1693 	return 0;
1694 }
1695 
1696 static const struct team_option team_options[] = {
1697 	{
1698 		.name = "mode",
1699 		.type = TEAM_OPTION_TYPE_STRING,
1700 		.getter = team_mode_option_get,
1701 		.setter = team_mode_option_set,
1702 	},
1703 	{
1704 		.name = "notify_peers_count",
1705 		.type = TEAM_OPTION_TYPE_U32,
1706 		.getter = team_notify_peers_count_get,
1707 		.setter = team_notify_peers_count_set,
1708 	},
1709 	{
1710 		.name = "notify_peers_interval",
1711 		.type = TEAM_OPTION_TYPE_U32,
1712 		.getter = team_notify_peers_interval_get,
1713 		.setter = team_notify_peers_interval_set,
1714 	},
1715 	{
1716 		.name = "mcast_rejoin_count",
1717 		.type = TEAM_OPTION_TYPE_U32,
1718 		.getter = team_mcast_rejoin_count_get,
1719 		.setter = team_mcast_rejoin_count_set,
1720 	},
1721 	{
1722 		.name = "mcast_rejoin_interval",
1723 		.type = TEAM_OPTION_TYPE_U32,
1724 		.getter = team_mcast_rejoin_interval_get,
1725 		.setter = team_mcast_rejoin_interval_set,
1726 	},
1727 	{
1728 		.name = "enabled",
1729 		.type = TEAM_OPTION_TYPE_BOOL,
1730 		.per_port = true,
1731 		.getter = team_port_en_option_get,
1732 		.setter = team_port_en_option_set,
1733 	},
1734 	{
1735 		.name = "rx_enabled",
1736 		.type = TEAM_OPTION_TYPE_BOOL,
1737 		.per_port = true,
1738 		.getter = team_port_rx_en_option_get,
1739 		.setter = team_port_rx_en_option_set,
1740 	},
1741 	{
1742 		.name = "tx_enabled",
1743 		.type = TEAM_OPTION_TYPE_BOOL,
1744 		.per_port = true,
1745 		.getter = team_port_tx_en_option_get,
1746 		.setter = team_port_tx_en_option_set,
1747 	},
1748 	{
1749 		.name = "user_linkup",
1750 		.type = TEAM_OPTION_TYPE_BOOL,
1751 		.per_port = true,
1752 		.getter = team_user_linkup_option_get,
1753 		.setter = team_user_linkup_option_set,
1754 	},
1755 	{
1756 		.name = "user_linkup_enabled",
1757 		.type = TEAM_OPTION_TYPE_BOOL,
1758 		.per_port = true,
1759 		.getter = team_user_linkup_en_option_get,
1760 		.setter = team_user_linkup_en_option_set,
1761 	},
1762 	{
1763 		.name = "priority",
1764 		.type = TEAM_OPTION_TYPE_S32,
1765 		.per_port = true,
1766 		.getter = team_priority_option_get,
1767 		.setter = team_priority_option_set,
1768 	},
1769 	{
1770 		.name = "queue_id",
1771 		.type = TEAM_OPTION_TYPE_U32,
1772 		.per_port = true,
1773 		.getter = team_queue_id_option_get,
1774 		.setter = team_queue_id_option_set,
1775 	},
1776 };
1777 
1778 
1779 static int team_init(struct net_device *dev)
1780 {
1781 	struct team *team = netdev_priv(dev);
1782 	int i;
1783 	int err;
1784 
1785 	team_set_no_mode(team);
1786 	team->notifier_ctx = false;
1787 
1788 	team->pcpu_stats = netdev_alloc_pcpu_stats(struct team_pcpu_stats);
1789 	if (!team->pcpu_stats)
1790 		return -ENOMEM;
1791 
1792 	for (i = 0; i < TEAM_PORT_HASHENTRIES; i++)
1793 		INIT_HLIST_HEAD(&team->tx_en_port_hlist[i]);
1794 	INIT_LIST_HEAD(&team->port_list);
1795 	err = team_queue_override_init(team);
1796 	if (err)
1797 		goto err_team_queue_override_init;
1798 
1799 	team_adjust_ops(team);
1800 
1801 	INIT_LIST_HEAD(&team->option_list);
1802 	INIT_LIST_HEAD(&team->option_inst_list);
1803 
1804 	team_notify_peers_init(team);
1805 	team_mcast_rejoin_init(team);
1806 
1807 	err = team_options_register(team, team_options, ARRAY_SIZE(team_options));
1808 	if (err)
1809 		goto err_options_register;
1810 	netif_carrier_off(dev);
1811 
1812 	netdev_lockdep_set_classes(dev);
1813 
1814 	return 0;
1815 
1816 err_options_register:
1817 	team_mcast_rejoin_fini(team);
1818 	team_notify_peers_fini(team);
1819 	team_queue_override_fini(team);
1820 err_team_queue_override_init:
1821 	free_percpu(team->pcpu_stats);
1822 
1823 	return err;
1824 }
1825 
1826 static void team_uninit(struct net_device *dev)
1827 {
1828 	struct team *team = netdev_priv(dev);
1829 	struct team_port *port;
1830 	struct team_port *tmp;
1831 
1832 	ASSERT_RTNL();
1833 
1834 	list_for_each_entry_safe(port, tmp, &team->port_list, list)
1835 		team_port_del(team, port->dev, false);
1836 
1837 	__team_change_mode(team, NULL); /* cleanup */
1838 	__team_options_unregister(team, team_options, ARRAY_SIZE(team_options));
1839 	team_mcast_rejoin_fini(team);
1840 	team_notify_peers_fini(team);
1841 	team_queue_override_fini(team);
1842 	netdev_change_features(dev);
1843 }
1844 
1845 static void team_destructor(struct net_device *dev)
1846 {
1847 	struct team *team = netdev_priv(dev);
1848 
1849 	free_percpu(team->pcpu_stats);
1850 }
1851 
1852 static int team_open(struct net_device *dev)
1853 {
1854 	return 0;
1855 }
1856 
1857 static int team_close(struct net_device *dev)
1858 {
1859 	struct team *team = netdev_priv(dev);
1860 	struct team_port *port;
1861 
1862 	list_for_each_entry(port, &team->port_list, list) {
1863 		dev_uc_unsync(port->dev, dev);
1864 		dev_mc_unsync(port->dev, dev);
1865 	}
1866 
1867 	return 0;
1868 }
1869 
1870 /*
1871  * note: already called with rcu_read_lock
1872  */
1873 static netdev_tx_t team_xmit(struct sk_buff *skb, struct net_device *dev)
1874 {
1875 	struct team *team = netdev_priv(dev);
1876 	bool tx_success;
1877 	unsigned int len = skb->len;
1878 
1879 	if (!team_queue_override_transmit(team, skb, &tx_success))
1880 		tx_success = READ_ONCE(team->ops.transmit)(team, skb);
1881 	if (tx_success) {
1882 		struct team_pcpu_stats *pcpu_stats;
1883 
1884 		pcpu_stats = this_cpu_ptr(team->pcpu_stats);
1885 		u64_stats_update_begin(&pcpu_stats->syncp);
1886 		u64_stats_inc(&pcpu_stats->tx_packets);
1887 		u64_stats_add(&pcpu_stats->tx_bytes, len);
1888 		u64_stats_update_end(&pcpu_stats->syncp);
1889 	} else {
1890 		this_cpu_inc(team->pcpu_stats->tx_dropped);
1891 	}
1892 
1893 	return NETDEV_TX_OK;
1894 }
1895 
1896 static u16 team_select_queue(struct net_device *dev, struct sk_buff *skb,
1897 			     struct net_device *sb_dev)
1898 {
1899 	/*
1900 	 * This helper function exists to help dev_pick_tx get the correct
1901 	 * destination queue.  Using a helper function skips a call to
1902 	 * skb_tx_hash and will put the skbs in the queue we expect on their
1903 	 * way down to the team driver.
1904 	 */
1905 	u16 txq = skb_rx_queue_recorded(skb) ? skb_get_rx_queue(skb) : 0;
1906 
1907 	/*
1908 	 * Save the original txq to restore before passing to the driver
1909 	 */
1910 	qdisc_skb_cb(skb)->slave_dev_queue_mapping = skb->queue_mapping;
1911 
1912 	if (unlikely(txq >= dev->real_num_tx_queues)) {
1913 		do {
1914 			txq -= dev->real_num_tx_queues;
1915 		} while (txq >= dev->real_num_tx_queues);
1916 	}
1917 	return txq;
1918 }
1919 
1920 static void team_change_rx_flags(struct net_device *dev, int change)
1921 {
1922 	struct team *team = netdev_priv(dev);
1923 	struct team_port *port;
1924 	int inc;
1925 
1926 	ASSERT_RTNL();
1927 
1928 	list_for_each_entry(port, &team->port_list, list) {
1929 		if (change & IFF_PROMISC) {
1930 			inc = dev->flags & IFF_PROMISC ? 1 : -1;
1931 			dev_set_promiscuity(port->dev, inc);
1932 		}
1933 		if (change & IFF_ALLMULTI) {
1934 			inc = dev->flags & IFF_ALLMULTI ? 1 : -1;
1935 			dev_set_allmulti(port->dev, inc);
1936 		}
1937 	}
1938 }
1939 
1940 static void team_set_rx_mode(struct net_device *dev)
1941 {
1942 	struct team *team = netdev_priv(dev);
1943 	struct team_port *port;
1944 
1945 	rcu_read_lock();
1946 	list_for_each_entry_rcu(port, &team->port_list, list) {
1947 		dev_uc_sync_multiple(port->dev, dev);
1948 		dev_mc_sync_multiple(port->dev, dev);
1949 	}
1950 	rcu_read_unlock();
1951 }
1952 
1953 static int team_set_mac_address(struct net_device *dev, void *p)
1954 {
1955 	struct sockaddr *addr = p;
1956 	struct team *team = netdev_priv(dev);
1957 	struct team_port *port;
1958 
1959 	ASSERT_RTNL();
1960 
1961 	if (dev->type == ARPHRD_ETHER && !is_valid_ether_addr(addr->sa_data))
1962 		return -EADDRNOTAVAIL;
1963 	dev_addr_set(dev, addr->sa_data);
1964 	list_for_each_entry(port, &team->port_list, list)
1965 		if (team->ops.port_change_dev_addr)
1966 			team->ops.port_change_dev_addr(team, port);
1967 	return 0;
1968 }
1969 
1970 static int team_change_mtu(struct net_device *dev, int new_mtu)
1971 {
1972 	struct team *team = netdev_priv(dev);
1973 	struct team_port *port;
1974 	int err;
1975 
1976 	ASSERT_RTNL();
1977 
1978 	team->port_mtu_change_allowed = true;
1979 	list_for_each_entry(port, &team->port_list, list) {
1980 		err = dev_set_mtu(port->dev, new_mtu);
1981 		if (err) {
1982 			netdev_err(dev, "Device %s failed to change mtu",
1983 				   port->dev->name);
1984 			goto unwind;
1985 		}
1986 	}
1987 	team->port_mtu_change_allowed = false;
1988 
1989 	WRITE_ONCE(dev->mtu, new_mtu);
1990 
1991 	return 0;
1992 
1993 unwind:
1994 	list_for_each_entry_continue_reverse(port, &team->port_list, list)
1995 		dev_set_mtu(port->dev, dev->mtu);
1996 	team->port_mtu_change_allowed = false;
1997 
1998 	return err;
1999 }
2000 
2001 static void
2002 team_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
2003 {
2004 	struct team *team = netdev_priv(dev);
2005 	struct team_pcpu_stats *p;
2006 	u64 rx_packets, rx_bytes, rx_multicast, tx_packets, tx_bytes;
2007 	u32 rx_dropped = 0, tx_dropped = 0, rx_nohandler = 0;
2008 	unsigned int start;
2009 	int i;
2010 
2011 	for_each_possible_cpu(i) {
2012 		p = per_cpu_ptr(team->pcpu_stats, i);
2013 		do {
2014 			start = u64_stats_fetch_begin(&p->syncp);
2015 			rx_packets	= u64_stats_read(&p->rx_packets);
2016 			rx_bytes	= u64_stats_read(&p->rx_bytes);
2017 			rx_multicast	= u64_stats_read(&p->rx_multicast);
2018 			tx_packets	= u64_stats_read(&p->tx_packets);
2019 			tx_bytes	= u64_stats_read(&p->tx_bytes);
2020 		} while (u64_stats_fetch_retry(&p->syncp, start));
2021 
2022 		stats->rx_packets	+= rx_packets;
2023 		stats->rx_bytes		+= rx_bytes;
2024 		stats->multicast	+= rx_multicast;
2025 		stats->tx_packets	+= tx_packets;
2026 		stats->tx_bytes		+= tx_bytes;
2027 		/*
2028 		 * rx_dropped, tx_dropped & rx_nohandler are u32,
2029 		 * updated without syncp protection.
2030 		 */
2031 		rx_dropped	+= READ_ONCE(p->rx_dropped);
2032 		tx_dropped	+= READ_ONCE(p->tx_dropped);
2033 		rx_nohandler	+= READ_ONCE(p->rx_nohandler);
2034 	}
2035 	stats->rx_dropped	= rx_dropped;
2036 	stats->tx_dropped	= tx_dropped;
2037 	stats->rx_nohandler	= rx_nohandler;
2038 }
2039 
2040 static int team_vlan_rx_add_vid(struct net_device *dev, __be16 proto, u16 vid)
2041 {
2042 	struct team *team = netdev_priv(dev);
2043 	struct team_port *port;
2044 	int err;
2045 
2046 	ASSERT_RTNL();
2047 
2048 	list_for_each_entry(port, &team->port_list, list) {
2049 		err = vlan_vid_add(port->dev, proto, vid);
2050 		if (err)
2051 			goto unwind;
2052 	}
2053 
2054 	return 0;
2055 
2056 unwind:
2057 	list_for_each_entry_continue_reverse(port, &team->port_list, list)
2058 		vlan_vid_del(port->dev, proto, vid);
2059 
2060 	return err;
2061 }
2062 
2063 static int team_vlan_rx_kill_vid(struct net_device *dev, __be16 proto, u16 vid)
2064 {
2065 	struct team *team = netdev_priv(dev);
2066 	struct team_port *port;
2067 
2068 	ASSERT_RTNL();
2069 
2070 	list_for_each_entry(port, &team->port_list, list)
2071 		vlan_vid_del(port->dev, proto, vid);
2072 
2073 	return 0;
2074 }
2075 
2076 #ifdef CONFIG_NET_POLL_CONTROLLER
2077 static void team_poll_controller(struct net_device *dev)
2078 {
2079 }
2080 
2081 static void __team_netpoll_cleanup(struct team *team)
2082 {
2083 	struct team_port *port;
2084 
2085 	list_for_each_entry(port, &team->port_list, list)
2086 		team_port_disable_netpoll(port);
2087 }
2088 
2089 static void team_netpoll_cleanup(struct net_device *dev)
2090 {
2091 	struct team *team = netdev_priv(dev);
2092 
2093 	ASSERT_RTNL();
2094 
2095 	__team_netpoll_cleanup(team);
2096 }
2097 
2098 static int team_netpoll_setup(struct net_device *dev)
2099 {
2100 	struct team *team = netdev_priv(dev);
2101 	struct team_port *port;
2102 	int err = 0;
2103 
2104 	ASSERT_RTNL();
2105 
2106 	list_for_each_entry(port, &team->port_list, list) {
2107 		err = __team_port_enable_netpoll(port);
2108 		if (err) {
2109 			__team_netpoll_cleanup(team);
2110 			break;
2111 		}
2112 	}
2113 	return err;
2114 }
2115 #endif
2116 
2117 static int team_add_slave(struct net_device *dev, struct net_device *port_dev,
2118 			  struct netlink_ext_ack *extack)
2119 {
2120 	struct team *team = netdev_priv(dev);
2121 
2122 	ASSERT_RTNL();
2123 
2124 	return team_port_add(team, port_dev, extack);
2125 }
2126 
2127 static int team_del_slave(struct net_device *dev, struct net_device *port_dev)
2128 {
2129 	struct team *team = netdev_priv(dev);
2130 
2131 	ASSERT_RTNL();
2132 
2133 	return team_port_del(team, port_dev, false);
2134 }
2135 
2136 static int team_del_slave_on_unregister(struct net_device *dev, struct net_device *port_dev)
2137 {
2138 	struct team *team = netdev_priv(dev);
2139 
2140 	ASSERT_RTNL();
2141 
2142 	return team_port_del(team, port_dev, true);
2143 }
2144 
2145 static netdev_features_t team_fix_features(struct net_device *dev,
2146 					   netdev_features_t features)
2147 {
2148 	struct team_port *port;
2149 	struct team *team = netdev_priv(dev);
2150 	netdev_features_t mask;
2151 
2152 	mask = features;
2153 	features = netdev_base_features(features);
2154 
2155 	rcu_read_lock();
2156 	list_for_each_entry_rcu(port, &team->port_list, list) {
2157 		features = netdev_increment_features(features,
2158 						     port->dev->features,
2159 						     mask);
2160 	}
2161 	rcu_read_unlock();
2162 
2163 	features = netdev_add_tso_features(features, mask);
2164 
2165 	return features;
2166 }
2167 
2168 static int team_change_carrier(struct net_device *dev, bool new_carrier)
2169 {
2170 	struct team *team = netdev_priv(dev);
2171 
2172 	team->user_carrier_enabled = true;
2173 
2174 	if (new_carrier)
2175 		netif_carrier_on(dev);
2176 	else
2177 		netif_carrier_off(dev);
2178 	return 0;
2179 }
2180 
2181 static const struct net_device_ops team_netdev_ops = {
2182 	.ndo_init		= team_init,
2183 	.ndo_uninit		= team_uninit,
2184 	.ndo_open		= team_open,
2185 	.ndo_stop		= team_close,
2186 	.ndo_start_xmit		= team_xmit,
2187 	.ndo_select_queue	= team_select_queue,
2188 	.ndo_change_rx_flags	= team_change_rx_flags,
2189 	.ndo_set_rx_mode	= team_set_rx_mode,
2190 	.ndo_set_mac_address	= team_set_mac_address,
2191 	.ndo_change_mtu		= team_change_mtu,
2192 	.ndo_get_stats64	= team_get_stats64,
2193 	.ndo_vlan_rx_add_vid	= team_vlan_rx_add_vid,
2194 	.ndo_vlan_rx_kill_vid	= team_vlan_rx_kill_vid,
2195 #ifdef CONFIG_NET_POLL_CONTROLLER
2196 	.ndo_poll_controller	= team_poll_controller,
2197 	.ndo_netpoll_setup	= team_netpoll_setup,
2198 	.ndo_netpoll_cleanup	= team_netpoll_cleanup,
2199 #endif
2200 	.ndo_add_slave		= team_add_slave,
2201 	.ndo_del_slave		= team_del_slave,
2202 	.ndo_fix_features	= team_fix_features,
2203 	.ndo_change_carrier     = team_change_carrier,
2204 	.ndo_features_check	= passthru_features_check,
2205 };
2206 
2207 /***********************
2208  * ethtool interface
2209  ***********************/
2210 
2211 static void team_ethtool_get_drvinfo(struct net_device *dev,
2212 				     struct ethtool_drvinfo *drvinfo)
2213 {
2214 	strscpy(drvinfo->driver, DRV_NAME, sizeof(drvinfo->driver));
2215 }
2216 
2217 static int team_ethtool_get_link_ksettings(struct net_device *dev,
2218 					   struct ethtool_link_ksettings *cmd)
2219 {
2220 	struct team *team= netdev_priv(dev);
2221 	unsigned long speed = 0;
2222 	struct team_port *port;
2223 
2224 	cmd->base.duplex = DUPLEX_UNKNOWN;
2225 	cmd->base.port = PORT_OTHER;
2226 
2227 	rcu_read_lock();
2228 	list_for_each_entry_rcu(port, &team->port_list, list) {
2229 		if (team_port_txable(port)) {
2230 			if (port->state.speed != SPEED_UNKNOWN)
2231 				speed += port->state.speed;
2232 			if (cmd->base.duplex == DUPLEX_UNKNOWN &&
2233 			    port->state.duplex != DUPLEX_UNKNOWN)
2234 				cmd->base.duplex = port->state.duplex;
2235 		}
2236 	}
2237 	rcu_read_unlock();
2238 
2239 	cmd->base.speed = speed ? : SPEED_UNKNOWN;
2240 
2241 	return 0;
2242 }
2243 
2244 static const struct ethtool_ops team_ethtool_ops = {
2245 	.get_drvinfo		= team_ethtool_get_drvinfo,
2246 	.get_link		= ethtool_op_get_link,
2247 	.get_link_ksettings	= team_ethtool_get_link_ksettings,
2248 };
2249 
2250 /***********************
2251  * rt netlink interface
2252  ***********************/
2253 
2254 /* For tx path we need a linkup && enabled port and for parse any port
2255  * suffices.
2256  */
2257 static struct team_port *team_header_port_get_rcu(struct team *team,
2258 						  bool txable)
2259 {
2260 	struct team_port *port;
2261 
2262 	list_for_each_entry_rcu(port, &team->port_list, list) {
2263 		if (!txable || team_port_txable(port))
2264 			return port;
2265 	}
2266 
2267 	return NULL;
2268 }
2269 
2270 static int team_header_create(struct sk_buff *skb, struct net_device *team_dev,
2271 			      unsigned short type, const void *daddr,
2272 			      const void *saddr, unsigned int len)
2273 {
2274 	struct team *team = netdev_priv(team_dev);
2275 	const struct header_ops *port_ops;
2276 	struct team_port *port;
2277 	int ret = 0;
2278 
2279 	rcu_read_lock();
2280 	port = team_header_port_get_rcu(team, true);
2281 	if (port) {
2282 		port_ops = READ_ONCE(port->dev->header_ops);
2283 		if (port_ops && port_ops->create)
2284 			ret = port_ops->create(skb, port->dev,
2285 					       type, daddr, saddr, len);
2286 	}
2287 	rcu_read_unlock();
2288 	return ret;
2289 }
2290 
2291 static int team_header_parse(const struct sk_buff *skb,
2292 			     const struct net_device *team_dev,
2293 			     unsigned char *haddr)
2294 {
2295 	struct team *team = netdev_priv(team_dev);
2296 	const struct header_ops *port_ops;
2297 	struct team_port *port;
2298 	int ret = 0;
2299 
2300 	rcu_read_lock();
2301 	port = team_header_port_get_rcu(team, false);
2302 	if (port) {
2303 		port_ops = READ_ONCE(port->dev->header_ops);
2304 		if (port_ops && port_ops->parse)
2305 			ret = port_ops->parse(skb, port->dev, haddr);
2306 	}
2307 	rcu_read_unlock();
2308 	return ret;
2309 }
2310 
2311 static const struct header_ops team_header_ops = {
2312 	.create		= team_header_create,
2313 	.parse		= team_header_parse,
2314 };
2315 
2316 static void team_setup_by_port(struct net_device *dev,
2317 			       struct net_device *port_dev)
2318 {
2319 	struct team *team = netdev_priv(dev);
2320 
2321 	if (port_dev->type == ARPHRD_ETHER)
2322 		dev->header_ops	= team->header_ops_cache;
2323 	else
2324 		dev->header_ops	= port_dev->header_ops ?
2325 				  &team_header_ops : NULL;
2326 	dev->type = port_dev->type;
2327 	dev->hard_header_len = port_dev->hard_header_len;
2328 	dev->needed_headroom = port_dev->needed_headroom;
2329 	dev->addr_len = port_dev->addr_len;
2330 	dev->mtu = port_dev->mtu;
2331 	memcpy(dev->broadcast, port_dev->broadcast, port_dev->addr_len);
2332 	eth_hw_addr_inherit(dev, port_dev);
2333 
2334 	if (port_dev->flags & IFF_POINTOPOINT) {
2335 		dev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);
2336 		dev->flags |= (IFF_POINTOPOINT | IFF_NOARP);
2337 	} else if ((port_dev->flags & (IFF_BROADCAST | IFF_MULTICAST)) ==
2338 		    (IFF_BROADCAST | IFF_MULTICAST)) {
2339 		dev->flags |= (IFF_BROADCAST | IFF_MULTICAST);
2340 		dev->flags &= ~(IFF_POINTOPOINT | IFF_NOARP);
2341 	}
2342 }
2343 
2344 static int team_dev_type_check_change(struct net_device *dev,
2345 				      struct net_device *port_dev)
2346 {
2347 	struct team *team = netdev_priv(dev);
2348 	char *portname = port_dev->name;
2349 	int err;
2350 
2351 	if (dev->type == port_dev->type)
2352 		return 0;
2353 	if (!list_empty(&team->port_list)) {
2354 		netdev_err(dev, "Device %s is of different type\n", portname);
2355 		return -EBUSY;
2356 	}
2357 	err = call_netdevice_notifiers(NETDEV_PRE_TYPE_CHANGE, dev);
2358 	err = notifier_to_errno(err);
2359 	if (err) {
2360 		netdev_err(dev, "Refused to change device type\n");
2361 		return err;
2362 	}
2363 	dev_uc_flush(dev);
2364 	dev_mc_flush(dev);
2365 	team_setup_by_port(dev, port_dev);
2366 	call_netdevice_notifiers(NETDEV_POST_TYPE_CHANGE, dev);
2367 	return 0;
2368 }
2369 
2370 static void team_setup(struct net_device *dev)
2371 {
2372 	struct team *team = netdev_priv(dev);
2373 
2374 	ether_setup(dev);
2375 	dev->max_mtu = ETH_MAX_MTU;
2376 	team->header_ops_cache = dev->header_ops;
2377 
2378 	dev->netdev_ops = &team_netdev_ops;
2379 	dev->ethtool_ops = &team_ethtool_ops;
2380 	dev->needs_free_netdev = true;
2381 	dev->priv_destructor = team_destructor;
2382 	dev->priv_flags &= ~(IFF_XMIT_DST_RELEASE | IFF_TX_SKB_SHARING);
2383 	dev->priv_flags |= IFF_NO_QUEUE;
2384 	dev->priv_flags |= IFF_TEAM;
2385 
2386 	/*
2387 	 * Indicate we support unicast address filtering. That way core won't
2388 	 * bring us to promisc mode in case a unicast addr is added.
2389 	 * Let this up to underlay drivers.
2390 	 */
2391 	dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIVE_ADDR_CHANGE;
2392 	dev->lltx = true;
2393 
2394 	/* Don't allow team devices to change network namespaces. */
2395 	dev->netns_immutable = true;
2396 
2397 	dev->features |= NETIF_F_GRO;
2398 
2399 	dev->hw_features = MASTER_UPPER_DEV_VLAN_FEATURES |
2400 			   NETIF_F_HW_VLAN_CTAG_RX |
2401 			   NETIF_F_HW_VLAN_CTAG_FILTER |
2402 			   NETIF_F_HW_VLAN_STAG_RX |
2403 			   NETIF_F_HW_VLAN_STAG_FILTER;
2404 
2405 	dev->hw_features |= NETIF_F_GSO_ENCAP_ALL;
2406 	dev->features |= dev->hw_features;
2407 	dev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX;
2408 }
2409 
2410 static int team_newlink(struct net_device *dev,
2411 			struct rtnl_newlink_params *params,
2412 			struct netlink_ext_ack *extack)
2413 {
2414 	struct nlattr **tb = params->tb;
2415 
2416 	if (tb[IFLA_ADDRESS] == NULL)
2417 		eth_hw_addr_random(dev);
2418 
2419 	return register_netdevice(dev);
2420 }
2421 
2422 static int team_validate(struct nlattr *tb[], struct nlattr *data[],
2423 			 struct netlink_ext_ack *extack)
2424 {
2425 	if (tb[IFLA_ADDRESS]) {
2426 		if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
2427 			return -EINVAL;
2428 		if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS])))
2429 			return -EADDRNOTAVAIL;
2430 	}
2431 	return 0;
2432 }
2433 
2434 static unsigned int team_get_num_tx_queues(void)
2435 {
2436 	return TEAM_DEFAULT_NUM_TX_QUEUES;
2437 }
2438 
2439 static unsigned int team_get_num_rx_queues(void)
2440 {
2441 	return TEAM_DEFAULT_NUM_RX_QUEUES;
2442 }
2443 
2444 static struct rtnl_link_ops team_link_ops __read_mostly = {
2445 	.kind			= DRV_NAME,
2446 	.priv_size		= sizeof(struct team),
2447 	.setup			= team_setup,
2448 	.newlink		= team_newlink,
2449 	.validate		= team_validate,
2450 	.get_num_tx_queues	= team_get_num_tx_queues,
2451 	.get_num_rx_queues	= team_get_num_rx_queues,
2452 };
2453 
2454 
2455 /***********************************
2456  * Generic netlink custom interface
2457  ***********************************/
2458 
2459 static struct genl_family team_nl_family;
2460 
2461 int team_nl_noop_doit(struct sk_buff *skb, struct genl_info *info)
2462 {
2463 	struct sk_buff *msg;
2464 	void *hdr;
2465 	int err;
2466 
2467 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
2468 	if (!msg)
2469 		return -ENOMEM;
2470 
2471 	hdr = genlmsg_put(msg, info->snd_portid, info->snd_seq,
2472 			  &team_nl_family, 0, TEAM_CMD_NOOP);
2473 	if (!hdr) {
2474 		err = -EMSGSIZE;
2475 		goto err_msg_put;
2476 	}
2477 
2478 	genlmsg_end(msg, hdr);
2479 
2480 	return genlmsg_unicast(genl_info_net(info), msg, info->snd_portid);
2481 
2482 err_msg_put:
2483 	nlmsg_free(msg);
2484 
2485 	return err;
2486 }
2487 
2488 /*
2489  * Netlink cmd functions should be locked by following two functions.
2490  * Since dev gets held here, that ensures dev won't disappear in between.
2491  */
2492 static struct team *team_nl_team_get(struct genl_info *info)
2493 {
2494 	struct net *net = genl_info_net(info);
2495 	struct net_device *dev;
2496 	int ifindex;
2497 
2498 	ASSERT_RTNL();
2499 
2500 	if (!info->attrs[TEAM_ATTR_TEAM_IFINDEX])
2501 		return NULL;
2502 
2503 	ifindex = nla_get_u32(info->attrs[TEAM_ATTR_TEAM_IFINDEX]);
2504 	dev = dev_get_by_index(net, ifindex);
2505 	if (!dev || dev->netdev_ops != &team_netdev_ops) {
2506 		dev_put(dev);
2507 		return NULL;
2508 	}
2509 
2510 	return netdev_priv(dev);
2511 }
2512 
2513 static void team_nl_team_put(struct team *team)
2514 {
2515 	dev_put(netdev_from_priv(team));
2516 }
2517 
2518 typedef int team_nl_send_func_t(struct sk_buff *skb,
2519 				struct team *team, u32 portid);
2520 
2521 static int team_nl_send_unicast(struct sk_buff *skb, struct team *team, u32 portid)
2522 {
2523 	return genlmsg_unicast(dev_net(netdev_from_priv(team)), skb, portid);
2524 }
2525 
2526 static int team_nl_fill_one_option_get(struct sk_buff *skb, struct team *team,
2527 				       struct team_option_inst *opt_inst)
2528 {
2529 	struct nlattr *option_item;
2530 	struct team_option *option = opt_inst->option;
2531 	struct team_option_inst_info *opt_inst_info = &opt_inst->info;
2532 	struct team_gsetter_ctx ctx;
2533 	int err;
2534 
2535 	ctx.info = opt_inst_info;
2536 	err = team_option_get(team, opt_inst, &ctx);
2537 	if (err)
2538 		return err;
2539 
2540 	option_item = nla_nest_start_noflag(skb, TEAM_ATTR_ITEM_OPTION);
2541 	if (!option_item)
2542 		return -EMSGSIZE;
2543 
2544 	if (nla_put_string(skb, TEAM_ATTR_OPTION_NAME, option->name))
2545 		goto nest_cancel;
2546 	if (opt_inst_info->port &&
2547 	    nla_put_u32(skb, TEAM_ATTR_OPTION_PORT_IFINDEX,
2548 			opt_inst_info->port->dev->ifindex))
2549 		goto nest_cancel;
2550 	if (opt_inst->option->array_size &&
2551 	    nla_put_u32(skb, TEAM_ATTR_OPTION_ARRAY_INDEX,
2552 			opt_inst_info->array_index))
2553 		goto nest_cancel;
2554 
2555 	switch (option->type) {
2556 	case TEAM_OPTION_TYPE_U32:
2557 		if (nla_put_u8(skb, TEAM_ATTR_OPTION_TYPE, NLA_U32))
2558 			goto nest_cancel;
2559 		if (nla_put_u32(skb, TEAM_ATTR_OPTION_DATA, ctx.data.u32_val))
2560 			goto nest_cancel;
2561 		break;
2562 	case TEAM_OPTION_TYPE_STRING:
2563 		if (nla_put_u8(skb, TEAM_ATTR_OPTION_TYPE, NLA_STRING))
2564 			goto nest_cancel;
2565 		if (nla_put_string(skb, TEAM_ATTR_OPTION_DATA,
2566 				   ctx.data.str_val))
2567 			goto nest_cancel;
2568 		break;
2569 	case TEAM_OPTION_TYPE_BINARY:
2570 		if (nla_put_u8(skb, TEAM_ATTR_OPTION_TYPE, NLA_BINARY))
2571 			goto nest_cancel;
2572 		if (nla_put(skb, TEAM_ATTR_OPTION_DATA, ctx.data.bin_val.len,
2573 			    ctx.data.bin_val.ptr))
2574 			goto nest_cancel;
2575 		break;
2576 	case TEAM_OPTION_TYPE_BOOL:
2577 		if (nla_put_u8(skb, TEAM_ATTR_OPTION_TYPE, NLA_FLAG))
2578 			goto nest_cancel;
2579 		if (ctx.data.bool_val &&
2580 		    nla_put_flag(skb, TEAM_ATTR_OPTION_DATA))
2581 			goto nest_cancel;
2582 		break;
2583 	case TEAM_OPTION_TYPE_S32:
2584 		if (nla_put_u8(skb, TEAM_ATTR_OPTION_TYPE, NLA_S32))
2585 			goto nest_cancel;
2586 		if (nla_put_s32(skb, TEAM_ATTR_OPTION_DATA, ctx.data.s32_val))
2587 			goto nest_cancel;
2588 		break;
2589 	default:
2590 		BUG();
2591 	}
2592 	if (opt_inst->removed && nla_put_flag(skb, TEAM_ATTR_OPTION_REMOVED))
2593 		goto nest_cancel;
2594 	if (opt_inst->changed) {
2595 		if (nla_put_flag(skb, TEAM_ATTR_OPTION_CHANGED))
2596 			goto nest_cancel;
2597 		opt_inst->changed = false;
2598 	}
2599 	nla_nest_end(skb, option_item);
2600 	return 0;
2601 
2602 nest_cancel:
2603 	nla_nest_cancel(skb, option_item);
2604 	return -EMSGSIZE;
2605 }
2606 
2607 static int __send_and_alloc_skb(struct sk_buff **pskb,
2608 				struct team *team, u32 portid,
2609 				team_nl_send_func_t *send_func)
2610 {
2611 	int err;
2612 
2613 	if (*pskb) {
2614 		err = send_func(*pskb, team, portid);
2615 		if (err)
2616 			return err;
2617 	}
2618 	*pskb = genlmsg_new(GENLMSG_DEFAULT_SIZE, GFP_KERNEL);
2619 	if (!*pskb)
2620 		return -ENOMEM;
2621 	return 0;
2622 }
2623 
2624 static int team_nl_send_options_get(struct team *team, u32 portid, u32 seq,
2625 				    int flags, team_nl_send_func_t *send_func,
2626 				    struct list_head *sel_opt_inst_list)
2627 {
2628 	struct nlattr *option_list;
2629 	struct nlmsghdr *nlh;
2630 	void *hdr;
2631 	struct team_option_inst *opt_inst;
2632 	int err;
2633 	struct sk_buff *skb = NULL;
2634 	bool incomplete;
2635 	int i;
2636 
2637 	opt_inst = list_first_entry(sel_opt_inst_list,
2638 				    struct team_option_inst, tmp_list);
2639 
2640 start_again:
2641 	err = __send_and_alloc_skb(&skb, team, portid, send_func);
2642 	if (err)
2643 		return err;
2644 
2645 	hdr = genlmsg_put(skb, portid, seq, &team_nl_family, flags | NLM_F_MULTI,
2646 			  TEAM_CMD_OPTIONS_GET);
2647 	if (!hdr) {
2648 		nlmsg_free(skb);
2649 		return -EMSGSIZE;
2650 	}
2651 
2652 	if (nla_put_u32(skb, TEAM_ATTR_TEAM_IFINDEX,
2653 			netdev_from_priv(team)->ifindex))
2654 		goto nla_put_failure;
2655 	option_list = nla_nest_start_noflag(skb, TEAM_ATTR_LIST_OPTION);
2656 	if (!option_list)
2657 		goto nla_put_failure;
2658 
2659 	i = 0;
2660 	incomplete = false;
2661 	list_for_each_entry_from(opt_inst, sel_opt_inst_list, tmp_list) {
2662 		err = team_nl_fill_one_option_get(skb, team, opt_inst);
2663 		if (err) {
2664 			if (err == -EMSGSIZE) {
2665 				if (!i)
2666 					goto errout;
2667 				incomplete = true;
2668 				break;
2669 			}
2670 			goto errout;
2671 		}
2672 		i++;
2673 	}
2674 
2675 	nla_nest_end(skb, option_list);
2676 	genlmsg_end(skb, hdr);
2677 	if (incomplete)
2678 		goto start_again;
2679 
2680 send_done:
2681 	nlh = nlmsg_put(skb, portid, seq, NLMSG_DONE, 0, flags | NLM_F_MULTI);
2682 	if (!nlh) {
2683 		err = __send_and_alloc_skb(&skb, team, portid, send_func);
2684 		if (err)
2685 			return err;
2686 		goto send_done;
2687 	}
2688 
2689 	return send_func(skb, team, portid);
2690 
2691 nla_put_failure:
2692 	err = -EMSGSIZE;
2693 errout:
2694 	nlmsg_free(skb);
2695 	return err;
2696 }
2697 
2698 int team_nl_options_get_doit(struct sk_buff *skb, struct genl_info *info)
2699 {
2700 	struct team *team;
2701 	struct team_option_inst *opt_inst;
2702 	int err;
2703 	LIST_HEAD(sel_opt_inst_list);
2704 
2705 	rtnl_lock();
2706 
2707 	team = team_nl_team_get(info);
2708 	if (!team) {
2709 		err = -EINVAL;
2710 		goto rtnl_unlock;
2711 	}
2712 
2713 	list_for_each_entry(opt_inst, &team->option_inst_list, list)
2714 		list_add_tail(&opt_inst->tmp_list, &sel_opt_inst_list);
2715 	err = team_nl_send_options_get(team, info->snd_portid, info->snd_seq,
2716 				       NLM_F_ACK, team_nl_send_unicast,
2717 				       &sel_opt_inst_list);
2718 
2719 	team_nl_team_put(team);
2720 
2721 rtnl_unlock:
2722 	rtnl_unlock();
2723 
2724 	return err;
2725 }
2726 
2727 static int team_nl_send_event_options_get(struct team *team,
2728 					  struct list_head *sel_opt_inst_list);
2729 
2730 int team_nl_options_set_doit(struct sk_buff *skb, struct genl_info *info)
2731 {
2732 	struct team *team;
2733 	int err = 0;
2734 	int i;
2735 	struct nlattr *nl_option;
2736 
2737 	rtnl_lock();
2738 
2739 	team = team_nl_team_get(info);
2740 	if (!team) {
2741 		err = -EINVAL;
2742 		goto rtnl_unlock;
2743 	}
2744 
2745 	err = -EINVAL;
2746 	if (!info->attrs[TEAM_ATTR_LIST_OPTION]) {
2747 		err = -EINVAL;
2748 		goto team_put;
2749 	}
2750 
2751 	nla_for_each_nested(nl_option, info->attrs[TEAM_ATTR_LIST_OPTION], i) {
2752 		struct nlattr *opt_attrs[TEAM_ATTR_OPTION_MAX + 1];
2753 		struct nlattr *attr;
2754 		struct nlattr *attr_data;
2755 		LIST_HEAD(opt_inst_list);
2756 		enum team_option_type opt_type;
2757 		int opt_port_ifindex = 0; /* != 0 for per-port options */
2758 		u32 opt_array_index = 0;
2759 		bool opt_is_array = false;
2760 		struct team_option_inst *opt_inst;
2761 		char *opt_name;
2762 		bool opt_found = false;
2763 
2764 		if (nla_type(nl_option) != TEAM_ATTR_ITEM_OPTION) {
2765 			err = -EINVAL;
2766 			goto team_put;
2767 		}
2768 		err = nla_parse_nested_deprecated(opt_attrs,
2769 						  TEAM_ATTR_OPTION_MAX,
2770 						  nl_option,
2771 						  team_attr_option_nl_policy,
2772 						  info->extack);
2773 		if (err)
2774 			goto team_put;
2775 		if (!opt_attrs[TEAM_ATTR_OPTION_NAME] ||
2776 		    !opt_attrs[TEAM_ATTR_OPTION_TYPE]) {
2777 			err = -EINVAL;
2778 			goto team_put;
2779 		}
2780 		switch (nla_get_u8(opt_attrs[TEAM_ATTR_OPTION_TYPE])) {
2781 		case NLA_U32:
2782 			opt_type = TEAM_OPTION_TYPE_U32;
2783 			break;
2784 		case NLA_STRING:
2785 			opt_type = TEAM_OPTION_TYPE_STRING;
2786 			break;
2787 		case NLA_BINARY:
2788 			opt_type = TEAM_OPTION_TYPE_BINARY;
2789 			break;
2790 		case NLA_FLAG:
2791 			opt_type = TEAM_OPTION_TYPE_BOOL;
2792 			break;
2793 		case NLA_S32:
2794 			opt_type = TEAM_OPTION_TYPE_S32;
2795 			break;
2796 		default:
2797 			goto team_put;
2798 		}
2799 
2800 		attr_data = opt_attrs[TEAM_ATTR_OPTION_DATA];
2801 		if (opt_type != TEAM_OPTION_TYPE_BOOL && !attr_data) {
2802 			err = -EINVAL;
2803 			goto team_put;
2804 		}
2805 
2806 		opt_name = nla_data(opt_attrs[TEAM_ATTR_OPTION_NAME]);
2807 		attr = opt_attrs[TEAM_ATTR_OPTION_PORT_IFINDEX];
2808 		if (attr)
2809 			opt_port_ifindex = nla_get_u32(attr);
2810 
2811 		attr = opt_attrs[TEAM_ATTR_OPTION_ARRAY_INDEX];
2812 		if (attr) {
2813 			opt_is_array = true;
2814 			opt_array_index = nla_get_u32(attr);
2815 		}
2816 
2817 		list_for_each_entry(opt_inst, &team->option_inst_list, list) {
2818 			struct team_option *option = opt_inst->option;
2819 			struct team_gsetter_ctx ctx;
2820 			struct team_option_inst_info *opt_inst_info;
2821 			int tmp_ifindex;
2822 
2823 			opt_inst_info = &opt_inst->info;
2824 			tmp_ifindex = opt_inst_info->port ?
2825 				      opt_inst_info->port->dev->ifindex : 0;
2826 			if (option->type != opt_type ||
2827 			    strcmp(option->name, opt_name) ||
2828 			    tmp_ifindex != opt_port_ifindex ||
2829 			    (option->array_size && !opt_is_array) ||
2830 			    opt_inst_info->array_index != opt_array_index)
2831 				continue;
2832 			opt_found = true;
2833 			ctx.info = opt_inst_info;
2834 			switch (opt_type) {
2835 			case TEAM_OPTION_TYPE_U32:
2836 				ctx.data.u32_val = nla_get_u32(attr_data);
2837 				break;
2838 			case TEAM_OPTION_TYPE_STRING:
2839 				if (nla_len(attr_data) > TEAM_STRING_MAX_LEN ||
2840 				    !memchr(nla_data(attr_data), '\0',
2841 					    nla_len(attr_data))) {
2842 					err = -EINVAL;
2843 					goto team_put;
2844 				}
2845 				ctx.data.str_val = nla_data(attr_data);
2846 				break;
2847 			case TEAM_OPTION_TYPE_BINARY:
2848 				ctx.data.bin_val.len = nla_len(attr_data);
2849 				ctx.data.bin_val.ptr = nla_data(attr_data);
2850 				break;
2851 			case TEAM_OPTION_TYPE_BOOL:
2852 				ctx.data.bool_val = attr_data ? true : false;
2853 				break;
2854 			case TEAM_OPTION_TYPE_S32:
2855 				ctx.data.s32_val = nla_get_s32(attr_data);
2856 				break;
2857 			default:
2858 				BUG();
2859 			}
2860 			err = team_option_set(team, opt_inst, &ctx);
2861 			if (err)
2862 				goto team_put;
2863 			opt_inst->changed = true;
2864 			list_add(&opt_inst->tmp_list, &opt_inst_list);
2865 		}
2866 		if (!opt_found) {
2867 			err = -ENOENT;
2868 			goto team_put;
2869 		}
2870 
2871 		err = team_nl_send_event_options_get(team, &opt_inst_list);
2872 		if (err)
2873 			break;
2874 	}
2875 
2876 team_put:
2877 	team_nl_team_put(team);
2878 rtnl_unlock:
2879 	rtnl_unlock();
2880 	return err;
2881 }
2882 
2883 static int team_nl_fill_one_port_get(struct sk_buff *skb,
2884 				     struct team_port *port)
2885 {
2886 	struct nlattr *port_item;
2887 
2888 	port_item = nla_nest_start_noflag(skb, TEAM_ATTR_ITEM_PORT);
2889 	if (!port_item)
2890 		goto nest_cancel;
2891 	if (nla_put_u32(skb, TEAM_ATTR_PORT_IFINDEX, port->dev->ifindex))
2892 		goto nest_cancel;
2893 	if (port->changed) {
2894 		if (nla_put_flag(skb, TEAM_ATTR_PORT_CHANGED))
2895 			goto nest_cancel;
2896 		port->changed = false;
2897 	}
2898 	if ((port->removed &&
2899 	     nla_put_flag(skb, TEAM_ATTR_PORT_REMOVED)) ||
2900 	    (port->state.linkup &&
2901 	     nla_put_flag(skb, TEAM_ATTR_PORT_LINKUP)) ||
2902 	    nla_put_u32(skb, TEAM_ATTR_PORT_SPEED, port->state.speed) ||
2903 	    nla_put_u8(skb, TEAM_ATTR_PORT_DUPLEX, port->state.duplex))
2904 		goto nest_cancel;
2905 	nla_nest_end(skb, port_item);
2906 	return 0;
2907 
2908 nest_cancel:
2909 	nla_nest_cancel(skb, port_item);
2910 	return -EMSGSIZE;
2911 }
2912 
2913 static int team_nl_send_port_list_get(struct team *team, u32 portid, u32 seq,
2914 				      int flags, team_nl_send_func_t *send_func,
2915 				      struct team_port *one_port)
2916 {
2917 	struct nlattr *port_list;
2918 	struct nlmsghdr *nlh;
2919 	void *hdr;
2920 	struct team_port *port;
2921 	int err;
2922 	struct sk_buff *skb = NULL;
2923 	bool incomplete;
2924 	int i;
2925 
2926 	port = list_first_entry_or_null(&team->port_list,
2927 					struct team_port, list);
2928 
2929 start_again:
2930 	err = __send_and_alloc_skb(&skb, team, portid, send_func);
2931 	if (err)
2932 		return err;
2933 
2934 	hdr = genlmsg_put(skb, portid, seq, &team_nl_family, flags | NLM_F_MULTI,
2935 			  TEAM_CMD_PORT_LIST_GET);
2936 	if (!hdr) {
2937 		nlmsg_free(skb);
2938 		return -EMSGSIZE;
2939 	}
2940 
2941 	if (nla_put_u32(skb, TEAM_ATTR_TEAM_IFINDEX,
2942 			netdev_from_priv(team)->ifindex))
2943 		goto nla_put_failure;
2944 	port_list = nla_nest_start_noflag(skb, TEAM_ATTR_LIST_PORT);
2945 	if (!port_list)
2946 		goto nla_put_failure;
2947 
2948 	i = 0;
2949 	incomplete = false;
2950 
2951 	/* If one port is selected, called wants to send port list containing
2952 	 * only this port. Otherwise go through all listed ports and send all
2953 	 */
2954 	if (one_port) {
2955 		err = team_nl_fill_one_port_get(skb, one_port);
2956 		if (err)
2957 			goto errout;
2958 	} else if (port) {
2959 		list_for_each_entry_from(port, &team->port_list, list) {
2960 			err = team_nl_fill_one_port_get(skb, port);
2961 			if (err) {
2962 				if (err == -EMSGSIZE) {
2963 					if (!i)
2964 						goto errout;
2965 					incomplete = true;
2966 					break;
2967 				}
2968 				goto errout;
2969 			}
2970 			i++;
2971 		}
2972 	}
2973 
2974 	nla_nest_end(skb, port_list);
2975 	genlmsg_end(skb, hdr);
2976 	if (incomplete)
2977 		goto start_again;
2978 
2979 send_done:
2980 	nlh = nlmsg_put(skb, portid, seq, NLMSG_DONE, 0, flags | NLM_F_MULTI);
2981 	if (!nlh) {
2982 		err = __send_and_alloc_skb(&skb, team, portid, send_func);
2983 		if (err)
2984 			return err;
2985 		goto send_done;
2986 	}
2987 
2988 	return send_func(skb, team, portid);
2989 
2990 nla_put_failure:
2991 	err = -EMSGSIZE;
2992 errout:
2993 	nlmsg_free(skb);
2994 	return err;
2995 }
2996 
2997 int team_nl_port_list_get_doit(struct sk_buff *skb,
2998 			       struct genl_info *info)
2999 {
3000 	struct team *team;
3001 	int err;
3002 
3003 	rtnl_lock();
3004 
3005 	team = team_nl_team_get(info);
3006 	if (!team) {
3007 		err = -EINVAL;
3008 		goto rtnl_unlock;
3009 	}
3010 
3011 	err = team_nl_send_port_list_get(team, info->snd_portid, info->snd_seq,
3012 					 NLM_F_ACK, team_nl_send_unicast, NULL);
3013 
3014 	team_nl_team_put(team);
3015 
3016 rtnl_unlock:
3017 	rtnl_unlock();
3018 
3019 	return err;
3020 }
3021 
3022 static const struct genl_multicast_group team_nl_mcgrps[] = {
3023 	{ .name = TEAM_GENL_CHANGE_EVENT_MC_GRP_NAME, },
3024 };
3025 
3026 static struct genl_family team_nl_family __ro_after_init = {
3027 	.name		= TEAM_GENL_NAME,
3028 	.version	= TEAM_GENL_VERSION,
3029 	.maxattr	= ARRAY_SIZE(team_nl_policy) - 1,
3030 	.policy = team_nl_policy,
3031 	.netnsok	= true,
3032 	.module		= THIS_MODULE,
3033 	.small_ops	= team_nl_ops,
3034 	.n_small_ops	= ARRAY_SIZE(team_nl_ops),
3035 	.resv_start_op	= TEAM_CMD_PORT_LIST_GET + 1,
3036 	.mcgrps		= team_nl_mcgrps,
3037 	.n_mcgrps	= ARRAY_SIZE(team_nl_mcgrps),
3038 };
3039 
3040 static int team_nl_send_multicast(struct sk_buff *skb,
3041 				  struct team *team, u32 portid)
3042 {
3043 	return genlmsg_multicast_netns(&team_nl_family,
3044 				       dev_net(netdev_from_priv(team)),
3045 				       skb, 0, 0, GFP_KERNEL);
3046 }
3047 
3048 static int team_nl_send_event_options_get(struct team *team,
3049 					  struct list_head *sel_opt_inst_list)
3050 {
3051 	return team_nl_send_options_get(team, 0, 0, 0, team_nl_send_multicast,
3052 					sel_opt_inst_list);
3053 }
3054 
3055 static int team_nl_send_event_port_get(struct team *team,
3056 				       struct team_port *port)
3057 {
3058 	return team_nl_send_port_list_get(team, 0, 0, 0, team_nl_send_multicast,
3059 					  port);
3060 }
3061 
3062 static int __init team_nl_init(void)
3063 {
3064 	return genl_register_family(&team_nl_family);
3065 }
3066 
3067 static void __exit team_nl_fini(void)
3068 {
3069 	genl_unregister_family(&team_nl_family);
3070 }
3071 
3072 
3073 /******************
3074  * Change checkers
3075  ******************/
3076 
3077 static void __team_options_change_check(struct team *team)
3078 {
3079 	int err;
3080 	struct team_option_inst *opt_inst;
3081 	LIST_HEAD(sel_opt_inst_list);
3082 
3083 	list_for_each_entry(opt_inst, &team->option_inst_list, list) {
3084 		if (opt_inst->changed)
3085 			list_add_tail(&opt_inst->tmp_list, &sel_opt_inst_list);
3086 	}
3087 	err = team_nl_send_event_options_get(team, &sel_opt_inst_list);
3088 	if (err && err != -ESRCH)
3089 		netdev_warn(netdev_from_priv(team),
3090 			    "Failed to send options change via netlink (err %d)\n",
3091 			    err);
3092 }
3093 
3094 /* rtnl lock is held */
3095 
3096 static void __team_port_change_send(struct team_port *port, bool linkup)
3097 {
3098 	int err;
3099 
3100 	port->changed = true;
3101 	port->state.linkup = linkup;
3102 	team_refresh_port_linkup(port);
3103 	if (linkup) {
3104 		struct ethtool_link_ksettings ecmd;
3105 
3106 		err = netif_get_link_ksettings(port->dev, &ecmd);
3107 		if (!err) {
3108 			port->state.speed = ecmd.base.speed;
3109 			port->state.duplex = ecmd.base.duplex;
3110 			goto send_event;
3111 		}
3112 	}
3113 	port->state.speed = 0;
3114 	port->state.duplex = 0;
3115 
3116 send_event:
3117 	err = team_nl_send_event_port_get(port->team, port);
3118 	if (err && err != -ESRCH)
3119 		netdev_warn(netdev_from_priv(port->team),
3120 			    "Failed to send port change of device %s via netlink (err %d)\n",
3121 			    port->dev->name, err);
3122 
3123 }
3124 
3125 static void __team_carrier_check(struct team *team)
3126 {
3127 	struct team_port *port;
3128 	bool team_linkup;
3129 
3130 	if (team->user_carrier_enabled)
3131 		return;
3132 
3133 	team_linkup = false;
3134 	list_for_each_entry(port, &team->port_list, list) {
3135 		if (port->linkup) {
3136 			team_linkup = true;
3137 			break;
3138 		}
3139 	}
3140 
3141 	if (team_linkup)
3142 		netif_carrier_on(netdev_from_priv(team));
3143 	else
3144 		netif_carrier_off(netdev_from_priv(team));
3145 }
3146 
3147 static void __team_port_change_check(struct team_port *port, bool linkup)
3148 {
3149 	if (port->state.linkup != linkup)
3150 		__team_port_change_send(port, linkup);
3151 	__team_carrier_check(port->team);
3152 }
3153 
3154 static void __team_port_change_port_added(struct team_port *port, bool linkup)
3155 {
3156 	__team_port_change_send(port, linkup);
3157 	__team_carrier_check(port->team);
3158 }
3159 
3160 static void __team_port_change_port_removed(struct team_port *port)
3161 {
3162 	port->removed = true;
3163 	__team_port_change_send(port, false);
3164 	__team_carrier_check(port->team);
3165 }
3166 
3167 static void team_port_change_check(struct team_port *port, bool linkup)
3168 {
3169 	ASSERT_RTNL();
3170 
3171 	__team_port_change_check(port, linkup);
3172 }
3173 
3174 
3175 /************************************
3176  * Net device notifier event handler
3177  ************************************/
3178 
3179 static int team_device_event(struct notifier_block *unused,
3180 			     unsigned long event, void *ptr)
3181 {
3182 	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
3183 	struct team_port *port;
3184 
3185 	port = team_port_get_rtnl(dev);
3186 	if (!port)
3187 		return NOTIFY_DONE;
3188 
3189 	switch (event) {
3190 	case NETDEV_UP:
3191 		if (netif_oper_up(dev))
3192 			team_port_change_check(port, true);
3193 		break;
3194 	case NETDEV_DOWN:
3195 		team_port_change_check(port, false);
3196 		break;
3197 	case NETDEV_CHANGE:
3198 		if (netif_running(port->dev))
3199 			team_port_change_check(port,
3200 					       !!netif_oper_up(port->dev));
3201 		break;
3202 	case NETDEV_UNREGISTER:
3203 		team_del_slave_on_unregister(netdev_from_priv(port->team),
3204 					     dev);
3205 		break;
3206 	case NETDEV_FEAT_CHANGE:
3207 		if (!port->team->notifier_ctx) {
3208 			port->team->notifier_ctx = true;
3209 			netdev_compute_master_upper_features(netdev_from_priv(port->team),
3210 							     true);
3211 			port->team->notifier_ctx = false;
3212 		}
3213 		break;
3214 	case NETDEV_PRECHANGEMTU:
3215 		/* Forbid to change mtu of underlaying device */
3216 		if (!port->team->port_mtu_change_allowed)
3217 			return NOTIFY_BAD;
3218 		break;
3219 	case NETDEV_PRE_TYPE_CHANGE:
3220 		/* Forbid to change type of underlaying device */
3221 		return NOTIFY_BAD;
3222 	case NETDEV_RESEND_IGMP:
3223 		/* Propagate to master device */
3224 		call_netdevice_notifiers(event, netdev_from_priv(port->team));
3225 		break;
3226 	}
3227 	return NOTIFY_DONE;
3228 }
3229 
3230 static struct notifier_block team_notifier_block __read_mostly = {
3231 	.notifier_call = team_device_event,
3232 };
3233 
3234 
3235 /***********************
3236  * Module init and exit
3237  ***********************/
3238 
3239 static int __init team_module_init(void)
3240 {
3241 	int err;
3242 
3243 	err = register_netdevice_notifier(&team_notifier_block);
3244 	if (err)
3245 		return err;
3246 
3247 	err = rtnl_link_register(&team_link_ops);
3248 	if (err)
3249 		goto err_rtnl_reg;
3250 
3251 	err = team_nl_init();
3252 	if (err)
3253 		goto err_nl_init;
3254 
3255 	return 0;
3256 
3257 err_nl_init:
3258 	rtnl_link_unregister(&team_link_ops);
3259 
3260 err_rtnl_reg:
3261 	unregister_netdevice_notifier(&team_notifier_block);
3262 
3263 	return err;
3264 }
3265 
3266 static void __exit team_module_exit(void)
3267 {
3268 	team_nl_fini();
3269 	rtnl_link_unregister(&team_link_ops);
3270 	unregister_netdevice_notifier(&team_notifier_block);
3271 }
3272 
3273 module_init(team_module_init);
3274 module_exit(team_module_exit);
3275 
3276 MODULE_LICENSE("GPL v2");
3277 MODULE_AUTHOR("Jiri Pirko <jpirko@redhat.com>");
3278 MODULE_DESCRIPTION("Ethernet team device driver");
3279 MODULE_ALIAS_RTNL_LINK(DRV_NAME);
3280 MODULE_IMPORT_NS("NETDEV_INTERNAL");
3281