Blame view
net/phonet/sysctl.c
2.16 KB
2b27bdcc2
|
1 |
// SPDX-License-Identifier: GPL-2.0-only |
87ab4e20b
|
2 3 4 5 6 7 8 |
/* * File: sysctl.c * * Phonet /proc/sys/net/phonet interface implementation * * Copyright (C) 2008 Nokia Corporation. * |
31fdc5553
|
9 |
* Author: Rémi Denis-Courmont |
87ab4e20b
|
10 11 12 13 14 15 |
*/ #include <linux/seqlock.h> #include <linux/sysctl.h> #include <linux/errno.h> #include <linux/init.h> |
8e052e528
|
16 17 18 |
#include <net/sock.h> #include <linux/phonet.h> #include <net/phonet/phonet.h> |
87ab4e20b
|
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#define DYNAMIC_PORT_MIN 0x40 #define DYNAMIC_PORT_MAX 0x7f static DEFINE_SEQLOCK(local_port_range_lock); static int local_port_range_min[2] = {0, 0}; static int local_port_range_max[2] = {1023, 1023}; static int local_port_range[2] = {DYNAMIC_PORT_MIN, DYNAMIC_PORT_MAX}; static struct ctl_table_header *phonet_table_hrd; static void set_local_port_range(int range[2]) { write_seqlock(&local_port_range_lock); local_port_range[0] = range[0]; local_port_range[1] = range[1]; write_sequnlock(&local_port_range_lock); } void phonet_get_local_port_range(int *min, int *max) { |
95c961747
|
38 |
unsigned int seq; |
87ab4e20b
|
39 40 41 42 43 44 45 46 |
do { seq = read_seqbegin(&local_port_range_lock); if (min) *min = local_port_range[0]; if (max) *max = local_port_range[1]; } while (read_seqretry(&local_port_range_lock, seq)); } |
fe2c6338f
|
47 |
static int proc_local_port_range(struct ctl_table *table, int write, |
87ab4e20b
|
48 49 50 51 52 |
void __user *buffer, size_t *lenp, loff_t *ppos) { int ret; int range[2] = {local_port_range[0], local_port_range[1]}; |
fe2c6338f
|
53 |
struct ctl_table tmp = { |
87ab4e20b
|
54 55 56 57 58 59 |
.data = &range, .maxlen = sizeof(range), .mode = table->mode, .extra1 = &local_port_range_min, .extra2 = &local_port_range_max, }; |
8d65af789
|
60 |
ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos); |
87ab4e20b
|
61 62 63 64 65 66 67 68 69 70 71 72 73 |
if (write && ret == 0) { if (range[1] < range[0]) ret = -EINVAL; else set_local_port_range(range); } return ret; } static struct ctl_table phonet_table[] = { { |
87ab4e20b
|
74 75 76 77 |
.procname = "local_port_range", .data = &local_port_range, .maxlen = sizeof(local_port_range), .mode = 0644, |
6d9f239a1
|
78 |
.proc_handler = proc_local_port_range, |
87ab4e20b
|
79 |
}, |
f8572d8f2
|
80 |
{ } |
87ab4e20b
|
81 |
}; |
87ab4e20b
|
82 83 |
int __init phonet_sysctl_init(void) { |
ec8f23ce0
|
84 |
phonet_table_hrd = register_net_sysctl(&init_net, "net/phonet", phonet_table); |
87ab4e20b
|
85 86 87 88 89 |
return phonet_table_hrd == NULL ? -ENOMEM : 0; } void phonet_sysctl_exit(void) { |
5dd3df105
|
90 |
unregister_net_sysctl_table(phonet_table_hrd); |
87ab4e20b
|
91 |
} |