Blame view
net/ipv6/xfrm6_output.c
2.42 KB
2874c5fd2 treewide: Replace... |
1 |
// SPDX-License-Identifier: GPL-2.0-or-later |
1da177e4c Linux-2.6.12-rc2 |
2 3 4 5 |
/* * xfrm6_output.c - Common IPsec encapsulation code for IPv6. * Copyright (C) 2002 USAGI/WIDE Project * Copyright (c) 2004 Herbert Xu <herbert@gondor.apana.org.au> |
1da177e4c Linux-2.6.12-rc2 |
6 |
*/ |
406ef77c8 [IPSEC]: Move com... |
7 |
#include <linux/if_ether.h> |
36cf9acf9 [IPSEC]: Separate... |
8 9 |
#include <linux/kernel.h> #include <linux/module.h> |
1da177e4c Linux-2.6.12-rc2 |
10 |
#include <linux/skbuff.h> |
1da177e4c Linux-2.6.12-rc2 |
11 |
#include <linux/icmpv6.h> |
16a6677fd [XFRM]: Netfilter... |
12 |
#include <linux/netfilter_ipv6.h> |
36cf9acf9 [IPSEC]: Separate... |
13 |
#include <net/dst.h> |
1da177e4c Linux-2.6.12-rc2 |
14 |
#include <net/ipv6.h> |
ad0081e43 ipv6: Fragment lo... |
15 |
#include <net/ip6_route.h> |
1da177e4c Linux-2.6.12-rc2 |
16 |
#include <net/xfrm.h> |
aee5adb43 [XFRM] STATE: Add... |
17 18 19 20 21 |
int xfrm6_find_1stfragopt(struct xfrm_state *x, struct sk_buff *skb, u8 **prevhdr) { return ip6_find_1stfragopt(skb, prevhdr); } |
7159039a1 [IPV6]: Decentral... |
22 |
EXPORT_SYMBOL(xfrm6_find_1stfragopt); |
3e50ddd8b xfrm: expose loca... |
23 |
void xfrm6_local_rxpmtu(struct sk_buff *skb, u32 mtu) |
dd767856a xfrm6: Don't call... |
24 25 26 27 28 |
{ struct flowi6 fl6; struct sock *sk = skb->sk; fl6.flowi6_oif = sk->sk_bound_dev_if; |
4e3fd7a06 net: remove ipv6_... |
29 |
fl6.daddr = ipv6_hdr(skb)->daddr; |
dd767856a xfrm6: Don't call... |
30 31 32 |
ipv6_local_rxpmtu(sk, &fl6, mtu); } |
628e341f3 xfrm: make local ... |
33 |
void xfrm6_local_error(struct sk_buff *skb, u32 mtu) |
dd767856a xfrm6: Don't call... |
34 35 |
{ struct flowi6 fl6; |
5d0ff542d ipv6: xfrm: deref... |
36 |
const struct ipv6hdr *hdr; |
dd767856a xfrm6: Don't call... |
37 |
struct sock *sk = skb->sk; |
5d0ff542d ipv6: xfrm: deref... |
38 |
hdr = skb->encapsulation ? inner_ipv6_hdr(skb) : ipv6_hdr(skb); |
dd767856a xfrm6: Don't call... |
39 |
fl6.fl6_dport = inet_sk(sk)->inet_dport; |
5d0ff542d ipv6: xfrm: deref... |
40 |
fl6.daddr = hdr->daddr; |
dd767856a xfrm6: Don't call... |
41 42 43 |
ipv6_local_error(sk, EMSGSIZE, &fl6, mtu); } |
7d8c6e391 ipv6: Pass struct... |
44 45 |
static int __xfrm6_output_finish(struct net *net, struct sock *sk, struct sk_buff *skb) { |
2ab6096db xfrm: remove outp... |
46 |
return xfrm_output(sk, skb); |
7d8c6e391 ipv6: Pass struct... |
47 |
} |
0c4b51f00 netfilter: Pass n... |
48 |
static int __xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb) |
ad0081e43 ipv6: Fragment lo... |
49 50 51 |
{ struct dst_entry *dst = skb_dst(skb); struct xfrm_state *x = dst->xfrm; |
5a25cf1e3 xfrm: revert ipv4... |
52 |
int mtu; |
93efac3f2 ipv6: Fix IPsec p... |
53 |
bool toobig; |
0ea9d5e3e xfrm: introduce h... |
54 |
|
5596732fa xfrm: Fix crash w... |
55 56 57 |
#ifdef CONFIG_NETFILTER if (!x) { IP6CB(skb)->flags |= IP6SKB_REROUTED; |
13206b6bf net: Pass net int... |
58 |
return dst_output(net, sk, skb); |
5596732fa xfrm: Fix crash w... |
59 60 |
} #endif |
93efac3f2 ipv6: Fix IPsec p... |
61 62 |
if (x->props.mode != XFRM_MODE_TUNNEL) goto skip_frag; |
5a25cf1e3 xfrm: revert ipv4... |
63 64 65 66 |
if (skb->protocol == htons(ETH_P_IPV6)) mtu = ip6_skb_dst_mtu(skb); else mtu = dst_mtu(skb_dst(skb)); |
dd767856a xfrm6: Don't call... |
67 |
|
93efac3f2 ipv6: Fix IPsec p... |
68 |
toobig = skb->len > mtu && !skb_is_gso(skb); |
ede64dd2b xfrm: place xfrm6... |
69 |
if (toobig && xfrm6_local_dontfrag(skb->sk)) { |
dd767856a xfrm6: Don't call... |
70 |
xfrm6_local_rxpmtu(skb, mtu); |
215ab0f02 xfrm6: call kfree... |
71 |
kfree_skb(skb); |
dd767856a xfrm6: Don't call... |
72 |
return -EMSGSIZE; |
93efac3f2 ipv6: Fix IPsec p... |
73 |
} else if (!skb->ignore_df && toobig && skb->sk) { |
628e341f3 xfrm: make local ... |
74 |
xfrm_local_error(skb, mtu); |
215ab0f02 xfrm6: call kfree... |
75 |
kfree_skb(skb); |
dd767856a xfrm6: Don't call... |
76 77 |
return -EMSGSIZE; } |
ad0081e43 ipv6: Fragment lo... |
78 |
|
93efac3f2 ipv6: Fix IPsec p... |
79 |
if (toobig || dst_allfrag(skb_dst(skb))) |
7d8c6e391 ipv6: Pass struct... |
80 81 |
return ip6_fragment(net, sk, skb, __xfrm6_output_finish); |
93efac3f2 ipv6: Fix IPsec p... |
82 83 |
skip_frag: |
2ab6096db xfrm: remove outp... |
84 |
return xfrm_output(sk, skb); |
ad0081e43 ipv6: Fragment lo... |
85 |
} |
ede2059db dst: Pass net int... |
86 |
int xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb) |
16a6677fd [XFRM]: Netfilter... |
87 |
{ |
29a26a568 netfilter: Pass s... |
88 |
return NF_HOOK_COND(NFPROTO_IPV6, NF_INET_POST_ROUTING, |
28f8bfd1a netfilter: Suppor... |
89 |
net, sk, skb, skb->dev, skb_dst(skb)->dev, |
29a26a568 netfilter: Pass s... |
90 |
__xfrm6_output, |
5596732fa xfrm: Fix crash w... |
91 |
!(IP6CB(skb)->flags & IP6SKB_REROUTED)); |
16a6677fd [XFRM]: Netfilter... |
92 |
} |