net: dsa: Call dsa_untag_bridge_pvid() from dsa_switch_rcv()
When a DSA switch driver needs to call dsa_untag_bridge_pvid(), it can set dsa_switch::untag_brige_pvid to indicate this is necessary. This is a pre-requisite to making sure that we are always calling dsa_untag_bridge_pvid() after eth_type_trans() has been called. Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c16bcd70a1
commit
1dc0408cdf
|
@ -308,6 +308,14 @@ struct dsa_switch {
|
||||||
*/
|
*/
|
||||||
bool configure_vlan_while_not_filtering;
|
bool configure_vlan_while_not_filtering;
|
||||||
|
|
||||||
|
/* If the switch driver always programs the CPU port as egress tagged
|
||||||
|
* despite the VLAN configuration indicating otherwise, then setting
|
||||||
|
* @untag_bridge_pvid will force the DSA receive path to pop the bridge's
|
||||||
|
* default_pvid VLAN tagged frames to offer a consistent behavior
|
||||||
|
* between a vlan_filtering=0 and vlan_filtering=1 bridge device.
|
||||||
|
*/
|
||||||
|
bool untag_bridge_pvid;
|
||||||
|
|
||||||
/* In case vlan_filtering_is_global is set, the VLAN awareness state
|
/* In case vlan_filtering_is_global is set, the VLAN awareness state
|
||||||
* should be retrieved from here and not from the per-port settings.
|
* should be retrieved from here and not from the per-port settings.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -225,6 +225,15 @@ static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||||
skb->pkt_type = PACKET_HOST;
|
skb->pkt_type = PACKET_HOST;
|
||||||
skb->protocol = eth_type_trans(skb, skb->dev);
|
skb->protocol = eth_type_trans(skb, skb->dev);
|
||||||
|
|
||||||
|
if (unlikely(cpu_dp->ds->untag_bridge_pvid)) {
|
||||||
|
nskb = dsa_untag_bridge_pvid(skb);
|
||||||
|
if (!nskb) {
|
||||||
|
kfree_skb(skb);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
skb = nskb;
|
||||||
|
}
|
||||||
|
|
||||||
s = this_cpu_ptr(p->stats64);
|
s = this_cpu_ptr(p->stats64);
|
||||||
u64_stats_update_begin(&s->syncp);
|
u64_stats_update_begin(&s->syncp);
|
||||||
s->rx_packets++;
|
s->rx_packets++;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user