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