diff options
author | Stephen Hemminger <shemminger@osdl.org> | 2005-06-23 15:19:55 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-06-23 15:19:55 -0400 |
commit | 317a76f9a44b437d6301718f4e5d08bd93f98da7 (patch) | |
tree | caeba9839dee264f59b035b81c3d13d6c61b638e /net/ipv4/sysctl_net_ipv4.c | |
parent | a8ad86f2dc46356f87be1327dabc18bdbda32f50 (diff) |
[TCP]: Add pluggable congestion control algorithm infrastructure.
Allow TCP to have multiple pluggable congestion control algorithms.
Algorithms are defined by a set of operations and can be built in
or modules. The legacy "new RENO" algorithm is used as a starting
point and fallback.
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/sysctl_net_ipv4.c')
-rw-r--r-- | net/ipv4/sysctl_net_ipv4.c | 114 |
1 files changed, 45 insertions, 69 deletions
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index 23068bddbf0b..e32894532416 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c | |||
@@ -118,6 +118,45 @@ static int ipv4_sysctl_forward_strategy(ctl_table *table, | |||
118 | return 1; | 118 | return 1; |
119 | } | 119 | } |
120 | 120 | ||
121 | static int proc_tcp_congestion_control(ctl_table *ctl, int write, struct file * filp, | ||
122 | void __user *buffer, size_t *lenp, loff_t *ppos) | ||
123 | { | ||
124 | char val[TCP_CA_NAME_MAX]; | ||
125 | ctl_table tbl = { | ||
126 | .data = val, | ||
127 | .maxlen = TCP_CA_NAME_MAX, | ||
128 | }; | ||
129 | int ret; | ||
130 | |||
131 | tcp_get_default_congestion_control(val); | ||
132 | |||
133 | ret = proc_dostring(&tbl, write, filp, buffer, lenp, ppos); | ||
134 | if (write && ret == 0) | ||
135 | ret = tcp_set_default_congestion_control(val); | ||
136 | return ret; | ||
137 | } | ||
138 | |||
139 | int sysctl_tcp_congestion_control(ctl_table *table, int __user *name, int nlen, | ||
140 | void __user *oldval, size_t __user *oldlenp, | ||
141 | void __user *newval, size_t newlen, | ||
142 | void **context) | ||
143 | { | ||
144 | char val[TCP_CA_NAME_MAX]; | ||
145 | ctl_table tbl = { | ||
146 | .data = val, | ||
147 | .maxlen = TCP_CA_NAME_MAX, | ||
148 | }; | ||
149 | int ret; | ||
150 | |||
151 | tcp_get_default_congestion_control(val); | ||
152 | ret = sysctl_string(&tbl, name, nlen, oldval, oldlenp, newval, newlen, | ||
153 | context); | ||
154 | if (ret == 0 && newval && newlen) | ||
155 | ret = tcp_set_default_congestion_control(val); | ||
156 | return ret; | ||
157 | } | ||
158 | |||
159 | |||
121 | ctl_table ipv4_table[] = { | 160 | ctl_table ipv4_table[] = { |
122 | { | 161 | { |
123 | .ctl_name = NET_IPV4_TCP_TIMESTAMPS, | 162 | .ctl_name = NET_IPV4_TCP_TIMESTAMPS, |
@@ -612,70 +651,6 @@ ctl_table ipv4_table[] = { | |||
612 | .proc_handler = &proc_dointvec, | 651 | .proc_handler = &proc_dointvec, |
613 | }, | 652 | }, |
614 | { | 653 | { |
615 | .ctl_name = NET_TCP_WESTWOOD, | ||
616 | .procname = "tcp_westwood", | ||
617 | .data = &sysctl_tcp_westwood, | ||
618 | .maxlen = sizeof(int), | ||
619 | .mode = 0644, | ||
620 | .proc_handler = &proc_dointvec, | ||
621 | }, | ||
622 | { | ||
623 | .ctl_name = NET_TCP_VEGAS, | ||
624 | .procname = "tcp_vegas_cong_avoid", | ||
625 | .data = &sysctl_tcp_vegas_cong_avoid, | ||
626 | .maxlen = sizeof(int), | ||
627 | .mode = 0644, | ||
628 | .proc_handler = &proc_dointvec, | ||
629 | }, | ||
630 | { | ||
631 | .ctl_name = NET_TCP_VEGAS_ALPHA, | ||
632 | .procname = "tcp_vegas_alpha", | ||
633 | .data = &sysctl_tcp_vegas_alpha, | ||
634 | .maxlen = sizeof(int), | ||
635 | .mode = 0644, | ||
636 | .proc_handler = &proc_dointvec, | ||
637 | }, | ||
638 | { | ||
639 | .ctl_name = NET_TCP_VEGAS_BETA, | ||
640 | .procname = "tcp_vegas_beta", | ||
641 | .data = &sysctl_tcp_vegas_beta, | ||
642 | .maxlen = sizeof(int), | ||
643 | .mode = 0644, | ||
644 | .proc_handler = &proc_dointvec, | ||
645 | }, | ||
646 | { | ||
647 | .ctl_name = NET_TCP_VEGAS_GAMMA, | ||
648 | .procname = "tcp_vegas_gamma", | ||
649 | .data = &sysctl_tcp_vegas_gamma, | ||
650 | .maxlen = sizeof(int), | ||
651 | .mode = 0644, | ||
652 | .proc_handler = &proc_dointvec, | ||
653 | }, | ||
654 | { | ||
655 | .ctl_name = NET_TCP_BIC, | ||
656 | .procname = "tcp_bic", | ||
657 | .data = &sysctl_tcp_bic, | ||
658 | .maxlen = sizeof(int), | ||
659 | .mode = 0644, | ||
660 | .proc_handler = &proc_dointvec, | ||
661 | }, | ||
662 | { | ||
663 | .ctl_name = NET_TCP_BIC_FAST_CONVERGENCE, | ||
664 | .procname = "tcp_bic_fast_convergence", | ||
665 | .data = &sysctl_tcp_bic_fast_convergence, | ||
666 | .maxlen = sizeof(int), | ||
667 | .mode = 0644, | ||
668 | .proc_handler = &proc_dointvec, | ||
669 | }, | ||
670 | { | ||
671 | .ctl_name = NET_TCP_BIC_LOW_WINDOW, | ||
672 | .procname = "tcp_bic_low_window", | ||
673 | .data = &sysctl_tcp_bic_low_window, | ||
674 | .maxlen = sizeof(int), | ||
675 | .mode = 0644, | ||
676 | .proc_handler = &proc_dointvec, | ||
677 | }, | ||
678 | { | ||
679 | .ctl_name = NET_TCP_MODERATE_RCVBUF, | 654 | .ctl_name = NET_TCP_MODERATE_RCVBUF, |
680 | .procname = "tcp_moderate_rcvbuf", | 655 | .procname = "tcp_moderate_rcvbuf", |
681 | .data = &sysctl_tcp_moderate_rcvbuf, | 656 | .data = &sysctl_tcp_moderate_rcvbuf, |
@@ -692,13 +667,14 @@ ctl_table ipv4_table[] = { | |||
692 | .proc_handler = &proc_dointvec, | 667 | .proc_handler = &proc_dointvec, |
693 | }, | 668 | }, |
694 | { | 669 | { |
695 | .ctl_name = NET_TCP_BIC_BETA, | 670 | .ctl_name = NET_TCP_CONG_CONTROL, |
696 | .procname = "tcp_bic_beta", | 671 | .procname = "tcp_congestion_control", |
697 | .data = &sysctl_tcp_bic_beta, | ||
698 | .maxlen = sizeof(int), | ||
699 | .mode = 0644, | 672 | .mode = 0644, |
700 | .proc_handler = &proc_dointvec, | 673 | .maxlen = TCP_CA_NAME_MAX, |
674 | .proc_handler = &proc_tcp_congestion_control, | ||
675 | .strategy = &sysctl_tcp_congestion_control, | ||
701 | }, | 676 | }, |
677 | |||
702 | { .ctl_name = 0 } | 678 | { .ctl_name = 0 } |
703 | }; | 679 | }; |
704 | 680 | ||