|
@@ -284,7 +284,7 @@ int br_nf_pre_routing_finish_bridge(struct sock *sk, struct sk_buff *skb)
|
|
nf_bridge->neigh_header,
|
|
nf_bridge->neigh_header,
|
|
ETH_HLEN-ETH_ALEN);
|
|
ETH_HLEN-ETH_ALEN);
|
|
/* tell br_dev_xmit to continue with forwarding */
|
|
/* tell br_dev_xmit to continue with forwarding */
|
|
- nf_bridge->mask |= BRNF_BRIDGED_DNAT;
|
|
|
|
|
|
+ nf_bridge->bridged_dnat = 1;
|
|
/* FIXME Need to refragment */
|
|
/* FIXME Need to refragment */
|
|
ret = neigh->output(neigh, skb);
|
|
ret = neigh->output(neigh, skb);
|
|
}
|
|
}
|
|
@@ -356,7 +356,7 @@ static int br_nf_pre_routing_finish(struct sock *sk, struct sk_buff *skb)
|
|
skb->pkt_type = PACKET_OTHERHOST;
|
|
skb->pkt_type = PACKET_OTHERHOST;
|
|
nf_bridge->pkt_otherhost = false;
|
|
nf_bridge->pkt_otherhost = false;
|
|
}
|
|
}
|
|
- nf_bridge->mask &= ~BRNF_NF_BRIDGE_PREROUTING;
|
|
|
|
|
|
+ nf_bridge->in_prerouting = 0;
|
|
if (br_nf_ipv4_daddr_was_changed(skb, nf_bridge)) {
|
|
if (br_nf_ipv4_daddr_was_changed(skb, nf_bridge)) {
|
|
if ((err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev))) {
|
|
if ((err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev))) {
|
|
struct in_device *in_dev = __in_dev_get_rcu(dev);
|
|
struct in_device *in_dev = __in_dev_get_rcu(dev);
|
|
@@ -444,7 +444,7 @@ struct net_device *setup_pre_routing(struct sk_buff *skb)
|
|
nf_bridge->pkt_otherhost = true;
|
|
nf_bridge->pkt_otherhost = true;
|
|
}
|
|
}
|
|
|
|
|
|
- nf_bridge->mask |= BRNF_NF_BRIDGE_PREROUTING;
|
|
|
|
|
|
+ nf_bridge->in_prerouting = 1;
|
|
nf_bridge->physindev = skb->dev;
|
|
nf_bridge->physindev = skb->dev;
|
|
skb->dev = brnf_get_logical_dev(skb, skb->dev);
|
|
skb->dev = brnf_get_logical_dev(skb, skb->dev);
|
|
|
|
|
|
@@ -850,10 +850,8 @@ static unsigned int ip_sabotage_in(const struct nf_hook_ops *ops,
|
|
struct sk_buff *skb,
|
|
struct sk_buff *skb,
|
|
const struct nf_hook_state *state)
|
|
const struct nf_hook_state *state)
|
|
{
|
|
{
|
|
- if (skb->nf_bridge &&
|
|
|
|
- !(skb->nf_bridge->mask & BRNF_NF_BRIDGE_PREROUTING)) {
|
|
|
|
|
|
+ if (skb->nf_bridge && !skb->nf_bridge->in_prerouting)
|
|
return NF_STOP;
|
|
return NF_STOP;
|
|
- }
|
|
|
|
|
|
|
|
return NF_ACCEPT;
|
|
return NF_ACCEPT;
|
|
}
|
|
}
|
|
@@ -872,7 +870,7 @@ static void br_nf_pre_routing_finish_bridge_slow(struct sk_buff *skb)
|
|
struct nf_bridge_info *nf_bridge = nf_bridge_info_get(skb);
|
|
struct nf_bridge_info *nf_bridge = nf_bridge_info_get(skb);
|
|
|
|
|
|
skb_pull(skb, ETH_HLEN);
|
|
skb_pull(skb, ETH_HLEN);
|
|
- nf_bridge->mask &= ~BRNF_BRIDGED_DNAT;
|
|
|
|
|
|
+ nf_bridge->bridged_dnat = 0;
|
|
|
|
|
|
BUILD_BUG_ON(sizeof(nf_bridge->neigh_header) != (ETH_HLEN - ETH_ALEN));
|
|
BUILD_BUG_ON(sizeof(nf_bridge->neigh_header) != (ETH_HLEN - ETH_ALEN));
|
|
|
|
|
|
@@ -887,7 +885,7 @@ static void br_nf_pre_routing_finish_bridge_slow(struct sk_buff *skb)
|
|
|
|
|
|
static int br_nf_dev_xmit(struct sk_buff *skb)
|
|
static int br_nf_dev_xmit(struct sk_buff *skb)
|
|
{
|
|
{
|
|
- if (skb->nf_bridge && (skb->nf_bridge->mask & BRNF_BRIDGED_DNAT)) {
|
|
|
|
|
|
+ if (skb->nf_bridge && skb->nf_bridge->bridged_dnat) {
|
|
br_nf_pre_routing_finish_bridge_slow(skb);
|
|
br_nf_pre_routing_finish_bridge_slow(skb);
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|