net: dsa: Discard frames from unused ports
commitfc5f33768c
upstream. The Marvell switches under some conditions will pass a frame to the host with the port being the CPU port. Such frames are invalid, and should be dropped. Not dropping them can result in a crash when incrementing the receive statistics for an invalid port. This has been reworked for 4.14, which does not have the central dsa_master_find_slave() function, so each tag driver needs to check. Reported-by: Chris Healy <cphealy@gmail.com> Fixes:91da11f870
("net: Distributed Switch Architecture protocol support") Signed-off-by: Andrew Lunn <andrew@lunn.ch> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
90a32d1f0e
Коммит
30593709f8
|
@ -121,6 +121,9 @@ static struct sk_buff *brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev,
|
|||
if (source_port >= ds->num_ports || !ds->ports[source_port].netdev)
|
||||
return NULL;
|
||||
|
||||
if (unlikely(ds->cpu_port_mask & BIT(source_port)))
|
||||
return NULL;
|
||||
|
||||
/* Remove Broadcom tag and update checksum */
|
||||
skb_pull_rcsum(skb, BRCM_TAG_LEN);
|
||||
|
||||
|
|
|
@ -107,6 +107,9 @@ static struct sk_buff *dsa_rcv(struct sk_buff *skb, struct net_device *dev,
|
|||
if (source_port >= ds->num_ports || !ds->ports[source_port].netdev)
|
||||
return NULL;
|
||||
|
||||
if (unlikely(ds->cpu_port_mask & BIT(source_port)))
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* Convert the DSA header to an 802.1q header if the 'tagged'
|
||||
* bit in the DSA header is set. If the 'tagged' bit is clear,
|
||||
|
|
|
@ -120,6 +120,9 @@ static struct sk_buff *edsa_rcv(struct sk_buff *skb, struct net_device *dev,
|
|||
if (source_port >= ds->num_ports || !ds->ports[source_port].netdev)
|
||||
return NULL;
|
||||
|
||||
if (unlikely(ds->cpu_port_mask & BIT(source_port)))
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* If the 'tagged' bit is set, convert the DSA tag to a 802.1q
|
||||
* tag and delete the ethertype part. If the 'tagged' bit is
|
||||
|
|
|
@ -92,6 +92,9 @@ static struct sk_buff *ksz_rcv(struct sk_buff *skb, struct net_device *dev,
|
|||
if (source_port >= ds->num_ports || !ds->ports[source_port].netdev)
|
||||
return NULL;
|
||||
|
||||
if (unlikely(ds->cpu_port_mask & BIT(source_port)))
|
||||
return NULL;
|
||||
|
||||
pskb_trim_rcsum(skb, skb->len - KSZ_EGRESS_TAG_LEN);
|
||||
|
||||
skb->dev = ds->ports[source_port].netdev;
|
||||
|
|
|
@ -108,6 +108,9 @@ static struct sk_buff *lan9303_rcv(struct sk_buff *skb, struct net_device *dev,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (unlikely(ds->cpu_port_mask & BIT(source_port)))
|
||||
return NULL;
|
||||
|
||||
if (!ds->ports[source_port].netdev) {
|
||||
dev_warn_ratelimited(&dev->dev, "Dropping packet due to invalid netdev or device\n");
|
||||
return NULL;
|
||||
|
|
|
@ -81,6 +81,9 @@ static struct sk_buff *mtk_tag_rcv(struct sk_buff *skb, struct net_device *dev,
|
|||
if (!ds->ports[port].netdev)
|
||||
return NULL;
|
||||
|
||||
if (unlikely(ds->cpu_port_mask & BIT(port)))
|
||||
return NULL;
|
||||
|
||||
skb->dev = ds->ports[port].netdev;
|
||||
|
||||
return skb;
|
||||
|
|
|
@ -104,6 +104,9 @@ static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev,
|
|||
if (!ds->ports[port].netdev)
|
||||
return NULL;
|
||||
|
||||
if (unlikely(ds->cpu_port_mask & BIT(port)))
|
||||
return NULL;
|
||||
|
||||
/* Update skb & forward the frame accordingly */
|
||||
skb->dev = ds->ports[port].netdev;
|
||||
|
||||
|
|
|
@ -76,6 +76,9 @@ static struct sk_buff *trailer_rcv(struct sk_buff *skb, struct net_device *dev,
|
|||
if (source_port >= ds->num_ports || !ds->ports[source_port].netdev)
|
||||
return NULL;
|
||||
|
||||
if (unlikely(ds->cpu_port_mask & BIT(source_port)))
|
||||
return NULL;
|
||||
|
||||
pskb_trim_rcsum(skb, skb->len - 4);
|
||||
|
||||
skb->dev = ds->ports[source_port].netdev;
|
||||
|
|
Загрузка…
Ссылка в новой задаче