1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#ifndef __CONNECTOR_H
23#define __CONNECTOR_H
24
25#include <linux/types.h>
26
27#define CN_IDX_CONNECTOR 0xffffffff
28#define CN_VAL_CONNECTOR 0xffffffff
29
30
31
32
33#define CN_IDX_PROC 0x1
34#define CN_VAL_PROC 0x1
35#define CN_IDX_CIFS 0x2
36#define CN_VAL_CIFS 0x1
37#define CN_W1_IDX 0x3
38#define CN_W1_VAL 0x1
39#define CN_IDX_V86D 0x4
40#define CN_VAL_V86D_UVESAFB 0x1
41#define CN_IDX_BB 0x5
42#define CN_DST_IDX 0x6
43#define CN_DST_VAL 0x1
44#define CN_IDX_DM 0x7
45#define CN_VAL_DM_USERSPACE_LOG 0x1
46
47#define CN_NETLINK_USERS 8
48
49
50
51
52#define CONNECTOR_MAX_MSG_SIZE 16384
53
54
55
56
57
58
59
60struct cb_id {
61 __u32 idx;
62 __u32 val;
63};
64
65struct cn_msg {
66 struct cb_id id;
67
68 __u32 seq;
69 __u32 ack;
70
71 __u16 len;
72 __u16 flags;
73 __u8 data[0];
74};
75
76
77
78
79
80struct cn_notify_req {
81 __u32 first;
82 __u32 range;
83};
84
85
86
87
88
89
90
91
92struct cn_ctl_msg {
93 __u32 idx_notify_num;
94 __u32 val_notify_num;
95 __u32 group;
96 __u32 len;
97 __u8 data[0];
98};
99
100#ifdef __KERNEL__
101
102#include <asm/atomic.h>
103
104#include <linux/list.h>
105#include <linux/workqueue.h>
106
107#include <net/sock.h>
108
109#define CN_CBQ_NAMELEN 32
110
111struct cn_queue_dev {
112 atomic_t refcnt;
113 unsigned char name[CN_CBQ_NAMELEN];
114
115 struct workqueue_struct *cn_queue;
116
117 struct work_struct wq_creation;
118
119 atomic_t wq_requested;
120
121 wait_queue_head_t wq_created;
122
123 struct list_head queue_list;
124 spinlock_t queue_lock;
125
126 struct sock *nls;
127};
128
129struct cn_callback_id {
130 unsigned char name[CN_CBQ_NAMELEN];
131 struct cb_id id;
132};
133
134struct cn_callback_data {
135 struct sk_buff *skb;
136 void (*callback) (struct cn_msg *, struct netlink_skb_parms *);
137
138 void *free;
139};
140
141struct cn_callback_entry {
142 struct list_head callback_entry;
143 struct work_struct work;
144 struct cn_queue_dev *pdev;
145
146 struct cn_callback_id id;
147 struct cn_callback_data data;
148
149 u32 seq, group;
150};
151
152struct cn_ctl_entry {
153 struct list_head notify_entry;
154 struct cn_ctl_msg *msg;
155};
156
157struct cn_dev {
158 struct cb_id id;
159
160 u32 seq, groups;
161 struct sock *nls;
162 void (*input) (struct sk_buff *skb);
163
164 struct cn_queue_dev *cbdev;
165};
166
167int cn_add_callback(struct cb_id *, char *, void (*callback) (struct cn_msg *, struct netlink_skb_parms *));
168void cn_del_callback(struct cb_id *);
169int cn_netlink_send(struct cn_msg *, u32, gfp_t);
170
171int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, void (*callback)(struct cn_msg *, struct netlink_skb_parms *));
172void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id);
173
174int queue_cn_work(struct cn_callback_entry *cbq, struct work_struct *work);
175
176struct cn_queue_dev *cn_queue_alloc_dev(char *name, struct sock *);
177void cn_queue_free_dev(struct cn_queue_dev *dev);
178
179int cn_cb_equal(struct cb_id *, struct cb_id *);
180
181void cn_queue_wrapper(struct work_struct *work);
182
183#endif
184#endif
185