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 enum { 10 RDMA_NLDEV_ATTR_EMPTY_STRING = 1, 11 RDMA_NLDEV_ATTR_ENTRY_STRLEN = 16, 12 RDMA_NLDEV_ATTR_CHARDEV_TYPE_SIZE = 32, 13 }; 14 15 struct rdma_nl_cbs { 16 int (*doit)(struct sk_buff *skb, struct nlmsghdr *nlh, 17 struct netlink_ext_ack *extack); 18 int (*dump)(struct sk_buff *skb, struct netlink_callback *nlcb); 19 u8 flags; 20 }; 21 22 enum rdma_nl_flags { 23 /* Require CAP_NET_ADMIN */ 24 RDMA_NL_ADMIN_PERM = 1 << 0, 25 }; 26 27 /* Define this module as providing netlink services for NETLINK_RDMA, with 28 * index _index. Since the client indexes were setup in a uapi header as an 29 * enum and we do no want to change that, the user must supply the expanded 30 * constant as well and the compiler checks they are the same. 31 */ 32 #define MODULE_ALIAS_RDMA_NETLINK(_index, _val) \ 33 static inline void __chk_##_index(void) \ 34 { \ 35 BUILD_BUG_ON(_index != _val); \ 36 } \ 37 MODULE_ALIAS("rdma-netlink-subsys-" __stringify(_val)) 38 39 /** 40 * Register client in RDMA netlink. 41 * @index: Index of the added client 42 * @cb_table: A table for op->callback 43 */ 44 void rdma_nl_register(unsigned int index, 45 const struct rdma_nl_cbs cb_table[]); 46 47 /** 48 * Remove a client from IB netlink. 49 * @index: Index of the removed IB client. 50 */ 51 void rdma_nl_unregister(unsigned int index); 52 53 /** 54 * Put a new message in a supplied skb. 55 * @skb: The netlink skb. 56 * @nlh: Pointer to put the header of the new netlink message. 57 * @seq: The message sequence number. 58 * @len: The requested message length to allocate. 59 * @client: Calling IB netlink client. 60 * @op: message content op. 61 * Returns the allocated buffer on success and NULL on failure. 62 */ 63 void *ibnl_put_msg(struct sk_buff *skb, struct nlmsghdr **nlh, int seq, 64 int len, int client, int op, int flags); 65 /** 66 * Put a new attribute in a supplied skb. 67 * @skb: The netlink skb. 68 * @nlh: Header of the netlink message to append the attribute to. 69 * @len: The length of the attribute data. 70 * @data: The attribute data to put. 71 * @type: The attribute type. 72 * Returns the 0 and a negative error code on failure. 73 */ 74 int ibnl_put_attr(struct sk_buff *skb, struct nlmsghdr *nlh, 75 int len, void *data, int type); 76 77 /** 78 * Send the supplied skb to a specific userspace PID. 79 * @net: Net namespace in which to send the skb 80 * @skb: The netlink skb 81 * @pid: Userspace netlink process ID 82 * Returns 0 on success or a negative error code. 83 */ 84 int rdma_nl_unicast(struct net *net, struct sk_buff *skb, u32 pid); 85 86 /** 87 * Send, with wait/1 retry, the supplied skb to a specific userspace PID. 88 * @net: Net namespace in which to send the skb 89 * @skb: The netlink skb 90 * @pid: Userspace netlink process ID 91 * Returns 0 on success or a negative error code. 92 */ 93 int rdma_nl_unicast_wait(struct net *net, struct sk_buff *skb, __u32 pid); 94 95 /** 96 * Send the supplied skb to a netlink group. 97 * @net: Net namespace in which to send the skb 98 * @skb: The netlink skb 99 * @group: Netlink group ID 100 * @flags: allocation flags 101 * Returns 0 on success or a negative error code. 102 */ 103 int rdma_nl_multicast(struct net *net, struct sk_buff *skb, 104 unsigned int group, gfp_t flags); 105 106 /** 107 * Check if there are any listeners to the netlink group 108 * @group: the netlink group ID 109 * Returns true on success or false if no listeners. 110 */ 111 bool rdma_nl_chk_listeners(unsigned int group); 112 113 struct rdma_link_ops { 114 struct list_head list; 115 const char *type; 116 int (*newlink)(const char *ibdev_name, struct net_device *ndev); 117 }; 118 119 void rdma_link_register(struct rdma_link_ops *ops); 120 void rdma_link_unregister(struct rdma_link_ops *ops); 121 122 #define MODULE_ALIAS_RDMA_LINK(type) MODULE_ALIAS("rdma-link-" type) 123 #define MODULE_ALIAS_RDMA_CLIENT(type) MODULE_ALIAS("rdma-client-" type) 124 125 #endif /* _RDMA_NETLINK_H */