--- linux-2.6.x/net/bridge/br_netfilter.c 18 Jun 2006 23:30:55 -0000 1.1.1.25 +++ linux-2.6.x/net/bridge/br_netfilter.c 11 Aug 2006 04:10:04 -0000 @@ -765,14 +765,28 @@ out: return NF_STOLEN; } +/* + * We've finished passing through netfilter, so we can remove the fake dst. + * This is required by some lower layers, eg ip_gre + */ +static int br_nf_dev_queue_xmit_finish(struct sk_buff *skb) +{ + if (skb->dst == (struct dst_entry *)&__fake_rtable) { + dst_release(skb->dst); + skb->dst = NULL; + } + + return br_dev_queue_push_xmit(skb); +} + static int br_nf_dev_queue_xmit(struct sk_buff *skb) { if (skb->protocol == htons(ETH_P_IP) && skb->len > skb->dev->mtu && !(skb_shinfo(skb)->ufo_size || skb_shinfo(skb)->tso_size)) - return ip_fragment(skb, br_dev_queue_push_xmit); + return ip_fragment(skb, br_nf_dev_queue_xmit_finish); else - return br_dev_queue_push_xmit(skb); + return br_nf_dev_queue_xmit_finish(skb); } /* PF_BRIDGE/POST_ROUTING ********************************************/