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