tcp: ioctl type SIOCOUTQNSD returns amount of data not sent
authorMario Schuknecht <m.schuknecht@dresearch.de>
Wed, 9 Mar 2011 22:08:09 +0000 (14:08 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 9 Mar 2011 22:08:09 +0000 (14:08 -0800)
In contrast to SIOCOUTQ which returns the amount of data sent
but not yet acknowledged plus data not yet sent this patch only
returns the data not sent.

For various methods of live streaming bitrate control it may
be helpful to know how much data are in the tcp outqueue are
not sent yet.

Signed-off-by: Mario Schuknecht <m.schuknecht@dresearch.de>
Signed-off-by: Steffen Sledz <sledz@dresearch.de>
Signed-off-by: David S. Miller <davem@davemloft.net>

include/linux/sockios.h
net/ipv4/tcp.c

index 241f179..7997a50 100644 (file)
@@ -22,7 +22,7 @@
 
 /* Linux-specific socket ioctls */
 #define SIOCINQ                FIONREAD
-#define SIOCOUTQ       TIOCOUTQ
+#define SIOCOUTQ       TIOCOUTQ        /* output queue size (not sent + not acked) */
 
 /* Routing table calls. */
 #define SIOCADDRT      0x890B          /* add routing table entry      */
@@ -83,6 +83,8 @@
 
 #define SIOCWANDEV     0x894A          /* get/set netdev parameters    */
 
+#define SIOCOUTQNSD    0x894B          /* output queue size (not sent only) */
+
 /* ARP cache control calls. */
                    /*  0x8950 - 0x8952  * obsolete calls, don't re-use */
 #define SIOCDARP       0x8953          /* delete ARP table entry       */
index a17a5a7..b22d450 100644 (file)
@@ -505,6 +505,15 @@ int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg)
                else
                        answ = tp->write_seq - tp->snd_una;
                break;
+       case SIOCOUTQNSD:
+               if (sk->sk_state == TCP_LISTEN)
+                       return -EINVAL;
+
+               if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV))
+                       answ = 0;
+               else
+                       answ = tp->write_seq - tp->snd_nxt;
+               break;
        default:
                return -ENOIOCTLCMD;
        }