Merge git://git.linux-nfs.org/pub/linux/nfs-2.6
[powerpc.git] / net / bridge / br_stp_bpdu.c
index 8934a54..60112bc 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/llc.h>
 #include <net/llc.h>
 #include <net/llc_pdu.h>
+#include <asm/unaligned.h>
 
 #include "br_private.h"
 #include "br_private_stp.h"
 #define LLC_RESERVE sizeof(struct llc_pdu_un)
 
 static void br_send_bpdu(struct net_bridge_port *p,
-                        const unsigned char *data, int length)
+                        const unsigned char *data, int length)
 {
        struct sk_buff *skb;
 
-       if (!p->br->stp_enabled)
-               return;
-
        skb = dev_alloc_skb(length+LLC_RESERVE);
        if (!skb)
                return;
@@ -59,12 +57,12 @@ static inline void br_set_ticks(unsigned char *dest, int j)
 {
        unsigned long ticks = (STP_HZ * j)/ HZ;
 
-       *((__be16 *) dest) = htons(ticks);
+       put_unaligned(htons(ticks), (__be16 *)dest);
 }
 
 static inline int br_get_ticks(const unsigned char *src)
 {
-       unsigned long ticks = ntohs(*(__be16 *)src);
+       unsigned long ticks = ntohs(get_unaligned((__be16 *)src));
 
        return (ticks * HZ + STP_HZ - 1) / STP_HZ;
 }
@@ -74,6 +72,9 @@ void br_send_config_bpdu(struct net_bridge_port *p, struct br_config_bpdu *bpdu)
 {
        unsigned char buf[35];
 
+       if (p->br->stp_enabled != BR_KERNEL_STP)
+               return;
+
        buf[0] = 0;
        buf[1] = 0;
        buf[2] = 0;
@@ -116,11 +117,14 @@ void br_send_tcn_bpdu(struct net_bridge_port *p)
 {
        unsigned char buf[4];
 
+       if (p->br->stp_enabled != BR_KERNEL_STP)
+               return;
+
        buf[0] = 0;
        buf[1] = 0;
        buf[2] = 0;
        buf[3] = BPDU_TYPE_TCN;
-       br_send_bpdu(p, buf, 7);
+       br_send_bpdu(p, buf, 4);
 }
 
 /*
@@ -156,9 +160,13 @@ int br_stp_rcv(struct sk_buff *skb, struct net_device *dev,
        br = p->br;
        spin_lock(&br->lock);
 
-       if (p->state == BR_STATE_DISABLED
-           || !br->stp_enabled
-           || !(br->dev->flags & IFF_UP))
+       if (br->stp_enabled != BR_KERNEL_STP)
+               goto out;
+
+       if (!(br->dev->flags & IFF_UP))
+               goto out;
+
+       if (p->state == BR_STATE_DISABLED)
                goto out;
 
        if (compare_ether_addr(dest, br->group_addr) != 0)