aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerrit Renker <gerrit@erg.abdn.ac.uk>2006-11-13 10:23:52 -0500
committerDavid S. Miller <davem@sunset.davemloft.net>2006-12-03 00:22:18 -0500
commit2e2e9e92bd723244ea20fa488b1780111f2b05e1 (patch)
tree2e859b2b0aa17d2e18927fe110cdefad6c4f5fe6
parente11d9d30802278af22e78d8c10f348b683670cd9 (diff)
[DCCP]: Add sysctls to control retransmission behaviour
This adds 3 sysctls which govern the retransmission behaviour of DCCP control packets (3way handshake, feature negotiation). It removes 4 FIXMEs from the code. The close resemblance of sysctl variables to their TCP analogues is emphasised not only by their name, but also by giving them the same initial values. This is useful since there is not much practical experience with DCCP yet. Furthermore, with regard to the previous patch, it is now possible to limit the number of keepalive-Responses by setting net.dccp.default.request_retries (also a bit like in TCP). Lastly, added documentation of all existing DCCP sysctls. Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk> Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
-rw-r--r--Documentation/networking/dccp.txt41
-rw-r--r--include/linux/sysctl.h3
-rw-r--r--net/dccp/dccp.h11
-rw-r--r--net/dccp/feat.h7
-rw-r--r--net/dccp/proto.c1
-rw-r--r--net/dccp/sysctl.c25
-rw-r--r--net/dccp/timer.c16
7 files changed, 91 insertions, 13 deletions
diff --git a/Documentation/networking/dccp.txt b/Documentation/networking/dccp.txt
index a8142a81038a..c2328c862e98 100644
--- a/Documentation/networking/dccp.txt
+++ b/Documentation/networking/dccp.txt
@@ -63,6 +63,47 @@ DCCP_SOCKOPT_SEND_CSCOV is for the receiver and has a different meaning: it
63 coverage value are also acceptable. The higher the number, the more 63 coverage value are also acceptable. The higher the number, the more
64 restrictive this setting (see [RFC 4340, sec. 9.2.1]). 64 restrictive this setting (see [RFC 4340, sec. 9.2.1]).
65 65
66Sysctl variables
67================
68Several DCCP default parameters can be managed by the following sysctls
69(sysctl net.dccp.default or /proc/sys/net/dccp/default):
70
71request_retries
72 The number of active connection initiation retries (the number of
73 Requests minus one) before timing out. In addition, it also governs
74 the behaviour of the other, passive side: this variable also sets
75 the number of times DCCP repeats sending a Response when the initial
76 handshake does not progress from RESPOND to OPEN (i.e. when no Ack
77 is received after the initial Request). This value should be greater
78 than 0, suggested is less than 10. Analogue of tcp_syn_retries.
79
80retries1
81 How often a DCCP Response is retransmitted until the listening DCCP
82 side considers its connecting peer dead. Analogue of tcp_retries1.
83
84retries2
85 The number of times a general DCCP packet is retransmitted. This has
86 importance for retransmitted acknowledgments and feature negotiation,
87 data packets are never retransmitted. Analogue of tcp_retries2.
88
89send_ndp = 1
90 Whether or not to send NDP count options (sec. 7.7.2).
91
92send_ackvec = 1
93 Whether or not to send Ack Vector options (sec. 11.5).
94
95ack_ratio = 2
96 The default Ack Ratio (sec. 11.3) to use.
97
98tx_ccid = 2
99 Default CCID for the sender-receiver half-connection.
100
101rx_ccid = 2
102 Default CCID for the receiver-sender half-connection.
103
104seq_window = 100
105 The initial sequence window (sec. 7.5.2).
106
66Notes 107Notes
67===== 108=====
68 109
diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h
index 0725441621d0..2e8c5ad82793 100644
--- a/include/linux/sysctl.h
+++ b/include/linux/sysctl.h
@@ -614,6 +614,9 @@ enum {
614 NET_DCCP_DEFAULT_ACK_RATIO = 4, 614 NET_DCCP_DEFAULT_ACK_RATIO = 4,
615 NET_DCCP_DEFAULT_SEND_ACKVEC = 5, 615 NET_DCCP_DEFAULT_SEND_ACKVEC = 5,
616 NET_DCCP_DEFAULT_SEND_NDP = 6, 616 NET_DCCP_DEFAULT_SEND_NDP = 6,
617 NET_DCCP_DEFAULT_REQ_RETRIES = 7,
618 NET_DCCP_DEFAULT_RETRIES1 = 8,
619 NET_DCCP_DEFAULT_RETRIES2 = 9,
617}; 620};
618 621
619/* /proc/sys/net/ipx */ 622/* /proc/sys/net/ipx */
diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h
index d5c414bf7819..e7b96074a1b1 100644
--- a/net/dccp/dccp.h
+++ b/net/dccp/dccp.h
@@ -64,6 +64,17 @@ extern void dccp_time_wait(struct sock *sk, int state, int timeo);
64 64
65#define DCCP_XMIT_TIMEO 30000 /* Time/msecs for blocking transmit per packet */ 65#define DCCP_XMIT_TIMEO 30000 /* Time/msecs for blocking transmit per packet */
66 66
67/* sysctl variables for DCCP */
68extern int sysctl_dccp_request_retries;
69extern int sysctl_dccp_retries1;
70extern int sysctl_dccp_retries2;
71extern int dccp_feat_default_sequence_window;
72extern int dccp_feat_default_rx_ccid;
73extern int dccp_feat_default_tx_ccid;
74extern int dccp_feat_default_ack_ratio;
75extern int dccp_feat_default_send_ack_vector;
76extern int dccp_feat_default_send_ndp_count;
77
67/* is seq1 < seq2 ? */ 78/* is seq1 < seq2 ? */
68static inline int before48(const u64 seq1, const u64 seq2) 79static inline int before48(const u64 seq1, const u64 seq2)
69{ 80{
diff --git a/net/dccp/feat.h b/net/dccp/feat.h
index cee553d416ca..6048373c7186 100644
--- a/net/dccp/feat.h
+++ b/net/dccp/feat.h
@@ -26,11 +26,4 @@ extern void dccp_feat_clean(struct dccp_minisock *dmsk);
26extern int dccp_feat_clone(struct sock *oldsk, struct sock *newsk); 26extern int dccp_feat_clone(struct sock *oldsk, struct sock *newsk);
27extern int dccp_feat_init(struct dccp_minisock *dmsk); 27extern int dccp_feat_init(struct dccp_minisock *dmsk);
28 28
29extern int dccp_feat_default_sequence_window;
30extern int dccp_feat_default_rx_ccid;
31extern int dccp_feat_default_tx_ccid;
32extern int dccp_feat_default_ack_ratio;
33extern int dccp_feat_default_send_ack_vector;
34extern int dccp_feat_default_send_ndp_count;
35
36#endif /* _DCCP_FEAT_H */ 29#endif /* _DCCP_FEAT_H */
diff --git a/net/dccp/proto.c b/net/dccp/proto.c
index db54e557eff1..9c9c08cffdaf 100644
--- a/net/dccp/proto.c
+++ b/net/dccp/proto.c
@@ -212,6 +212,7 @@ int dccp_init_sock(struct sock *sk, const __u8 ctl_sock_initialized)
212 212
213 dccp_init_xmit_timers(sk); 213 dccp_init_xmit_timers(sk);
214 icsk->icsk_rto = DCCP_TIMEOUT_INIT; 214 icsk->icsk_rto = DCCP_TIMEOUT_INIT;
215 icsk->icsk_syn_retries = sysctl_dccp_request_retries;
215 sk->sk_state = DCCP_CLOSED; 216 sk->sk_state = DCCP_CLOSED;
216 sk->sk_write_space = dccp_write_space; 217 sk->sk_write_space = dccp_write_space;
217 icsk->icsk_sync_mss = dccp_sync_mss; 218 icsk->icsk_sync_mss = dccp_sync_mss;
diff --git a/net/dccp/sysctl.c b/net/dccp/sysctl.c
index 38bc157876f3..7b09f2179985 100644
--- a/net/dccp/sysctl.c
+++ b/net/dccp/sysctl.c
@@ -11,6 +11,7 @@
11 11
12#include <linux/mm.h> 12#include <linux/mm.h>
13#include <linux/sysctl.h> 13#include <linux/sysctl.h>
14#include "dccp.h"
14#include "feat.h" 15#include "feat.h"
15 16
16#ifndef CONFIG_SYSCTL 17#ifndef CONFIG_SYSCTL
@@ -66,6 +67,30 @@ static struct ctl_table dccp_default_table[] = {
66 .mode = 0644, 67 .mode = 0644,
67 .proc_handler = proc_dointvec, 68 .proc_handler = proc_dointvec,
68 }, 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 },
69 { .ctl_name = 0, } 94 { .ctl_name = 0, }
70}; 95};
71 96
diff --git a/net/dccp/timer.c b/net/dccp/timer.c
index bda0af639ae4..7b3f16e29a97 100644
--- a/net/dccp/timer.c
+++ b/net/dccp/timer.c
@@ -15,6 +15,11 @@
15 15
16#include "dccp.h" 16#include "dccp.h"
17 17
18/* sysctl variables governing numbers of retransmission attempts */
19int sysctl_dccp_request_retries __read_mostly = TCP_SYN_RETRIES;
20int sysctl_dccp_retries1 __read_mostly = TCP_RETR1;
21int sysctl_dccp_retries2 __read_mostly = TCP_RETR2;
22
18static void dccp_write_timer(unsigned long data); 23static void dccp_write_timer(unsigned long data);
19static void dccp_keepalive_timer(unsigned long data); 24static void dccp_keepalive_timer(unsigned long data);
20static void dccp_delack_timer(unsigned long data); 25static void dccp_delack_timer(unsigned long data);
@@ -44,11 +49,10 @@ static int dccp_write_timeout(struct sock *sk)
44 if (sk->sk_state == DCCP_REQUESTING || sk->sk_state == DCCP_PARTOPEN) { 49 if (sk->sk_state == DCCP_REQUESTING || sk->sk_state == DCCP_PARTOPEN) {
45 if (icsk->icsk_retransmits != 0) 50 if (icsk->icsk_retransmits != 0)
46 dst_negative_advice(&sk->sk_dst_cache); 51 dst_negative_advice(&sk->sk_dst_cache);
47 retry_until = icsk->icsk_syn_retries ? : 52 retry_until = icsk->icsk_syn_retries ?
48 /* FIXME! */ 3 /* FIXME! sysctl_tcp_syn_retries */; 53 : sysctl_dccp_request_retries;
49 } else { 54 } else {
50 if (icsk->icsk_retransmits >= 55 if (icsk->icsk_retransmits >= sysctl_dccp_retries1) {
51 /* FIXME! sysctl_tcp_retries1 */ 5 /* FIXME! */) {
52 /* NOTE. draft-ietf-tcpimpl-pmtud-01.txt requires pmtu 56 /* NOTE. draft-ietf-tcpimpl-pmtud-01.txt requires pmtu
53 black hole detection. :-( 57 black hole detection. :-(
54 58
@@ -72,7 +76,7 @@ static int dccp_write_timeout(struct sock *sk)
72 dst_negative_advice(&sk->sk_dst_cache); 76 dst_negative_advice(&sk->sk_dst_cache);
73 } 77 }
74 78
75 retry_until = /* FIXME! */ 15 /* FIXME! sysctl_tcp_retries2 */; 79 retry_until = sysctl_dccp_retries2;
76 /* 80 /*
77 * FIXME: see tcp_write_timout and tcp_out_of_resources 81 * FIXME: see tcp_write_timout and tcp_out_of_resources
78 */ 82 */
@@ -196,7 +200,7 @@ backoff:
196 icsk->icsk_rto = min(icsk->icsk_rto << 1, DCCP_RTO_MAX); 200 icsk->icsk_rto = min(icsk->icsk_rto << 1, DCCP_RTO_MAX);
197 inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, icsk->icsk_rto, 201 inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, icsk->icsk_rto,
198 DCCP_RTO_MAX); 202 DCCP_RTO_MAX);
199 if (icsk->icsk_retransmits > 3 /* FIXME: sysctl_dccp_retries1 */) 203 if (icsk->icsk_retransmits > sysctl_dccp_retries1)
200 __sk_dst_reset(sk); 204 __sk_dst_reset(sk);
201out:; 205out:;
202} 206}