diff options
Diffstat (limited to 'net/bridge/br_netfilter_hooks.c')
-rw-r--r-- | net/bridge/br_netfilter_hooks.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/net/bridge/br_netfilter_hooks.c b/net/bridge/br_netfilter_hooks.c index 97fc19f001bf..55dcb2b20b59 100644 --- a/net/bridge/br_netfilter_hooks.c +++ b/net/bridge/br_netfilter_hooks.c | |||
@@ -701,18 +701,20 @@ static unsigned int nf_bridge_mtu_reduction(const struct sk_buff *skb) | |||
701 | 701 | ||
702 | static int br_nf_dev_queue_xmit(struct net *net, struct sock *sk, struct sk_buff *skb) | 702 | static int br_nf_dev_queue_xmit(struct net *net, struct sock *sk, struct sk_buff *skb) |
703 | { | 703 | { |
704 | struct nf_bridge_info *nf_bridge; | 704 | struct nf_bridge_info *nf_bridge = nf_bridge_info_get(skb); |
705 | unsigned int mtu_reserved; | 705 | unsigned int mtu, mtu_reserved; |
706 | 706 | ||
707 | mtu_reserved = nf_bridge_mtu_reduction(skb); | 707 | mtu_reserved = nf_bridge_mtu_reduction(skb); |
708 | mtu = skb->dev->mtu; | ||
709 | |||
710 | if (nf_bridge->frag_max_size && nf_bridge->frag_max_size < mtu) | ||
711 | mtu = nf_bridge->frag_max_size; | ||
708 | 712 | ||
709 | if (skb_is_gso(skb) || skb->len + mtu_reserved <= skb->dev->mtu) { | 713 | if (skb_is_gso(skb) || skb->len + mtu_reserved <= mtu) { |
710 | nf_bridge_info_free(skb); | 714 | nf_bridge_info_free(skb); |
711 | return br_dev_queue_push_xmit(net, sk, skb); | 715 | return br_dev_queue_push_xmit(net, sk, skb); |
712 | } | 716 | } |
713 | 717 | ||
714 | nf_bridge = nf_bridge_info_get(skb); | ||
715 | |||
716 | /* This is wrong! We should preserve the original fragment | 718 | /* This is wrong! We should preserve the original fragment |
717 | * boundaries by preserving frag_list rather than refragmenting. | 719 | * boundaries by preserving frag_list rather than refragmenting. |
718 | */ | 720 | */ |