unix_diag: Basic module skeleton
Includes basic module_init/_exit functionality, dump/get_exact stubs and declares the basic API structures for request and response. Signed-off-by: Pavel Emelyanov <xemul@parallels.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
fa7ff56f75
commit
22931d3b90
24
include/linux/unix_diag.h
Normal file
24
include/linux/unix_diag.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#ifndef __UNIX_DIAG_H__
|
||||||
|
#define __UNIX_DIAG_H__
|
||||||
|
|
||||||
|
struct unix_diag_req {
|
||||||
|
__u8 sdiag_family;
|
||||||
|
__u8 sdiag_protocol;
|
||||||
|
__u16 pad;
|
||||||
|
__u32 udiag_states;
|
||||||
|
__u32 udiag_ino;
|
||||||
|
__u32 udiag_show;
|
||||||
|
__u32 udiag_cookie[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct unix_diag_msg {
|
||||||
|
__u8 udiag_family;
|
||||||
|
__u8 udiag_type;
|
||||||
|
__u8 udiag_state;
|
||||||
|
__u8 pad;
|
||||||
|
|
||||||
|
__u32 udiag_ino;
|
||||||
|
__u32 udiag_cookie[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
57
net/unix/diag.c
Normal file
57
net/unix/diag.c
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
#include <linux/types.h>
|
||||||
|
#include <linux/spinlock.h>
|
||||||
|
#include <linux/sock_diag.h>
|
||||||
|
#include <linux/unix_diag.h>
|
||||||
|
#include <linux/skbuff.h>
|
||||||
|
#include <net/netlink.h>
|
||||||
|
#include <net/af_unix.h>
|
||||||
|
#include <net/tcp_states.h>
|
||||||
|
|
||||||
|
#define UNIX_DIAG_PUT(skb, attrtype, attrlen) \
|
||||||
|
RTA_DATA(__RTA_PUT(skb, attrtype, attrlen))
|
||||||
|
|
||||||
|
static int unix_diag_dump(struct sk_buff *skb, struct netlink_callback *cb)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int unix_diag_get_exact(struct sk_buff *in_skb,
|
||||||
|
const struct nlmsghdr *nlh,
|
||||||
|
struct unix_diag_req *req)
|
||||||
|
{
|
||||||
|
return -EAFNOSUPPORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int unix_diag_handler_dump(struct sk_buff *skb, struct nlmsghdr *h)
|
||||||
|
{
|
||||||
|
int hdrlen = sizeof(struct unix_diag_req);
|
||||||
|
|
||||||
|
if (nlmsg_len(h) < hdrlen)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (h->nlmsg_flags & NLM_F_DUMP)
|
||||||
|
return netlink_dump_start(sock_diag_nlsk, skb, h,
|
||||||
|
unix_diag_dump, NULL, 0);
|
||||||
|
else
|
||||||
|
return unix_diag_get_exact(skb, h, (struct unix_diag_req *)NLMSG_DATA(h));
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct sock_diag_handler unix_diag_handler = {
|
||||||
|
.family = AF_UNIX,
|
||||||
|
.dump = unix_diag_handler_dump,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init unix_diag_init(void)
|
||||||
|
{
|
||||||
|
return sock_diag_register(&unix_diag_handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __exit unix_diag_exit(void)
|
||||||
|
{
|
||||||
|
sock_diag_unregister(&unix_diag_handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
module_init(unix_diag_init);
|
||||||
|
module_exit(unix_diag_exit);
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_NETLINK, NETLINK_SOCK_DIAG, 1 /* AF_LOCAL */);
|
Reference in New Issue
Block a user