[DCCP] feat: Introduce sysctls for the default features
authorArnaldo Carvalho de Melo <acme@mandriva.com>
Tue, 21 Mar 2006 03:25:02 +0000 (19:25 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 21 Mar 2006 03:25:02 +0000 (19:25 -0800)
[root@qemu ~]# for a in /proc/sys/net/dccp/default/* ; do echo $a ; cat $a ; done
/proc/sys/net/dccp/default/ack_ratio
2
/proc/sys/net/dccp/default/rx_ccid
3
/proc/sys/net/dccp/default/send_ackvec
1
/proc/sys/net/dccp/default/send_ndp
1
/proc/sys/net/dccp/default/seq_window
100
/proc/sys/net/dccp/default/tx_ccid
3
[root@qemu ~]#

So if wanting to test ccid3 as the tx CCID one can just do:

[root@qemu ~]# echo 3 > /proc/sys/net/dccp/default/tx_ccid
[root@qemu ~]# echo 2 > /proc/sys/net/dccp/default/rx_ccid
[root@qemu ~]# cat /proc/sys/net/dccp/default/[tr]x_ccid
2
3
[root@qemu ~]#

Of course we also need the setsockopt for each app to tell its preferences, but
for testing or defining something other than CCID2 as the default for apps that
don't explicitely set their preference the sysctl interface is handy.

Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/sysctl.h
net/dccp/Makefile
net/dccp/dccp.h
net/dccp/options.c
net/dccp/proto.c
net/dccp/sysctl.c [new file with mode: 0644]

index b686548f32e02d225d62902ea409a50eb5668cb8..dfcf449afc7c03c1482ad289421eeefdf50a4f90 100644 (file)
@@ -211,6 +211,7 @@ enum
        NET_SCTP=17,
        NET_LLC=18,
        NET_NETFILTER=19,
+       NET_DCCP=20,
 };
 
 /* /proc/sys/kernel/random */
@@ -571,6 +572,21 @@ enum {
        __NET_NEIGH_MAX
 };
 
+/* /proc/sys/net/dccp */
+enum {
+       NET_DCCP_DEFAULT=1,
+};
+
+/* /proc/sys/net/dccp/default */
+enum {
+       NET_DCCP_DEFAULT_SEQ_WINDOW  = 1,
+       NET_DCCP_DEFAULT_RX_CCID     = 2,
+       NET_DCCP_DEFAULT_TX_CCID     = 3,
+       NET_DCCP_DEFAULT_ACK_RATIO   = 4,
+       NET_DCCP_DEFAULT_SEND_ACKVEC = 5,
+       NET_DCCP_DEFAULT_SEND_NDP    = 6,
+};
+
 /* /proc/sys/net/ipx */
 enum {
        NET_IPX_PPROP_BROADCASTING=1,
index 5736acea1c869c3117f06518ff3fa8a793a743ea..7af0569fe4cb51c670ed22bd2f3f1cdd13e2220c 100644 (file)
@@ -11,6 +11,8 @@ dccp-$(CONFIG_IP_DCCP_ACKVEC) += ackvec.o
 
 obj-$(CONFIG_INET_DCCP_DIAG) += dccp_diag.o
 
+dccp-$(CONFIG_SYSCTL) += sysctl.o
+
 dccp_diag-y := diag.o
 
 obj-y += ccids/
index 1764adb4f15ee5db61a8cfc9d780d00d817c0001..f059541f5a1d4ffee47b0d9e07d966abe3b1f579 100644 (file)
@@ -433,4 +433,18 @@ static inline void timeval_sub_usecs(struct timeval *tv,
        }
 }
 
+#ifdef CONFIG_SYSCTL
+extern int dccp_sysctl_init(void);
+extern void dccp_sysctl_exit(void);
+#else
+static inline int dccp_sysctl_init(void)
+{
+       return 0;
+}
+
+static inline void dccp_sysctl_exit(void)
+{
+}
+#endif
+
 #endif /* _DCCP_H */
index 7d73b33a60438e0eaf29c2c9d70a673d08e9e3d8..3ecd319c0f598b5869fb227786d4a0fb4a25b37a 100644 (file)
 #include "dccp.h"
 #include "feat.h"
 
-/* stores the default values for new connection. may be changed with sysctl */
-static const struct dccp_options dccpo_default_values = {
-       .dccpo_sequence_window    = DCCPF_INITIAL_SEQUENCE_WINDOW,
-       .dccpo_rx_ccid            = DCCPF_INITIAL_CCID,
-       .dccpo_tx_ccid            = DCCPF_INITIAL_CCID,
-       .dccpo_ack_ratio          = DCCPF_INITIAL_ACK_RATIO,
-       .dccpo_send_ack_vector    = DCCPF_INITIAL_SEND_ACK_VECTOR,
-       .dccpo_send_ndp_count     = DCCPF_INITIAL_SEND_NDP_COUNT,
-};
+int dccp_feat_default_sequence_window = DCCPF_INITIAL_SEQUENCE_WINDOW;
+int dccp_feat_default_rx_ccid        = DCCPF_INITIAL_CCID;
+int dccp_feat_default_tx_ccid        = DCCPF_INITIAL_CCID;
+int dccp_feat_default_ack_ratio              = DCCPF_INITIAL_ACK_RATIO;
+int dccp_feat_default_send_ack_vector = DCCPF_INITIAL_SEND_ACK_VECTOR;
+int dccp_feat_default_send_ndp_count  = DCCPF_INITIAL_SEND_NDP_COUNT;
 
 void dccp_options_init(struct dccp_options *dccpo)
 {
-       memcpy(dccpo, &dccpo_default_values, sizeof(*dccpo));
+       dccpo->dccpo_sequence_window = dccp_feat_default_sequence_window;
+       dccpo->dccpo_rx_ccid         = dccp_feat_default_rx_ccid;
+       dccpo->dccpo_tx_ccid         = dccp_feat_default_tx_ccid;
+       dccpo->dccpo_ack_ratio       = dccp_feat_default_ack_ratio;
+       dccpo->dccpo_send_ack_vector = dccp_feat_default_send_ack_vector;
+       dccpo->dccpo_send_ndp_count  = dccp_feat_default_send_ndp_count;
 }
 
 static u32 dccp_decode_value_var(const unsigned char *bf, const u8 len)
index 53735ee2bbd15bf1679aad4903bf2b871708dfd7..6403e9306ddbdb5148adfe04a80c4f288504f61a 100644 (file)
@@ -934,11 +934,17 @@ static int __init dccp_init(void)
        if (rc)
                goto out_unregister_protosw;
 
-       rc = dccp_ctl_sock_init();
+       rc = dccp_sysctl_init();
        if (rc)
                goto out_ackvec_exit;
+
+       rc = dccp_ctl_sock_init();
+       if (rc)
+               goto out_sysctl_exit;
 out:
        return rc;
+out_sysctl_exit:
+       dccp_sysctl_exit();
 out_ackvec_exit:
        dccp_ackvec_exit();
 out_unregister_protosw:
@@ -983,6 +989,7 @@ static void __exit dccp_fini(void)
        kmem_cache_destroy(dccp_hashinfo.bind_bucket_cachep);
        proto_unregister(&dccp_prot);
        dccp_ackvec_exit();
+       dccp_sysctl_exit();
 }
 
 module_init(dccp_init);
diff --git a/net/dccp/sysctl.c b/net/dccp/sysctl.c
new file mode 100644 (file)
index 0000000..64c89e9
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ *  net/dccp/sysctl.c
+ *
+ *  An implementation of the DCCP protocol
+ *  Arnaldo Carvalho de Melo <acme@mandriva.com>
+ *
+ *     This program is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License v2
+ *     as published by the Free Software Foundation.
+ */
+
+#include <linux/config.h>
+#include <linux/mm.h>
+#include <linux/sysctl.h>
+
+#ifndef CONFIG_SYSCTL
+#error This file should not be compiled without CONFIG_SYSCTL defined
+#endif
+
+extern int dccp_feat_default_sequence_window;
+extern int dccp_feat_default_rx_ccid;
+extern int dccp_feat_default_tx_ccid;
+extern int dccp_feat_default_ack_ratio;
+extern int dccp_feat_default_send_ack_vector;
+extern int dccp_feat_default_send_ndp_count;
+
+static struct ctl_table dccp_default_table[] = {
+       {
+               .ctl_name       = NET_DCCP_DEFAULT_SEQ_WINDOW,
+               .procname       = "seq_window",
+               .data           = &dccp_feat_default_sequence_window,
+               .maxlen         = sizeof(dccp_feat_default_sequence_window),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .ctl_name       = NET_DCCP_DEFAULT_RX_CCID,
+               .procname       = "rx_ccid",
+               .data           = &dccp_feat_default_rx_ccid,
+               .maxlen         = sizeof(dccp_feat_default_rx_ccid),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .ctl_name       = NET_DCCP_DEFAULT_TX_CCID,
+               .procname       = "tx_ccid",
+               .data           = &dccp_feat_default_tx_ccid,
+               .maxlen         = sizeof(dccp_feat_default_tx_ccid),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .ctl_name       = NET_DCCP_DEFAULT_ACK_RATIO,
+               .procname       = "ack_ratio",
+               .data           = &dccp_feat_default_ack_ratio,
+               .maxlen         = sizeof(dccp_feat_default_ack_ratio),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .ctl_name       = NET_DCCP_DEFAULT_SEND_ACKVEC,
+               .procname       = "send_ackvec",
+               .data           = &dccp_feat_default_send_ack_vector,
+               .maxlen         = sizeof(dccp_feat_default_send_ack_vector),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .ctl_name       = NET_DCCP_DEFAULT_SEND_NDP,
+               .procname       = "send_ndp",
+               .data           = &dccp_feat_default_send_ndp_count,
+               .maxlen         = sizeof(dccp_feat_default_send_ndp_count),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       { .ctl_name = 0, }
+};
+
+static struct ctl_table dccp_table[] = {
+       {
+               .ctl_name       = NET_DCCP_DEFAULT,
+               .procname       = "default",
+               .mode           = 0555,
+               .child          = dccp_default_table,
+       },
+       { .ctl_name = 0, },
+};
+
+static struct ctl_table dccp_dir_table[] = {
+       {
+               .ctl_name       = NET_DCCP,
+               .procname       = "dccp",
+               .mode           = 0555,
+               .child          = dccp_table,
+       },
+       { .ctl_name = 0, },
+};
+
+static struct ctl_table dccp_root_table[] = {
+       {
+               .ctl_name       = CTL_NET,
+               .procname       = "net",
+               .mode           = 0555,
+               .child          = dccp_dir_table,
+       },
+       { .ctl_name = 0, },
+};
+
+static struct ctl_table_header *dccp_table_header;
+
+int __init dccp_sysctl_init(void)
+{
+       dccp_table_header = register_sysctl_table(dccp_root_table, 1);
+
+       return dccp_table_header != NULL ? 0 : -ENOMEM;
+}
+
+void dccp_sysctl_exit(void)
+{
+       if (dccp_table_header != NULL) {
+               unregister_sysctl_table(dccp_table_header);
+               dccp_table_header = NULL;
+       }
+}