11a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 27672d0b5SEvgeniy Polyakov /* 37672d0b5SEvgeniy Polyakov * connector.h 47672d0b5SEvgeniy Polyakov * 5a8018766SEvgeniy Polyakov * 2004-2005 Copyright (c) Evgeniy Polyakov <zbr@ioremap.net> 67672d0b5SEvgeniy Polyakov * All rights reserved. 77672d0b5SEvgeniy Polyakov */ 87672d0b5SEvgeniy Polyakov #ifndef __CONNECTOR_H 97672d0b5SEvgeniy Polyakov #define __CONNECTOR_H 107672d0b5SEvgeniy Polyakov 117672d0b5SEvgeniy Polyakov 12e65f7ee3SElena Reshetova #include <linux/refcount.h> 137672d0b5SEvgeniy Polyakov 147672d0b5SEvgeniy Polyakov #include <linux/list.h> 157672d0b5SEvgeniy Polyakov #include <linux/workqueue.h> 167672d0b5SEvgeniy Polyakov 177672d0b5SEvgeniy Polyakov #include <net/sock.h> 18607ca46eSDavid Howells #include <uapi/linux/connector.h> 197672d0b5SEvgeniy Polyakov 207672d0b5SEvgeniy Polyakov #define CN_CBQ_NAMELEN 32 217672d0b5SEvgeniy Polyakov 227672d0b5SEvgeniy Polyakov struct cn_queue_dev { 237672d0b5SEvgeniy Polyakov atomic_t refcnt; 247672d0b5SEvgeniy Polyakov unsigned char name[CN_CBQ_NAMELEN]; 257672d0b5SEvgeniy Polyakov 267672d0b5SEvgeniy Polyakov struct list_head queue_list; 277672d0b5SEvgeniy Polyakov spinlock_t queue_lock; 287672d0b5SEvgeniy Polyakov 297672d0b5SEvgeniy Polyakov struct sock *nls; 307672d0b5SEvgeniy Polyakov }; 317672d0b5SEvgeniy Polyakov 32acd042bbSEvgeniy Polyakov struct cn_callback_id { 337672d0b5SEvgeniy Polyakov unsigned char name[CN_CBQ_NAMELEN]; 347672d0b5SEvgeniy Polyakov struct cb_id id; 35acd042bbSEvgeniy Polyakov }; 36acd042bbSEvgeniy Polyakov 377672d0b5SEvgeniy Polyakov struct cn_callback_entry { 387672d0b5SEvgeniy Polyakov struct list_head callback_entry; 39e65f7ee3SElena Reshetova refcount_t refcnt; 407672d0b5SEvgeniy Polyakov struct cn_queue_dev *pdev; 417672d0b5SEvgeniy Polyakov 42acd042bbSEvgeniy Polyakov struct cn_callback_id id; 4304f482faSPatrick McHardy void (*callback) (struct cn_msg *, struct netlink_skb_parms *); 447672d0b5SEvgeniy Polyakov 456e32814bSLi Zefan u32 seq, group; 467672d0b5SEvgeniy Polyakov }; 477672d0b5SEvgeniy Polyakov 487672d0b5SEvgeniy Polyakov struct cn_dev { 497672d0b5SEvgeniy Polyakov struct cb_id id; 507672d0b5SEvgeniy Polyakov 517672d0b5SEvgeniy Polyakov u32 seq, groups; 527672d0b5SEvgeniy Polyakov struct sock *nls; 537672d0b5SEvgeniy Polyakov 547672d0b5SEvgeniy Polyakov struct cn_queue_dev *cbdev; 557672d0b5SEvgeniy Polyakov }; 567672d0b5SEvgeniy Polyakov 57720594f6SMauro Carvalho Chehab /** 58720594f6SMauro Carvalho Chehab * cn_add_callback() - Registers new callback with connector core. 59720594f6SMauro Carvalho Chehab * 60720594f6SMauro Carvalho Chehab * @id: unique connector's user identifier. 61720594f6SMauro Carvalho Chehab * It must be registered in connector.h for legal 62720594f6SMauro Carvalho Chehab * in-kernel users. 63720594f6SMauro Carvalho Chehab * @name: connector's callback symbolic name. 64720594f6SMauro Carvalho Chehab * @callback: connector's callback. 65720594f6SMauro Carvalho Chehab * parameters are %cn_msg and the sender's credentials 66720594f6SMauro Carvalho Chehab */ 67c18e6869SGeoff Levand int cn_add_callback(const struct cb_id *id, const char *name, 68008536e8SJoe Perches void (*callback)(struct cn_msg *, struct netlink_skb_parms *)); 69720594f6SMauro Carvalho Chehab /** 70720594f6SMauro Carvalho Chehab * cn_del_callback() - Unregisters new callback with connector core. 71720594f6SMauro Carvalho Chehab * 72720594f6SMauro Carvalho Chehab * @id: unique connector's user identifier. 73720594f6SMauro Carvalho Chehab */ 74c18e6869SGeoff Levand void cn_del_callback(const struct cb_id *id); 75720594f6SMauro Carvalho Chehab 76720594f6SMauro Carvalho Chehab 77720594f6SMauro Carvalho Chehab /** 78720594f6SMauro Carvalho Chehab * cn_netlink_send_mult - Sends message to the specified groups. 79720594f6SMauro Carvalho Chehab * 80720594f6SMauro Carvalho Chehab * @msg: message header(with attached data). 81720594f6SMauro Carvalho Chehab * @len: Number of @msg to be sent. 82720594f6SMauro Carvalho Chehab * @portid: destination port. 83720594f6SMauro Carvalho Chehab * If non-zero the message will be sent to the given port, 84720594f6SMauro Carvalho Chehab * which should be set to the original sender. 85720594f6SMauro Carvalho Chehab * @group: destination group. 86720594f6SMauro Carvalho Chehab * If @portid and @group is zero, then appropriate group will 87720594f6SMauro Carvalho Chehab * be searched through all registered connector users, and 88720594f6SMauro Carvalho Chehab * message will be delivered to the group which was created 89720594f6SMauro Carvalho Chehab * for user with the same ID as in @msg. 90720594f6SMauro Carvalho Chehab * If @group is not zero, then message will be delivered 91720594f6SMauro Carvalho Chehab * to the specified group. 92720594f6SMauro Carvalho Chehab * @gfp_mask: GFP mask. 93*2aa1f7a1SAnjali Kulkarni * @filter: Filter function to be used at netlink layer. 94*2aa1f7a1SAnjali Kulkarni * @filter_data:Filter data to be supplied to the filter function 95720594f6SMauro Carvalho Chehab * 96720594f6SMauro Carvalho Chehab * It can be safely called from softirq context, but may silently 97720594f6SMauro Carvalho Chehab * fail under strong memory pressure. 98720594f6SMauro Carvalho Chehab * 99720594f6SMauro Carvalho Chehab * If there are no listeners for given group %-ESRCH can be returned. 100720594f6SMauro Carvalho Chehab */ 101*2aa1f7a1SAnjali Kulkarni int cn_netlink_send_mult(struct cn_msg *msg, u16 len, u32 portid, 102*2aa1f7a1SAnjali Kulkarni u32 group, gfp_t gfp_mask, 103*2aa1f7a1SAnjali Kulkarni int (*filter)(struct sock *dsk, struct sk_buff *skb, 104*2aa1f7a1SAnjali Kulkarni void *data), 105*2aa1f7a1SAnjali Kulkarni void *filter_data); 106720594f6SMauro Carvalho Chehab 107720594f6SMauro Carvalho Chehab /** 1083aa1141fSMauro Carvalho Chehab * cn_netlink_send - Sends message to the specified groups. 109720594f6SMauro Carvalho Chehab * 110720594f6SMauro Carvalho Chehab * @msg: message header(with attached data). 111720594f6SMauro Carvalho Chehab * @portid: destination port. 112720594f6SMauro Carvalho Chehab * If non-zero the message will be sent to the given port, 113720594f6SMauro Carvalho Chehab * which should be set to the original sender. 114720594f6SMauro Carvalho Chehab * @group: destination group. 115720594f6SMauro Carvalho Chehab * If @portid and @group is zero, then appropriate group will 116720594f6SMauro Carvalho Chehab * be searched through all registered connector users, and 117720594f6SMauro Carvalho Chehab * message will be delivered to the group which was created 118720594f6SMauro Carvalho Chehab * for user with the same ID as in @msg. 119720594f6SMauro Carvalho Chehab * If @group is not zero, then message will be delivered 120720594f6SMauro Carvalho Chehab * to the specified group. 121720594f6SMauro Carvalho Chehab * @gfp_mask: GFP mask. 122720594f6SMauro Carvalho Chehab * 123720594f6SMauro Carvalho Chehab * It can be safely called from softirq context, but may silently 124720594f6SMauro Carvalho Chehab * fail under strong memory pressure. 125720594f6SMauro Carvalho Chehab * 126720594f6SMauro Carvalho Chehab * If there are no listeners for given group %-ESRCH can be returned. 127720594f6SMauro Carvalho Chehab */ 128ac8f7330SDavid Fries int cn_netlink_send(struct cn_msg *msg, u32 portid, u32 group, gfp_t gfp_mask); 1297672d0b5SEvgeniy Polyakov 130008536e8SJoe Perches int cn_queue_add_callback(struct cn_queue_dev *dev, const char *name, 131c18e6869SGeoff Levand const struct cb_id *id, 132008536e8SJoe Perches void (*callback)(struct cn_msg *, struct netlink_skb_parms *)); 133c18e6869SGeoff Levand void cn_queue_del_callback(struct cn_queue_dev *dev, const struct cb_id *id); 13404f482faSPatrick McHardy void cn_queue_release_callback(struct cn_callback_entry *); 1357672d0b5SEvgeniy Polyakov 136008536e8SJoe Perches struct cn_queue_dev *cn_queue_alloc_dev(const char *name, struct sock *); 1377672d0b5SEvgeniy Polyakov void cn_queue_free_dev(struct cn_queue_dev *dev); 1387672d0b5SEvgeniy Polyakov 139c18e6869SGeoff Levand int cn_cb_equal(const struct cb_id *, const struct cb_id *); 1407672d0b5SEvgeniy Polyakov 1417672d0b5SEvgeniy Polyakov #endif /* __CONNECTOR_H */ 142