bridge: add export of multicast database adjacent to net_dev
[cascardo/linux.git] / net / bridge / br_private.h
index 2b2286d..50e2ab0 100644 (file)
@@ -54,30 +54,23 @@ struct mac_addr
        unsigned char   addr[ETH_ALEN];
 };
 
-struct br_ip
-{
-       union {
-               __be32  ip4;
-#if IS_ENABLED(CONFIG_IPV6)
-               struct in6_addr ip6;
-#endif
-       } u;
-       __be16          proto;
-       __u16           vid;
-};
-
 #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
 /* our own querier */
-struct bridge_mcast_query {
+struct bridge_mcast_own_query {
        struct timer_list       timer;
        u32                     startup_sent;
 };
 
 /* other querier */
-struct bridge_mcast_querier {
+struct bridge_mcast_other_query {
        struct timer_list               timer;
        unsigned long                   delay_time;
 };
+
+/* selected querier */
+struct bridge_mcast_querier {
+       struct br_ip addr;
+};
 #endif
 
 struct net_port_vlans {
@@ -178,9 +171,9 @@ struct net_bridge_port
 #define BR_PROMISC             0x00000080
 
 #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
-       struct bridge_mcast_query       ip4_query;
+       struct bridge_mcast_own_query   ip4_own_query;
 #if IS_ENABLED(CONFIG_IPV6)
-       struct bridge_mcast_query       ip6_query;
+       struct bridge_mcast_own_query   ip6_own_query;
 #endif /* IS_ENABLED(CONFIG_IPV6) */
        unsigned char                   multicast_router;
        struct timer_list               multicast_router_timer;
@@ -282,11 +275,13 @@ struct net_bridge
        struct hlist_head               router_list;
 
        struct timer_list               multicast_router_timer;
+       struct bridge_mcast_other_query ip4_other_query;
+       struct bridge_mcast_own_query   ip4_own_query;
        struct bridge_mcast_querier     ip4_querier;
-       struct bridge_mcast_query       ip4_query;
 #if IS_ENABLED(CONFIG_IPV6)
+       struct bridge_mcast_other_query ip6_other_query;
+       struct bridge_mcast_own_query   ip6_own_query;
        struct bridge_mcast_querier     ip6_querier;
-       struct bridge_mcast_query       ip6_query;
 #endif /* IS_ENABLED(CONFIG_IPV6) */
 #endif
 
@@ -333,8 +328,6 @@ struct br_input_skb_cb {
 #define br_debug(br, format, args...)                  \
        pr_debug("%s: " format,  (br)->dev->name, ##args)
 
-extern struct notifier_block br_device_notifier;
-
 /* called under bridge lock */
 static inline int br_is_root_bridge(const struct net_bridge *br)
 {
@@ -495,7 +488,7 @@ static inline bool br_multicast_is_router(struct net_bridge *br)
 
 static inline bool
 __br_multicast_querier_exists(struct net_bridge *br,
-                             struct bridge_mcast_querier *querier)
+                             struct bridge_mcast_other_query *querier)
 {
        return time_is_before_jiffies(querier->delay_time) &&
               (br->multicast_querier || timer_pending(&querier->timer));
@@ -506,10 +499,10 @@ static inline bool br_multicast_querier_exists(struct net_bridge *br,
 {
        switch (eth->h_proto) {
        case (htons(ETH_P_IP)):
-               return __br_multicast_querier_exists(br, &br->ip4_querier);
+               return __br_multicast_querier_exists(br, &br->ip4_other_query);
 #if IS_ENABLED(CONFIG_IPV6)
        case (htons(ETH_P_IPV6)):
-               return __br_multicast_querier_exists(br, &br->ip6_querier);
+               return __br_multicast_querier_exists(br, &br->ip6_other_query);
 #endif
        default:
                return false;
@@ -591,6 +584,7 @@ bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,
                        struct sk_buff *skb, u16 *vid);
 bool br_allowed_egress(struct net_bridge *br, const struct net_port_vlans *v,
                       const struct sk_buff *skb);
+bool br_should_learn(struct net_bridge_port *p, struct sk_buff *skb, u16 *vid);
 struct sk_buff *br_handle_vlan(struct net_bridge *br,
                               const struct net_port_vlans *v,
                               struct sk_buff *skb);
@@ -662,6 +656,12 @@ static inline bool br_allowed_egress(struct net_bridge *br,
        return true;
 }
 
+static inline bool br_should_learn(struct net_bridge_port *p,
+                                  struct sk_buff *skb, u16 *vid)
+{
+       return true;
+}
+
 static inline struct sk_buff *br_handle_vlan(struct net_bridge *br,
                                             const struct net_port_vlans *v,
                                             struct sk_buff *skb)
@@ -727,7 +727,7 @@ static inline u16 br_get_pvid(const struct net_port_vlans *v)
        return VLAN_N_VID;      /* Returns invalid vid */
 }
 
-static inline int br_vlan_enabled(struct net_bridge *br);
+static inline int br_vlan_enabled(struct net_bridge *br)
 {
        return 0;
 }