diff options
author | Patrick McHardy <kaber@trash.net> | 2008-07-06 00:25:56 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-07-06 00:25:56 -0400 |
commit | 7c85fbf0657f216557b0c9c4a2e4e07f37d8bb8c (patch) | |
tree | 08660067a7f60fdf4e8343ec9481ce6da22ac6d8 /net/bridge/br.c | |
parent | a19800d704177caaa5874baf5819307c5b7d5e4f (diff) |
bridge: Use STP demux
Use the STP demux layer for receiving STP PDUs instead of directly
registering with LLC.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bridge/br.c')
-rw-r--r-- | net/bridge/br.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/net/bridge/br.c b/net/bridge/br.c index cede010f4ddd..573acdf6f9ff 100644 --- a/net/bridge/br.c +++ b/net/bridge/br.c | |||
@@ -18,21 +18,24 @@ | |||
18 | #include <linux/init.h> | 18 | #include <linux/init.h> |
19 | #include <linux/llc.h> | 19 | #include <linux/llc.h> |
20 | #include <net/llc.h> | 20 | #include <net/llc.h> |
21 | #include <net/stp.h> | ||
21 | 22 | ||
22 | #include "br_private.h" | 23 | #include "br_private.h" |
23 | 24 | ||
24 | int (*br_should_route_hook)(struct sk_buff *skb); | 25 | int (*br_should_route_hook)(struct sk_buff *skb); |
25 | 26 | ||
26 | static struct llc_sap *br_stp_sap; | 27 | static const struct stp_proto br_stp_proto = { |
28 | .rcv = br_stp_rcv, | ||
29 | }; | ||
27 | 30 | ||
28 | static int __init br_init(void) | 31 | static int __init br_init(void) |
29 | { | 32 | { |
30 | int err; | 33 | int err; |
31 | 34 | ||
32 | br_stp_sap = llc_sap_open(LLC_SAP_BSPAN, br_stp_rcv); | 35 | err = stp_proto_register(&br_stp_proto); |
33 | if (!br_stp_sap) { | 36 | if (err < 0) { |
34 | printk(KERN_ERR "bridge: can't register sap for STP\n"); | 37 | printk(KERN_ERR "bridge: can't register sap for STP\n"); |
35 | return -EADDRINUSE; | 38 | return err; |
36 | } | 39 | } |
37 | 40 | ||
38 | err = br_fdb_init(); | 41 | err = br_fdb_init(); |
@@ -65,13 +68,13 @@ err_out2: | |||
65 | err_out1: | 68 | err_out1: |
66 | br_fdb_fini(); | 69 | br_fdb_fini(); |
67 | err_out: | 70 | err_out: |
68 | llc_sap_put(br_stp_sap); | 71 | stp_proto_unregister(&br_stp_proto); |
69 | return err; | 72 | return err; |
70 | } | 73 | } |
71 | 74 | ||
72 | static void __exit br_deinit(void) | 75 | static void __exit br_deinit(void) |
73 | { | 76 | { |
74 | rcu_assign_pointer(br_stp_sap->rcv_func, NULL); | 77 | stp_proto_unregister(&br_stp_proto); |
75 | 78 | ||
76 | br_netlink_fini(); | 79 | br_netlink_fini(); |
77 | unregister_netdevice_notifier(&br_device_notifier); | 80 | unregister_netdevice_notifier(&br_device_notifier); |
@@ -82,7 +85,6 @@ static void __exit br_deinit(void) | |||
82 | synchronize_net(); | 85 | synchronize_net(); |
83 | 86 | ||
84 | br_netfilter_fini(); | 87 | br_netfilter_fini(); |
85 | llc_sap_put(br_stp_sap); | ||
86 | br_fdb_get_hook = NULL; | 88 | br_fdb_get_hook = NULL; |
87 | br_fdb_put_hook = NULL; | 89 | br_fdb_put_hook = NULL; |
88 | 90 | ||