diff options
author | Jiri Pirko <jpirko@redhat.com> | 2012-07-11 01:34:03 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-07-12 11:08:20 -0400 |
commit | 5fc889911a99043a97da1daa0d010ad72cbc3042 (patch) | |
tree | 27b18274d2c02e1f43e643f5653f2cf021f4f5b8 /drivers/net/team | |
parent | 6e88e1357c788d40cd64a8c9080e81ca6c9eee0f (diff) |
team: add broadcast mode
Signed-off-by: Jiri Pirko <jpirko@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/team')
-rw-r--r-- | drivers/net/team/Kconfig | 13 | ||||
-rw-r--r-- | drivers/net/team/Makefile | 1 | ||||
-rw-r--r-- | drivers/net/team/team_mode_broadcast.c | 88 |
3 files changed, 101 insertions, 1 deletions
diff --git a/drivers/net/team/Kconfig b/drivers/net/team/Kconfig index 89024d5fc33a..6a7260b03a1e 100644 --- a/drivers/net/team/Kconfig +++ b/drivers/net/team/Kconfig | |||
@@ -15,6 +15,17 @@ menuconfig NET_TEAM | |||
15 | 15 | ||
16 | if NET_TEAM | 16 | if NET_TEAM |
17 | 17 | ||
18 | config NET_TEAM_MODE_BROADCAST | ||
19 | tristate "Broadcast mode support" | ||
20 | depends on NET_TEAM | ||
21 | ---help--- | ||
22 | Basic mode where packets are transmitted always by all suitable ports. | ||
23 | |||
24 | All added ports are setup to have team's mac address. | ||
25 | |||
26 | To compile this team mode as a module, choose M here: the module | ||
27 | will be called team_mode_broadcast. | ||
28 | |||
18 | config NET_TEAM_MODE_ROUNDROBIN | 29 | config NET_TEAM_MODE_ROUNDROBIN |
19 | tristate "Round-robin mode support" | 30 | tristate "Round-robin mode support" |
20 | depends on NET_TEAM | 31 | depends on NET_TEAM |
@@ -22,7 +33,7 @@ config NET_TEAM_MODE_ROUNDROBIN | |||
22 | Basic mode where port used for transmitting packets is selected in | 33 | Basic mode where port used for transmitting packets is selected in |
23 | round-robin fashion using packet counter. | 34 | round-robin fashion using packet counter. |
24 | 35 | ||
25 | All added ports are setup to have bond's mac address. | 36 | All added ports are setup to have team's mac address. |
26 | 37 | ||
27 | To compile this team mode as a module, choose M here: the module | 38 | To compile this team mode as a module, choose M here: the module |
28 | will be called team_mode_roundrobin. | 39 | will be called team_mode_roundrobin. |
diff --git a/drivers/net/team/Makefile b/drivers/net/team/Makefile index fb9f4c1c51ff..975763014e5a 100644 --- a/drivers/net/team/Makefile +++ b/drivers/net/team/Makefile | |||
@@ -3,6 +3,7 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | obj-$(CONFIG_NET_TEAM) += team.o | 5 | obj-$(CONFIG_NET_TEAM) += team.o |
6 | obj-$(CONFIG_NET_TEAM_MODE_BROADCAST) += team_mode_broadcast.o | ||
6 | obj-$(CONFIG_NET_TEAM_MODE_ROUNDROBIN) += team_mode_roundrobin.o | 7 | obj-$(CONFIG_NET_TEAM_MODE_ROUNDROBIN) += team_mode_roundrobin.o |
7 | obj-$(CONFIG_NET_TEAM_MODE_ACTIVEBACKUP) += team_mode_activebackup.o | 8 | obj-$(CONFIG_NET_TEAM_MODE_ACTIVEBACKUP) += team_mode_activebackup.o |
8 | obj-$(CONFIG_NET_TEAM_MODE_LOADBALANCE) += team_mode_loadbalance.o | 9 | obj-$(CONFIG_NET_TEAM_MODE_LOADBALANCE) += team_mode_loadbalance.o |
diff --git a/drivers/net/team/team_mode_broadcast.c b/drivers/net/team/team_mode_broadcast.c new file mode 100644 index 000000000000..5562345e9cef --- /dev/null +++ b/drivers/net/team/team_mode_broadcast.c | |||
@@ -0,0 +1,88 @@ | |||
1 | /* | ||
2 | * drivers/net/team/team_mode_broadcast.c - Broadcast mode for team | ||
3 | * Copyright (c) 2012 Jiri Pirko <jpirko@redhat.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/types.h> | ||
13 | #include <linux/module.h> | ||
14 | #include <linux/init.h> | ||
15 | #include <linux/errno.h> | ||
16 | #include <linux/netdevice.h> | ||
17 | #include <linux/if_team.h> | ||
18 | |||
19 | static bool bc_transmit(struct team *team, struct sk_buff *skb) | ||
20 | { | ||
21 | struct team_port *cur; | ||
22 | struct team_port *last = NULL; | ||
23 | struct sk_buff *skb2; | ||
24 | bool ret; | ||
25 | bool sum_ret = false; | ||
26 | |||
27 | list_for_each_entry_rcu(cur, &team->port_list, list) { | ||
28 | if (team_port_txable(cur)) { | ||
29 | if (last) { | ||
30 | skb2 = skb_clone(skb, GFP_ATOMIC); | ||
31 | if (skb2) { | ||
32 | skb2->dev = last->dev; | ||
33 | ret = dev_queue_xmit(skb2); | ||
34 | if (!sum_ret) | ||
35 | sum_ret = ret; | ||
36 | } | ||
37 | } | ||
38 | last = cur; | ||
39 | } | ||
40 | } | ||
41 | if (last) { | ||
42 | skb->dev = last->dev; | ||
43 | ret = dev_queue_xmit(skb); | ||
44 | if (!sum_ret) | ||
45 | sum_ret = ret; | ||
46 | } | ||
47 | return sum_ret; | ||
48 | } | ||
49 | |||
50 | static int bc_port_enter(struct team *team, struct team_port *port) | ||
51 | { | ||
52 | return team_port_set_team_mac(port); | ||
53 | } | ||
54 | |||
55 | static void bc_port_change_mac(struct team *team, struct team_port *port) | ||
56 | { | ||
57 | team_port_set_team_mac(port); | ||
58 | } | ||
59 | |||
60 | static const struct team_mode_ops bc_mode_ops = { | ||
61 | .transmit = bc_transmit, | ||
62 | .port_enter = bc_port_enter, | ||
63 | .port_change_mac = bc_port_change_mac, | ||
64 | }; | ||
65 | |||
66 | static const struct team_mode bc_mode = { | ||
67 | .kind = "broadcast", | ||
68 | .owner = THIS_MODULE, | ||
69 | .ops = &bc_mode_ops, | ||
70 | }; | ||
71 | |||
72 | static int __init bc_init_module(void) | ||
73 | { | ||
74 | return team_mode_register(&bc_mode); | ||
75 | } | ||
76 | |||
77 | static void __exit bc_cleanup_module(void) | ||
78 | { | ||
79 | team_mode_unregister(&bc_mode); | ||
80 | } | ||
81 | |||
82 | module_init(bc_init_module); | ||
83 | module_exit(bc_cleanup_module); | ||
84 | |||
85 | MODULE_LICENSE("GPL v2"); | ||
86 | MODULE_AUTHOR("Jiri Pirko <jpirko@redhat.com>"); | ||
87 | MODULE_DESCRIPTION("Broadcast mode for team"); | ||
88 | MODULE_ALIAS("team-mode-broadcast"); | ||