|
@@ -114,12 +114,6 @@ int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb)
|
|
|
if (err)
|
|
|
return err;
|
|
|
|
|
|
- memset(IP6CB(skb), 0, sizeof(*IP6CB(skb)));
|
|
|
-#ifdef CONFIG_NETFILTER
|
|
|
- IP6CB(skb)->flags |= IP6SKB_XFRM_TRANSFORMED;
|
|
|
-#endif
|
|
|
-
|
|
|
- skb->protocol = htons(ETH_P_IPV6);
|
|
|
skb->local_df = 1;
|
|
|
|
|
|
return x->outer_mode->output2(x, skb);
|
|
@@ -128,11 +122,13 @@ EXPORT_SYMBOL(xfrm6_prepare_output);
|
|
|
|
|
|
int xfrm6_output_finish(struct sk_buff *skb)
|
|
|
{
|
|
|
+ memset(IP6CB(skb), 0, sizeof(*IP6CB(skb)));
|
|
|
+ skb->protocol = htons(ETH_P_IPV6);
|
|
|
+
|
|
|
#ifdef CONFIG_NETFILTER
|
|
|
IP6CB(skb)->flags |= IP6SKB_XFRM_TRANSFORMED;
|
|
|
#endif
|
|
|
|
|
|
- skb->protocol = htons(ETH_P_IPV6);
|
|
|
return xfrm_output(skb);
|
|
|
}
|
|
|
|
|
@@ -142,6 +138,13 @@ static int __xfrm6_output(struct sk_buff *skb)
|
|
|
struct xfrm_state *x = dst->xfrm;
|
|
|
int mtu;
|
|
|
|
|
|
+#ifdef CONFIG_NETFILTER
|
|
|
+ if (!x) {
|
|
|
+ IP6CB(skb)->flags |= IP6SKB_REROUTED;
|
|
|
+ return dst_output(skb);
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
if (skb->protocol == htons(ETH_P_IPV6))
|
|
|
mtu = ip6_skb_dst_mtu(skb);
|
|
|
else
|
|
@@ -165,6 +168,7 @@ static int __xfrm6_output(struct sk_buff *skb)
|
|
|
|
|
|
int xfrm6_output(struct sk_buff *skb)
|
|
|
{
|
|
|
- return NF_HOOK(NFPROTO_IPV6, NF_INET_POST_ROUTING, skb, NULL,
|
|
|
- skb_dst(skb)->dev, __xfrm6_output);
|
|
|
+ return NF_HOOK_COND(NFPROTO_IPV6, NF_INET_POST_ROUTING, skb,
|
|
|
+ NULL, skb_dst(skb)->dev, __xfrm6_output,
|
|
|
+ !(IP6CB(skb)->flags & IP6SKB_REROUTED));
|
|
|
}
|