1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * xfrm4_output.c - Common IPsec encapsulation code for IPv4.
4 * Copyright (c) 2004 Herbert Xu <herbert@gondor.apana.org.au>
7 #include <linux/if_ether.h>
8 #include <linux/kernel.h>
9 #include <linux/module.h>
10 #include <linux/skbuff.h>
11 #include <linux/netfilter_ipv4.h>
17 static int __xfrm4_output(struct net
*net
, struct sock
*sk
, struct sk_buff
*skb
)
19 #ifdef CONFIG_NETFILTER
20 struct xfrm_state
*x
= skb_dst(skb
)->xfrm
;
23 IPCB(skb
)->flags
|= IPSKB_REROUTED
;
24 return dst_output(net
, sk
, skb
);
28 return xfrm_output(sk
, skb
);
31 int xfrm4_output(struct net
*net
, struct sock
*sk
, struct sk_buff
*skb
)
33 return NF_HOOK_COND(NFPROTO_IPV4
, NF_INET_POST_ROUTING
,
34 net
, sk
, skb
, skb
->dev
, skb_dst(skb
)->dev
,
36 !(IPCB(skb
)->flags
& IPSKB_REROUTED
));
39 void xfrm4_local_error(struct sk_buff
*skb
, u32 mtu
)
43 hdr
= skb
->encapsulation
? inner_ip_hdr(skb
) : ip_hdr(skb
);
44 ip_local_error(skb
->sk
, EMSGSIZE
, hdr
->daddr
,
45 inet_sk(skb
->sk
)->inet_dport
, mtu
);