diff options
-rw-r--r-- | net/bridge/netfilter/ebt_dnat.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/net/bridge/netfilter/ebt_dnat.c b/net/bridge/netfilter/ebt_dnat.c index ed91ea31978a..12a4f4d93681 100644 --- a/net/bridge/netfilter/ebt_dnat.c +++ b/net/bridge/netfilter/ebt_dnat.c | |||
@@ -20,7 +20,6 @@ static unsigned int | |||
20 | ebt_dnat_tg(struct sk_buff *skb, const struct xt_action_param *par) | 20 | ebt_dnat_tg(struct sk_buff *skb, const struct xt_action_param *par) |
21 | { | 21 | { |
22 | const struct ebt_nat_info *info = par->targinfo; | 22 | const struct ebt_nat_info *info = par->targinfo; |
23 | struct net_device *dev; | ||
24 | 23 | ||
25 | if (skb_ensure_writable(skb, ETH_ALEN)) | 24 | if (skb_ensure_writable(skb, ETH_ALEN)) |
26 | return EBT_DROP; | 25 | return EBT_DROP; |
@@ -33,10 +32,22 @@ ebt_dnat_tg(struct sk_buff *skb, const struct xt_action_param *par) | |||
33 | else | 32 | else |
34 | skb->pkt_type = PACKET_MULTICAST; | 33 | skb->pkt_type = PACKET_MULTICAST; |
35 | } else { | 34 | } else { |
36 | if (xt_hooknum(par) != NF_BR_BROUTING) | 35 | const struct net_device *dev; |
37 | dev = br_port_get_rcu(xt_in(par))->br->dev; | 36 | |
38 | else | 37 | switch (xt_hooknum(par)) { |
38 | case NF_BR_BROUTING: | ||
39 | dev = xt_in(par); | 39 | dev = xt_in(par); |
40 | break; | ||
41 | case NF_BR_PRE_ROUTING: | ||
42 | dev = br_port_get_rcu(xt_in(par))->br->dev; | ||
43 | break; | ||
44 | default: | ||
45 | dev = NULL; | ||
46 | break; | ||
47 | } | ||
48 | |||
49 | if (!dev) /* NF_BR_LOCAL_OUT */ | ||
50 | return info->target; | ||
40 | 51 | ||
41 | if (ether_addr_equal(info->mac, dev->dev_addr)) | 52 | if (ether_addr_equal(info->mac, dev->dev_addr)) |
42 | skb->pkt_type = PACKET_HOST; | 53 | skb->pkt_type = PACKET_HOST; |