diff mbox series

[v2] net: dccp: Add SIOCOUTQ IOCTL support (send buffer fill)

Message ID 20200530163159.932749-1-richard_siegfried@systemli.org
State New
Headers show
Series [v2] net: dccp: Add SIOCOUTQ IOCTL support (send buffer fill) | expand

Commit Message

Richard Sailer May 30, 2020, 4:31 p.m. UTC
From: Richard Sailer <rs@tuxedocomputers.com>

This adds support for the SIOCOUTQ IOCTL to call send buffer fill
from the DCCP socket, like UDP and TCP already have.

Regarding the used data field. DCCP uses per packet sequence numbers,
not per byte, so sequence numbers can't be used like in TCP. sk_wmem_queued
is not used by DCCP and always 0, even in test on highly congested paths.
Therefore this uses sk_wmem_alloc like in UDP.

Signed-off-by: Richard Sailer <richard_siegfried@systemli.org>
---
v2: Add Signed-off-by line and fix tab-vs-space error produced by badly
configuerd emacs
---
 Documentation/networking/dccp.txt | 2 ++
 net/dccp/proto.c                  | 8 ++++++++
 2 files changed, 10 insertions(+)
diff mbox series

Patch

diff --git a/Documentation/networking/dccp.txt b/Documentation/networking/dccp.txt
index 55c575fcaf17d..682ecf8288827 100644
--- a/Documentation/networking/dccp.txt
+++ b/Documentation/networking/dccp.txt
@@ -185,6 +185,8 @@  FIONREAD
 	Works as in udp(7): returns in the `int' argument pointer the size of
 	the next pending datagram in bytes, or 0 when no datagram is pending.
 
+SIOCOUTQ
+  Returns the number of data bytes in the local send queue.
 
 Other tunables
 ==============
diff --git a/net/dccp/proto.c b/net/dccp/proto.c
index 4af8a98fe7846..53ed36705b820 100644
--- a/net/dccp/proto.c
+++ b/net/dccp/proto.c
@@ -375,6 +375,14 @@  int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg)
 		goto out;
 
 	switch (cmd) {
+	case SIOCOUTQ: {
+		/* Using sk_wmem_alloc here because sk_wmem_queued is not used by DCCP and
+		 * always 0, comparably to UDP.
+		 */
+		int amount = sk_wmem_alloc_get(sk);
+		rc = put_user(amount, (int __user *)arg);
+	}
+		       break;
 	case SIOCINQ: {
 		struct sk_buff *skb;
 		unsigned long amount = 0;