|
@@ -736,8 +736,6 @@ static unsigned int br_nf_forward_ip(const struct nf_hook_ops *ops,
|
|
|
if (pf == NFPROTO_IPV4 && br_parse_ip_options(skb))
|
|
|
return NF_DROP;
|
|
|
|
|
|
- /* The physdev module checks on this */
|
|
|
- nf_bridge->mask |= BRNF_BRIDGED;
|
|
|
nf_bridge->physoutdev = skb->dev;
|
|
|
if (pf == NFPROTO_IPV4)
|
|
|
skb->protocol = htons(ETH_P_IP);
|
|
@@ -857,7 +855,12 @@ static unsigned int br_nf_post_routing(const struct nf_hook_ops *ops,
|
|
|
struct net_device *realoutdev = bridge_parent(skb->dev);
|
|
|
u_int8_t pf;
|
|
|
|
|
|
- if (!nf_bridge || !(nf_bridge->mask & BRNF_BRIDGED))
|
|
|
+ /* if nf_bridge is set, but ->physoutdev is NULL, this packet came in
|
|
|
+ * on a bridge, but was delivered locally and is now being routed:
|
|
|
+ *
|
|
|
+ * POST_ROUTING was already invoked from the ip stack.
|
|
|
+ */
|
|
|
+ if (!nf_bridge || !nf_bridge->physoutdev)
|
|
|
return NF_ACCEPT;
|
|
|
|
|
|
if (!realoutdev)
|