diff options
-rw-r--r-- | Documentation/networking/dccp.txt | 41 | ||||
-rw-r--r-- | include/linux/sysctl.h | 3 | ||||
-rw-r--r-- | net/dccp/dccp.h | 11 | ||||
-rw-r--r-- | net/dccp/feat.h | 7 | ||||
-rw-r--r-- | net/dccp/proto.c | 1 | ||||
-rw-r--r-- | net/dccp/sysctl.c | 25 | ||||
-rw-r--r-- | net/dccp/timer.c | 16 |
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 | ||
66 | Sysctl variables | ||
67 | ================ | ||
68 | Several DCCP default parameters can be managed by the following sysctls | ||
69 | (sysctl net.dccp.default or /proc/sys/net/dccp/default): | ||
70 | |||
71 | request_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 | |||
80 | retries1 | ||
81 | How often a DCCP Response is retransmitted until the listening DCCP | ||
82 | side considers its connecting peer dead. Analogue of tcp_retries1. | ||
83 | |||
84 | retries2 | ||
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 | |||
89 | send_ndp = 1 | ||
90 | Whether or not to send NDP count options (sec. 7.7.2). | ||
91 | |||
92 | send_ackvec = 1 | ||
93 | Whether or not to send Ack Vector options (sec. 11.5). | ||
94 | |||
95 | ack_ratio = 2 | ||
96 | The default Ack Ratio (sec. 11.3) to use. | ||
97 | |||
98 | tx_ccid = 2 | ||
99 | Default CCID for the sender-receiver half-connection. | ||
100 | |||
101 | rx_ccid = 2 | ||
102 | Default CCID for the receiver-sender half-connection. | ||
103 | |||
104 | seq_window = 100 | ||
105 | The initial sequence window (sec. 7.5.2). | ||
106 | |||
66 | Notes | 107 | Notes |
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 */ | ||
68 | extern int sysctl_dccp_request_retries; | ||
69 | extern int sysctl_dccp_retries1; | ||
70 | extern int sysctl_dccp_retries2; | ||
71 | extern int dccp_feat_default_sequence_window; | ||
72 | extern int dccp_feat_default_rx_ccid; | ||
73 | extern int dccp_feat_default_tx_ccid; | ||
74 | extern int dccp_feat_default_ack_ratio; | ||
75 | extern int dccp_feat_default_send_ack_vector; | ||
76 | extern int dccp_feat_default_send_ndp_count; | ||
77 | |||
67 | /* is seq1 < seq2 ? */ | 78 | /* is seq1 < seq2 ? */ |
68 | static inline int before48(const u64 seq1, const u64 seq2) | 79 | static 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); | |||
26 | extern int dccp_feat_clone(struct sock *oldsk, struct sock *newsk); | 26 | extern int dccp_feat_clone(struct sock *oldsk, struct sock *newsk); |
27 | extern int dccp_feat_init(struct dccp_minisock *dmsk); | 27 | extern int dccp_feat_init(struct dccp_minisock *dmsk); |
28 | 28 | ||
29 | extern int dccp_feat_default_sequence_window; | ||
30 | extern int dccp_feat_default_rx_ccid; | ||
31 | extern int dccp_feat_default_tx_ccid; | ||
32 | extern int dccp_feat_default_ack_ratio; | ||
33 | extern int dccp_feat_default_send_ack_vector; | ||
34 | extern 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 */ | ||
19 | int sysctl_dccp_request_retries __read_mostly = TCP_SYN_RETRIES; | ||
20 | int sysctl_dccp_retries1 __read_mostly = TCP_RETR1; | ||
21 | int sysctl_dccp_retries2 __read_mostly = TCP_RETR2; | ||
22 | |||
18 | static void dccp_write_timer(unsigned long data); | 23 | static void dccp_write_timer(unsigned long data); |
19 | static void dccp_keepalive_timer(unsigned long data); | 24 | static void dccp_keepalive_timer(unsigned long data); |
20 | static void dccp_delack_timer(unsigned long data); | 25 | static 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); |
201 | out:; | 205 | out:; |
202 | } | 206 | } |