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