team_mode_broadcast.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * drivers/net/team/team_mode_broadcast.c - Broadcast mode for team
  4. * Copyright (c) 2012 Jiri Pirko <jpirko@redhat.com>
  5. */
  6. #include <linux/kernel.h>
  7. #include <linux/types.h>
  8. #include <linux/module.h>
  9. #include <linux/init.h>
  10. #include <linux/netdevice.h>
  11. #include <linux/if_team.h>
  12. static bool bc_transmit(struct team *team, struct sk_buff *skb)
  13. {
  14. struct team_port *cur;
  15. struct team_port *last = NULL;
  16. struct sk_buff *skb2;
  17. bool ret;
  18. bool sum_ret = false;
  19. list_for_each_entry_rcu(cur, &team->port_list, list) {
  20. if (team_port_txable(cur)) {
  21. if (last) {
  22. skb2 = skb_clone(skb, GFP_ATOMIC);
  23. if (skb2) {
  24. ret = !team_dev_queue_xmit(team, last,
  25. skb2);
  26. if (!sum_ret)
  27. sum_ret = ret;
  28. }
  29. }
  30. last = cur;
  31. }
  32. }
  33. if (last) {
  34. ret = !team_dev_queue_xmit(team, last, skb);
  35. if (!sum_ret)
  36. sum_ret = ret;
  37. }
  38. return sum_ret;
  39. }
  40. static const struct team_mode_ops bc_mode_ops = {
  41. .transmit = bc_transmit,
  42. .port_enter = team_modeop_port_enter,
  43. .port_change_dev_addr = team_modeop_port_change_dev_addr,
  44. };
  45. static const struct team_mode bc_mode = {
  46. .kind = "broadcast",
  47. .owner = THIS_MODULE,
  48. .ops = &bc_mode_ops,
  49. .lag_tx_type = NETDEV_LAG_TX_TYPE_BROADCAST,
  50. };
  51. static int __init bc_init_module(void)
  52. {
  53. return team_mode_register(&bc_mode);
  54. }
  55. static void __exit bc_cleanup_module(void)
  56. {
  57. team_mode_unregister(&bc_mode);
  58. }
  59. module_init(bc_init_module);
  60. module_exit(bc_cleanup_module);
  61. MODULE_LICENSE("GPL v2");
  62. MODULE_AUTHOR("Jiri Pirko <jpirko@redhat.com>");
  63. MODULE_DESCRIPTION("Broadcast mode for team");
  64. MODULE_ALIAS_TEAM_MODE("broadcast");