brintos

brintos / linux-shallow public Read only

0
0
Text · 5.3 KiB · b48b53a Raw
189 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 * RDMA Transport Layer4 *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_H10#define RTRS_H11 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 API23 */24 25/**26 * enum rtrs_clt_link_ev - Events about connectivity state of a client27 * @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 * Source and destination address of a path to be established37 */38struct rtrs_addr {39	struct sockaddr_storage *src;40	struct sockaddr_storage *dst;41};42 43/**44 * rtrs_clt_ops - it holds the link event callback and private pointer.45 * @priv: User supplied private data.46 * @link_ev: Event notification callback function for connection state changes47 *	@priv: User supplied data that was passed to rtrs_clt_open()48 *	@ev: Occurred event49 */50struct rtrs_clt_ops {51	void	*priv;52	void	(*link_ev)(void *priv, enum rtrs_clt_link_ev ev);53};54 55struct rtrs_clt_sess *rtrs_clt_open(struct rtrs_clt_ops *ops,56				 const char *pathname,57				 const struct rtrs_addr *paths,58				 size_t path_cnt, u16 port,59				 size_t pdu_sz, u8 reconnect_delay_sec,60				 s16 max_reconnect_attempts, u32 nr_poll_queues);61 62void rtrs_clt_close(struct rtrs_clt_sess *clt);63 64enum wait_type {65	RTRS_PERMIT_NOWAIT = 0,66	RTRS_PERMIT_WAIT   = 167};68 69/**70 * enum rtrs_clt_con_type() type of ib connection to use with a given71 * rtrs_permit72 * @ADMIN_CON - use connection reserved for "service" messages73 * @IO_CON - use a connection reserved for IO74 */75enum rtrs_clt_con_type {76	RTRS_ADMIN_CON,77	RTRS_IO_CON78};79 80struct rtrs_permit *rtrs_clt_get_permit(struct rtrs_clt_sess *sess,81					enum rtrs_clt_con_type con_type,82					enum wait_type wait);83 84void rtrs_clt_put_permit(struct rtrs_clt_sess *sess,85			 struct rtrs_permit *permit);86 87/**88 * rtrs_clt_req_ops - it holds the request confirmation callback89 * and a private pointer.90 * @priv: User supplied private data.91 * @conf_fn:	callback function to be called as confirmation92 *	@priv:	User provided data, passed back with corresponding93 *		@(conf) confirmation.94 *	@errno: error number.95 */96struct rtrs_clt_req_ops {97	void	*priv;98	void	(*conf_fn)(void *priv, int errno);99};100 101int rtrs_clt_request(int dir, struct rtrs_clt_req_ops *ops,102		     struct rtrs_clt_sess *sess, struct rtrs_permit *permit,103		     const struct kvec *vec, size_t nr, size_t len,104		     struct scatterlist *sg, unsigned int sg_cnt);105int rtrs_clt_rdma_cq_direct(struct rtrs_clt_sess *clt, unsigned int index);106 107/**108 * rtrs_attrs - RTRS session attributes109 */110struct rtrs_attrs {111	u32		queue_depth;112	u32		max_io_size;113	u32		max_segments;114};115 116int rtrs_clt_query(struct rtrs_clt_sess *sess, struct rtrs_attrs *attr);117 118/*119 * Here goes RTRS server API120 */121 122/**123 * enum rtrs_srv_link_ev - Server link events124 * @RTRS_SRV_LINK_EV_CONNECTED:	Connection from client established125 * @RTRS_SRV_LINK_EV_DISCONNECTED:	Connection was disconnected, all126 *					connection RTRS resources were freed.127 */128enum rtrs_srv_link_ev {129	RTRS_SRV_LINK_EV_CONNECTED,130	RTRS_SRV_LINK_EV_DISCONNECTED,131};132 133struct rtrs_srv_ops {134	/**135	 * rdma_ev():		Event notification for RDMA operations136	 *			If the callback returns a value != 0, an error137	 *			message for the data transfer will be sent to138	 *			the client.139 140	 *	@priv:		Private data set by rtrs_srv_set_sess_priv()141	 *	@id:		internal RTRS operation id142	 *	@data:		Pointer to (bidirectional) rdma memory area:143	 *			- in case of %RTRS_SRV_RDMA_EV_RECV contains144	 *			data sent by the client145	 *			- in case of %RTRS_SRV_RDMA_EV_WRITE_REQ points146	 *			to the memory area where the response is to be147	 *			written to148	 *	@datalen:	Size of the memory area in @data149	 *	@usr:		The extra user message sent by the client (%vec)150	 *	@usrlen:	Size of the user message151	 */152	int (*rdma_ev)(void *priv,153		       struct rtrs_srv_op *id,154		       void *data, size_t datalen, const void *usr,155		       size_t usrlen);156	/**157	 * link_ev():		Events about connectivity state changes158	 *			If the callback returns != 0 and the event159	 *			%RTRS_SRV_LINK_EV_CONNECTED the corresponding160	 *			session will be destroyed.161	 *	@sess:		Session162	 *	@ev:		event163	 *	@priv:		Private data from user if previously set with164	 *			rtrs_srv_set_sess_priv()165	 */166	int (*link_ev)(struct rtrs_srv_sess *sess, enum rtrs_srv_link_ev ev,167		       void *priv);168};169 170struct rtrs_srv_ctx *rtrs_srv_open(struct rtrs_srv_ops *ops, u16 port);171 172void rtrs_srv_close(struct rtrs_srv_ctx *ctx);173 174bool rtrs_srv_resp_rdma(struct rtrs_srv_op *id, int errno);175 176void rtrs_srv_set_sess_priv(struct rtrs_srv_sess *sess, void *priv);177 178int rtrs_srv_get_path_name(struct rtrs_srv_sess *sess, char *pathname,179			   size_t len);180 181int rtrs_srv_get_queue_depth(struct rtrs_srv_sess *sess);182 183int rtrs_addr_to_sockaddr(const char *str, size_t len, u16 port,184			  struct rtrs_addr *addr);185 186int sockaddr_to_str(const struct sockaddr *addr, char *buf, size_t len);187int rtrs_addr_to_str(const struct rtrs_addr *addr, char *buf, size_t len);188#endif189