diff options
author | Ian McDonald <ian.mcdonald@jandi.co.nz> | 2006-11-20 15:30:17 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-12-03 00:24:37 -0500 |
commit | b1308dc015eb09cf094ca169296738a13ae049ad (patch) | |
tree | 9c408412fc94671bb7f23b356ef328489c433d1f /net/dccp | |
parent | 56724aa434e9b4d73548021ede7a1474f533f3fe (diff) |
[DCCP]: Set TX Queue Length Bounds via Sysctl
Previously the transmit queue was unbounded.
This patch:
* puts a limit on transmit queue length
and sends back EAGAIN if the buffer is full
* sets the TX queue length to a sensible default
* implements tx buffer sysctls for DCCP
Signed-off-by: Ian McDonald <ian.mcdonald@jandi.co.nz>
Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
Diffstat (limited to 'net/dccp')
-rw-r--r-- | net/dccp/dccp.h | 1 | ||||
-rw-r--r-- | net/dccp/proto.c | 10 |
2 files changed, 11 insertions, 0 deletions
diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h index 33d86f53138b..3a94625a1af3 100644 --- a/net/dccp/dccp.h +++ b/net/dccp/dccp.h | |||
@@ -87,6 +87,7 @@ extern int sysctl_dccp_feat_tx_ccid; | |||
87 | extern int sysctl_dccp_feat_ack_ratio; | 87 | extern int sysctl_dccp_feat_ack_ratio; |
88 | extern int sysctl_dccp_feat_send_ack_vector; | 88 | extern int sysctl_dccp_feat_send_ack_vector; |
89 | extern int sysctl_dccp_feat_send_ndp_count; | 89 | extern int sysctl_dccp_feat_send_ndp_count; |
90 | extern int sysctl_dccp_tx_qlen; | ||
90 | 91 | ||
91 | /* is seq1 < seq2 ? */ | 92 | /* is seq1 < seq2 ? */ |
92 | static inline int before48(const u64 seq1, const u64 seq2) | 93 | static inline int before48(const u64 seq1, const u64 seq2) |
diff --git a/net/dccp/proto.c b/net/dccp/proto.c index 0225bdacd3b1..a7f345c8d0db 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c | |||
@@ -52,6 +52,9 @@ struct inet_hashinfo __cacheline_aligned dccp_hashinfo = { | |||
52 | 52 | ||
53 | EXPORT_SYMBOL_GPL(dccp_hashinfo); | 53 | EXPORT_SYMBOL_GPL(dccp_hashinfo); |
54 | 54 | ||
55 | /* the maximum queue length for tx in packets. 0 is no limit */ | ||
56 | int sysctl_dccp_tx_qlen __read_mostly = 5; | ||
57 | |||
55 | void dccp_set_state(struct sock *sk, const int state) | 58 | void dccp_set_state(struct sock *sk, const int state) |
56 | { | 59 | { |
57 | const int oldstate = sk->sk_state; | 60 | const int oldstate = sk->sk_state; |
@@ -645,6 +648,13 @@ int dccp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
645 | return -EMSGSIZE; | 648 | return -EMSGSIZE; |
646 | 649 | ||
647 | lock_sock(sk); | 650 | lock_sock(sk); |
651 | |||
652 | if (sysctl_dccp_tx_qlen && | ||
653 | (sk->sk_write_queue.qlen >= sysctl_dccp_tx_qlen)) { | ||
654 | rc = -EAGAIN; | ||
655 | goto out_release; | ||
656 | } | ||
657 | |||
648 | timeo = sock_sndtimeo(sk, noblock); | 658 | timeo = sock_sndtimeo(sk, noblock); |
649 | 659 | ||
650 | /* | 660 | /* |