You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/ethernet/marvell/mvneta.c The mvneta.c conflict is a case of overlapping changes, a conversion to devm_ioremap_resource() vs. a conversion to netdev_alloc_pcpu_stats. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -49,14 +49,14 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
brstats->tx_bytes += skb->len;
|
||||
u64_stats_update_end(&brstats->syncp);
|
||||
|
||||
if (!br_allowed_ingress(br, br_get_vlan_info(br), skb, &vid))
|
||||
goto out;
|
||||
|
||||
BR_INPUT_SKB_CB(skb)->brdev = dev;
|
||||
|
||||
skb_reset_mac_header(skb);
|
||||
skb_pull(skb, ETH_HLEN);
|
||||
|
||||
if (!br_allowed_ingress(br, br_get_vlan_info(br), skb, &vid))
|
||||
goto out;
|
||||
|
||||
if (is_broadcast_ether_addr(dest))
|
||||
br_flood_deliver(br, skb, false);
|
||||
else if (is_multicast_ether_addr(dest)) {
|
||||
|
||||
@@ -29,6 +29,7 @@ static int br_pass_frame_up(struct sk_buff *skb)
|
||||
struct net_device *indev, *brdev = BR_INPUT_SKB_CB(skb)->brdev;
|
||||
struct net_bridge *br = netdev_priv(brdev);
|
||||
struct pcpu_sw_netstats *brstats = this_cpu_ptr(br->stats);
|
||||
struct net_port_vlans *pv;
|
||||
|
||||
u64_stats_update_begin(&brstats->syncp);
|
||||
brstats->rx_packets++;
|
||||
@@ -39,18 +40,18 @@ static int br_pass_frame_up(struct sk_buff *skb)
|
||||
* packet is allowed except in promisc modue when someone
|
||||
* may be running packet capture.
|
||||
*/
|
||||
pv = br_get_vlan_info(br);
|
||||
if (!(brdev->flags & IFF_PROMISC) &&
|
||||
!br_allowed_egress(br, br_get_vlan_info(br), skb)) {
|
||||
!br_allowed_egress(br, pv, skb)) {
|
||||
kfree_skb(skb);
|
||||
return NET_RX_DROP;
|
||||
}
|
||||
|
||||
skb = br_handle_vlan(br, br_get_vlan_info(br), skb);
|
||||
if (!skb)
|
||||
return NET_RX_DROP;
|
||||
|
||||
indev = skb->dev;
|
||||
skb->dev = brdev;
|
||||
skb = br_handle_vlan(br, pv, skb);
|
||||
if (!skb)
|
||||
return NET_RX_DROP;
|
||||
|
||||
return NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_IN, skb, indev, NULL,
|
||||
netif_receive_skb);
|
||||
|
||||
+27
-17
@@ -119,22 +119,6 @@ static void __vlan_flush(struct net_port_vlans *v)
|
||||
kfree_rcu(v, rcu);
|
||||
}
|
||||
|
||||
/* Strip the tag from the packet. Will return skb with tci set 0. */
|
||||
static struct sk_buff *br_vlan_untag(struct sk_buff *skb)
|
||||
{
|
||||
if (skb->protocol != htons(ETH_P_8021Q)) {
|
||||
skb->vlan_tci = 0;
|
||||
return skb;
|
||||
}
|
||||
|
||||
skb->vlan_tci = 0;
|
||||
skb = vlan_untag(skb);
|
||||
if (skb)
|
||||
skb->vlan_tci = 0;
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
struct sk_buff *br_handle_vlan(struct net_bridge *br,
|
||||
const struct net_port_vlans *pv,
|
||||
struct sk_buff *skb)
|
||||
@@ -144,13 +128,27 @@ struct sk_buff *br_handle_vlan(struct net_bridge *br,
|
||||
if (!br->vlan_enabled)
|
||||
goto out;
|
||||
|
||||
/* Vlan filter table must be configured at this point. The
|
||||
* only exception is the bridge is set in promisc mode and the
|
||||
* packet is destined for the bridge device. In this case
|
||||
* pass the packet as is.
|
||||
*/
|
||||
if (!pv) {
|
||||
if ((br->dev->flags & IFF_PROMISC) && skb->dev == br->dev) {
|
||||
goto out;
|
||||
} else {
|
||||
kfree_skb(skb);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* At this point, we know that the frame was filtered and contains
|
||||
* a valid vlan id. If the vlan id is set in the untagged bitmap,
|
||||
* send untagged; otherwise, send tagged.
|
||||
*/
|
||||
br_vlan_get_tag(skb, &vid);
|
||||
if (test_bit(vid, pv->untagged_bitmap))
|
||||
skb = br_vlan_untag(skb);
|
||||
skb->vlan_tci = 0;
|
||||
|
||||
out:
|
||||
return skb;
|
||||
@@ -174,6 +172,18 @@ bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,
|
||||
if (!v)
|
||||
return false;
|
||||
|
||||
/* If vlan tx offload is disabled on bridge device and frame was
|
||||
* sent from vlan device on the bridge device, it does not have
|
||||
* HW accelerated vlan tag.
|
||||
*/
|
||||
if (unlikely(!vlan_tx_tag_present(skb) &&
|
||||
(skb->protocol == htons(ETH_P_8021Q) ||
|
||||
skb->protocol == htons(ETH_P_8021AD)))) {
|
||||
skb = vlan_untag(skb);
|
||||
if (unlikely(!skb))
|
||||
return false;
|
||||
}
|
||||
|
||||
err = br_vlan_get_tag(skb, vid);
|
||||
if (!*vid) {
|
||||
u16 pvid = br_get_pvid(v);
|
||||
|
||||
Reference in New Issue
Block a user