summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorIan McDonald2006-11-20 21:30:17 +0100
committerDavid S. Miller2006-12-03 06:24:37 +0100
commitb1308dc015eb09cf094ca169296738a13ae049ad (patch)
tree9c408412fc94671bb7f23b356ef328489c433d1f /net
parent[DCCP]: Add CCID3 debug support to Kconfig (diff)
downloadkernel-qcow2-linux-b1308dc015eb09cf094ca169296738a13ae049ad.tar.gz
kernel-qcow2-linux-b1308dc015eb09cf094ca169296738a13ae049ad.tar.xz
kernel-qcow2-linux-b1308dc015eb09cf094ca169296738a13ae049ad.zip
[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')
-rw-r--r--net/dccp/dccp.h1
-rw-r--r--net/dccp/proto.c10
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;
extern int sysctl_dccp_feat_ack_ratio;
extern int sysctl_dccp_feat_send_ack_vector;
extern int sysctl_dccp_feat_send_ndp_count;
+extern int sysctl_dccp_tx_qlen;
/* is seq1 < seq2 ? */
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 = {
EXPORT_SYMBOL_GPL(dccp_hashinfo);
+/* the maximum queue length for tx in packets. 0 is no limit */
+int sysctl_dccp_tx_qlen __read_mostly = 5;
+
void dccp_set_state(struct sock *sk, const int state)
{
const int oldstate = sk->sk_state;
@@ -645,6 +648,13 @@ int dccp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
return -EMSGSIZE;
lock_sock(sk);
+
+ if (sysctl_dccp_tx_qlen &&
+ (sk->sk_write_queue.qlen >= sysctl_dccp_tx_qlen)) {
+ rc = -EAGAIN;
+ goto out_release;
+ }
+
timeo = sock_sndtimeo(sk, noblock);
/*