Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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