aboutsummaryrefslogtreecommitdiffstats
path: root/net/dccp
diff options
context:
space:
mode:
Diffstat (limited to 'net/dccp')
-rw-r--r--net/dccp/dccp.h2
-rw-r--r--net/dccp/output.c26
2 files changed, 6 insertions, 22 deletions
diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h
index 68886986c8e4..44829d636c93 100644
--- a/net/dccp/dccp.h
+++ b/net/dccp/dccp.h
@@ -80,8 +80,6 @@ extern void dccp_time_wait(struct sock *sk, int state, int timeo);
80 80
81#define DCCP_RTO_MAX ((unsigned)(120 * HZ)) /* FIXME: using TCP value */ 81#define DCCP_RTO_MAX ((unsigned)(120 * HZ)) /* FIXME: using TCP value */
82 82
83#define DCCP_XMIT_TIMEO 30000 /* Time/msecs for blocking transmit per packet */
84
85/* sysctl variables for DCCP */ 83/* sysctl variables for DCCP */
86extern int sysctl_dccp_request_retries; 84extern int sysctl_dccp_request_retries;
87extern int sysctl_dccp_retries1; 85extern int sysctl_dccp_retries1;
diff --git a/net/dccp/output.c b/net/dccp/output.c
index 400c30b6fcae..29a8e8508462 100644
--- a/net/dccp/output.c
+++ b/net/dccp/output.c
@@ -175,14 +175,12 @@ void dccp_write_space(struct sock *sk)
175/** 175/**
176 * dccp_wait_for_ccid - Wait for ccid to tell us we can send a packet 176 * dccp_wait_for_ccid - Wait for ccid to tell us we can send a packet
177 * @sk: socket to wait for 177 * @sk: socket to wait for
178 * @timeo: for how long
179 */ 178 */
180static int dccp_wait_for_ccid(struct sock *sk, struct sk_buff *skb, 179static int dccp_wait_for_ccid(struct sock *sk, struct sk_buff *skb)
181 long *timeo)
182{ 180{
183 struct dccp_sock *dp = dccp_sk(sk); 181 struct dccp_sock *dp = dccp_sk(sk);
184 DEFINE_WAIT(wait); 182 DEFINE_WAIT(wait);
185 long delay; 183 unsigned long delay;
186 int rc; 184 int rc;
187 185
188 while (1) { 186 while (1) {
@@ -190,8 +188,6 @@ static int dccp_wait_for_ccid(struct sock *sk, struct sk_buff *skb,
190 188
191 if (sk->sk_err) 189 if (sk->sk_err)
192 goto do_error; 190 goto do_error;
193 if (!*timeo)
194 goto do_nonblock;
195 if (signal_pending(current)) 191 if (signal_pending(current))
196 goto do_interrupted; 192 goto do_interrupted;
197 193
@@ -199,12 +195,9 @@ static int dccp_wait_for_ccid(struct sock *sk, struct sk_buff *skb,
199 if (rc <= 0) 195 if (rc <= 0)
200 break; 196 break;
201 delay = msecs_to_jiffies(rc); 197 delay = msecs_to_jiffies(rc);
202 if (delay > *timeo || delay < 0)
203 goto do_nonblock;
204
205 sk->sk_write_pending++; 198 sk->sk_write_pending++;
206 release_sock(sk); 199 release_sock(sk);
207 *timeo -= schedule_timeout(delay); 200 schedule_timeout(delay);
208 lock_sock(sk); 201 lock_sock(sk);
209 sk->sk_write_pending--; 202 sk->sk_write_pending--;
210 } 203 }
@@ -215,11 +208,8 @@ out:
215do_error: 208do_error:
216 rc = -EPIPE; 209 rc = -EPIPE;
217 goto out; 210 goto out;
218do_nonblock:
219 rc = -EAGAIN;
220 goto out;
221do_interrupted: 211do_interrupted:
222 rc = sock_intr_errno(*timeo); 212 rc = -EINTR;
223 goto out; 213 goto out;
224} 214}
225 215
@@ -240,8 +230,6 @@ void dccp_write_xmit(struct sock *sk, int block)
240{ 230{
241 struct dccp_sock *dp = dccp_sk(sk); 231 struct dccp_sock *dp = dccp_sk(sk);
242 struct sk_buff *skb; 232 struct sk_buff *skb;
243 long timeo = DCCP_XMIT_TIMEO; /* If a packet is taking longer than
244 this we have other issues */
245 233
246 while ((skb = skb_peek(&sk->sk_write_queue))) { 234 while ((skb = skb_peek(&sk->sk_write_queue))) {
247 int err = ccid_hc_tx_send_packet(dp->dccps_hc_tx_ccid, sk, skb); 235 int err = ccid_hc_tx_send_packet(dp->dccps_hc_tx_ccid, sk, skb);
@@ -251,10 +239,8 @@ void dccp_write_xmit(struct sock *sk, int block)
251 sk_reset_timer(sk, &dp->dccps_xmit_timer, 239 sk_reset_timer(sk, &dp->dccps_xmit_timer,
252 msecs_to_jiffies(err)+jiffies); 240 msecs_to_jiffies(err)+jiffies);
253 break; 241 break;
254 } else { 242 } else
255 err = dccp_wait_for_ccid(sk, skb, &timeo); 243 err = dccp_wait_for_ccid(sk, skb);
256 timeo = DCCP_XMIT_TIMEO;
257 }
258 if (err) 244 if (err)
259 DCCP_BUG("err=%d after dccp_wait_for_ccid", err); 245 DCCP_BUG("err=%d after dccp_wait_for_ccid", err);
260 } 246 }