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