Commit fea1829f authored by David S. Miller's avatar David S. Miller

Merge branch 'bridge_8021AD'

Vlad Yasevich says:

====================
bridge: Fix forwarding of 8021AD frames

Bridge has its own way to deterine if the packet is forwardable and it doesn't
support 8021ad tags correctly.  Instead just allow bridge to use an
existing is_skb_forwardable() function.

v2: Fix missing hunk in patch 2/2 to make it build.

v3: Fix indent for is_skb_forwardable
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 9109e17f f6367b46
...@@ -2629,6 +2629,7 @@ int dev_get_phys_port_id(struct net_device *dev, ...@@ -2629,6 +2629,7 @@ int dev_get_phys_port_id(struct net_device *dev,
int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
struct netdev_queue *txq); struct netdev_queue *txq);
int dev_forward_skb(struct net_device *dev, struct sk_buff *skb); int dev_forward_skb(struct net_device *dev, struct sk_buff *skb);
bool is_skb_forwardable(struct net_device *dev, struct sk_buff *skb);
extern int netdev_budget; extern int netdev_budget;
......
...@@ -35,16 +35,11 @@ static inline int should_deliver(const struct net_bridge_port *p, ...@@ -35,16 +35,11 @@ static inline int should_deliver(const struct net_bridge_port *p,
p->state == BR_STATE_FORWARDING; p->state == BR_STATE_FORWARDING;
} }
static inline unsigned int packet_length(const struct sk_buff *skb)
{
return skb->len - (skb->protocol == htons(ETH_P_8021Q) ? VLAN_HLEN : 0);
}
int br_dev_queue_push_xmit(struct sk_buff *skb) int br_dev_queue_push_xmit(struct sk_buff *skb)
{ {
/* ip_fragment doesn't copy the MAC header */ /* ip_fragment doesn't copy the MAC header */
if (nf_bridge_maybe_copy_header(skb) || if (nf_bridge_maybe_copy_header(skb) ||
(packet_length(skb) > skb->dev->mtu && !skb_is_gso(skb))) { !is_skb_forwardable(skb->dev, skb)) {
kfree_skb(skb); kfree_skb(skb);
} else { } else {
skb_push(skb, ETH_HLEN); skb_push(skb, ETH_HLEN);
...@@ -71,7 +66,7 @@ static void __br_deliver(const struct net_bridge_port *to, struct sk_buff *skb) ...@@ -71,7 +66,7 @@ static void __br_deliver(const struct net_bridge_port *to, struct sk_buff *skb)
skb->dev = to->dev; skb->dev = to->dev;
if (unlikely(netpoll_tx_running(to->br->dev))) { if (unlikely(netpoll_tx_running(to->br->dev))) {
if (packet_length(skb) > skb->dev->mtu && !skb_is_gso(skb)) if (!is_skb_forwardable(skb->dev, skb))
kfree_skb(skb); kfree_skb(skb);
else { else {
skb_push(skb, ETH_HLEN); skb_push(skb, ETH_HLEN);
......
...@@ -1640,8 +1640,7 @@ static inline void net_timestamp_set(struct sk_buff *skb) ...@@ -1640,8 +1640,7 @@ static inline void net_timestamp_set(struct sk_buff *skb)
__net_timestamp(SKB); \ __net_timestamp(SKB); \
} \ } \
static inline bool is_skb_forwardable(struct net_device *dev, bool is_skb_forwardable(struct net_device *dev, struct sk_buff *skb)
struct sk_buff *skb)
{ {
unsigned int len; unsigned int len;
...@@ -1660,6 +1659,7 @@ static inline bool is_skb_forwardable(struct net_device *dev, ...@@ -1660,6 +1659,7 @@ static inline bool is_skb_forwardable(struct net_device *dev,
return false; return false;
} }
EXPORT_SYMBOL_GPL(is_skb_forwardable);
/** /**
* dev_forward_skb - loopback an skb to another netif * dev_forward_skb - loopback an skb to another netif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment