Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

unix_diag: Fixup RQLEN extension report

While it's not too late fix the recently added RQLEN diag extension
to report rqlen and wqlen in the same way as TCP does.

I.e. for listening sockets the ack backlog length (which is the input
queue length for socket) in rqlen and the max ack backlog length in
wqlen, and what the CINQ/OUTQ ioctls do for established.

Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Pavel Emelyanov and committed by
David S. Miller
c9da99e6 885ee74d

+17 -1
+5
include/linux/unix_diag.h
··· 46 46 __u32 udiag_vfs_dev; 47 47 }; 48 48 49 + struct unix_diag_rqlen { 50 + __u32 udiag_rqueue; 51 + __u32 udiag_wqueue; 52 + }; 53 + 49 54 #endif
+12 -1
net/unix/diag.c
··· 101 101 102 102 static int sk_diag_show_rqlen(struct sock *sk, struct sk_buff *nlskb) 103 103 { 104 - RTA_PUT_U32(nlskb, UNIX_DIAG_RQLEN, sk->sk_receive_queue.qlen); 104 + struct unix_diag_rqlen *rql; 105 + 106 + rql = UNIX_DIAG_PUT(nlskb, UNIX_DIAG_RQLEN, sizeof(*rql)); 107 + 108 + if (sk->sk_state == TCP_LISTEN) { 109 + rql->udiag_rqueue = sk->sk_receive_queue.qlen; 110 + rql->udiag_wqueue = sk->sk_max_ack_backlog; 111 + } else { 112 + rql->udiag_rqueue = (__u32)unix_inq_len(sk); 113 + rql->udiag_wqueue = (__u32)unix_outq_len(sk); 114 + } 115 + 105 116 return 0; 106 117 107 118 rtattr_failure: