All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pavel Emelyanov <xemul@parallels.com>
To: David Miller <davem@davemloft.net>,
	Linux Netdev List <netdev@vger.kernel.org>
Subject: [PATCH 7/13] unix_diag: Dumping exact socket core
Date: Thu, 15 Dec 2011 16:45:07 +0400	[thread overview]
Message-ID: <4EE9EBD3.8010103@parallels.com> (raw)
In-Reply-To: <4EE9EB2A.4040909@parallels.com>

The socket inode is used as a key for lookup. This is effectively
the only really unique ID of a unix socket, but using this for
search currently has one problem -- it is O(number of sockets) :(

Does it worth fixing this lookup or inventing some other ID for
unix sockets?

Signed-off-by: Pavel Emelyanov <xemul@parallels.com>

---
 net/unix/diag.c |   67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 66 insertions(+), 1 deletions(-)

diff --git a/net/unix/diag.c b/net/unix/diag.c
index 86d85ab..d7bd48c 100644
--- a/net/unix/diag.c
+++ b/net/unix/diag.c
@@ -89,11 +89,76 @@ done:
 	return skb->len;
 }
 
+static struct sock *unix_lookup_by_ino(int ino)
+{
+	int i;
+	struct sock *sk;
+
+	spin_lock(&unix_table_lock);
+	for (i = 0; i <= UNIX_HASH_SIZE; i++) {
+		struct hlist_node *node;
+
+		sk_for_each(sk, node, &unix_socket_table[i])
+			if (ino == sock_i_ino(sk)) {
+				sock_hold(sk);
+				spin_unlock(&unix_table_lock);
+
+				return sk;
+			}
+	}
+
+	spin_unlock(&unix_table_lock);
+	return NULL;
+}
+
 static int unix_diag_get_exact(struct sk_buff *in_skb,
 			       const struct nlmsghdr *nlh,
 			       struct unix_diag_req *req)
 {
-	return -EAFNOSUPPORT;
+	int err = -EINVAL;
+	struct sock *sk;
+	struct sk_buff *rep;
+	unsigned int extra_len;
+
+	if (req->udiag_ino == 0)
+		goto out_nosk;
+
+	sk = unix_lookup_by_ino(req->udiag_ino);
+	err = -ENOENT;
+	if (sk == NULL)
+		goto out_nosk;
+
+	err = sock_diag_check_cookie(sk, req->udiag_cookie);
+	if (err)
+		goto out;
+
+	extra_len = 256;
+again:
+	err = -ENOMEM;
+	rep = alloc_skb(NLMSG_SPACE((sizeof(struct unix_diag_msg) + extra_len)),
+			GFP_KERNEL);
+	if (!rep)
+		goto out;
+
+	err = sk_diag_fill(sk, rep, req, NETLINK_CB(in_skb).pid,
+			   nlh->nlmsg_seq, 0, req->udiag_ino);
+	if (err < 0) {
+		kfree_skb(rep);
+		extra_len += 256;
+		if (extra_len >= PAGE_SIZE)
+			goto out;
+
+		goto again;
+	}
+	err = netlink_unicast(sock_diag_nlsk, rep, NETLINK_CB(in_skb).pid,
+			      MSG_DONTWAIT);
+	if (err > 0)
+		err = 0;
+out:
+	if (sk)
+		sock_put(sk);
+out_nosk:
+	return err;
 }
 
 static int unix_diag_handler_dump(struct sk_buff *skb, struct nlmsghdr *h)
-- 
1.5.5.6

  parent reply	other threads:[~2011-12-15 12:45 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-15 12:42 [PATCH 0/13] Dumping AF_UNIX sockets via netlink Pavel Emelyanov
2011-12-15 12:42 ` [PATCH 1/13] sock_diag: Move the SOCK_DIAG_BY_FAMILY cmd declaration Pavel Emelyanov
2011-12-15 12:43 ` [PATCH 2/13] sock_diag: Fix module netlink aliases Pavel Emelyanov
2011-12-15 12:43 ` [PATCH 3/13] sock_diag: Generalize requests cookies managements Pavel Emelyanov
2011-12-15 12:44 ` [PATCH 4/13] af_unix: Export stuff required for diag module Pavel Emelyanov
2011-12-15 12:44 ` [PATCH 5/13] unix_diag: Basic module skeleton Pavel Emelyanov
2011-12-15 12:44 ` [PATCH 6/13] unix_diag: Dumping all sockets core Pavel Emelyanov
2011-12-15 12:45 ` Pavel Emelyanov [this message]
2011-12-15 12:45 ` [PATCH 8/13] unix_diag: Unix socket name NLA Pavel Emelyanov
2011-12-15 12:45 ` [PATCH 9/13] unix_diag: Unix inode info NLA Pavel Emelyanov
2011-12-15 12:45 ` [PATCH 10/13] unix_diag: Unix peer inode NLA Pavel Emelyanov
2011-12-15 12:46 ` [PATCH 11/13] unix_diag: Pending connections IDs NLA Pavel Emelyanov
2011-12-15 12:46 ` [PATCH 12/13] unix_diag: Receive queue lenght NLA Pavel Emelyanov
2011-12-15 12:46 ` [PATCH 13/13] unix_diag: Write it into kbuild Pavel Emelyanov
2011-12-15 13:28 ` [PATCH] iproute: Dump unix sockets via netlink Pavel Emelyanov
2012-01-20 20:51   ` Stephen Hemminger
2011-12-16 18:50 ` [PATCH 0/13] Dumping AF_UNIX " David Miller
2011-12-17  9:54   ` Pavel Emelyanov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4EE9EBD3.8010103@parallels.com \
    --to=xemul@parallels.com \
    --cc=davem@davemloft.net \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.