brintos

brintos / linux-shallow public Read only

0
0
Text · 4.0 KiB · 70bc116 Raw
141 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 * 	connector.h4 * 5 * 2004-2005 Copyright (c) Evgeniy Polyakov <zbr@ioremap.net>6 * All rights reserved.7 */8#ifndef __CONNECTOR_H9#define __CONNECTOR_H10 11 12#include <linux/refcount.h>13 14#include <linux/list.h>15#include <linux/workqueue.h>16 17#include <net/sock.h>18#include <uapi/linux/connector.h>19 20#define CN_CBQ_NAMELEN		3221 22struct cn_queue_dev {23	atomic_t refcnt;24	unsigned char name[CN_CBQ_NAMELEN];25 26	struct list_head queue_list;27	spinlock_t queue_lock;28 29	struct sock *nls;30};31 32struct cn_callback_id {33	unsigned char name[CN_CBQ_NAMELEN];34	struct cb_id id;35};36 37struct cn_callback_entry {38	struct list_head callback_entry;39	refcount_t refcnt;40	struct cn_queue_dev *pdev;41 42	struct cn_callback_id id;43	void (*callback) (struct cn_msg *, struct netlink_skb_parms *);44 45	u32 seq, group;46};47 48struct cn_dev {49	struct cb_id id;50 51	u32 seq, groups;52	struct sock *nls;53 54	struct cn_queue_dev *cbdev;55};56 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 legal62 *		in-kernel users.63 * @name:	connector's callback symbolic name.64 * @callback:	connector's callback.65 * 		parameters are %cn_msg and the sender's credentials66 */67int cn_add_callback(const struct cb_id *id, const char *name,68		    void (*callback)(struct cn_msg *, struct netlink_skb_parms *));69/**70 * cn_del_callback() - Unregisters new callback with connector core.71 *72 * @id:		unique connector's user identifier.73 */74void cn_del_callback(const struct cb_id *id);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 will87 *		be searched through all registered connector users, and88 *		message will be delivered to the group which was created89 *		for user with the same ID as in @msg.90 *		If @group is not zero, then message will be delivered91 *		to the specified group.92 * @gfp_mask:	GFP mask.93 * @filter:     Filter function to be used at netlink layer.94 * @filter_data:Filter data to be supplied to the filter function95 *96 * It can be safely called from softirq context, but may silently97 * fail under strong memory pressure.98 *99 * If there are no listeners for given group %-ESRCH can be returned.100 */101int cn_netlink_send_mult(struct cn_msg *msg, u16 len, u32 portid,102			 u32 group, gfp_t gfp_mask,103			 netlink_filter_fn filter,104			 void *filter_data);105 106/**107 * cn_netlink_send - Sends message to the specified groups.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 will115 *		be searched through all registered connector users, and116 *		message will be delivered to the group which was created117 *		for user with the same ID as in @msg.118 *		If @group is not zero, then message will be delivered119 *		to the specified group.120 * @gfp_mask:	GFP mask.121 *122 * It can be safely called from softirq context, but may silently123 * fail under strong memory pressure.124 *125 * If there are no listeners for given group %-ESRCH can be returned.126 */127int cn_netlink_send(struct cn_msg *msg, u32 portid, u32 group, gfp_t gfp_mask);128 129int cn_queue_add_callback(struct cn_queue_dev *dev, const char *name,130			  const struct cb_id *id,131			  void (*callback)(struct cn_msg *, struct netlink_skb_parms *));132void cn_queue_del_callback(struct cn_queue_dev *dev, const struct cb_id *id);133void cn_queue_release_callback(struct cn_callback_entry *);134 135struct cn_queue_dev *cn_queue_alloc_dev(const char *name, struct sock *);136void cn_queue_free_dev(struct cn_queue_dev *dev);137 138int cn_cb_equal(const struct cb_id *, const struct cb_id *);139 140#endif				/* __CONNECTOR_H */141