1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * RDMA Transport Layer
4 *
5 * Copyright (c) 2014 - 2018 ProfitBricks GmbH. All rights reserved.
6 * Copyright (c) 2018 - 2019 1&1 IONOS Cloud GmbH. All rights reserved.
7 * Copyright (c) 2019 - 2020 1&1 IONOS SE. All rights reserved.
8 */
9#ifndef RTRS_H
10#define RTRS_H
11
12#include <linux/socket.h>
13#include <linux/scatterlist.h>
14
15struct rtrs_permit;
16struct rtrs_clt_sess;
17struct rtrs_srv_ctx;
18struct rtrs_srv_sess;
19struct rtrs_srv_op;
20
21/*
22 * RDMA transport (RTRS) client API
23 */
24
25/**
26 * enum rtrs_clt_link_ev - Events about connectivity state of a client
27 * @RTRS_CLT_LINK_EV_RECONNECTED: Client was reconnected.
28 * @RTRS_CLT_LINK_EV_DISCONNECTED: Client was disconnected.
29 */
30enum rtrs_clt_link_ev {
31 RTRS_CLT_LINK_EV_RECONNECTED,
32 RTRS_CLT_LINK_EV_DISCONNECTED,
33};
34
35/**
36 * struct rtrs_addr - Source and destination address of a path to be established
37 * @src: source address
38 * @dst: destination address
39 */
40struct rtrs_addr {
41 struct sockaddr_storage *src;
42 struct sockaddr_storage *dst;
43};
44
45/**
46 * struct rtrs_clt_ops - it holds the link event callback and private pointer.
47 * @priv: User supplied private data.
48 * @link_ev: Event notification callback function for connection state changes
49 * @priv: User supplied data that was passed to rtrs_clt_open()
50 * @ev: Occurred event
51 */
52struct rtrs_clt_ops {
53 void *priv;
54 void (*link_ev)(void *priv, enum rtrs_clt_link_ev ev);
55};
56
57struct rtrs_clt_sess *rtrs_clt_open(struct rtrs_clt_ops *ops,
58 const char *pathname,
59 const struct rtrs_addr *paths,
60 size_t path_cnt, u16 port,
61 size_t pdu_sz, u8 reconnect_delay_sec,
62 s16 max_reconnect_attempts, u32 nr_poll_queues);
63
64void rtrs_clt_close(struct rtrs_clt_sess *clt);
65
66enum wait_type {
67 RTRS_PERMIT_NOWAIT = 0,
68 RTRS_PERMIT_WAIT = 1
69};
70
71/**
72 * enum rtrs_clt_con_type - type of ib connection to use with a given
73 * rtrs_permit
74 * @RTRS_ADMIN_CON: use connection reserved for "service" messages
75 * @RTRS_IO_CON: use a connection reserved for IO
76 */
77enum rtrs_clt_con_type {
78 RTRS_ADMIN_CON,
79 RTRS_IO_CON
80};
81
82struct rtrs_permit *rtrs_clt_get_permit(struct rtrs_clt_sess *sess,
83 enum rtrs_clt_con_type con_type,
84 enum wait_type wait);
85
86void rtrs_clt_put_permit(struct rtrs_clt_sess *sess,
87 struct rtrs_permit *permit);
88
89/**
90 * struct rtrs_clt_req_ops - it holds the request confirmation callback
91 * and a private pointer.
92 * @priv: User supplied private data.
93 * @conf_fn: callback function to be called as confirmation
94 * @priv: User provided data, passed back with corresponding
95 * @(conf) confirmation.
96 * @errno: error number.
97 */
98struct rtrs_clt_req_ops {
99 void *priv;
100 void (*conf_fn)(void *priv, int errno);
101};
102
103int rtrs_clt_request(int dir, struct rtrs_clt_req_ops *ops,
104 struct rtrs_clt_sess *sess, struct rtrs_permit *permit,
105 const struct kvec *vec, size_t nr, size_t len,
106 struct scatterlist *sg, unsigned int sg_cnt);
107int rtrs_clt_rdma_cq_direct(struct rtrs_clt_sess *clt, unsigned int index);
108
109/**
110 * struct rtrs_attrs - RTRS session attributes
111 * @queue_depth: queue_depth saved from rtrs_clt_sess message
112 * @max_io_size: max_io_size from rtrs_clt_sess message, capped to
113 * @max_segments * %SZ_4K
114 * @max_segments: max_segments saved from rtrs_clt_sess message
115 */
116struct rtrs_attrs {
117 u32 queue_depth;
118 u32 max_io_size;
119 u32 max_segments;
120};
121
122int rtrs_clt_query(struct rtrs_clt_sess *sess, struct rtrs_attrs *attr);
123
124/*
125 * Here goes RTRS server API
126 */
127
128/**
129 * enum rtrs_srv_link_ev - Server link events
130 * @RTRS_SRV_LINK_EV_CONNECTED: Connection from client established
131 * @RTRS_SRV_LINK_EV_DISCONNECTED: Connection was disconnected, all
132 * connection RTRS resources were freed.
133 */
134enum rtrs_srv_link_ev {
135 RTRS_SRV_LINK_EV_CONNECTED,
136 RTRS_SRV_LINK_EV_DISCONNECTED,
137};
138
139struct rtrs_srv_ops {
140 /**
141 * rdma_ev(): Event notification for RDMA operations
142 * If the callback returns a value != 0, an error
143 * message for the data transfer will be sent to
144 * the client.
145
146 * @priv: Private data set by rtrs_srv_set_sess_priv()
147 * @id: internal RTRS operation id
148 * @data: Pointer to (bidirectional) rdma memory area:
149 * - in case of %RTRS_SRV_RDMA_EV_RECV contains
150 * data sent by the client
151 * - in case of %RTRS_SRV_RDMA_EV_WRITE_REQ points
152 * to the memory area where the response is to be
153 * written to
154 * @datalen: Size of the memory area in @data
155 * @usr: The extra user message sent by the client (%vec)
156 * @usrlen: Size of the user message
157 */
158 int (*rdma_ev)(void *priv,
159 struct rtrs_srv_op *id,
160 void *data, size_t datalen, const void *usr,
161 size_t usrlen);
162 /**
163 * link_ev(): Events about connectivity state changes
164 * If the callback returns != 0 and the event
165 * %RTRS_SRV_LINK_EV_CONNECTED the corresponding
166 * session will be destroyed.
167 * @sess: Session
168 * @ev: event
169 * @priv: Private data from user if previously set with
170 * rtrs_srv_set_sess_priv()
171 */
172 int (*link_ev)(struct rtrs_srv_sess *sess, enum rtrs_srv_link_ev ev,
173 void *priv);
174};
175
176struct rtrs_srv_ctx *rtrs_srv_open(struct rtrs_srv_ops *ops, u16 port);
177
178void rtrs_srv_close(struct rtrs_srv_ctx *ctx);
179
180bool rtrs_srv_resp_rdma(struct rtrs_srv_op *id, int errno);
181
182void rtrs_srv_set_sess_priv(struct rtrs_srv_sess *sess, void *priv);
183
184int rtrs_srv_get_path_name(struct rtrs_srv_sess *sess, char *pathname,
185 size_t len);
186
187int rtrs_srv_get_queue_depth(struct rtrs_srv_sess *sess);
188
189int rtrs_addr_to_sockaddr(const char *str, size_t len, u16 port,
190 struct rtrs_addr *addr);
191
192int sockaddr_to_str(const struct sockaddr *addr, char *buf, size_t len);
193int rtrs_addr_to_str(const struct rtrs_addr *addr, char *buf, size_t len);
194#endif
195

source code of linux/drivers/infiniband/ulp/rtrs/rtrs.h