aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'net/bridge/br_netfilter_hooks.c')
-rw-r--r--net/bridge/br_netfilter_hooks.c12
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
702static int br_nf_dev_queue_xmit(struct net *net, struct sock *sk, struct sk_buff *skb) 702static 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 */