Skip to content

Commit

Permalink
[DCCP] feat: Introduce sysctls for the default features
Browse files Browse the repository at this point in the history
[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>
  • Loading branch information
Arnaldo Carvalho de Melo authored and David S. Miller committed Mar 21, 2006
1 parent 04e2661 commit e55d912
Show file tree
Hide file tree
Showing 6 changed files with 176 additions and 11 deletions.
16 changes: 16 additions & 0 deletions include/linux/sysctl.h
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,7 @@ enum
NET_SCTP=17,
NET_LLC=18,
NET_NETFILTER=19,
NET_DCCP=20,
};

/* /proc/sys/kernel/random */
Expand Down Expand Up @@ -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,
Expand Down
2 changes: 2 additions & 0 deletions net/dccp/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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/
14 changes: 14 additions & 0 deletions net/dccp/dccp.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
22 changes: 12 additions & 10 deletions net/dccp/options.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,21 @@
#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)
Expand Down
9 changes: 8 additions & 1 deletion net/dccp/proto.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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);
Expand Down
124 changes: 124 additions & 0 deletions net/dccp/sysctl.c
Original file line number Diff line number Diff line change
@@ -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;
}
}

0 comments on commit e55d912

Please sign in to comment.