treewide: replace nbd@openwrt.org with nbd@nbd.name
[openwrt/staging/dedeckeh.git] / target / linux / generic / patches-4.4 / 645-bridge_multicast_to_unicast.patch
index 830883526d48cc179afddb5fbad16b39125fb511..bab091262c86d7f66c03ccc7a45738cf19b61424 100644 (file)
@@ -1,4 +1,4 @@
-From: Felix Fietkau <nbd@openwrt.org>
+From: Felix Fietkau <nbd@nbd.name>
 Subject: [PATCH] bridge: multicast to unicast
 
 Implement optinal multicast->unicast conversion for igmp snooping
@@ -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
@@ -135,7 +135,11 @@ Implement optinal multicast->unicast conversion for igmp snooping
        struct igmpv3_report *ih;
        struct igmpv3_grec *grec;
        int i;
-@@ -1038,9 +1062,10 @@ static int br_ip4_multicast_igmp3_report
+@@ -1035,12 +1059,13 @@ static int br_ip4_multicast_igmp3_report
+                       continue;
+               }
++              src = eth_hdr(skb)->h_source;
                if ((type == IGMPV3_CHANGE_TO_INCLUDE ||
                     type == IGMPV3_MODE_IS_INCLUDE) &&
                    ntohs(grec->grec_nsrcs) == 0) {
@@ -143,7 +147,6 @@ Implement optinal multicast->unicast conversion for igmp snooping
 +                      br_ip4_multicast_leave_group(br, port, group, vid, src);
                } else {
 -                      err = br_ip4_multicast_add_group(br, port, group, vid);
-+                      src = eth_hdr(skb)->h_source;
 +                      err = br_ip4_multicast_add_group(br, port, group, vid, src);
                        if (err)
                                break;
@@ -169,7 +172,7 @@ Implement optinal multicast->unicast conversion for igmp snooping
                        if (!err)
                                break;
                }
-@@ -1422,7 +1448,8 @@ br_multicast_leave_group(struct net_brid
+@@ -1424,7 +1450,8 @@ br_multicast_leave_group(struct net_brid
                         struct net_bridge_port *port,
                         struct br_ip *group,
                         struct bridge_mcast_other_query *other_query,
@@ -179,7 +182,7 @@ Implement optinal multicast->unicast conversion for igmp snooping
  {
        struct net_bridge_mdb_htable *mdb;
        struct net_bridge_mdb_entry *mp;
-@@ -1446,7 +1473,7 @@ br_multicast_leave_group(struct net_brid
+@@ -1448,7 +1475,7 @@ br_multicast_leave_group(struct net_brid
                for (pp = &mp->ports;
                     (p = mlock_dereference(*pp, br)) != NULL;
                     pp = &p->next) {
@@ -188,7 +191,7 @@ Implement optinal multicast->unicast conversion for igmp snooping
                                continue;
  
                        rcu_assign_pointer(*pp, p->next);
-@@ -1509,7 +1536,7 @@ br_multicast_leave_group(struct net_brid
+@@ -1511,7 +1538,7 @@ br_multicast_leave_group(struct net_brid
        for (p = mlock_dereference(mp->ports, br);
             p != NULL;
             p = mlock_dereference(p->next, br)) {
@@ -197,7 +200,7 @@ Implement optinal multicast->unicast conversion for igmp snooping
                        continue;
  
                if (!hlist_unhashed(&p->mglist) &&
-@@ -1527,8 +1554,8 @@ out:
+@@ -1529,8 +1556,8 @@ out:
  
  static void br_ip4_multicast_leave_group(struct net_bridge *br,
                                         struct net_bridge_port *port,
@@ -208,7 +211,7 @@ Implement optinal multicast->unicast conversion for igmp snooping
  {
        struct br_ip br_group;
        struct bridge_mcast_own_query *own_query;
-@@ -1543,14 +1570,14 @@ static void br_ip4_multicast_leave_group
+@@ -1545,14 +1572,14 @@ static void br_ip4_multicast_leave_group
        br_group.vid = vid;
  
        br_multicast_leave_group(br, port, &br_group, &br->ip4_other_query,
@@ -225,7 +228,7 @@ Implement optinal multicast->unicast conversion for igmp snooping
  {
        struct br_ip br_group;
        struct bridge_mcast_own_query *own_query;
-@@ -1565,7 +1592,7 @@ static void br_ip6_multicast_leave_group
+@@ -1567,7 +1594,7 @@ static void br_ip6_multicast_leave_group
        br_group.vid = vid;
  
        br_multicast_leave_group(br, port, &br_group, &br->ip6_other_query,
@@ -234,7 +237,7 @@ Implement optinal multicast->unicast conversion for igmp snooping
  }
  #endif
  
-@@ -1574,6 +1601,7 @@ static int br_multicast_ipv4_rcv(struct
+@@ -1576,6 +1603,7 @@ static int br_multicast_ipv4_rcv(struct
                                 struct sk_buff *skb,
                                 u16 vid)
  {
@@ -242,7 +245,7 @@ Implement optinal multicast->unicast conversion for igmp snooping
        struct sk_buff *skb_trimmed = NULL;
        struct igmphdr *ih;
        int err;
-@@ -1590,12 +1618,13 @@ static int br_multicast_ipv4_rcv(struct
+@@ -1592,12 +1620,13 @@ static int br_multicast_ipv4_rcv(struct
  
        BR_INPUT_SKB_CB(skb)->igmp = 1;
        ih = igmp_hdr(skb);
@@ -257,7 +260,7 @@ Implement optinal multicast->unicast conversion for igmp snooping
                break;
        case IGMPV3_HOST_MEMBERSHIP_REPORT:
                err = br_ip4_multicast_igmp3_report(br, port, skb_trimmed, vid);
-@@ -1604,7 +1633,7 @@ static int br_multicast_ipv4_rcv(struct
+@@ -1606,7 +1635,7 @@ static int br_multicast_ipv4_rcv(struct
                err = br_ip4_multicast_query(br, port, skb_trimmed, vid);
                break;
        case IGMP_HOST_LEAVE_MESSAGE:
@@ -266,7 +269,7 @@ Implement optinal multicast->unicast conversion for igmp snooping
                break;
        }
  
-@@ -1620,6 +1649,7 @@ static int br_multicast_ipv6_rcv(struct
+@@ -1622,6 +1651,7 @@ static int br_multicast_ipv6_rcv(struct
                                 struct sk_buff *skb,
                                 u16 vid)
  {
@@ -274,7 +277,7 @@ Implement optinal multicast->unicast conversion for igmp snooping
        struct sk_buff *skb_trimmed = NULL;
        struct mld_msg *mld;
        int err;
-@@ -1639,8 +1669,9 @@ static int br_multicast_ipv6_rcv(struct
+@@ -1641,8 +1671,9 @@ static int br_multicast_ipv6_rcv(struct
  
        switch (mld->mld_type) {
        case ICMPV6_MGM_REPORT:
@@ -285,7 +288,7 @@ Implement optinal multicast->unicast conversion for igmp snooping
                break;
        case ICMPV6_MLD2_REPORT:
                err = br_ip6_multicast_mld2_report(br, port, skb_trimmed, vid);
-@@ -1649,7 +1680,8 @@ static int br_multicast_ipv6_rcv(struct
+@@ -1651,7 +1682,8 @@ static int br_multicast_ipv6_rcv(struct
                err = br_ip6_multicast_query(br, port, skb_trimmed, vid);
                break;
        case ICMPV6_MGM_REDUCTION:
@@ -297,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,