diff options
author | Patrick McHardy <kaber@trash.net> | 2006-01-07 02:05:36 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-01-07 15:57:35 -0500 |
commit | 5c901daaea3be0d900b3ae1fc9b5f64ff94e4f02 (patch) | |
tree | 7532b280d892bab7fd9af98b02a3f81929ddca5d /net/ipv4/ip_output.c | |
parent | 4e8e9de7c25315669e2d5565acc50ec379522c28 (diff) |
[NETFILTER]: Redo policy lookups after NAT when neccessary
When NAT changes the key used for the xfrm lookup it needs to be done
again. If a new policy is returned in POST_ROUTING the packet needs
to be passed to xfrm4_output_one manually after all hooks were called
because POST_ROUTING is called with fixed okfn (ip_finish_output).
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/ip_output.c')
-rw-r--r-- | net/ipv4/ip_output.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 8b1c9bd0091e..59fdac3a099a 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -202,6 +202,11 @@ static inline int ip_finish_output2(struct sk_buff *skb) | |||
202 | 202 | ||
203 | static inline int ip_finish_output(struct sk_buff *skb) | 203 | static inline int ip_finish_output(struct sk_buff *skb) |
204 | { | 204 | { |
205 | #if defined(CONFIG_NETFILTER) && defined(CONFIG_XFRM) | ||
206 | /* Policy lookup after SNAT yielded a new policy */ | ||
207 | if (skb->dst->xfrm != NULL) | ||
208 | return xfrm4_output_finish(skb); | ||
209 | #endif | ||
205 | if (skb->len > dst_mtu(skb->dst) && | 210 | if (skb->len > dst_mtu(skb->dst) && |
206 | !(skb_shinfo(skb)->ufo_size || skb_shinfo(skb)->tso_size)) | 211 | !(skb_shinfo(skb)->ufo_size || skb_shinfo(skb)->tso_size)) |
207 | return ip_fragment(skb, ip_finish_output2); | 212 | return ip_fragment(skb, ip_finish_output2); |