1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _RDMA_NETLINK_H 3 #define _RDMA_NETLINK_H 4 5 6 #include <linux/netlink.h> 7 #include <uapi/rdma/rdma_netlink.h> 8 9 struct rdma_nl_cbs { 10 int (*doit)(struct sk_buff *skb, struct nlmsghdr *nlh, 11 struct netlink_ext_ack *extack); 12 int (*dump)(struct sk_buff *skb, struct netlink_callback *nlcb); 13 u8 flags; 14 }; 15 16 enum rdma_nl_flags { 17 /* Require CAP_NET_ADMIN */ 18 RDMA_NL_ADMIN_PERM = 1 << 0, 19 }; 20 21 /* Define this module as providing netlink services for NETLINK_RDMA, with 22 * index _index. Since the client indexes were setup in a uapi header as an 23 * enum and we do no want to change that, the user must supply the expanded 24 * constant as well and the compiler checks they are the same. 25 */ 26 #define MODULE_ALIAS_RDMA_NETLINK(_index, _val) \ 27 static inline void __chk_##_index(void) \ 28 { \ 29 BUILD_BUG_ON(_index != _val); \ 30 } \ 31 MODULE_ALIAS("rdma-netlink-subsys-" __stringify(_val)) 32 33 /** 34 * Register client in RDMA netlink. 35 * @index: Index of the added client 36 * @cb_table: A table for op->callback 37 */ 38 void rdma_nl_register(unsigned int index, 39 const struct rdma_nl_cbs cb_table[]); 40 41 /** 42 * Remove a client from IB netlink. 43 * @index: Index of the removed IB client. 44 */ 45 void rdma_nl_unregister(unsigned int index); 46 47 /** 48 * Put a new message in a supplied skb. 49 * @skb: The netlink skb. 50 * @nlh: Pointer to put the header of the new netlink message. 51 * @seq: The message sequence number. 52 * @len: The requested message length to allocate. 53 * @client: Calling IB netlink client. 54 * @op: message content op. 55 * Returns the allocated buffer on success and NULL on failure. 56 */ 57 void *ibnl_put_msg(struct sk_buff *skb, struct nlmsghdr **nlh, int seq, 58 int len, int client, int op, int flags); 59 /** 60 * Put a new attribute in a supplied skb. 61 * @skb: The netlink skb. 62 * @nlh: Header of the netlink message to append the attribute to. 63 * @len: The length of the attribute data. 64 * @data: The attribute data to put. 65 * @type: The attribute type. 66 * Returns the 0 and a negative error code on failure. 67 */ 68 int ibnl_put_attr(struct sk_buff *skb, struct nlmsghdr *nlh, 69 int len, void *data, int type); 70 71 /** 72 * Send the supplied skb to a specific userspace PID. 73 * @skb: The netlink skb 74 * @pid: Userspace netlink process ID 75 * Returns 0 on success or a negative error code. 76 */ 77 int rdma_nl_unicast(struct sk_buff *skb, u32 pid); 78 79 /** 80 * Send, with wait/1 retry, the supplied skb to a specific userspace PID. 81 * @skb: The netlink skb 82 * @pid: Userspace netlink process ID 83 * Returns 0 on success or a negative error code. 84 */ 85 int rdma_nl_unicast_wait(struct sk_buff *skb, __u32 pid); 86 87 /** 88 * Send the supplied skb to a netlink group. 89 * @skb: The netlink skb 90 * @group: Netlink group ID 91 * @flags: allocation flags 92 * Returns 0 on success or a negative error code. 93 */ 94 int rdma_nl_multicast(struct sk_buff *skb, unsigned int group, gfp_t flags); 95 96 /** 97 * Check if there are any listeners to the netlink group 98 * @group: the netlink group ID 99 * Returns 0 on success or a negative for no listeners. 100 */ 101 int rdma_nl_chk_listeners(unsigned int group); 102 #endif /* _RDMA_NETLINK_H */ 103