1 /* 2 * net/dccp/sysctl.c 3 * 4 * An implementation of the DCCP protocol 5 * Arnaldo Carvalho de Melo <acme@mandriva.com> 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License v2 9 * as published by the Free Software Foundation. 10 */ 11 12 #include <linux/mm.h> 13 #include <linux/sysctl.h> 14 #include "dccp.h" 15 #include "feat.h" 16 17 #ifndef CONFIG_SYSCTL 18 #error This file should not be compiled without CONFIG_SYSCTL defined 19 #endif 20 21 /* Boundary values */ 22 static int zero = 0, 23 u8_max = 0xFF; 24 static unsigned long seqw_min = 32; 25 26 static struct ctl_table dccp_default_table[] = { 27 { 28 .procname = "seq_window", 29 .data = &sysctl_dccp_sequence_window, 30 .maxlen = sizeof(sysctl_dccp_sequence_window), 31 .mode = 0644, 32 .proc_handler = proc_doulongvec_minmax, 33 .extra1 = &seqw_min, /* RFC 4340, 7.5.2 */ 34 }, 35 { 36 .procname = "rx_ccid", 37 .data = &sysctl_dccp_rx_ccid, 38 .maxlen = sizeof(sysctl_dccp_rx_ccid), 39 .mode = 0644, 40 .proc_handler = proc_dointvec_minmax, 41 .extra1 = &zero, 42 .extra2 = &u8_max, /* RFC 4340, 10. */ 43 }, 44 { 45 .procname = "tx_ccid", 46 .data = &sysctl_dccp_tx_ccid, 47 .maxlen = sizeof(sysctl_dccp_tx_ccid), 48 .mode = 0644, 49 .proc_handler = proc_dointvec_minmax, 50 .extra1 = &zero, 51 .extra2 = &u8_max, /* RFC 4340, 10. */ 52 }, 53 { 54 .procname = "request_retries", 55 .data = &sysctl_dccp_request_retries, 56 .maxlen = sizeof(sysctl_dccp_request_retries), 57 .mode = 0644, 58 .proc_handler = proc_dointvec_minmax, 59 .extra1 = &zero, 60 .extra2 = &u8_max, 61 }, 62 { 63 .procname = "retries1", 64 .data = &sysctl_dccp_retries1, 65 .maxlen = sizeof(sysctl_dccp_retries1), 66 .mode = 0644, 67 .proc_handler = proc_dointvec_minmax, 68 .extra1 = &zero, 69 .extra2 = &u8_max, 70 }, 71 { 72 .procname = "retries2", 73 .data = &sysctl_dccp_retries2, 74 .maxlen = sizeof(sysctl_dccp_retries2), 75 .mode = 0644, 76 .proc_handler = proc_dointvec_minmax, 77 .extra1 = &zero, 78 .extra2 = &u8_max, 79 }, 80 { 81 .procname = "tx_qlen", 82 .data = &sysctl_dccp_tx_qlen, 83 .maxlen = sizeof(sysctl_dccp_tx_qlen), 84 .mode = 0644, 85 .proc_handler = proc_dointvec_minmax, 86 .extra1 = &zero, 87 }, 88 { 89 .procname = "sync_ratelimit", 90 .data = &sysctl_dccp_sync_ratelimit, 91 .maxlen = sizeof(sysctl_dccp_sync_ratelimit), 92 .mode = 0644, 93 .proc_handler = proc_dointvec_ms_jiffies, 94 }, 95 96 { .ctl_name = 0, } 97 }; 98 99 static struct ctl_path dccp_path[] = { 100 { .procname = "net", .ctl_name = CTL_NET, }, 101 { .procname = "dccp", .ctl_name = NET_DCCP, }, 102 { .procname = "default", .ctl_name = NET_DCCP_DEFAULT, }, 103 { } 104 }; 105 106 static struct ctl_table_header *dccp_table_header; 107 108 int __init dccp_sysctl_init(void) 109 { 110 dccp_table_header = register_sysctl_paths(dccp_path, 111 dccp_default_table); 112 113 return dccp_table_header != NULL ? 0 : -ENOMEM; 114 } 115 116 void dccp_sysctl_exit(void) 117 { 118 if (dccp_table_header != NULL) { 119 unregister_sysctl_table(dccp_table_header); 120 dccp_table_header = NULL; 121 } 122 } 123