]> Pileus Git - ~andy/linux/commitdiff
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 241f179347d94c7fbbbfb558096f09752bf9a62c..7997a506ad4105fb145a9ddc120286a8431a1502 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 a17a5a72b98dcd1a6983d903187f66c7cc47db58..b22d450105450ae089d42a06486938fcaa2c80dc 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;
        }