Hi, On Wed, Mar 10, 2021 at 07:16:34PM +0100, Henneberg - Systemdesign wrote: > Hi, > > I have a question regarding the implementation of ioctl TIOCOUTQ for > various sockets compared to the tty implementation. > > For several sockets, e. g. AF_BLUETOOTH it is done like this > > af_bluetooth.c: > case TIOCOUTQ: > if (sk->sk_state == BT_LISTEN) > return -EINVAL; > > amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk); > if (amount < 0) > amount = 0; > err = put_user(amount, (int __user *)arg); > break; > > so the ioctl returns the available space in the send queue if I > understand the code correctly (this is also what I observed from tests). > > The tty does this: > > n_tty.c: > case TIOCOUTQ: > return put_user(tty_chars_in_buffer(tty), (int __user *) arg); > > so it returns the used space in the send queue. This is also what I > would expect from the manpage description. > > Is this mismatch intentional?
At least both man pages (tty_ioctl and tcp(7)) mention that TIOCOUTQ should return the number of byte in queue. What I suspect for sockets is that sk_sndbuf grows with allocations and that sk_wmem_alloc_get() in fact returns the number of unused allocations thus the difference would be the amount queued. But I could be wrong and I would tend to read the code the same way as you did. Willy