Commit | Line | Data |
---|---|---|
2874c5fd | 1 | // SPDX-License-Identifier: GPL-2.0-or-later |
1da177e4 LT |
2 | /* |
3 | * xfrm4_output.c - Common IPsec encapsulation code for IPv4. | |
4 | * Copyright (c) 2004 Herbert Xu <herbert@gondor.apana.org.au> | |
1da177e4 LT |
5 | */ |
6 | ||
09b8f7a9 HX |
7 | #include <linux/if_ether.h> |
8 | #include <linux/kernel.h> | |
36cf9acf | 9 | #include <linux/module.h> |
1da177e4 | 10 | #include <linux/skbuff.h> |
16a6677f | 11 | #include <linux/netfilter_ipv4.h> |
36cf9acf | 12 | #include <net/dst.h> |
1da177e4 LT |
13 | #include <net/ip.h> |
14 | #include <net/xfrm.h> | |
15 | #include <net/icmp.h> | |
16 | ||
0c4b51f0 | 17 | static int __xfrm4_output(struct net *net, struct sock *sk, struct sk_buff *skb) |
5596732f | 18 | { |
7d4343d5 | 19 | #ifdef CONFIG_NETFILTER |
5596732f SK |
20 | struct xfrm_state *x = skb_dst(skb)->xfrm; |
21 | ||
5596732f | 22 | if (!x) { |
09b8f7a9 | 23 | IPCB(skb)->flags |= IPSKB_REROUTED; |
13206b6b | 24 | return dst_output(net, sk, skb); |
09b8f7a9 | 25 | } |
862b82c6 | 26 | #endif |
09b8f7a9 | 27 | |
2ab6096d | 28 | return xfrm_output(sk, skb); |
09b8f7a9 HX |
29 | } |
30 | ||
ede2059d | 31 | int xfrm4_output(struct net *net, struct sock *sk, struct sk_buff *skb) |
16a6677f | 32 | { |
29a26a56 | 33 | return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING, |
28f8bfd1 | 34 | net, sk, skb, skb->dev, skb_dst(skb)->dev, |
29a26a56 | 35 | __xfrm4_output, |
48d5cad8 | 36 | !(IPCB(skb)->flags & IPSKB_REROUTED)); |
16a6677f | 37 | } |
628e341f HFS |
38 | |
39 | void xfrm4_local_error(struct sk_buff *skb, u32 mtu) | |
40 | { | |
41 | struct iphdr *hdr; | |
42 | ||
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); | |
46 | } |