diff options
-rw-r--r-- | include/linux/unix_diag.h | 5 | ||||
-rw-r--r-- | net/unix/diag.c | 13 |
2 files changed, 17 insertions, 1 deletions
diff --git a/include/linux/unix_diag.h b/include/linux/unix_diag.h index 93fdb782468a..b1d2bf16b33c 100644 --- a/include/linux/unix_diag.h +++ b/include/linux/unix_diag.h | |||
@@ -46,4 +46,9 @@ struct unix_diag_vfs { | |||
46 | __u32 udiag_vfs_dev; | 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 | #endif | 54 | #endif |
diff --git a/net/unix/diag.c b/net/unix/diag.c index 98945f29da4f..6b7697fd911b 100644 --- a/net/unix/diag.c +++ b/net/unix/diag.c | |||
@@ -101,7 +101,18 @@ rtattr_failure: | |||
101 | 101 | ||
102 | static int sk_diag_show_rqlen(struct sock *sk, struct sk_buff *nlskb) | 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 | return 0; | 116 | return 0; |
106 | 117 | ||
107 | rtattr_failure: | 118 | rtattr_failure: |