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 static struct ctl_table dccp_default_table[] = { 22 { 23 .procname = "seq_window", 24 .data = &sysctl_dccp_feat_sequence_window, 25 .maxlen = sizeof(sysctl_dccp_feat_sequence_window), 26 .mode = 0644, 27 .proc_handler = proc_dointvec, 28 }, 29 { 30 .procname = "rx_ccid", 31 .data = &sysctl_dccp_feat_rx_ccid, 32 .maxlen = sizeof(sysctl_dccp_feat_rx_ccid), 33 .mode = 0644, 34 .proc_handler = proc_dointvec, 35 }, 36 { 37 .procname = "tx_ccid", 38 .data = &sysctl_dccp_feat_tx_ccid, 39 .maxlen = sizeof(sysctl_dccp_feat_tx_ccid), 40 .mode = 0644, 41 .proc_handler = proc_dointvec, 42 }, 43 { 44 .procname = "ack_ratio", 45 .data = &sysctl_dccp_feat_ack_ratio, 46 .maxlen = sizeof(sysctl_dccp_feat_ack_ratio), 47 .mode = 0644, 48 .proc_handler = proc_dointvec, 49 }, 50 { 51 .procname = "send_ackvec", 52 .data = &sysctl_dccp_feat_send_ack_vector, 53 .maxlen = sizeof(sysctl_dccp_feat_send_ack_vector), 54 .mode = 0644, 55 .proc_handler = proc_dointvec, 56 }, 57 { 58 .procname = "send_ndp", 59 .data = &sysctl_dccp_feat_send_ndp_count, 60 .maxlen = sizeof(sysctl_dccp_feat_send_ndp_count), 61 .mode = 0644, 62 .proc_handler = proc_dointvec, 63 }, 64 { 65 .procname = "request_retries", 66 .data = &sysctl_dccp_request_retries, 67 .maxlen = sizeof(sysctl_dccp_request_retries), 68 .mode = 0644, 69 .proc_handler = proc_dointvec, 70 }, 71 { 72 .procname = "retries1", 73 .data = &sysctl_dccp_retries1, 74 .maxlen = sizeof(sysctl_dccp_retries1), 75 .mode = 0644, 76 .proc_handler = proc_dointvec, 77 }, 78 { 79 .procname = "retries2", 80 .data = &sysctl_dccp_retries2, 81 .maxlen = sizeof(sysctl_dccp_retries2), 82 .mode = 0644, 83 .proc_handler = proc_dointvec, 84 }, 85 { 86 .procname = "tx_qlen", 87 .data = &sysctl_dccp_tx_qlen, 88 .maxlen = sizeof(sysctl_dccp_tx_qlen), 89 .mode = 0644, 90 .proc_handler = proc_dointvec, 91 }, 92 { 93 .procname = "sync_ratelimit", 94 .data = &sysctl_dccp_sync_ratelimit, 95 .maxlen = sizeof(sysctl_dccp_sync_ratelimit), 96 .mode = 0644, 97 .proc_handler = proc_dointvec_ms_jiffies, 98 }, 99 100 { .ctl_name = 0, } 101 }; 102 103 static struct ctl_table dccp_table[] = { 104 { 105 .ctl_name = NET_DCCP_DEFAULT, 106 .procname = "default", 107 .mode = 0555, 108 .child = dccp_default_table, 109 }, 110 { .ctl_name = 0, }, 111 }; 112 113 static struct ctl_table dccp_dir_table[] = { 114 { 115 .ctl_name = NET_DCCP, 116 .procname = "dccp", 117 .mode = 0555, 118 .child = dccp_table, 119 }, 120 { .ctl_name = 0, }, 121 }; 122 123 static struct ctl_table dccp_root_table[] = { 124 { 125 .ctl_name = CTL_NET, 126 .procname = "net", 127 .mode = 0555, 128 .child = dccp_dir_table, 129 }, 130 { .ctl_name = 0, }, 131 }; 132 133 static struct ctl_table_header *dccp_table_header; 134 135 int __init dccp_sysctl_init(void) 136 { 137 dccp_table_header = register_sysctl_table(dccp_root_table); 138 139 return dccp_table_header != NULL ? 0 : -ENOMEM; 140 } 141 142 void dccp_sysctl_exit(void) 143 { 144 if (dccp_table_header != NULL) { 145 unregister_sysctl_table(dccp_table_header); 146 dccp_table_header = NULL; 147 } 148 } 149