diff --git a/[refs] b/[refs] index ee58c38e74e8..efcc753a73b8 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 885ee74d5d3058e4a904671ed7929c9540c95fa5 +refs/heads/master: c9da99e6475f92653139e43f3c30c0cd011a0fd8 diff --git a/trunk/include/linux/unix_diag.h b/trunk/include/linux/unix_diag.h index 93fdb782468a..b1d2bf16b33c 100644 --- a/trunk/include/linux/unix_diag.h +++ b/trunk/include/linux/unix_diag.h @@ -46,4 +46,9 @@ struct unix_diag_vfs { __u32 udiag_vfs_dev; }; +struct unix_diag_rqlen { + __u32 udiag_rqueue; + __u32 udiag_wqueue; +}; + #endif diff --git a/trunk/net/unix/diag.c b/trunk/net/unix/diag.c index 98945f29da4f..6b7697fd911b 100644 --- a/trunk/net/unix/diag.c +++ b/trunk/net/unix/diag.c @@ -101,7 +101,18 @@ static int sk_diag_dump_icons(struct sock *sk, struct sk_buff *nlskb) static int sk_diag_show_rqlen(struct sock *sk, struct sk_buff *nlskb) { - RTA_PUT_U32(nlskb, UNIX_DIAG_RQLEN, sk->sk_receive_queue.qlen); + struct unix_diag_rqlen *rql; + + rql = UNIX_DIAG_PUT(nlskb, UNIX_DIAG_RQLEN, sizeof(*rql)); + + if (sk->sk_state == TCP_LISTEN) { + rql->udiag_rqueue = sk->sk_receive_queue.qlen; + rql->udiag_wqueue = sk->sk_max_ack_backlog; + } else { + rql->udiag_rqueue = (__u32)unix_inq_len(sk); + rql->udiag_wqueue = (__u32)unix_outq_len(sk); + } + return 0; rtattr_failure: