^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #include <linux/sysctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <net/net_namespace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <net/xfrm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) static void __net_init __xfrm_sysctl_init(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) net->xfrm.sysctl_aevent_etime = XFRM_AE_ETIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) net->xfrm.sysctl_aevent_rseqth = XFRM_AE_SEQT_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) net->xfrm.sysctl_larval_drop = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) net->xfrm.sysctl_acq_expires = 30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #ifdef CONFIG_SYSCTL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) static struct ctl_table xfrm_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) .procname = "xfrm_aevent_etime",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) .maxlen = sizeof(u32),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) .proc_handler = proc_douintvec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) .procname = "xfrm_aevent_rseqth",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) .maxlen = sizeof(u32),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) .proc_handler = proc_douintvec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) .procname = "xfrm_larval_drop",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) .proc_handler = proc_dointvec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) .procname = "xfrm_acq_expires",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) .maxlen = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) .mode = 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) .proc_handler = proc_dointvec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) int __net_init xfrm_sysctl_init(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) struct ctl_table *table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) __xfrm_sysctl_init(net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) table = kmemdup(xfrm_table, sizeof(xfrm_table), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) if (!table)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) goto out_kmemdup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) table[0].data = &net->xfrm.sysctl_aevent_etime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) table[1].data = &net->xfrm.sysctl_aevent_rseqth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) table[2].data = &net->xfrm.sysctl_larval_drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) table[3].data = &net->xfrm.sysctl_acq_expires;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) /* Don't export sysctls to unprivileged users */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) if (net->user_ns != &init_user_ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) table[0].procname = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) net->xfrm.sysctl_hdr = register_net_sysctl(net, "net/core", table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) if (!net->xfrm.sysctl_hdr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) goto out_register;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) out_register:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) kfree(table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) out_kmemdup:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) void __net_exit xfrm_sysctl_fini(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) struct ctl_table *table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) table = net->xfrm.sysctl_hdr->ctl_table_arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) unregister_net_sysctl_table(net->xfrm.sysctl_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) kfree(table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) int __net_init xfrm_sysctl_init(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) __xfrm_sysctl_init(net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #endif