Commit | Line | Data |
---|---|---|
1a59d1b8 | 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
7672d0b5 EP |
2 | /* |
3 | * connector.h | |
4 | * | |
a8018766 | 5 | * 2004-2005 Copyright (c) Evgeniy Polyakov <zbr@ioremap.net> |
7672d0b5 | 6 | * All rights reserved. |
7672d0b5 | 7 | */ |
7672d0b5 EP |
8 | #ifndef __CONNECTOR_H |
9 | #define __CONNECTOR_H | |
10 | ||
7672d0b5 | 11 | |
e65f7ee3 | 12 | #include <linux/refcount.h> |
7672d0b5 EP |
13 | |
14 | #include <linux/list.h> | |
15 | #include <linux/workqueue.h> | |
16 | ||
17 | #include <net/sock.h> | |
607ca46e | 18 | #include <uapi/linux/connector.h> |
7672d0b5 EP |
19 | |
20 | #define CN_CBQ_NAMELEN 32 | |
21 | ||
22 | struct cn_queue_dev { | |
23 | atomic_t refcnt; | |
24 | unsigned char name[CN_CBQ_NAMELEN]; | |
25 | ||
7672d0b5 EP |
26 | struct list_head queue_list; |
27 | spinlock_t queue_lock; | |
28 | ||
7672d0b5 EP |
29 | struct sock *nls; |
30 | }; | |
31 | ||
acd042bb | 32 | struct cn_callback_id { |
7672d0b5 | 33 | unsigned char name[CN_CBQ_NAMELEN]; |
7672d0b5 | 34 | struct cb_id id; |
acd042bb EP |
35 | }; |
36 | ||
7672d0b5 EP |
37 | struct cn_callback_entry { |
38 | struct list_head callback_entry; | |
e65f7ee3 | 39 | refcount_t refcnt; |
7672d0b5 EP |
40 | struct cn_queue_dev *pdev; |
41 | ||
acd042bb | 42 | struct cn_callback_id id; |
04f482fa | 43 | void (*callback) (struct cn_msg *, struct netlink_skb_parms *); |
7672d0b5 | 44 | |
6e32814b | 45 | u32 seq, group; |
7672d0b5 EP |
46 | }; |
47 | ||
7672d0b5 EP |
48 | struct cn_dev { |
49 | struct cb_id id; | |
50 | ||
51 | u32 seq, groups; | |
52 | struct sock *nls; | |
7672d0b5 EP |
53 | |
54 | struct cn_queue_dev *cbdev; | |
55 | }; | |
56 | ||
720594f6 MCC |
57 | /** |
58 | * cn_add_callback() - Registers new callback with connector core. | |
59 | * | |
60 | * @id: unique connector's user identifier. | |
61 | * It must be registered in connector.h for legal | |
62 | * in-kernel users. | |
63 | * @name: connector's callback symbolic name. | |
64 | * @callback: connector's callback. | |
65 | * parameters are %cn_msg and the sender's credentials | |
66 | */ | |
c18e6869 | 67 | int cn_add_callback(const struct cb_id *id, const char *name, |
008536e8 | 68 | void (*callback)(struct cn_msg *, struct netlink_skb_parms *)); |
720594f6 MCC |
69 | /** |
70 | * cn_del_callback() - Unregisters new callback with connector core. | |
71 | * | |
72 | * @id: unique connector's user identifier. | |
73 | */ | |
c18e6869 | 74 | void cn_del_callback(const struct cb_id *id); |
720594f6 MCC |
75 | |
76 | ||
77 | /** | |
78 | * cn_netlink_send_mult - Sends message to the specified groups. | |
79 | * | |
80 | * @msg: message header(with attached data). | |
81 | * @len: Number of @msg to be sent. | |
82 | * @portid: destination port. | |
83 | * If non-zero the message will be sent to the given port, | |
84 | * which should be set to the original sender. | |
85 | * @group: destination group. | |
86 | * If @portid and @group is zero, then appropriate group will | |
87 | * be searched through all registered connector users, and | |
88 | * message will be delivered to the group which was created | |
89 | * for user with the same ID as in @msg. | |
90 | * If @group is not zero, then message will be delivered | |
91 | * to the specified group. | |
92 | * @gfp_mask: GFP mask. | |
2aa1f7a1 AK |
93 | * @filter: Filter function to be used at netlink layer. |
94 | * @filter_data:Filter data to be supplied to the filter function | |
720594f6 MCC |
95 | * |
96 | * It can be safely called from softirq context, but may silently | |
97 | * fail under strong memory pressure. | |
98 | * | |
99 | * If there are no listeners for given group %-ESRCH can be returned. | |
100 | */ | |
2aa1f7a1 AK |
101 | int cn_netlink_send_mult(struct cn_msg *msg, u16 len, u32 portid, |
102 | u32 group, gfp_t gfp_mask, | |
403863e9 | 103 | netlink_filter_fn filter, |
2aa1f7a1 | 104 | void *filter_data); |
720594f6 MCC |
105 | |
106 | /** | |
3aa1141f | 107 | * cn_netlink_send - Sends message to the specified groups. |
720594f6 MCC |
108 | * |
109 | * @msg: message header(with attached data). | |
110 | * @portid: destination port. | |
111 | * If non-zero the message will be sent to the given port, | |
112 | * which should be set to the original sender. | |
113 | * @group: destination group. | |
114 | * If @portid and @group is zero, then appropriate group will | |
115 | * be searched through all registered connector users, and | |
116 | * message will be delivered to the group which was created | |
117 | * for user with the same ID as in @msg. | |
118 | * If @group is not zero, then message will be delivered | |
119 | * to the specified group. | |
120 | * @gfp_mask: GFP mask. | |
121 | * | |
122 | * It can be safely called from softirq context, but may silently | |
123 | * fail under strong memory pressure. | |
124 | * | |
125 | * If there are no listeners for given group %-ESRCH can be returned. | |
126 | */ | |
ac8f7330 | 127 | int cn_netlink_send(struct cn_msg *msg, u32 portid, u32 group, gfp_t gfp_mask); |
7672d0b5 | 128 | |
008536e8 | 129 | int cn_queue_add_callback(struct cn_queue_dev *dev, const char *name, |
c18e6869 | 130 | const struct cb_id *id, |
008536e8 | 131 | void (*callback)(struct cn_msg *, struct netlink_skb_parms *)); |
c18e6869 | 132 | void cn_queue_del_callback(struct cn_queue_dev *dev, const struct cb_id *id); |
04f482fa | 133 | void cn_queue_release_callback(struct cn_callback_entry *); |
7672d0b5 | 134 | |
008536e8 | 135 | struct cn_queue_dev *cn_queue_alloc_dev(const char *name, struct sock *); |
7672d0b5 EP |
136 | void cn_queue_free_dev(struct cn_queue_dev *dev); |
137 | ||
c18e6869 | 138 | int cn_cb_equal(const struct cb_id *, const struct cb_id *); |
7672d0b5 | 139 | |
7672d0b5 | 140 | #endif /* __CONNECTOR_H */ |