File Index
Files and directories
Sign in
FILE

rtrs.h

File preview with syntax highlighting.

linux-6.19.14/drivers/infiniband/ulp/rtrs/rtrs.h C
  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
~/ Read-only file preview.