diff options
author | David S. Miller <davem@davemloft.net> | 2014-10-08 16:22:22 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-10-08 16:22:22 -0400 |
commit | 64b1f00a0830e1c53874067273a096b228d83d36 (patch) | |
tree | dd547b0f1d431d0995b8eaa711cedb92399f31fe /net/bridge | |
parent | 16b99a4f6644d58c94acb4b4253e84049de588c5 (diff) | |
parent | 5301e3e117d88ef0967ce278912e54757f1a31a2 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'net/bridge')
-rw-r--r-- | net/bridge/br_netfilter.c | 11 | ||||
-rw-r--r-- | net/bridge/br_private.h | 4 |
2 files changed, 15 insertions, 0 deletions
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index fa1270cc5086..1bada53bb195 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
@@ -316,6 +316,7 @@ static int br_nf_pre_routing_finish_bridge(struct sk_buff *skb) | |||
316 | ETH_HLEN-ETH_ALEN); | 316 | ETH_HLEN-ETH_ALEN); |
317 | /* tell br_dev_xmit to continue with forwarding */ | 317 | /* tell br_dev_xmit to continue with forwarding */ |
318 | nf_bridge->mask |= BRNF_BRIDGED_DNAT; | 318 | nf_bridge->mask |= BRNF_BRIDGED_DNAT; |
319 | /* FIXME Need to refragment */ | ||
319 | ret = neigh->output(neigh, skb); | 320 | ret = neigh->output(neigh, skb); |
320 | } | 321 | } |
321 | neigh_release(neigh); | 322 | neigh_release(neigh); |
@@ -371,6 +372,10 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb) | |||
371 | struct nf_bridge_info *nf_bridge = skb->nf_bridge; | 372 | struct nf_bridge_info *nf_bridge = skb->nf_bridge; |
372 | struct rtable *rt; | 373 | struct rtable *rt; |
373 | int err; | 374 | int err; |
375 | int frag_max_size; | ||
376 | |||
377 | frag_max_size = IPCB(skb)->frag_max_size; | ||
378 | BR_INPUT_SKB_CB(skb)->frag_max_size = frag_max_size; | ||
374 | 379 | ||
375 | if (nf_bridge->mask & BRNF_PKT_TYPE) { | 380 | if (nf_bridge->mask & BRNF_PKT_TYPE) { |
376 | skb->pkt_type = PACKET_OTHERHOST; | 381 | skb->pkt_type = PACKET_OTHERHOST; |
@@ -775,13 +780,19 @@ static unsigned int br_nf_forward_arp(const struct nf_hook_ops *ops, | |||
775 | static int br_nf_dev_queue_xmit(struct sk_buff *skb) | 780 | static int br_nf_dev_queue_xmit(struct sk_buff *skb) |
776 | { | 781 | { |
777 | int ret; | 782 | int ret; |
783 | int frag_max_size; | ||
778 | 784 | ||
785 | /* This is wrong! We should preserve the original fragment | ||
786 | * boundaries by preserving frag_list rather than refragmenting. | ||
787 | */ | ||
779 | if (skb->protocol == htons(ETH_P_IP) && | 788 | if (skb->protocol == htons(ETH_P_IP) && |
780 | skb->len + nf_bridge_mtu_reduction(skb) > skb->dev->mtu && | 789 | skb->len + nf_bridge_mtu_reduction(skb) > skb->dev->mtu && |
781 | !skb_is_gso(skb)) { | 790 | !skb_is_gso(skb)) { |
791 | frag_max_size = BR_INPUT_SKB_CB(skb)->frag_max_size; | ||
782 | if (br_parse_ip_options(skb)) | 792 | if (br_parse_ip_options(skb)) |
783 | /* Drop invalid packet */ | 793 | /* Drop invalid packet */ |
784 | return NF_DROP; | 794 | return NF_DROP; |
795 | IPCB(skb)->frag_max_size = frag_max_size; | ||
785 | ret = ip_fragment(skb, br_dev_queue_push_xmit); | 796 | ret = ip_fragment(skb, br_dev_queue_push_xmit); |
786 | } else | 797 | } else |
787 | ret = br_dev_queue_push_xmit(skb); | 798 | ret = br_dev_queue_push_xmit(skb); |
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index d8cbaa694227..4d783d071305 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h | |||
@@ -306,10 +306,14 @@ struct net_bridge | |||
306 | 306 | ||
307 | struct br_input_skb_cb { | 307 | struct br_input_skb_cb { |
308 | struct net_device *brdev; | 308 | struct net_device *brdev; |
309 | |||
309 | #ifdef CONFIG_BRIDGE_IGMP_SNOOPING | 310 | #ifdef CONFIG_BRIDGE_IGMP_SNOOPING |
310 | int igmp; | 311 | int igmp; |
311 | int mrouters_only; | 312 | int mrouters_only; |
312 | #endif | 313 | #endif |
314 | |||
315 | u16 frag_max_size; | ||
316 | |||
313 | #ifdef CONFIG_BRIDGE_VLAN_FILTERING | 317 | #ifdef CONFIG_BRIDGE_VLAN_FILTERING |
314 | bool vlan_filtered; | 318 | bool vlan_filtered; |
315 | #endif | 319 | #endif |