summaryrefslogtreecommitdiff
path: root/net/core/sock_diag.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2013-04-29 13:22:07 -0400
committerDavid S. Miller <davem@davemloft.net>2013-04-29 13:22:07 -0400
commit13ccf043ce85b64802a57bd3e47ca1505b6bf275 (patch)
tree16093300e9da78c1c3e272283ae4886d7b3984e8 /net/core/sock_diag.c
parentfdd5f43a1b53a844d04c6eda2cbdbe044b629ae7 (diff)
parente8d9612c181b1a68ba5f71384629343466f1bd13 (diff)
Merge branch 'pktdiag'
Nicolas Dichtel says: ==================== The goal of this patchset is to be able to get all infos exported via the /proc/net/packet and also beeing able to get filter associated to af_packet sockets. As usual, the patch against iproute2 will be sent once the patches are included and net-next merged. I can send it on demand. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/sock_diag.c')
-rw-r--r--net/core/sock_diag.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/net/core/sock_diag.c b/net/core/sock_diag.c
index a29e90cf36b7..d5bef0b0f639 100644
--- a/net/core/sock_diag.c
+++ b/net/core/sock_diag.c
@@ -49,6 +49,39 @@ int sock_diag_put_meminfo(struct sock *sk, struct sk_buff *skb, int attrtype)
}
EXPORT_SYMBOL_GPL(sock_diag_put_meminfo);
+int sock_diag_put_filterinfo(struct user_namespace *user_ns, struct sock *sk,
+ struct sk_buff *skb, int attrtype)
+{
+ struct nlattr *attr;
+ struct sk_filter *filter;
+ unsigned int len;
+ int err = 0;
+
+ if (!ns_capable(user_ns, CAP_NET_ADMIN)) {
+ nla_reserve(skb, attrtype, 0);
+ return 0;
+ }
+
+ rcu_read_lock();
+
+ filter = rcu_dereference(sk->sk_filter);
+ len = filter ? filter->len * sizeof(struct sock_filter) : 0;
+
+ attr = nla_reserve(skb, attrtype, len);
+ if (attr == NULL) {
+ err = -EMSGSIZE;
+ goto out;
+ }
+
+ if (filter)
+ memcpy(nla_data(attr), filter->insns, len);
+
+out:
+ rcu_read_unlock();
+ return err;
+}
+EXPORT_SYMBOL(sock_diag_put_filterinfo);
+
void sock_diag_register_inet_compat(int (*fn)(struct sk_buff *skb, struct nlmsghdr *nlh))
{
mutex_lock(&sock_diag_table_mutex);