connector.h 4.4 KB
Newer Older
E
Evgeniy Polyakov 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/*
 * 	connector.h
 * 
 * 2004-2005 Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru>
 * All rights reserved.
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef __CONNECTOR_H
#define __CONNECTOR_H

25
#include <linux/types.h>
E
Evgeniy Polyakov 已提交
26 27 28 29

#define CN_IDX_CONNECTOR		0xffffffff
#define CN_VAL_CONNECTOR		0xffffffff

M
Matt Helsley 已提交
30 31 32 33 34
/*
 * Process Events connector unique ids -- used for message routing
 */
#define CN_IDX_PROC			0x1
#define CN_VAL_PROC			0x1
35 36
#define CN_IDX_CIFS			0x2
#define CN_VAL_CIFS                     0x1
37 38
#define CN_W1_IDX			0x3	/* w1 communication */
#define CN_W1_VAL			0x1
39 40
#define CN_IDX_V86D			0x4
#define CN_VAL_V86D_UVESAFB		0x1
41
#define CN_IDX_BB			0x5	/* BlackBoard, from the TSP GPL sampling framework */
E
Evgeniy Polyakov 已提交
42 43
#define CN_DST_IDX			0x6
#define CN_DST_VAL			0x1
J
Jonthan Brassow 已提交
44 45
#define CN_IDX_DM			0x7	/* Device Mapper */
#define CN_VAL_DM_USERSPACE_LOG		0x1
M
Matt Helsley 已提交
46

J
Jonthan Brassow 已提交
47
#define CN_NETLINK_USERS		8
E
Evgeniy Polyakov 已提交
48 49 50 51

/*
 * Maximum connector's message size.
 */
52
#define CONNECTOR_MAX_MSG_SIZE		16384
E
Evgeniy Polyakov 已提交
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115

/*
 * idx and val are unique identifiers which 
 * are used for message routing and 
 * must be registered in connector.h for in-kernel usage.
 */

struct cb_id {
	__u32 idx;
	__u32 val;
};

struct cn_msg {
	struct cb_id id;

	__u32 seq;
	__u32 ack;

	__u16 len;		/* Length of the following data */
	__u16 flags;
	__u8 data[0];
};

/*
 * Notify structure - requests notification about
 * registering/unregistering idx/val in range [first, first+range].
 */
struct cn_notify_req {
	__u32 first;
	__u32 range;
};

/*
 * Main notification control message
 * *_notify_num 	- number of appropriate cn_notify_req structures after 
 *				this struct.
 * group 		- notification receiver's idx.
 * len 			- total length of the attached data.
 */
struct cn_ctl_msg {
	__u32 idx_notify_num;
	__u32 val_notify_num;
	__u32 group;
	__u32 len;
	__u8 data[0];
};

#ifdef __KERNEL__

#include <asm/atomic.h>

#include <linux/list.h>
#include <linux/workqueue.h>

#include <net/sock.h>

#define CN_CBQ_NAMELEN		32

struct cn_queue_dev {
	atomic_t refcnt;
	unsigned char name[CN_CBQ_NAMELEN];

	struct workqueue_struct *cn_queue;
116 117 118 119 120 121
	/* Sent to kevent to create cn_queue only when needed */
	struct work_struct wq_creation;
	/* Tell if the wq_creation job is pending/completed */
	atomic_t wq_requested;
	/* Wait for cn_queue to be created */
	wait_queue_head_t wq_created;
E
Evgeniy Polyakov 已提交
122 123 124 125 126 127 128

	struct list_head queue_list;
	spinlock_t queue_lock;

	struct sock *nls;
};

129
struct cn_callback_id {
E
Evgeniy Polyakov 已提交
130 131
	unsigned char name[CN_CBQ_NAMELEN];
	struct cb_id id;
132 133 134
};

struct cn_callback_data {
135
	struct sk_buff *skb;
136
	void (*callback) (struct cn_msg *, struct netlink_skb_parms *);
137 138

	void *free;
E
Evgeniy Polyakov 已提交
139 140 141 142
};

struct cn_callback_entry {
	struct list_head callback_entry;
143
	struct work_struct work;
E
Evgeniy Polyakov 已提交
144 145
	struct cn_queue_dev *pdev;

146 147
	struct cn_callback_id id;
	struct cn_callback_data data;
E
Evgeniy Polyakov 已提交
148

149
	u32 seq, group;
E
Evgeniy Polyakov 已提交
150 151 152 153 154 155 156 157 158 159 160 161
};

struct cn_ctl_entry {
	struct list_head notify_entry;
	struct cn_ctl_msg *msg;
};

struct cn_dev {
	struct cb_id id;

	u32 seq, groups;
	struct sock *nls;
162
	void (*input) (struct sk_buff *skb);
E
Evgeniy Polyakov 已提交
163 164 165 166

	struct cn_queue_dev *cbdev;
};

167
int cn_add_callback(struct cb_id *, char *, void (*callback) (struct cn_msg *, struct netlink_skb_parms *));
E
Evgeniy Polyakov 已提交
168
void cn_del_callback(struct cb_id *);
A
Al Viro 已提交
169
int cn_netlink_send(struct cn_msg *, u32, gfp_t);
E
Evgeniy Polyakov 已提交
170

171
int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, void (*callback)(struct cn_msg *, struct netlink_skb_parms *));
E
Evgeniy Polyakov 已提交
172 173
void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id);

174 175
int queue_cn_work(struct cn_callback_entry *cbq, struct work_struct *work);

E
Evgeniy Polyakov 已提交
176 177 178 179 180
struct cn_queue_dev *cn_queue_alloc_dev(char *name, struct sock *);
void cn_queue_free_dev(struct cn_queue_dev *dev);

int cn_cb_equal(struct cb_id *, struct cb_id *);

D
David Howells 已提交
181
void cn_queue_wrapper(struct work_struct *work);
182

E
Evgeniy Polyakov 已提交
183 184
#endif				/* __KERNEL__ */
#endif				/* __CONNECTOR_H */