connector.h 3.9 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 25 26 27 28 29
/*
 * 	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

#include <asm/types.h>

#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
M
Matt Helsley 已提交
41

42
#define CN_NETLINK_USERS		5
E
Evgeniy Polyakov 已提交
43 44 45 46

/*
 * Maximum connector's message size.
 */
47
#define CONNECTOR_MAX_MSG_SIZE		16384
E
Evgeniy Polyakov 已提交
48 49 50 51 52 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 116 117

/*
 * 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;

	struct list_head queue_list;
	spinlock_t queue_lock;

	struct sock *nls;
};

118
struct cn_callback_id {
E
Evgeniy Polyakov 已提交
119 120
	unsigned char name[CN_CBQ_NAMELEN];
	struct cb_id id;
121 122 123 124 125 126 127
};

struct cn_callback_data {
	void (*destruct_data) (void *);
	void *ddata;
	
	void *callback_priv;
E
Evgeniy Polyakov 已提交
128
	void (*callback) (void *);
129 130

	void *free;
E
Evgeniy Polyakov 已提交
131 132 133 134 135
};

struct cn_callback_entry {
	struct list_head callback_entry;
	struct cn_callback *cb;
136
	struct work_struct work;
E
Evgeniy Polyakov 已提交
137 138
	struct cn_queue_dev *pdev;

139 140
	struct cn_callback_id id;
	struct cn_callback_data data;
E
Evgeniy Polyakov 已提交
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155

	int seq, group;
	struct sock *nls;
};

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;
156
	void (*input) (struct sk_buff *skb);
E
Evgeniy Polyakov 已提交
157 158 159 160 161 162

	struct cn_queue_dev *cbdev;
};

int cn_add_callback(struct cb_id *, char *, void (*callback) (void *));
void cn_del_callback(struct cb_id *);
A
Al Viro 已提交
163
int cn_netlink_send(struct cn_msg *, u32, gfp_t);
E
Evgeniy Polyakov 已提交
164

165
int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, void (*callback)(void *));
E
Evgeniy Polyakov 已提交
166 167 168 169 170 171 172
void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id);

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 已提交
173
void cn_queue_wrapper(struct work_struct *work);
174

E
Evgeniy Polyakov 已提交
175 176 177 178
extern int cn_already_initialized;

#endif				/* __KERNEL__ */
#endif				/* __CONNECTOR_H */