hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/xfrm/xfrm_state.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * xfrm_state.c
34 *
....@@ -26,6 +27,8 @@
2627 #include <linux/interrupt.h>
2728 #include <linux/kernel.h>
2829
30
+#include <crypto/aead.h>
31
+
2932 #include "xfrm_hash.h"
3033
3134 #define xfrm_state_deref_prot(table, net) \
....@@ -41,7 +44,6 @@
4144 */
4245
4346 static unsigned int xfrm_state_hashmax __read_mostly = 1 * 1024 * 1024;
44
-static __read_mostly seqcount_t xfrm_state_hash_generation = SEQCNT_ZERO(xfrm_state_hash_generation);
4547 static struct kmem_cache *xfrm_state_cache __ro_after_init;
4648
4749 static DECLARE_WORK(xfrm_state_gc_work, xfrm_state_gc_task);
....@@ -137,7 +139,7 @@
137139 }
138140
139141 spin_lock_bh(&net->xfrm.xfrm_state_lock);
140
- write_seqcount_begin(&xfrm_state_hash_generation);
142
+ write_seqcount_begin(&net->xfrm.xfrm_state_hash_generation);
141143
142144 nhashmask = (nsize / sizeof(struct hlist_head)) - 1U;
143145 odst = xfrm_state_deref_prot(net->xfrm.state_bydst, net);
....@@ -153,7 +155,7 @@
153155 rcu_assign_pointer(net->xfrm.state_byspi, nspi);
154156 net->xfrm.state_hmask = nhashmask;
155157
156
- write_seqcount_end(&xfrm_state_hash_generation);
158
+ write_seqcount_end(&net->xfrm.xfrm_state_hash_generation);
157159 spin_unlock_bh(&net->xfrm.xfrm_state_lock);
158160
159161 osize = (ohashmask + 1) * sizeof(struct hlist_head);
....@@ -173,66 +175,135 @@
173175 int __xfrm_state_delete(struct xfrm_state *x);
174176
175177 int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol);
176
-bool km_is_alive(const struct km_event *c);
178
+static bool km_is_alive(const struct km_event *c);
177179 void km_state_expired(struct xfrm_state *x, int hard, u32 portid);
178180
179
-static DEFINE_SPINLOCK(xfrm_type_lock);
180181 int xfrm_register_type(const struct xfrm_type *type, unsigned short family)
181182 {
182183 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
183
- const struct xfrm_type **typemap;
184184 int err = 0;
185185
186
- if (unlikely(afinfo == NULL))
186
+ if (!afinfo)
187187 return -EAFNOSUPPORT;
188
- typemap = afinfo->type_map;
189
- spin_lock_bh(&xfrm_type_lock);
190188
191
- if (likely(typemap[type->proto] == NULL))
192
- typemap[type->proto] = type;
193
- else
194
- err = -EEXIST;
195
- spin_unlock_bh(&xfrm_type_lock);
189
+#define X(afi, T, name) do { \
190
+ WARN_ON((afi)->type_ ## name); \
191
+ (afi)->type_ ## name = (T); \
192
+ } while (0)
193
+
194
+ switch (type->proto) {
195
+ case IPPROTO_COMP:
196
+ X(afinfo, type, comp);
197
+ break;
198
+ case IPPROTO_AH:
199
+ X(afinfo, type, ah);
200
+ break;
201
+ case IPPROTO_ESP:
202
+ X(afinfo, type, esp);
203
+ break;
204
+ case IPPROTO_IPIP:
205
+ X(afinfo, type, ipip);
206
+ break;
207
+ case IPPROTO_DSTOPTS:
208
+ X(afinfo, type, dstopts);
209
+ break;
210
+ case IPPROTO_ROUTING:
211
+ X(afinfo, type, routing);
212
+ break;
213
+ case IPPROTO_IPV6:
214
+ X(afinfo, type, ipip6);
215
+ break;
216
+ default:
217
+ WARN_ON(1);
218
+ err = -EPROTONOSUPPORT;
219
+ break;
220
+ }
221
+#undef X
196222 rcu_read_unlock();
197223 return err;
198224 }
199225 EXPORT_SYMBOL(xfrm_register_type);
200226
201
-int xfrm_unregister_type(const struct xfrm_type *type, unsigned short family)
227
+void xfrm_unregister_type(const struct xfrm_type *type, unsigned short family)
202228 {
203229 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
204
- const struct xfrm_type **typemap;
205
- int err = 0;
206230
207231 if (unlikely(afinfo == NULL))
208
- return -EAFNOSUPPORT;
209
- typemap = afinfo->type_map;
210
- spin_lock_bh(&xfrm_type_lock);
232
+ return;
211233
212
- if (unlikely(typemap[type->proto] != type))
213
- err = -ENOENT;
214
- else
215
- typemap[type->proto] = NULL;
216
- spin_unlock_bh(&xfrm_type_lock);
234
+#define X(afi, T, name) do { \
235
+ WARN_ON((afi)->type_ ## name != (T)); \
236
+ (afi)->type_ ## name = NULL; \
237
+ } while (0)
238
+
239
+ switch (type->proto) {
240
+ case IPPROTO_COMP:
241
+ X(afinfo, type, comp);
242
+ break;
243
+ case IPPROTO_AH:
244
+ X(afinfo, type, ah);
245
+ break;
246
+ case IPPROTO_ESP:
247
+ X(afinfo, type, esp);
248
+ break;
249
+ case IPPROTO_IPIP:
250
+ X(afinfo, type, ipip);
251
+ break;
252
+ case IPPROTO_DSTOPTS:
253
+ X(afinfo, type, dstopts);
254
+ break;
255
+ case IPPROTO_ROUTING:
256
+ X(afinfo, type, routing);
257
+ break;
258
+ case IPPROTO_IPV6:
259
+ X(afinfo, type, ipip6);
260
+ break;
261
+ default:
262
+ WARN_ON(1);
263
+ break;
264
+ }
265
+#undef X
217266 rcu_read_unlock();
218
- return err;
219267 }
220268 EXPORT_SYMBOL(xfrm_unregister_type);
221269
222270 static const struct xfrm_type *xfrm_get_type(u8 proto, unsigned short family)
223271 {
272
+ const struct xfrm_type *type = NULL;
224273 struct xfrm_state_afinfo *afinfo;
225
- const struct xfrm_type **typemap;
226
- const struct xfrm_type *type;
227274 int modload_attempted = 0;
228275
229276 retry:
230277 afinfo = xfrm_state_get_afinfo(family);
231278 if (unlikely(afinfo == NULL))
232279 return NULL;
233
- typemap = afinfo->type_map;
234280
235
- type = READ_ONCE(typemap[proto]);
281
+ switch (proto) {
282
+ case IPPROTO_COMP:
283
+ type = afinfo->type_comp;
284
+ break;
285
+ case IPPROTO_AH:
286
+ type = afinfo->type_ah;
287
+ break;
288
+ case IPPROTO_ESP:
289
+ type = afinfo->type_esp;
290
+ break;
291
+ case IPPROTO_IPIP:
292
+ type = afinfo->type_ipip;
293
+ break;
294
+ case IPPROTO_DSTOPTS:
295
+ type = afinfo->type_dstopts;
296
+ break;
297
+ case IPPROTO_ROUTING:
298
+ type = afinfo->type_routing;
299
+ break;
300
+ case IPPROTO_IPV6:
301
+ type = afinfo->type_ipip6;
302
+ break;
303
+ default:
304
+ break;
305
+ }
306
+
236307 if (unlikely(type && !try_module_get(type->owner)))
237308 type = NULL;
238309
....@@ -252,65 +323,71 @@
252323 module_put(type->owner);
253324 }
254325
255
-static DEFINE_SPINLOCK(xfrm_type_offload_lock);
256326 int xfrm_register_type_offload(const struct xfrm_type_offload *type,
257327 unsigned short family)
258328 {
259329 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
260
- const struct xfrm_type_offload **typemap;
261330 int err = 0;
262331
263332 if (unlikely(afinfo == NULL))
264333 return -EAFNOSUPPORT;
265
- typemap = afinfo->type_offload_map;
266
- spin_lock_bh(&xfrm_type_offload_lock);
267334
268
- if (likely(typemap[type->proto] == NULL))
269
- typemap[type->proto] = type;
270
- else
271
- err = -EEXIST;
272
- spin_unlock_bh(&xfrm_type_offload_lock);
335
+ switch (type->proto) {
336
+ case IPPROTO_ESP:
337
+ WARN_ON(afinfo->type_offload_esp);
338
+ afinfo->type_offload_esp = type;
339
+ break;
340
+ default:
341
+ WARN_ON(1);
342
+ err = -EPROTONOSUPPORT;
343
+ break;
344
+ }
345
+
273346 rcu_read_unlock();
274347 return err;
275348 }
276349 EXPORT_SYMBOL(xfrm_register_type_offload);
277350
278
-int xfrm_unregister_type_offload(const struct xfrm_type_offload *type,
279
- unsigned short family)
351
+void xfrm_unregister_type_offload(const struct xfrm_type_offload *type,
352
+ unsigned short family)
280353 {
281354 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
282
- const struct xfrm_type_offload **typemap;
283
- int err = 0;
284355
285356 if (unlikely(afinfo == NULL))
286
- return -EAFNOSUPPORT;
287
- typemap = afinfo->type_offload_map;
288
- spin_lock_bh(&xfrm_type_offload_lock);
357
+ return;
289358
290
- if (unlikely(typemap[type->proto] != type))
291
- err = -ENOENT;
292
- else
293
- typemap[type->proto] = NULL;
294
- spin_unlock_bh(&xfrm_type_offload_lock);
359
+ switch (type->proto) {
360
+ case IPPROTO_ESP:
361
+ WARN_ON(afinfo->type_offload_esp != type);
362
+ afinfo->type_offload_esp = NULL;
363
+ break;
364
+ default:
365
+ WARN_ON(1);
366
+ break;
367
+ }
295368 rcu_read_unlock();
296
- return err;
297369 }
298370 EXPORT_SYMBOL(xfrm_unregister_type_offload);
299371
300372 static const struct xfrm_type_offload *
301373 xfrm_get_type_offload(u8 proto, unsigned short family, bool try_load)
302374 {
375
+ const struct xfrm_type_offload *type = NULL;
303376 struct xfrm_state_afinfo *afinfo;
304
- const struct xfrm_type_offload **typemap;
305
- const struct xfrm_type_offload *type;
306377
307378 retry:
308379 afinfo = xfrm_state_get_afinfo(family);
309380 if (unlikely(afinfo == NULL))
310381 return NULL;
311
- typemap = afinfo->type_offload_map;
312382
313
- type = typemap[proto];
383
+ switch (proto) {
384
+ case IPPROTO_ESP:
385
+ type = afinfo->type_offload_esp;
386
+ break;
387
+ default:
388
+ break;
389
+ }
390
+
314391 if ((type && !try_module_get(type->owner)))
315392 type = NULL;
316393
....@@ -330,100 +407,67 @@
330407 module_put(type->owner);
331408 }
332409
333
-static DEFINE_SPINLOCK(xfrm_mode_lock);
334
-int xfrm_register_mode(struct xfrm_mode *mode, int family)
410
+static const struct xfrm_mode xfrm4_mode_map[XFRM_MODE_MAX] = {
411
+ [XFRM_MODE_BEET] = {
412
+ .encap = XFRM_MODE_BEET,
413
+ .flags = XFRM_MODE_FLAG_TUNNEL,
414
+ .family = AF_INET,
415
+ },
416
+ [XFRM_MODE_TRANSPORT] = {
417
+ .encap = XFRM_MODE_TRANSPORT,
418
+ .family = AF_INET,
419
+ },
420
+ [XFRM_MODE_TUNNEL] = {
421
+ .encap = XFRM_MODE_TUNNEL,
422
+ .flags = XFRM_MODE_FLAG_TUNNEL,
423
+ .family = AF_INET,
424
+ },
425
+};
426
+
427
+static const struct xfrm_mode xfrm6_mode_map[XFRM_MODE_MAX] = {
428
+ [XFRM_MODE_BEET] = {
429
+ .encap = XFRM_MODE_BEET,
430
+ .flags = XFRM_MODE_FLAG_TUNNEL,
431
+ .family = AF_INET6,
432
+ },
433
+ [XFRM_MODE_ROUTEOPTIMIZATION] = {
434
+ .encap = XFRM_MODE_ROUTEOPTIMIZATION,
435
+ .family = AF_INET6,
436
+ },
437
+ [XFRM_MODE_TRANSPORT] = {
438
+ .encap = XFRM_MODE_TRANSPORT,
439
+ .family = AF_INET6,
440
+ },
441
+ [XFRM_MODE_TUNNEL] = {
442
+ .encap = XFRM_MODE_TUNNEL,
443
+ .flags = XFRM_MODE_FLAG_TUNNEL,
444
+ .family = AF_INET6,
445
+ },
446
+};
447
+
448
+static const struct xfrm_mode *xfrm_get_mode(unsigned int encap, int family)
335449 {
336
- struct xfrm_state_afinfo *afinfo;
337
- struct xfrm_mode **modemap;
338
- int err;
339
-
340
- if (unlikely(mode->encap >= XFRM_MODE_MAX))
341
- return -EINVAL;
342
-
343
- afinfo = xfrm_state_get_afinfo(family);
344
- if (unlikely(afinfo == NULL))
345
- return -EAFNOSUPPORT;
346
-
347
- err = -EEXIST;
348
- modemap = afinfo->mode_map;
349
- spin_lock_bh(&xfrm_mode_lock);
350
- if (modemap[mode->encap])
351
- goto out;
352
-
353
- err = -ENOENT;
354
- if (!try_module_get(afinfo->owner))
355
- goto out;
356
-
357
- mode->afinfo = afinfo;
358
- modemap[mode->encap] = mode;
359
- err = 0;
360
-
361
-out:
362
- spin_unlock_bh(&xfrm_mode_lock);
363
- rcu_read_unlock();
364
- return err;
365
-}
366
-EXPORT_SYMBOL(xfrm_register_mode);
367
-
368
-int xfrm_unregister_mode(struct xfrm_mode *mode, int family)
369
-{
370
- struct xfrm_state_afinfo *afinfo;
371
- struct xfrm_mode **modemap;
372
- int err;
373
-
374
- if (unlikely(mode->encap >= XFRM_MODE_MAX))
375
- return -EINVAL;
376
-
377
- afinfo = xfrm_state_get_afinfo(family);
378
- if (unlikely(afinfo == NULL))
379
- return -EAFNOSUPPORT;
380
-
381
- err = -ENOENT;
382
- modemap = afinfo->mode_map;
383
- spin_lock_bh(&xfrm_mode_lock);
384
- if (likely(modemap[mode->encap] == mode)) {
385
- modemap[mode->encap] = NULL;
386
- module_put(mode->afinfo->owner);
387
- err = 0;
388
- }
389
-
390
- spin_unlock_bh(&xfrm_mode_lock);
391
- rcu_read_unlock();
392
- return err;
393
-}
394
-EXPORT_SYMBOL(xfrm_unregister_mode);
395
-
396
-static struct xfrm_mode *xfrm_get_mode(unsigned int encap, int family)
397
-{
398
- struct xfrm_state_afinfo *afinfo;
399
- struct xfrm_mode *mode;
400
- int modload_attempted = 0;
450
+ const struct xfrm_mode *mode;
401451
402452 if (unlikely(encap >= XFRM_MODE_MAX))
403453 return NULL;
404454
405
-retry:
406
- afinfo = xfrm_state_get_afinfo(family);
407
- if (unlikely(afinfo == NULL))
408
- return NULL;
409
-
410
- mode = READ_ONCE(afinfo->mode_map[encap]);
411
- if (unlikely(mode && !try_module_get(mode->owner)))
412
- mode = NULL;
413
-
414
- rcu_read_unlock();
415
- if (!mode && !modload_attempted) {
416
- request_module("xfrm-mode-%d-%d", family, encap);
417
- modload_attempted = 1;
418
- goto retry;
455
+ switch (family) {
456
+ case AF_INET:
457
+ mode = &xfrm4_mode_map[encap];
458
+ if (mode->family == family)
459
+ return mode;
460
+ break;
461
+ case AF_INET6:
462
+ mode = &xfrm6_mode_map[encap];
463
+ if (mode->family == family)
464
+ return mode;
465
+ break;
466
+ default:
467
+ break;
419468 }
420469
421
- return mode;
422
-}
423
-
424
-static void xfrm_put_mode(struct xfrm_mode *mode)
425
-{
426
- module_put(mode->owner);
470
+ return NULL;
427471 }
428472
429473 void xfrm_state_free(struct xfrm_state *x)
....@@ -434,7 +478,7 @@
434478
435479 static void ___xfrm_state_destroy(struct xfrm_state *x)
436480 {
437
- tasklet_hrtimer_cancel(&x->mtimer);
481
+ hrtimer_cancel(&x->mtimer);
438482 del_timer_sync(&x->rtimer);
439483 kfree(x->aead);
440484 kfree(x->aalg);
....@@ -444,12 +488,6 @@
444488 kfree(x->coaddr);
445489 kfree(x->replay_esn);
446490 kfree(x->preplay_esn);
447
- if (x->inner_mode)
448
- xfrm_put_mode(x->inner_mode);
449
- if (x->inner_mode_iaf)
450
- xfrm_put_mode(x->inner_mode_iaf);
451
- if (x->outer_mode)
452
- xfrm_put_mode(x->outer_mode);
453491 if (x->type_offload)
454492 xfrm_put_type_offload(x->type_offload);
455493 if (x->type) {
....@@ -481,8 +519,8 @@
481519
482520 static enum hrtimer_restart xfrm_timer_handler(struct hrtimer *me)
483521 {
484
- struct tasklet_hrtimer *thr = container_of(me, struct tasklet_hrtimer, timer);
485
- struct xfrm_state *x = container_of(thr, struct xfrm_state, mtimer);
522
+ struct xfrm_state *x = container_of(me, struct xfrm_state, mtimer);
523
+ enum hrtimer_restart ret = HRTIMER_NORESTART;
486524 time64_t now = ktime_get_real_seconds();
487525 time64_t next = TIME64_MAX;
488526 int warn = 0;
....@@ -546,7 +584,8 @@
546584 km_state_expired(x, 0, 0);
547585 resched:
548586 if (next != TIME64_MAX) {
549
- tasklet_hrtimer_start(&x->mtimer, ktime_set(next, 0), HRTIMER_MODE_REL);
587
+ hrtimer_forward_now(&x->mtimer, ktime_set(next, 0));
588
+ ret = HRTIMER_RESTART;
550589 }
551590
552591 goto out;
....@@ -563,7 +602,7 @@
563602
564603 out:
565604 spin_unlock(&x->lock);
566
- return HRTIMER_NORESTART;
605
+ return ret;
567606 }
568607
569608 static void xfrm_replay_timer_handler(struct timer_list *t);
....@@ -572,7 +611,7 @@
572611 {
573612 struct xfrm_state *x;
574613
575
- x = kmem_cache_alloc(xfrm_state_cache, GFP_ATOMIC | __GFP_ZERO);
614
+ x = kmem_cache_zalloc(xfrm_state_cache, GFP_ATOMIC);
576615
577616 if (x) {
578617 write_pnet(&x->xs_net, net);
....@@ -582,8 +621,8 @@
582621 INIT_HLIST_NODE(&x->bydst);
583622 INIT_HLIST_NODE(&x->bysrc);
584623 INIT_HLIST_NODE(&x->byspi);
585
- tasklet_hrtimer_init(&x->mtimer, xfrm_timer_handler,
586
- CLOCK_BOOTTIME, HRTIMER_MODE_ABS);
624
+ hrtimer_init(&x->mtimer, CLOCK_BOOTTIME, HRTIMER_MODE_ABS_SOFT);
625
+ x->mtimer.function = xfrm_timer_handler;
587626 timer_setup(&x->rtimer, xfrm_replay_timer_handler, 0);
588627 x->curlft.add_time = ktime_get_real_seconds();
589628 x->lft.soft_byte_limit = XFRM_INF;
....@@ -592,8 +631,6 @@
592631 x->lft.hard_packet_limit = XFRM_INF;
593632 x->replay_maxage = 0;
594633 x->replay_maxdiff = 0;
595
- x->inner_mode = NULL;
596
- x->inner_mode_iaf = NULL;
597634 spin_lock_init(&x->lock);
598635 }
599636 return x;
....@@ -631,6 +668,9 @@
631668 hlist_del_rcu(&x->byspi);
632669 net->xfrm.state_num--;
633670 spin_unlock(&net->xfrm.xfrm_state_lock);
671
+
672
+ if (x->encap_sk)
673
+ sock_put(rcu_dereference_raw(x->encap_sk));
634674
635675 xfrm_dev_state_delete(x);
636676
....@@ -811,24 +851,79 @@
811851 EXPORT_SYMBOL(xfrm_sad_getinfo);
812852
813853 static void
854
+__xfrm4_init_tempsel(struct xfrm_selector *sel, const struct flowi *fl)
855
+{
856
+ const struct flowi4 *fl4 = &fl->u.ip4;
857
+
858
+ sel->daddr.a4 = fl4->daddr;
859
+ sel->saddr.a4 = fl4->saddr;
860
+ sel->dport = xfrm_flowi_dport(fl, &fl4->uli);
861
+ sel->dport_mask = htons(0xffff);
862
+ sel->sport = xfrm_flowi_sport(fl, &fl4->uli);
863
+ sel->sport_mask = htons(0xffff);
864
+ sel->family = AF_INET;
865
+ sel->prefixlen_d = 32;
866
+ sel->prefixlen_s = 32;
867
+ sel->proto = fl4->flowi4_proto;
868
+ sel->ifindex = fl4->flowi4_oif;
869
+}
870
+
871
+static void
872
+__xfrm6_init_tempsel(struct xfrm_selector *sel, const struct flowi *fl)
873
+{
874
+ const struct flowi6 *fl6 = &fl->u.ip6;
875
+
876
+ /* Initialize temporary selector matching only to current session. */
877
+ *(struct in6_addr *)&sel->daddr = fl6->daddr;
878
+ *(struct in6_addr *)&sel->saddr = fl6->saddr;
879
+ sel->dport = xfrm_flowi_dport(fl, &fl6->uli);
880
+ sel->dport_mask = htons(0xffff);
881
+ sel->sport = xfrm_flowi_sport(fl, &fl6->uli);
882
+ sel->sport_mask = htons(0xffff);
883
+ sel->family = AF_INET6;
884
+ sel->prefixlen_d = 128;
885
+ sel->prefixlen_s = 128;
886
+ sel->proto = fl6->flowi6_proto;
887
+ sel->ifindex = fl6->flowi6_oif;
888
+}
889
+
890
+static void
814891 xfrm_init_tempstate(struct xfrm_state *x, const struct flowi *fl,
815892 const struct xfrm_tmpl *tmpl,
816893 const xfrm_address_t *daddr, const xfrm_address_t *saddr,
817894 unsigned short family)
818895 {
819
- struct xfrm_state_afinfo *afinfo = xfrm_state_afinfo_get_rcu(family);
820
-
821
- if (!afinfo)
822
- return;
823
-
824
- afinfo->init_tempsel(&x->sel, fl);
825
-
826
- if (family != tmpl->encap_family) {
827
- afinfo = xfrm_state_afinfo_get_rcu(tmpl->encap_family);
828
- if (!afinfo)
829
- return;
896
+ switch (family) {
897
+ case AF_INET:
898
+ __xfrm4_init_tempsel(&x->sel, fl);
899
+ break;
900
+ case AF_INET6:
901
+ __xfrm6_init_tempsel(&x->sel, fl);
902
+ break;
830903 }
831
- afinfo->init_temprop(x, tmpl, daddr, saddr);
904
+
905
+ x->id = tmpl->id;
906
+
907
+ switch (tmpl->encap_family) {
908
+ case AF_INET:
909
+ if (x->id.daddr.a4 == 0)
910
+ x->id.daddr.a4 = daddr->a4;
911
+ x->props.saddr = tmpl->saddr;
912
+ if (x->props.saddr.a4 == 0)
913
+ x->props.saddr.a4 = saddr->a4;
914
+ break;
915
+ case AF_INET6:
916
+ if (ipv6_addr_any((struct in6_addr *)&x->id.daddr))
917
+ memcpy(&x->id.daddr, daddr, sizeof(x->sel.daddr));
918
+ memcpy(&x->props.saddr, &tmpl->saddr, sizeof(x->props.saddr));
919
+ if (ipv6_addr_any((struct in6_addr *)&x->props.saddr))
920
+ memcpy(&x->props.saddr, saddr, sizeof(x->props.saddr));
921
+ break;
922
+ }
923
+
924
+ x->props.mode = tmpl->mode;
925
+ x->props.reqid = tmpl->reqid;
926
+ x->props.family = tmpl->encap_family;
832927 }
833928
834929 static struct xfrm_state *__xfrm_state_lookup(struct net *net, u32 mark,
....@@ -925,7 +1020,8 @@
9251020 if ((x->sel.family &&
9261021 (x->sel.family != family ||
9271022 !xfrm_selector_match(&x->sel, fl, family))) ||
928
- !security_xfrm_state_pol_flow_match(x, pol, fl))
1023
+ !security_xfrm_state_pol_flow_match(x, pol,
1024
+ &fl->u.__fl_common))
9291025 return;
9301026
9311027 if (!*best ||
....@@ -940,7 +1036,8 @@
9401036 if ((!x->sel.family ||
9411037 (x->sel.family == family &&
9421038 xfrm_selector_match(&x->sel, fl, family))) &&
943
- security_xfrm_state_pol_flow_match(x, pol, fl))
1039
+ security_xfrm_state_pol_flow_match(x, pol,
1040
+ &fl->u.__fl_common))
9441041 *error = -ESRCH;
9451042 }
9461043 }
....@@ -965,7 +1062,7 @@
9651062
9661063 to_put = NULL;
9671064
968
- sequence = read_seqcount_begin(&xfrm_state_hash_generation);
1065
+ sequence = read_seqcount_begin(&net->xfrm.xfrm_state_hash_generation);
9691066
9701067 rcu_read_lock();
9711068 h = xfrm_dst_hash(net, daddr, saddr, tmpl->reqid, encap_family);
....@@ -1052,7 +1149,9 @@
10521149 hlist_add_head_rcu(&x->byspi, net->xfrm.state_byspi + h);
10531150 }
10541151 x->lft.hard_add_expires_seconds = net->xfrm.sysctl_acq_expires;
1055
- tasklet_hrtimer_start(&x->mtimer, ktime_set(net->xfrm.sysctl_acq_expires, 0), HRTIMER_MODE_REL);
1152
+ hrtimer_start(&x->mtimer,
1153
+ ktime_set(net->xfrm.sysctl_acq_expires, 0),
1154
+ HRTIMER_MODE_REL_SOFT);
10561155 net->xfrm.state_num++;
10571156 xfrm_hash_grow_check(net, x->bydst.next != NULL);
10581157 spin_unlock_bh(&net->xfrm.xfrm_state_lock);
....@@ -1076,7 +1175,7 @@
10761175 if (to_put)
10771176 xfrm_state_put(to_put);
10781177
1079
- if (read_seqcount_retry(&xfrm_state_hash_generation, sequence)) {
1178
+ if (read_seqcount_retry(&net->xfrm.xfrm_state_hash_generation, sequence)) {
10801179 *err = -EAGAIN;
10811180 if (x) {
10821181 xfrm_state_put(x);
....@@ -1164,7 +1263,7 @@
11641263 hlist_add_head_rcu(&x->byspi, net->xfrm.state_byspi + h);
11651264 }
11661265
1167
- tasklet_hrtimer_start(&x->mtimer, ktime_set(1, 0), HRTIMER_MODE_REL);
1266
+ hrtimer_start(&x->mtimer, ktime_set(1, 0), HRTIMER_MODE_REL_SOFT);
11681267 if (x->replay_maxage)
11691268 mod_timer(&x->rtimer, jiffies + x->replay_maxage);
11701269
....@@ -1271,7 +1370,9 @@
12711370 x->mark.m = m->m;
12721371 x->lft.hard_add_expires_seconds = net->xfrm.sysctl_acq_expires;
12731372 xfrm_state_hold(x);
1274
- tasklet_hrtimer_start(&x->mtimer, ktime_set(net->xfrm.sysctl_acq_expires, 0), HRTIMER_MODE_REL);
1373
+ hrtimer_start(&x->mtimer,
1374
+ ktime_set(net->xfrm.sysctl_acq_expires, 0),
1375
+ HRTIMER_MODE_REL_SOFT);
12751376 list_add(&x->km.all, &net->xfrm.state_all);
12761377 hlist_add_head_rcu(&x->bydst, net->xfrm.state_bydst + h);
12771378 h = xfrm_src_hash(net, daddr, saddr, family);
....@@ -1443,9 +1544,6 @@
14431544 memcpy(&x->mark, &orig->mark, sizeof(x->mark));
14441545 memcpy(&x->props.smark, &orig->props.smark, sizeof(x->props.smark));
14451546
1446
- if (xfrm_init_state(x) < 0)
1447
- goto error;
1448
-
14491547 x->props.flags = orig->props.flags;
14501548 x->props.extra_flags = orig->props.extra_flags;
14511549
....@@ -1458,6 +1556,7 @@
14581556 x->km.seq = orig->km.seq;
14591557 x->replay = orig->replay;
14601558 x->preplay = orig->preplay;
1559
+ x->lastused = orig->lastused;
14611560
14621561 return x;
14631562
....@@ -1467,7 +1566,8 @@
14671566 return NULL;
14681567 }
14691568
1470
-struct xfrm_state *xfrm_migrate_state_find(struct xfrm_migrate *m, struct net *net)
1569
+struct xfrm_state *xfrm_migrate_state_find(struct xfrm_migrate *m, struct net *net,
1570
+ u32 if_id)
14711571 {
14721572 unsigned int h;
14731573 struct xfrm_state *x = NULL;
....@@ -1483,6 +1583,8 @@
14831583 continue;
14841584 if (m->reqid && x->props.reqid != m->reqid)
14851585 continue;
1586
+ if (if_id != 0 && x->if_id != if_id)
1587
+ continue;
14861588 if (!xfrm_addr_equal(&x->id.daddr, &m->old_daddr,
14871589 m->old_family) ||
14881590 !xfrm_addr_equal(&x->props.saddr, &m->old_saddr,
....@@ -1497,6 +1599,8 @@
14971599 hlist_for_each_entry(x, net->xfrm.state_bysrc+h, bysrc) {
14981600 if (x->props.mode != m->mode ||
14991601 x->id.proto != m->proto)
1602
+ continue;
1603
+ if (if_id != 0 && x->if_id != if_id)
15001604 continue;
15011605 if (!xfrm_addr_equal(&x->id.daddr, &m->old_daddr,
15021606 m->old_family) ||
....@@ -1523,6 +1627,11 @@
15231627 xc = xfrm_state_clone(x, encap);
15241628 if (!xc)
15251629 return NULL;
1630
+
1631
+ xc->props.family = m->new_family;
1632
+
1633
+ if (xfrm_init_state(xc) < 0)
1634
+ goto error;
15261635
15271636 memcpy(&xc->id.daddr, &m->new_daddr, sizeof(xc->id.daddr));
15281637 memcpy(&xc->props.saddr, &m->new_saddr, sizeof(xc->props.saddr));
....@@ -1605,7 +1714,8 @@
16051714 memcpy(&x1->lft, &x->lft, sizeof(x1->lft));
16061715 x1->km.dying = 0;
16071716
1608
- tasklet_hrtimer_start(&x1->mtimer, ktime_set(1, 0), HRTIMER_MODE_REL);
1717
+ hrtimer_start(&x1->mtimer, ktime_set(1, 0),
1718
+ HRTIMER_MODE_REL_SOFT);
16091719 if (x1->curlft.use_time)
16101720 xfrm_state_check_expire(x1);
16111721
....@@ -1644,7 +1754,7 @@
16441754 if (x->curlft.bytes >= x->lft.hard_byte_limit ||
16451755 x->curlft.packets >= x->lft.hard_packet_limit) {
16461756 x->km.state = XFRM_STATE_EXPIRED;
1647
- tasklet_hrtimer_start(&x->mtimer, 0, HRTIMER_MODE_REL);
1757
+ hrtimer_start(&x->mtimer, 0, HRTIMER_MODE_REL_SOFT);
16481758 return -EINVAL;
16491759 }
16501760
....@@ -1701,51 +1811,129 @@
17011811 EXPORT_SYMBOL(xfrm_find_acq);
17021812
17031813 #ifdef CONFIG_XFRM_SUB_POLICY
1704
-int
1705
-xfrm_tmpl_sort(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n,
1706
- unsigned short family, struct net *net)
1814
+#if IS_ENABLED(CONFIG_IPV6)
1815
+/* distribution counting sort function for xfrm_state and xfrm_tmpl */
1816
+static void
1817
+__xfrm6_sort(void **dst, void **src, int n,
1818
+ int (*cmp)(const void *p), int maxclass)
1819
+{
1820
+ int count[XFRM_MAX_DEPTH] = { };
1821
+ int class[XFRM_MAX_DEPTH];
1822
+ int i;
1823
+
1824
+ for (i = 0; i < n; i++) {
1825
+ int c = cmp(src[i]);
1826
+
1827
+ class[i] = c;
1828
+ count[c]++;
1829
+ }
1830
+
1831
+ for (i = 2; i < maxclass; i++)
1832
+ count[i] += count[i - 1];
1833
+
1834
+ for (i = 0; i < n; i++) {
1835
+ dst[count[class[i] - 1]++] = src[i];
1836
+ src[i] = NULL;
1837
+ }
1838
+}
1839
+
1840
+/* Rule for xfrm_state:
1841
+ *
1842
+ * rule 1: select IPsec transport except AH
1843
+ * rule 2: select MIPv6 RO or inbound trigger
1844
+ * rule 3: select IPsec transport AH
1845
+ * rule 4: select IPsec tunnel
1846
+ * rule 5: others
1847
+ */
1848
+static int __xfrm6_state_sort_cmp(const void *p)
1849
+{
1850
+ const struct xfrm_state *v = p;
1851
+
1852
+ switch (v->props.mode) {
1853
+ case XFRM_MODE_TRANSPORT:
1854
+ if (v->id.proto != IPPROTO_AH)
1855
+ return 1;
1856
+ else
1857
+ return 3;
1858
+#if IS_ENABLED(CONFIG_IPV6_MIP6)
1859
+ case XFRM_MODE_ROUTEOPTIMIZATION:
1860
+ case XFRM_MODE_IN_TRIGGER:
1861
+ return 2;
1862
+#endif
1863
+ case XFRM_MODE_TUNNEL:
1864
+ case XFRM_MODE_BEET:
1865
+ return 4;
1866
+ }
1867
+ return 5;
1868
+}
1869
+
1870
+/* Rule for xfrm_tmpl:
1871
+ *
1872
+ * rule 1: select IPsec transport
1873
+ * rule 2: select MIPv6 RO or inbound trigger
1874
+ * rule 3: select IPsec tunnel
1875
+ * rule 4: others
1876
+ */
1877
+static int __xfrm6_tmpl_sort_cmp(const void *p)
1878
+{
1879
+ const struct xfrm_tmpl *v = p;
1880
+
1881
+ switch (v->mode) {
1882
+ case XFRM_MODE_TRANSPORT:
1883
+ return 1;
1884
+#if IS_ENABLED(CONFIG_IPV6_MIP6)
1885
+ case XFRM_MODE_ROUTEOPTIMIZATION:
1886
+ case XFRM_MODE_IN_TRIGGER:
1887
+ return 2;
1888
+#endif
1889
+ case XFRM_MODE_TUNNEL:
1890
+ case XFRM_MODE_BEET:
1891
+ return 3;
1892
+ }
1893
+ return 4;
1894
+}
1895
+#else
1896
+static inline int __xfrm6_state_sort_cmp(const void *p) { return 5; }
1897
+static inline int __xfrm6_tmpl_sort_cmp(const void *p) { return 4; }
1898
+
1899
+static inline void
1900
+__xfrm6_sort(void **dst, void **src, int n,
1901
+ int (*cmp)(const void *p), int maxclass)
17071902 {
17081903 int i;
1709
- int err = 0;
1710
- struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
1711
- if (!afinfo)
1712
- return -EAFNOSUPPORT;
17131904
1714
- spin_lock_bh(&net->xfrm.xfrm_state_lock); /*FIXME*/
1715
- if (afinfo->tmpl_sort)
1716
- err = afinfo->tmpl_sort(dst, src, n);
1905
+ for (i = 0; i < n; i++)
1906
+ dst[i] = src[i];
1907
+}
1908
+#endif /* CONFIG_IPV6 */
1909
+
1910
+void
1911
+xfrm_tmpl_sort(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n,
1912
+ unsigned short family)
1913
+{
1914
+ int i;
1915
+
1916
+ if (family == AF_INET6)
1917
+ __xfrm6_sort((void **)dst, (void **)src, n,
1918
+ __xfrm6_tmpl_sort_cmp, 5);
17171919 else
17181920 for (i = 0; i < n; i++)
17191921 dst[i] = src[i];
1720
- spin_unlock_bh(&net->xfrm.xfrm_state_lock);
1721
- rcu_read_unlock();
1722
- return err;
17231922 }
1724
-EXPORT_SYMBOL(xfrm_tmpl_sort);
17251923
1726
-int
1924
+void
17271925 xfrm_state_sort(struct xfrm_state **dst, struct xfrm_state **src, int n,
17281926 unsigned short family)
17291927 {
17301928 int i;
1731
- int err = 0;
1732
- struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
1733
- struct net *net = xs_net(*src);
17341929
1735
- if (!afinfo)
1736
- return -EAFNOSUPPORT;
1737
-
1738
- spin_lock_bh(&net->xfrm.xfrm_state_lock);
1739
- if (afinfo->state_sort)
1740
- err = afinfo->state_sort(dst, src, n);
1930
+ if (family == AF_INET6)
1931
+ __xfrm6_sort((void **)dst, (void **)src, n,
1932
+ __xfrm6_state_sort_cmp, 6);
17411933 else
17421934 for (i = 0; i < n; i++)
17431935 dst[i] = src[i];
1744
- spin_unlock_bh(&net->xfrm.xfrm_state_lock);
1745
- rcu_read_unlock();
1746
- return err;
17471936 }
1748
-EXPORT_SYMBOL(xfrm_state_sort);
17491937 #endif
17501938
17511939 /* Silly enough, but I'm lazy to build resolution list */
....@@ -2102,7 +2290,7 @@
21022290 }
21032291 EXPORT_SYMBOL(km_report);
21042292
2105
-bool km_is_alive(const struct km_event *c)
2293
+static bool km_is_alive(const struct km_event *c)
21062294 {
21072295 struct xfrm_mgr *km;
21082296 bool is_alive = false;
....@@ -2118,7 +2306,6 @@
21182306
21192307 return is_alive;
21202308 }
2121
-EXPORT_SYMBOL(km_is_alive);
21222309
21232310 #if IS_ENABLED(CONFIG_XFRM_USER_COMPAT)
21242311 static DEFINE_SPINLOCK(xfrm_translator_lock);
....@@ -2180,14 +2367,14 @@
21802367 EXPORT_SYMBOL_GPL(xfrm_unregister_translator);
21812368 #endif
21822369
2183
-int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen)
2370
+int xfrm_user_policy(struct sock *sk, int optname, sockptr_t optval, int optlen)
21842371 {
21852372 int err;
21862373 u8 *data;
21872374 struct xfrm_mgr *km;
21882375 struct xfrm_policy *pol = NULL;
21892376
2190
- if (!optval && !optlen) {
2377
+ if (sockptr_is_null(optval) && !optlen) {
21912378 xfrm_sk_policy_insert(sk, XFRM_POLICY_IN, NULL);
21922379 xfrm_sk_policy_insert(sk, XFRM_POLICY_OUT, NULL);
21932380 __sk_dst_reset(sk);
....@@ -2197,7 +2384,7 @@
21972384 if (optlen <= 0 || optlen > PAGE_SIZE)
21982385 return -EMSGSIZE;
21992386
2200
- data = memdup_user(optval, optlen);
2387
+ data = memdup_sockptr(optval, optlen);
22012388 if (IS_ERR(data))
22022389 return PTR_ERR(data);
22032390
....@@ -2206,8 +2393,10 @@
22062393 if (in_compat_syscall()) {
22072394 struct xfrm_translator *xtr = xfrm_get_translator();
22082395
2209
- if (!xtr)
2396
+ if (!xtr) {
2397
+ kfree(data);
22102398 return -EOPNOTSUPP;
2399
+ }
22112400
22122401 err = xtr->xlate_user_policy_sockptr(&data, optlen);
22132402 xfrm_put_translator(xtr);
....@@ -2305,6 +2494,7 @@
23052494
23062495 return rcu_dereference(xfrm_state_afinfo[family]);
23072496 }
2497
+EXPORT_SYMBOL_GPL(xfrm_state_afinfo_get_rcu);
23082498
23092499 struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned int family)
23102500 {
....@@ -2339,37 +2529,49 @@
23392529 }
23402530 EXPORT_SYMBOL(xfrm_state_delete_tunnel);
23412531
2342
-int xfrm_state_mtu(struct xfrm_state *x, int mtu)
2532
+u32 xfrm_state_mtu(struct xfrm_state *x, int mtu)
23432533 {
23442534 const struct xfrm_type *type = READ_ONCE(x->type);
2535
+ struct crypto_aead *aead;
2536
+ u32 blksize, net_adj = 0;
23452537
2346
- if (x->km.state == XFRM_STATE_VALID &&
2347
- type && type->get_mtu)
2348
- return type->get_mtu(x, mtu);
2538
+ if (x->km.state != XFRM_STATE_VALID ||
2539
+ !type || type->proto != IPPROTO_ESP)
2540
+ return mtu - x->props.header_len;
23492541
2350
- return mtu - x->props.header_len;
2542
+ aead = x->data;
2543
+ blksize = ALIGN(crypto_aead_blocksize(aead), 4);
2544
+
2545
+ switch (x->props.mode) {
2546
+ case XFRM_MODE_TRANSPORT:
2547
+ case XFRM_MODE_BEET:
2548
+ if (x->props.family == AF_INET)
2549
+ net_adj = sizeof(struct iphdr);
2550
+ else if (x->props.family == AF_INET6)
2551
+ net_adj = sizeof(struct ipv6hdr);
2552
+ break;
2553
+ case XFRM_MODE_TUNNEL:
2554
+ break;
2555
+ default:
2556
+ WARN_ON_ONCE(1);
2557
+ break;
2558
+ }
2559
+
2560
+ return ((mtu - x->props.header_len - crypto_aead_authsize(aead) -
2561
+ net_adj) & ~(blksize - 1)) + net_adj - 2;
23512562 }
2563
+EXPORT_SYMBOL_GPL(xfrm_state_mtu);
23522564
23532565 int __xfrm_init_state(struct xfrm_state *x, bool init_replay, bool offload)
23542566 {
2355
- struct xfrm_state_afinfo *afinfo;
2356
- struct xfrm_mode *inner_mode;
2567
+ const struct xfrm_mode *inner_mode;
2568
+ const struct xfrm_mode *outer_mode;
23572569 int family = x->props.family;
23582570 int err;
23592571
2360
- err = -EAFNOSUPPORT;
2361
- afinfo = xfrm_state_get_afinfo(family);
2362
- if (!afinfo)
2363
- goto error;
2364
-
2365
- err = 0;
2366
- if (afinfo->init_flags)
2367
- err = afinfo->init_flags(x);
2368
-
2369
- rcu_read_unlock();
2370
-
2371
- if (err)
2372
- goto error;
2572
+ if (family == AF_INET &&
2573
+ READ_ONCE(xs_net(x)->ipv4.sysctl_ip_no_pmtu_disc))
2574
+ x->props.flags |= XFRM_STATE_NOPMTUDISC;
23732575
23742576 err = -EPROTONOSUPPORT;
23752577
....@@ -2379,25 +2581,19 @@
23792581 goto error;
23802582
23812583 if (!(inner_mode->flags & XFRM_MODE_FLAG_TUNNEL) &&
2382
- family != x->sel.family) {
2383
- xfrm_put_mode(inner_mode);
2584
+ family != x->sel.family)
23842585 goto error;
2385
- }
23862586
2387
- x->inner_mode = inner_mode;
2587
+ x->inner_mode = *inner_mode;
23882588 } else {
2389
- struct xfrm_mode *inner_mode_iaf;
2589
+ const struct xfrm_mode *inner_mode_iaf;
23902590 int iafamily = AF_INET;
23912591
23922592 inner_mode = xfrm_get_mode(x->props.mode, x->props.family);
23932593 if (inner_mode == NULL)
23942594 goto error;
23952595
2396
- if (!(inner_mode->flags & XFRM_MODE_FLAG_TUNNEL)) {
2397
- xfrm_put_mode(inner_mode);
2398
- goto error;
2399
- }
2400
- x->inner_mode = inner_mode;
2596
+ x->inner_mode = *inner_mode;
24012597
24022598 if (x->props.family == AF_INET)
24032599 iafamily = AF_INET6;
....@@ -2405,9 +2601,7 @@
24052601 inner_mode_iaf = xfrm_get_mode(x->props.mode, iafamily);
24062602 if (inner_mode_iaf) {
24072603 if (inner_mode_iaf->flags & XFRM_MODE_FLAG_TUNNEL)
2408
- x->inner_mode_iaf = inner_mode_iaf;
2409
- else
2410
- xfrm_put_mode(inner_mode_iaf);
2604
+ x->inner_mode_iaf = *inner_mode_iaf;
24112605 }
24122606 }
24132607
....@@ -2421,12 +2615,13 @@
24212615 if (err)
24222616 goto error;
24232617
2424
- x->outer_mode = xfrm_get_mode(x->props.mode, family);
2425
- if (x->outer_mode == NULL) {
2618
+ outer_mode = xfrm_get_mode(x->props.mode, family);
2619
+ if (!outer_mode) {
24262620 err = -EPROTONOSUPPORT;
24272621 goto error;
24282622 }
24292623
2624
+ x->outer_mode = *outer_mode;
24302625 if (init_replay) {
24312626 err = xfrm_init_replay(x);
24322627 if (err)
....@@ -2478,6 +2673,7 @@
24782673 net->xfrm.state_num = 0;
24792674 INIT_WORK(&net->xfrm.state_hash_work, xfrm_hash_resize);
24802675 spin_lock_init(&net->xfrm.xfrm_state_lock);
2676
+ seqcount_init(&net->xfrm.xfrm_state_hash_generation);
24812677 return 0;
24822678
24832679 out_byspi: