Merge branch 'for-4.4/reservations' of git://git.kernel.dk/linux-block
[firefly-linux-kernel-4.4.55.git] / net / bridge / br_forward.c
index 48afca729ed7ae3286d7c1c217bcc8b59894fe56..fcdb86dd5a239cceb0fb79d8e422f6fc56d14f0a 100644 (file)
@@ -30,9 +30,11 @@ static int deliver_clone(const struct net_bridge_port *prev,
 static inline int should_deliver(const struct net_bridge_port *p,
                                 const struct sk_buff *skb)
 {
+       struct net_bridge_vlan_group *vg;
+
+       vg = nbp_vlan_group_rcu(p);
        return ((p->flags & BR_HAIRPIN_MODE) || skb->dev != p->dev) &&
-               br_allowed_egress(p->br, nbp_get_vlan_info(p), skb) &&
-               p->state == BR_STATE_FORWARDING;
+               br_allowed_egress(vg, skb) && p->state == BR_STATE_FORWARDING;
 }
 
 int br_dev_queue_push_xmit(struct net *net, struct sock *sk, struct sk_buff *skb)
@@ -76,7 +78,10 @@ EXPORT_SYMBOL_GPL(br_forward_finish);
 
 static void __br_deliver(const struct net_bridge_port *to, struct sk_buff *skb)
 {
-       skb = br_handle_vlan(to->br, nbp_get_vlan_info(to), skb);
+       struct net_bridge_vlan_group *vg;
+
+       vg = nbp_vlan_group_rcu(to);
+       skb = br_handle_vlan(to->br, vg, skb);
        if (!skb)
                return;
 
@@ -99,6 +104,7 @@ static void __br_deliver(const struct net_bridge_port *to, struct sk_buff *skb)
 
 static void __br_forward(const struct net_bridge_port *to, struct sk_buff *skb)
 {
+       struct net_bridge_vlan_group *vg;
        struct net_device *indev;
 
        if (skb_warn_if_lro(skb)) {
@@ -106,7 +112,8 @@ static void __br_forward(const struct net_bridge_port *to, struct sk_buff *skb)
                return;
        }
 
-       skb = br_handle_vlan(to->br, nbp_get_vlan_info(to), skb);
+       vg = nbp_vlan_group_rcu(to);
+       skb = br_handle_vlan(to->br, vg, skb);
        if (!skb)
                return;
 
@@ -134,7 +141,7 @@ EXPORT_SYMBOL_GPL(br_deliver);
 /* called with rcu_read_lock */
 void br_forward(const struct net_bridge_port *to, struct sk_buff *skb, struct sk_buff *skb0)
 {
-       if (should_deliver(to, skb)) {
+       if (to && should_deliver(to, skb)) {
                if (skb0)
                        deliver_clone(to, skb, __br_forward);
                else