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