1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * connector.h 4 * 5 * 2004-2005 Copyright (c) Evgeniy Polyakov <[email protected]> 6 * All rights reserved. 7 */ 8 #ifndef __CONNECTOR_H 9 #define __CONNECTOR_H 10 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 32 21 22 struct 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 32 struct cn_callback_id { 33 unsigned char name[CN_CBQ_NAMELEN]; 34 struct cb_id id; 35 }; 36 37 struct 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 48 struct cn_dev { 49 struct cb_id id; 50 51 u32 seq, groups; 52 struct sock *nls; 53 void (*input) (struct sk_buff *skb); 54 55 struct cn_queue_dev *cbdev; 56 }; 57 58 /** 59 * cn_add_callback() - Registers new callback with connector core. 60 * 61 * @id: unique connector's user identifier. 62 * It must be registered in connector.h for legal 63 * in-kernel users. 64 * @name: connector's callback symbolic name. 65 * @callback: connector's callback. 66 * parameters are %cn_msg and the sender's credentials 67 */ 68 int cn_add_callback(struct cb_id *id, const char *name, 69 void (*callback)(struct cn_msg *, struct netlink_skb_parms *)); 70 /** 71 * cn_del_callback() - Unregisters new callback with connector core. 72 * 73 * @id: unique connector's user identifier. 74 */ 75 void cn_del_callback(struct cb_id *id); 76 77 78 /** 79 * cn_netlink_send_mult - Sends message to the specified groups. 80 * 81 * @msg: message header(with attached data). 82 * @len: Number of @msg to be sent. 83 * @portid: destination port. 84 * If non-zero the message will be sent to the given port, 85 * which should be set to the original sender. 86 * @group: destination group. 87 * If @portid and @group is zero, then appropriate group will 88 * be searched through all registered connector users, and 89 * message will be delivered to the group which was created 90 * for user with the same ID as in @msg. 91 * If @group is not zero, then message will be delivered 92 * to the specified group. 93 * @gfp_mask: GFP mask. 94 * 95 * It can be safely called from softirq context, but may silently 96 * fail under strong memory pressure. 97 * 98 * If there are no listeners for given group %-ESRCH can be returned. 99 */ 100 int cn_netlink_send_mult(struct cn_msg *msg, u16 len, u32 portid, u32 group, gfp_t gfp_mask); 101 102 /** 103 * cn_netlink_send_mult - Sends message to the specified groups. 104 * 105 * @msg: message header(with attached data). 106 * @portid: destination port. 107 * If non-zero the message will be sent to the given port, 108 * which should be set to the original sender. 109 * @group: destination group. 110 * If @portid and @group is zero, then appropriate group will 111 * be searched through all registered connector users, and 112 * message will be delivered to the group which was created 113 * for user with the same ID as in @msg. 114 * If @group is not zero, then message will be delivered 115 * to the specified group. 116 * @gfp_mask: GFP mask. 117 * 118 * It can be safely called from softirq context, but may silently 119 * fail under strong memory pressure. 120 * 121 * If there are no listeners for given group %-ESRCH can be returned. 122 */ 123 int cn_netlink_send(struct cn_msg *msg, u32 portid, u32 group, gfp_t gfp_mask); 124 125 int cn_queue_add_callback(struct cn_queue_dev *dev, const char *name, 126 struct cb_id *id, 127 void (*callback)(struct cn_msg *, struct netlink_skb_parms *)); 128 void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id); 129 void cn_queue_release_callback(struct cn_callback_entry *); 130 131 struct cn_queue_dev *cn_queue_alloc_dev(const char *name, struct sock *); 132 void cn_queue_free_dev(struct cn_queue_dev *dev); 133 134 int cn_cb_equal(struct cb_id *, struct cb_id *); 135 136 #endif /* __CONNECTOR_H */ 137