2
* Event notification code.
3
* (C) 2005 FUJITA Tomonori <tomof@acm.org>
4
* This code is licenced under the GPL.
6
* Some functions are based on audit code.
11
#include "iscsi_dbg.h"
13
static struct sock *nl;
16
static int event_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
21
pid = NETLINK_CREDS(skb)->pid;
22
uid = NETLINK_CREDS(skb)->uid;
24
data = NLMSG_DATA(nlh);
31
static void event_recv_skb(struct sk_buff *skb)
37
while (skb->len >= NLMSG_SPACE(0)) {
38
nlh = (struct nlmsghdr *)skb->data;
39
if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len)
41
rlen = NLMSG_ALIGN(nlh->nlmsg_len);
44
if ((err = event_recv_msg(skb, nlh))) {
45
netlink_ack(skb, nlh, -err);
46
} else if (nlh->nlmsg_flags & NLM_F_ACK)
47
netlink_ack(skb, nlh, 0);
52
static int notify(void *data, int len, int gfp_mask)
58
if (!(skb = alloc_skb(NLMSG_SPACE(len), gfp_mask)))
61
nlh = __nlmsg_put(skb, ietd_pid, seq++, NLMSG_DONE, len - sizeof(*nlh), 0);
63
memcpy(NLMSG_DATA(nlh), data, len);
65
return netlink_unicast(nl, skb, ietd_pid, 0);
68
int event_send(u32 tid, u64 sid, u32 cid, u32 state, int atomic)
71
struct iet_event event;
78
err = notify(&event, NLMSG_SPACE(sizeof(struct iet_event)), 0);
85
nl = netlink_kernel_create(&init_net, NETLINK_IET, 1, event_recv_skb,
95
netlink_kernel_release(nl);