connector.h 3.5 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

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

47
#define CN_NETLINK_USERS		9
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

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

#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;
};

99
struct cn_callback_id {
E
Evgeniy Polyakov 已提交
100 101
	unsigned char name[CN_CBQ_NAMELEN];
	struct cb_id id;
102 103 104
};

struct cn_callback_data {
105
	struct sk_buff *skb;
106
	void (*callback) (struct cn_msg *, struct netlink_skb_parms *);
107 108

	void *free;
E
Evgeniy Polyakov 已提交
109 110 111 112
};

struct cn_callback_entry {
	struct list_head callback_entry;
113
	struct work_struct work;
E
Evgeniy Polyakov 已提交
114 115
	struct cn_queue_dev *pdev;

116 117
	struct cn_callback_id id;
	struct cn_callback_data data;
E
Evgeniy Polyakov 已提交
118

119
	u32 seq, group;
E
Evgeniy Polyakov 已提交
120 121 122 123 124 125 126
};

struct cn_dev {
	struct cb_id id;

	u32 seq, groups;
	struct sock *nls;
127
	void (*input) (struct sk_buff *skb);
E
Evgeniy Polyakov 已提交
128 129 130 131

	struct cn_queue_dev *cbdev;
};

132 133
int cn_add_callback(struct cb_id *id, const char *name,
		    void (*callback)(struct cn_msg *, struct netlink_skb_parms *));
E
Evgeniy Polyakov 已提交
134
void cn_del_callback(struct cb_id *);
A
Al Viro 已提交
135
int cn_netlink_send(struct cn_msg *, u32, gfp_t);
E
Evgeniy Polyakov 已提交
136

137 138 139
int cn_queue_add_callback(struct cn_queue_dev *dev, const char *name,
			  struct cb_id *id,
			  void (*callback)(struct cn_msg *, struct netlink_skb_parms *));
E
Evgeniy Polyakov 已提交
140 141
void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id);

142
struct cn_queue_dev *cn_queue_alloc_dev(const char *name, struct sock *);
E
Evgeniy Polyakov 已提交
143 144 145 146
void cn_queue_free_dev(struct cn_queue_dev *dev);

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

D
David Howells 已提交
147
void cn_queue_wrapper(struct work_struct *work);
148

E
Evgeniy Polyakov 已提交
149 150
#endif				/* __KERNEL__ */
#endif				/* __CONNECTOR_H */