Merge tag 'perf-tools-fixes-for-v6.4-1-2023-05-20' of git://git.kernel.org/pub/scm...
[linux-block.git] / net / xfrm / xfrm_input.c
CommitLineData
b2441318 1// SPDX-License-Identifier: GPL-2.0
1da177e4
LT
2/*
3 * xfrm_input.c
4 *
5 * Changes:
6 * YOSHIFUJI Hideaki @USAGI
7 * Split up af-specific portion
a716c119 8 *
1da177e4
LT
9 */
10
acf568ee 11#include <linux/bottom_half.h>
f8c3d0dd 12#include <linux/cache.h>
acf568ee 13#include <linux/interrupt.h>
1da177e4
LT
14#include <linux/slab.h>
15#include <linux/module.h>
716062fd 16#include <linux/netdevice.h>
acf568ee 17#include <linux/percpu.h>
716062fd 18#include <net/dst.h>
1da177e4
LT
19#include <net/ip.h>
20#include <net/xfrm.h>
049f8e2e
AD
21#include <net/ip_tunnels.h>
22#include <net/ip6_tunnel.h>
abc340b3 23#include <net/dst_metadata.h>
1da177e4 24
b3284df1
FW
25#include "xfrm_inout.h"
26
acf568ee 27struct xfrm_trans_tasklet {
4f492066
LJ
28 struct work_struct work;
29 spinlock_t queue_lock;
acf568ee
HX
30 struct sk_buff_head queue;
31};
32
33struct xfrm_trans_cb {
9a3fb9fb
SK
34 union {
35 struct inet_skb_parm h4;
36#if IS_ENABLED(CONFIG_IPV6)
37 struct inet6_skb_parm h6;
38#endif
39 } header;
acf568ee 40 int (*finish)(struct net *net, struct sock *sk, struct sk_buff *skb);
7b380192 41 struct net *net;
acf568ee
HX
42};
43
44#define XFRM_TRANS_SKB_CB(__skb) ((struct xfrm_trans_cb *)&((__skb)->cb[0]))
45
2f32b51b 46static DEFINE_SPINLOCK(xfrm_input_afinfo_lock);
1475ee0a 47static struct xfrm_input_afinfo const __rcu *xfrm_input_afinfo[2][AF_INET6 + 1];
2f32b51b 48
1995876a
SK
49static struct gro_cells gro_cells;
50static struct net_device xfrm_napi_dev;
51
acf568ee
HX
52static DEFINE_PER_CPU(struct xfrm_trans_tasklet, xfrm_trans_tasklet);
53
960fdfde 54int xfrm_input_register_afinfo(const struct xfrm_input_afinfo *afinfo)
2f32b51b
SK
55{
56 int err = 0;
57
1475ee0a 58 if (WARN_ON(afinfo->family > AF_INET6))
2f32b51b 59 return -EAFNOSUPPORT;
960fdfde 60
2f32b51b 61 spin_lock_bh(&xfrm_input_afinfo_lock);
1475ee0a 62 if (unlikely(xfrm_input_afinfo[afinfo->is_ipip][afinfo->family]))
f31e8d4f 63 err = -EEXIST;
2f32b51b 64 else
1475ee0a 65 rcu_assign_pointer(xfrm_input_afinfo[afinfo->is_ipip][afinfo->family], afinfo);
2f32b51b
SK
66 spin_unlock_bh(&xfrm_input_afinfo_lock);
67 return err;
68}
69EXPORT_SYMBOL(xfrm_input_register_afinfo);
70
960fdfde 71int xfrm_input_unregister_afinfo(const struct xfrm_input_afinfo *afinfo)
2f32b51b
SK
72{
73 int err = 0;
74
2f32b51b 75 spin_lock_bh(&xfrm_input_afinfo_lock);
1475ee0a
XL
76 if (likely(xfrm_input_afinfo[afinfo->is_ipip][afinfo->family])) {
77 if (unlikely(xfrm_input_afinfo[afinfo->is_ipip][afinfo->family] != afinfo))
2f32b51b
SK
78 err = -EINVAL;
79 else
1475ee0a 80 RCU_INIT_POINTER(xfrm_input_afinfo[afinfo->is_ipip][afinfo->family], NULL);
2f32b51b
SK
81 }
82 spin_unlock_bh(&xfrm_input_afinfo_lock);
83 synchronize_rcu();
84 return err;
85}
86EXPORT_SYMBOL(xfrm_input_unregister_afinfo);
87
1475ee0a 88static const struct xfrm_input_afinfo *xfrm_input_get_afinfo(u8 family, bool is_ipip)
2f32b51b 89{
960fdfde 90 const struct xfrm_input_afinfo *afinfo;
2f32b51b 91
1475ee0a 92 if (WARN_ON_ONCE(family > AF_INET6))
2f32b51b 93 return NULL;
960fdfde 94
2f32b51b 95 rcu_read_lock();
1475ee0a 96 afinfo = rcu_dereference(xfrm_input_afinfo[is_ipip][family]);
2f32b51b
SK
97 if (unlikely(!afinfo))
98 rcu_read_unlock();
99 return afinfo;
100}
101
2f32b51b
SK
102static int xfrm_rcv_cb(struct sk_buff *skb, unsigned int family, u8 protocol,
103 int err)
104{
1475ee0a
XL
105 bool is_ipip = (protocol == IPPROTO_IPIP || protocol == IPPROTO_IPV6);
106 const struct xfrm_input_afinfo *afinfo;
2f32b51b 107 int ret;
2f32b51b 108
1475ee0a 109 afinfo = xfrm_input_get_afinfo(family, is_ipip);
2f32b51b
SK
110 if (!afinfo)
111 return -EAFNOSUPPORT;
112
113 ret = afinfo->callback(skb, protocol, err);
960fdfde 114 rcu_read_unlock();
2f32b51b
SK
115
116 return ret;
117}
118
4165079b 119struct sec_path *secpath_set(struct sk_buff *skb)
1da177e4 120{
4165079b 121 struct sec_path *sp, *tmp = skb_ext_find(skb, SKB_EXT_SEC_PATH);
1da177e4 122
4165079b 123 sp = skb_ext_add(skb, SKB_EXT_SEC_PATH);
1da177e4
LT
124 if (!sp)
125 return NULL;
126
4165079b
FW
127 if (tmp) /* reused existing one (was COW'd if needed) */
128 return sp;
54ef207a 129
4165079b 130 /* allocated new secpath */
f1193e91 131 memset(sp->ovec, 0, sizeof(sp->ovec));
4165079b
FW
132 sp->olen = 0;
133 sp->len = 0;
0ca64da1
FW
134
135 return sp;
b0fcee82
SK
136}
137EXPORT_SYMBOL(secpath_set);
138
1da177e4
LT
139/* Fetch spi and seq from ipsec header */
140
6067b2ba 141int xfrm_parse_spi(struct sk_buff *skb, u8 nexthdr, __be32 *spi, __be32 *seq)
1da177e4
LT
142{
143 int offset, offset_seq;
44072500 144 int hlen;
1da177e4
LT
145
146 switch (nexthdr) {
147 case IPPROTO_AH:
44072500 148 hlen = sizeof(struct ip_auth_hdr);
1da177e4
LT
149 offset = offsetof(struct ip_auth_hdr, spi);
150 offset_seq = offsetof(struct ip_auth_hdr, seq_no);
151 break;
152 case IPPROTO_ESP:
44072500 153 hlen = sizeof(struct ip_esp_hdr);
1da177e4
LT
154 offset = offsetof(struct ip_esp_hdr, spi);
155 offset_seq = offsetof(struct ip_esp_hdr, seq_no);
156 break;
157 case IPPROTO_COMP:
158 if (!pskb_may_pull(skb, sizeof(struct ip_comp_hdr)))
159 return -EINVAL;
3e94c2dc 160 *spi = htonl(ntohs(*(__be16 *)(skb_transport_header(skb) + 2)));
1da177e4
LT
161 *seq = 0;
162 return 0;
163 default:
164 return 1;
165 }
166
44072500 167 if (!pskb_may_pull(skb, hlen))
1da177e4
LT
168 return -EINVAL;
169
3e94c2dc
WC
170 *spi = *(__be32 *)(skb_transport_header(skb) + offset);
171 *seq = *(__be32 *)(skb_transport_header(skb) + offset_seq);
1da177e4
LT
172 return 0;
173}
1e295370 174EXPORT_SYMBOL(xfrm_parse_spi);
1da177e4 175
b3284df1
FW
176static int xfrm4_remove_beet_encap(struct xfrm_state *x, struct sk_buff *skb)
177{
178 struct iphdr *iph;
179 int optlen = 0;
180 int err = -EINVAL;
181
182 if (unlikely(XFRM_MODE_SKB_CB(skb)->protocol == IPPROTO_BEETPH)) {
183 struct ip_beet_phdr *ph;
184 int phlen;
185
186 if (!pskb_may_pull(skb, sizeof(*ph)))
187 goto out;
188
189 ph = (struct ip_beet_phdr *)skb->data;
190
191 phlen = sizeof(*ph) + ph->padlen;
192 optlen = ph->hdrlen * 8 + (IPV4_BEET_PHMAXLEN - phlen);
193 if (optlen < 0 || optlen & 3 || optlen > 250)
194 goto out;
195
196 XFRM_MODE_SKB_CB(skb)->protocol = ph->nexthdr;
197
198 if (!pskb_may_pull(skb, phlen))
199 goto out;
200 __skb_pull(skb, phlen);
201 }
202
203 skb_push(skb, sizeof(*iph));
204 skb_reset_network_header(skb);
205 skb_mac_header_rebuild(skb);
206
207 xfrm4_beet_make_header(skb);
208
209 iph = ip_hdr(skb);
210
211 iph->ihl += optlen / 4;
212 iph->tot_len = htons(skb->len);
213 iph->daddr = x->sel.daddr.a4;
214 iph->saddr = x->sel.saddr.a4;
215 iph->check = 0;
216 iph->check = ip_fast_csum(skb_network_header(skb), iph->ihl);
217 err = 0;
218out:
219 return err;
220}
221
222static void ipip_ecn_decapsulate(struct sk_buff *skb)
223{
224 struct iphdr *inner_iph = ipip_hdr(skb);
225
226 if (INET_ECN_is_ce(XFRM_MODE_SKB_CB(skb)->tos))
227 IP_ECN_set_ce(inner_iph);
228}
229
230static int xfrm4_remove_tunnel_encap(struct xfrm_state *x, struct sk_buff *skb)
231{
232 int err = -EINVAL;
233
b3284df1
FW
234 if (!pskb_may_pull(skb, sizeof(struct iphdr)))
235 goto out;
236
237 err = skb_unclone(skb, GFP_ATOMIC);
238 if (err)
239 goto out;
240
241 if (x->props.flags & XFRM_STATE_DECAP_DSCP)
242 ipv4_copy_dscp(XFRM_MODE_SKB_CB(skb)->tos, ipip_hdr(skb));
243 if (!(x->props.flags & XFRM_STATE_NOECN))
244 ipip_ecn_decapsulate(skb);
245
246 skb_reset_network_header(skb);
247 skb_mac_header_rebuild(skb);
248 if (skb->mac_len)
249 eth_hdr(skb)->h_proto = skb->protocol;
250
251 err = 0;
252
253out:
254 return err;
255}
256
257static void ipip6_ecn_decapsulate(struct sk_buff *skb)
258{
259 struct ipv6hdr *inner_iph = ipipv6_hdr(skb);
260
261 if (INET_ECN_is_ce(XFRM_MODE_SKB_CB(skb)->tos))
262 IP6_ECN_set_ce(skb, inner_iph);
263}
264
265static int xfrm6_remove_tunnel_encap(struct xfrm_state *x, struct sk_buff *skb)
266{
267 int err = -EINVAL;
268
b3284df1
FW
269 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
270 goto out;
271
272 err = skb_unclone(skb, GFP_ATOMIC);
273 if (err)
274 goto out;
275
276 if (x->props.flags & XFRM_STATE_DECAP_DSCP)
6028da3f 277 ipv6_copy_dscp(XFRM_MODE_SKB_CB(skb)->tos, ipipv6_hdr(skb));
b3284df1
FW
278 if (!(x->props.flags & XFRM_STATE_NOECN))
279 ipip6_ecn_decapsulate(skb);
280
281 skb_reset_network_header(skb);
282 skb_mac_header_rebuild(skb);
283 if (skb->mac_len)
284 eth_hdr(skb)->h_proto = skb->protocol;
285
286 err = 0;
287
288out:
289 return err;
290}
291
292static int xfrm6_remove_beet_encap(struct xfrm_state *x, struct sk_buff *skb)
293{
294 struct ipv6hdr *ip6h;
295 int size = sizeof(struct ipv6hdr);
296 int err;
297
298 err = skb_cow_head(skb, size + skb->mac_len);
299 if (err)
300 goto out;
301
302 __skb_push(skb, size);
303 skb_reset_network_header(skb);
304 skb_mac_header_rebuild(skb);
305
306 xfrm6_beet_make_header(skb);
307
308 ip6h = ipv6_hdr(skb);
309 ip6h->payload_len = htons(skb->len - size);
310 ip6h->daddr = x->sel.daddr.in6;
311 ip6h->saddr = x->sel.saddr.in6;
312 err = 0;
313out:
314 return err;
315}
316
317/* Remove encapsulation header.
318 *
319 * The IP header will be moved over the top of the encapsulation
320 * header.
321 *
322 * On entry, the transport header shall point to where the IP header
323 * should be and the network header shall be set to where the IP
324 * header currently is. skb->data shall point to the start of the
325 * payload.
326 */
327static int
328xfrm_inner_mode_encap_remove(struct xfrm_state *x,
b3284df1
FW
329 struct sk_buff *skb)
330{
5f24f41e 331 switch (x->props.mode) {
b3284df1 332 case XFRM_MODE_BEET:
5f24f41e
HX
333 switch (XFRM_MODE_SKB_CB(skb)->protocol) {
334 case IPPROTO_IPIP:
335 case IPPROTO_BEETPH:
b3284df1 336 return xfrm4_remove_beet_encap(x, skb);
5f24f41e 337 case IPPROTO_IPV6:
b3284df1 338 return xfrm6_remove_beet_encap(x, skb);
5f24f41e 339 }
b3284df1
FW
340 break;
341 case XFRM_MODE_TUNNEL:
5f24f41e
HX
342 switch (XFRM_MODE_SKB_CB(skb)->protocol) {
343 case IPPROTO_IPIP:
b3284df1 344 return xfrm4_remove_tunnel_encap(x, skb);
5f24f41e 345 case IPPROTO_IPV6:
b3284df1
FW
346 return xfrm6_remove_tunnel_encap(x, skb);
347 break;
5f24f41e 348 }
b3284df1
FW
349 }
350
351 WARN_ON_ONCE(1);
352 return -EOPNOTSUPP;
353}
354
c2d305e5 355static int xfrm_prepare_input(struct xfrm_state *x, struct sk_buff *skb)
227620e2 356{
5f24f41e 357 switch (x->props.family) {
a269fbfc
FW
358 case AF_INET:
359 xfrm4_extract_header(skb);
360 break;
361 case AF_INET6:
362 xfrm6_extract_header(skb);
363 break;
364 default:
365 WARN_ON_ONCE(1);
366 return -EAFNOSUPPORT;
367 }
227620e2 368
5f24f41e
HX
369 switch (XFRM_MODE_SKB_CB(skb)->protocol) {
370 case IPPROTO_IPIP:
371 case IPPROTO_BEETPH:
4c203b04
FW
372 skb->protocol = htons(ETH_P_IP);
373 break;
5f24f41e 374 case IPPROTO_IPV6:
4c203b04 375 skb->protocol = htons(ETH_P_IPV6);
1be451d9 376 break;
4c203b04
FW
377 default:
378 WARN_ON_ONCE(1);
379 break;
733a5fac
FW
380 }
381
5f24f41e 382 return xfrm_inner_mode_encap_remove(x, skb);
227620e2 383}
c2d305e5
FW
384
385/* Remove encapsulation header.
386 *
387 * The IP header will be moved over the top of the encapsulation header.
388 *
389 * On entry, skb_transport_header() shall point to where the IP header
390 * should be and skb_network_header() shall be set to where the IP header
391 * currently is. skb->data shall point to the start of the payload.
392 */
393static int xfrm4_transport_input(struct xfrm_state *x, struct sk_buff *skb)
394{
c2d305e5
FW
395 int ihl = skb->data - skb_transport_header(skb);
396
397 if (skb->transport_header != skb->network_header) {
398 memmove(skb_transport_header(skb),
399 skb_network_header(skb), ihl);
400 skb->network_header = skb->transport_header;
401 }
402 ip_hdr(skb)->tot_len = htons(skb->len + ihl);
403 skb_reset_transport_header(skb);
404 return 0;
c2d305e5
FW
405}
406
407static int xfrm6_transport_input(struct xfrm_state *x, struct sk_buff *skb)
408{
4c145dce 409#if IS_ENABLED(CONFIG_IPV6)
c2d305e5
FW
410 int ihl = skb->data - skb_transport_header(skb);
411
412 if (skb->transport_header != skb->network_header) {
413 memmove(skb_transport_header(skb),
414 skb_network_header(skb), ihl);
415 skb->network_header = skb->transport_header;
416 }
417 ipv6_hdr(skb)->payload_len = htons(skb->len + ihl -
418 sizeof(struct ipv6hdr));
419 skb_reset_transport_header(skb);
420 return 0;
421#else
4c145dce
FW
422 WARN_ON_ONCE(1);
423 return -EAFNOSUPPORT;
c2d305e5
FW
424#endif
425}
426
427static int xfrm_inner_mode_input(struct xfrm_state *x,
c2d305e5
FW
428 struct sk_buff *skb)
429{
5f24f41e 430 switch (x->props.mode) {
c2d305e5
FW
431 case XFRM_MODE_BEET:
432 case XFRM_MODE_TUNNEL:
433 return xfrm_prepare_input(x, skb);
434 case XFRM_MODE_TRANSPORT:
5f24f41e 435 if (x->props.family == AF_INET)
c2d305e5 436 return xfrm4_transport_input(x, skb);
5f24f41e 437 if (x->props.family == AF_INET6)
c2d305e5
FW
438 return xfrm6_transport_input(x, skb);
439 break;
440 case XFRM_MODE_ROUTEOPTIMIZATION:
441 WARN_ON_ONCE(1);
442 break;
443 default:
444 WARN_ON_ONCE(1);
445 break;
446 }
447
448 return -EOPNOTSUPP;
449}
227620e2 450
716062fd
HX
451int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
452{
733a5fac 453 const struct xfrm_state_afinfo *afinfo;
bd235e3c 454 struct net *net = dev_net(skb->dev);
716062fd
HX
455 int err;
456 __be32 seq;
2cd08467 457 __be32 seq_hi;
3328715e 458 struct xfrm_state *x = NULL;
1bf06cd2 459 xfrm_address_t *daddr;
049f8e2e 460 u32 mark = skb->mark;
4ce3dbe3 461 unsigned int family = AF_UNSPEC;
716062fd 462 int decaps = 0;
1bf06cd2 463 int async = 0;
7785bba2 464 bool xfrm_gro = false;
d77e38e6
SK
465 bool crypto_done = false;
466 struct xfrm_offload *xo = xfrm_offload(skb);
0ca64da1 467 struct sec_path *sp;
1bf06cd2 468
1bf06cd2 469 if (encap_type < 0) {
00501121 470 x = xfrm_input_state(skb);
4ce3dbe3
AH
471
472 if (unlikely(x->km.state != XFRM_STATE_VALID)) {
473 if (x->km.state == XFRM_STATE_ACQ)
474 XFRM_INC_STATS(net, LINUX_MIB_XFRMACQUIREERROR);
475 else
476 XFRM_INC_STATS(net,
477 LINUX_MIB_XFRMINSTATEINVALID);
4944a4b1
XX
478
479 if (encap_type == -1)
480 dev_put(skb->dev);
4ce3dbe3
AH
481 goto drop;
482 }
483
5f24f41e 484 family = x->props.family;
7785bba2
SK
485
486 /* An encap_type of -1 indicates async resumption. */
487 if (encap_type == -1) {
488 async = 1;
489 seq = XFRM_SKB_CB(skb)->seq.input.low;
490 goto resume;
491 }
bcd1f8a4 492
7785bba2
SK
493 /* encap_type < -1 indicates a GRO call. */
494 encap_type = 0;
495 seq = XFRM_SPI_SKB_CB(skb)->seq;
716062fd 496
bcd1f8a4
SK
497 if (xo && (xo->flags & CRYPTO_DONE)) {
498 crypto_done = true;
bcd1f8a4
SK
499 family = XFRM_SPI_SKB_CB(skb)->family;
500
501 if (!(xo->status & CRYPTO_SUCCESS)) {
502 if (xo->status &
503 (CRYPTO_TRANSPORT_AH_AUTH_FAILED |
504 CRYPTO_TRANSPORT_ESP_AUTH_FAILED |
505 CRYPTO_TUNNEL_AH_AUTH_FAILED |
506 CRYPTO_TUNNEL_ESP_AUTH_FAILED)) {
507
508 xfrm_audit_state_icvfail(x, skb,
509 x->type->proto);
510 x->stats.integrity_failed++;
511 XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEPROTOERROR);
512 goto drop;
513 }
514
47ebcc0b
YK
515 if (xo->status & CRYPTO_INVALID_PROTOCOL) {
516 XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEPROTOERROR);
517 goto drop;
518 }
519
bcd1f8a4 520 XFRM_INC_STATS(net, LINUX_MIB_XFRMINBUFFERERROR);
d77e38e6
SK
521 goto drop;
522 }
523
ad57dae8 524 if (xfrm_parse_spi(skb, nexthdr, &spi, &seq)) {
bcd1f8a4
SK
525 XFRM_INC_STATS(net, LINUX_MIB_XFRMINHDRERROR);
526 goto drop;
527 }
d77e38e6
SK
528 }
529
7785bba2 530 goto lock;
1bf06cd2 531 }
716062fd 532
3328715e
SK
533 family = XFRM_SPI_SKB_CB(skb)->family;
534
049f8e2e 535 /* if tunnel is present override skb->mark value with tunnel i_key */
1625f452
AK
536 switch (family) {
537 case AF_INET:
538 if (XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4)
049f8e2e 539 mark = be32_to_cpu(XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4->parms.i_key);
1625f452
AK
540 break;
541 case AF_INET6:
542 if (XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip6)
049f8e2e 543 mark = be32_to_cpu(XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip6->parms.i_key);
1625f452 544 break;
049f8e2e
AD
545 }
546
0ca64da1
FW
547 sp = secpath_set(skb);
548 if (!sp) {
b0fcee82
SK
549 XFRM_INC_STATS(net, LINUX_MIB_XFRMINERROR);
550 goto drop;
b2aa5e9d
HX
551 }
552
716062fd 553 seq = 0;
ad57dae8 554 if (!spi && xfrm_parse_spi(skb, nexthdr, &spi, &seq)) {
f203b76d 555 secpath_reset(skb);
59c9940e 556 XFRM_INC_STATS(net, LINUX_MIB_XFRMINHDRERROR);
716062fd 557 goto drop;
0aa64774 558 }
716062fd 559
cb79a180
FW
560 daddr = (xfrm_address_t *)(skb_network_header(skb) +
561 XFRM_SPI_SKB_CB(skb)->daddroff);
716062fd 562 do {
2294be0f
FW
563 sp = skb_sec_path(skb);
564
565 if (sp->len == XFRM_MAX_DEPTH) {
f203b76d 566 secpath_reset(skb);
59c9940e 567 XFRM_INC_STATS(net, LINUX_MIB_XFRMINBUFFERERROR);
716062fd 568 goto drop;
0aa64774 569 }
716062fd 570
049f8e2e 571 x = xfrm_state_lookup(net, mark, daddr, spi, nexthdr, family);
0aa64774 572 if (x == NULL) {
f203b76d 573 secpath_reset(skb);
59c9940e 574 XFRM_INC_STATS(net, LINUX_MIB_XFRMINNOSTATES);
afeb14b4 575 xfrm_audit_state_notfound(skb, family, spi, seq);
716062fd 576 goto drop;
0aa64774 577 }
716062fd 578
9b42c1f1
SK
579 skb->mark = xfrm_smark_get(skb->mark, x);
580
2294be0f 581 sp->xvec[sp->len++] = x;
b2aa5e9d 582
0152eee6
SK
583 skb_dst_force(skb);
584 if (!skb_dst(skb)) {
585 XFRM_INC_STATS(net, LINUX_MIB_XFRMINERROR);
586 goto drop;
587 }
588
7785bba2 589lock:
716062fd 590 spin_lock(&x->lock);
4c4d41f2 591
0aa64774 592 if (unlikely(x->km.state != XFRM_STATE_VALID)) {
dc0565ce
LR
593 if (x->km.state == XFRM_STATE_ACQ)
594 XFRM_INC_STATS(net, LINUX_MIB_XFRMACQUIREERROR);
595 else
596 XFRM_INC_STATS(net,
597 LINUX_MIB_XFRMINSTATEINVALID);
716062fd 598 goto drop_unlock;
0aa64774 599 }
716062fd 600
3de77cf2
DM
601 if ((x->encap ? x->encap->encap_type : 0) != encap_type) {
602 XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEMISMATCH);
603 goto drop_unlock;
604 }
605
adfc2fdb 606 if (xfrm_replay_check(x, skb, seq)) {
59c9940e 607 XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR);
716062fd 608 goto drop_unlock;
0aa64774 609 }
716062fd 610
0aa64774 611 if (xfrm_state_check_expire(x)) {
59c9940e 612 XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEEXPIRED);
716062fd 613 goto drop_unlock;
0aa64774 614 }
716062fd 615
0ebea8ef
HX
616 spin_unlock(&x->lock);
617
68c11e98
AD
618 if (xfrm_tunnel_check(skb, x, family)) {
619 XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEMODEERROR);
620 goto drop;
621 }
622
2cd08467
SK
623 seq_hi = htonl(xfrm_replay_seqhi(x, seq));
624
1ce3644a 625 XFRM_SKB_CB(skb)->seq.input.low = seq;
2cd08467 626 XFRM_SKB_CB(skb)->seq.input.hi = seq_hi;
1bf06cd2 627
071d36bf 628 dev_hold(skb->dev);
3bc07321 629
d77e38e6
SK
630 if (crypto_done)
631 nexthdr = x->type_offload->input_tail(x, skb);
632 else
633 nexthdr = x->type->input(x, skb);
0ebea8ef 634
1bf06cd2
HX
635 if (nexthdr == -EINPROGRESS)
636 return 0;
1bf06cd2 637resume:
071d36bf 638 dev_put(skb->dev);
639
0ebea8ef 640 spin_lock(&x->lock);
afcaf61b 641 if (nexthdr < 0) {
9dd3245a
HX
642 if (nexthdr == -EBADMSG) {
643 xfrm_audit_state_icvfail(x, skb,
644 x->type->proto);
668dc8af 645 x->stats.integrity_failed++;
9dd3245a 646 }
59c9940e 647 XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEPROTOERROR);
716062fd 648 goto drop_unlock;
668dc8af 649 }
716062fd 650
716062fd
HX
651 /* only the first xfrm gets the encap type */
652 encap_type = 0;
653
25cfb8bc 654 if (xfrm_replay_recheck(x, skb, seq)) {
bcf66bf5
SK
655 XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR);
656 goto drop_unlock;
657 }
658
c7f87783 659 xfrm_replay_advance(x, seq);
716062fd
HX
660
661 x->curlft.bytes += skb->len;
662 x->curlft.packets++;
f7fe25a6 663 x->lastused = ktime_get_real_seconds();
716062fd
HX
664
665 spin_unlock(&x->lock);
666
60d5fcfb
HX
667 XFRM_MODE_SKB_CB(skb)->protocol = nexthdr;
668
5f24f41e 669 if (xfrm_inner_mode_input(x, skb)) {
59c9940e 670 XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATEMODEERROR);
716062fd 671 goto drop;
0aa64774 672 }
716062fd 673
c9500d7b 674 if (x->outer_mode.flags & XFRM_MODE_FLAG_TUNNEL) {
716062fd
HX
675 decaps = 1;
676 break;
677 }
678
1bf06cd2
HX
679 /*
680 * We need the inner address. However, we only get here for
681 * transport mode so the outer address is identical.
682 */
683 daddr = &x->id.daddr;
5f24f41e 684 family = x->props.family;
1bf06cd2 685
716062fd 686 err = xfrm_parse_spi(skb, nexthdr, &spi, &seq);
0aa64774 687 if (err < 0) {
59c9940e 688 XFRM_INC_STATS(net, LINUX_MIB_XFRMINHDRERROR);
716062fd 689 goto drop;
0aa64774 690 }
782710e3 691 crypto_done = false;
716062fd
HX
692 } while (!err);
693
3328715e
SK
694 err = xfrm_rcv_cb(skb, family, x->type->proto, 0);
695 if (err)
696 goto drop;
697
895b5c9f 698 nf_reset_ct(skb);
716062fd
HX
699
700 if (decaps) {
2294be0f
FW
701 sp = skb_sec_path(skb);
702 if (sp)
703 sp->olen = 0;
abc340b3
EB
704 if (skb_valid_dst(skb))
705 skb_dst_drop(skb);
1995876a 706 gro_cells_receive(&gro_cells, skb);
716062fd
HX
707 return 0;
708 } else {
7785bba2
SK
709 xo = xfrm_offload(skb);
710 if (xo)
711 xfrm_gro = xo->flags & XFRM_GRO;
712
733a5fac
FW
713 err = -EAFNOSUPPORT;
714 rcu_read_lock();
5f24f41e 715 afinfo = xfrm_state_afinfo_get_rcu(x->props.family);
733a5fac
FW
716 if (likely(afinfo))
717 err = afinfo->transport_finish(skb, xfrm_gro || async);
718 rcu_read_unlock();
7785bba2 719 if (xfrm_gro) {
2294be0f
FW
720 sp = skb_sec_path(skb);
721 if (sp)
722 sp->olen = 0;
abc340b3
EB
723 if (skb_valid_dst(skb))
724 skb_dst_drop(skb);
7785bba2
SK
725 gro_cells_receive(&gro_cells, skb);
726 return err;
727 }
728
729 return err;
716062fd
HX
730 }
731
732drop_unlock:
733 spin_unlock(&x->lock);
716062fd 734drop:
3328715e 735 xfrm_rcv_cb(skb, family, x && x->type ? x->type->proto : nexthdr, -1);
716062fd
HX
736 kfree_skb(skb);
737 return 0;
738}
739EXPORT_SYMBOL(xfrm_input);
740
1bf06cd2
HX
741int xfrm_input_resume(struct sk_buff *skb, int nexthdr)
742{
743 return xfrm_input(skb, nexthdr, 0, -1);
744}
745EXPORT_SYMBOL(xfrm_input_resume);
746
4f492066 747static void xfrm_trans_reinject(struct work_struct *work)
acf568ee 748{
4f492066 749 struct xfrm_trans_tasklet *trans = container_of(work, struct xfrm_trans_tasklet, work);
acf568ee
HX
750 struct sk_buff_head queue;
751 struct sk_buff *skb;
752
753 __skb_queue_head_init(&queue);
4f492066 754 spin_lock_bh(&trans->queue_lock);
acf568ee 755 skb_queue_splice_init(&trans->queue, &queue);
4f492066 756 spin_unlock_bh(&trans->queue_lock);
acf568ee 757
4f492066 758 local_bh_disable();
acf568ee 759 while ((skb = __skb_dequeue(&queue)))
7b380192
SD
760 XFRM_TRANS_SKB_CB(skb)->finish(XFRM_TRANS_SKB_CB(skb)->net,
761 NULL, skb);
4f492066 762 local_bh_enable();
acf568ee
HX
763}
764
7b380192
SD
765int xfrm_trans_queue_net(struct net *net, struct sk_buff *skb,
766 int (*finish)(struct net *, struct sock *,
767 struct sk_buff *))
acf568ee
HX
768{
769 struct xfrm_trans_tasklet *trans;
770
771 trans = this_cpu_ptr(&xfrm_trans_tasklet);
772
5dcd08cd 773 if (skb_queue_len(&trans->queue) >= READ_ONCE(netdev_max_backlog))
acf568ee
HX
774 return -ENOBUFS;
775
7b380192
SD
776 BUILD_BUG_ON(sizeof(struct xfrm_trans_cb) > sizeof(skb->cb));
777
acf568ee 778 XFRM_TRANS_SKB_CB(skb)->finish = finish;
7b380192 779 XFRM_TRANS_SKB_CB(skb)->net = net;
4f492066 780 spin_lock_bh(&trans->queue_lock);
d16b46e4 781 __skb_queue_tail(&trans->queue, skb);
4f492066
LJ
782 spin_unlock_bh(&trans->queue_lock);
783 schedule_work(&trans->work);
acf568ee
HX
784 return 0;
785}
7b380192
SD
786EXPORT_SYMBOL(xfrm_trans_queue_net);
787
788int xfrm_trans_queue(struct sk_buff *skb,
789 int (*finish)(struct net *, struct sock *,
790 struct sk_buff *))
791{
792 return xfrm_trans_queue_net(dev_net(skb->dev), skb, finish);
793}
acf568ee
HX
794EXPORT_SYMBOL(xfrm_trans_queue);
795
1da177e4
LT
796void __init xfrm_input_init(void)
797{
1995876a 798 int err;
acf568ee 799 int i;
1995876a
SK
800
801 init_dummy_netdev(&xfrm_napi_dev);
802 err = gro_cells_init(&gro_cells, &xfrm_napi_dev);
803 if (err)
804 gro_cells.cells = NULL;
805
acf568ee
HX
806 for_each_possible_cpu(i) {
807 struct xfrm_trans_tasklet *trans;
808
809 trans = &per_cpu(xfrm_trans_tasklet, i);
4f492066 810 spin_lock_init(&trans->queue_lock);
acf568ee 811 __skb_queue_head_init(&trans->queue);
4f492066 812 INIT_WORK(&trans->work, xfrm_trans_reinject);
acf568ee 813 }
1da177e4 814}