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