kernel: fix unaligned access issue in the bridge multicast-to-unicast patch
[openwrt/openwrt.git] / target / linux / generic / patches-4.4 / 645-bridge_multicast_to_unicast.patch
index 59aa1eda15a7ac907590f2a0fb481beb8896f90a..5d2103fe5c7844a1966e8df825cf67fa698d5355 100644 (file)
@@ -11,8 +11,8 @@ Implement optinal multicast->unicast conversion for igmp snooping
  #define BR_ISOLATE_MODE       BIT(11)
 +#define BR_MULTICAST_TO_UCAST BIT(12)
  
- /* values as per ieee8021QBridgeFdbAgingTime */
- #define BR_MIN_AGEING_TIME    (10 * HZ)
+ #define BR_DEFAULT_AGEING_TIME        (300 * HZ)
 --- a/net/bridge/br_multicast.c
 +++ b/net/bridge/br_multicast.c
 @@ -42,12 +42,13 @@ static void br_multicast_add_router(stru
@@ -300,17 +300,17 @@ Implement optinal multicast->unicast conversion for igmp snooping
  
 --- a/net/bridge/br_private.h
 +++ b/net/bridge/br_private.h
-@@ -158,6 +158,9 @@ struct net_bridge_port_group {
+@@ -157,7 +157,9 @@ struct net_bridge_port_group {
+       struct rcu_head                 rcu;
        struct timer_list               timer;
        struct br_ip                    addr;
-       unsigned char                   state;
-+
 +      unsigned char                   eth_addr[ETH_ALEN];
+       unsigned char                   state;
 +      bool                            unicast;
  };
  
  struct net_bridge_mdb_entry
-@@ -554,7 +557,8 @@ void br_multicast_free_pg(struct rcu_hea
+@@ -554,7 +556,8 @@ void br_multicast_free_pg(struct rcu_hea
  struct net_bridge_port_group *
  br_multicast_new_port_group(struct net_bridge_port *port, struct br_ip *group,
                            struct net_bridge_port_group __rcu *next,
@@ -382,8 +382,6 @@ Implement optinal multicast->unicast conversion for igmp snooping
  
 -              port = (unsigned long)lport > (unsigned long)rport ?
 -                     lport : rport;
--
--              prev = maybe_deliver(prev, port, skb, __packet_hook);
 +              if ((unsigned long)lport > (unsigned long)rport) {
 +                      port = lport;
 +                      addr = p->unicast ? p->eth_addr : NULL;
@@ -391,7 +389,8 @@ Implement optinal multicast->unicast conversion for igmp snooping
 +                      port = rport;
 +                      addr = NULL;
 +              }
-+
+-              prev = maybe_deliver(prev, port, skb, __packet_hook);
 +              if (addr)
 +                      prev = maybe_deliver_addr(prev, port, skb, addr,
 +                                                __packet_hook);