Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * RDMA Transport Layer
0004  *
0005  * Copyright (c) 2014 - 2018 ProfitBricks GmbH. All rights reserved.
0006  * Copyright (c) 2018 - 2019 1&1 IONOS Cloud GmbH. All rights reserved.
0007  * Copyright (c) 2019 - 2020 1&1 IONOS SE. All rights reserved.
0008  */
0009 #ifndef RTRS_H
0010 #define RTRS_H
0011 
0012 #include <linux/socket.h>
0013 #include <linux/scatterlist.h>
0014 
0015 struct rtrs_permit;
0016 struct rtrs_clt_sess;
0017 struct rtrs_srv_ctx;
0018 struct rtrs_srv_sess;
0019 struct rtrs_srv_op;
0020 
0021 /*
0022  * RDMA transport (RTRS) client API
0023  */
0024 
0025 /**
0026  * enum rtrs_clt_link_ev - Events about connectivity state of a client
0027  * @RTRS_CLT_LINK_EV_RECONNECTED    Client was reconnected.
0028  * @RTRS_CLT_LINK_EV_DISCONNECTED   Client was disconnected.
0029  */
0030 enum rtrs_clt_link_ev {
0031     RTRS_CLT_LINK_EV_RECONNECTED,
0032     RTRS_CLT_LINK_EV_DISCONNECTED,
0033 };
0034 
0035 /**
0036  * Source and destination address of a path to be established
0037  */
0038 struct rtrs_addr {
0039     struct sockaddr_storage *src;
0040     struct sockaddr_storage *dst;
0041 };
0042 
0043 /**
0044  * rtrs_clt_ops - it holds the link event callback and private pointer.
0045  * @priv: User supplied private data.
0046  * @link_ev: Event notification callback function for connection state changes
0047  *  @priv: User supplied data that was passed to rtrs_clt_open()
0048  *  @ev: Occurred event
0049  */
0050 struct rtrs_clt_ops {
0051     void    *priv;
0052     void    (*link_ev)(void *priv, enum rtrs_clt_link_ev ev);
0053 };
0054 
0055 struct rtrs_clt_sess *rtrs_clt_open(struct rtrs_clt_ops *ops,
0056                  const char *pathname,
0057                  const struct rtrs_addr *paths,
0058                  size_t path_cnt, u16 port,
0059                  size_t pdu_sz, u8 reconnect_delay_sec,
0060                  s16 max_reconnect_attempts, u32 nr_poll_queues);
0061 
0062 void rtrs_clt_close(struct rtrs_clt_sess *clt);
0063 
0064 enum wait_type {
0065     RTRS_PERMIT_NOWAIT = 0,
0066     RTRS_PERMIT_WAIT   = 1
0067 };
0068 
0069 /**
0070  * enum rtrs_clt_con_type() type of ib connection to use with a given
0071  * rtrs_permit
0072  * @ADMIN_CON - use connection reserved for "service" messages
0073  * @IO_CON - use a connection reserved for IO
0074  */
0075 enum rtrs_clt_con_type {
0076     RTRS_ADMIN_CON,
0077     RTRS_IO_CON
0078 };
0079 
0080 struct rtrs_permit *rtrs_clt_get_permit(struct rtrs_clt_sess *sess,
0081                     enum rtrs_clt_con_type con_type,
0082                     enum wait_type wait);
0083 
0084 void rtrs_clt_put_permit(struct rtrs_clt_sess *sess,
0085              struct rtrs_permit *permit);
0086 
0087 /**
0088  * rtrs_clt_req_ops - it holds the request confirmation callback
0089  * and a private pointer.
0090  * @priv: User supplied private data.
0091  * @conf_fn:    callback function to be called as confirmation
0092  *  @priv:  User provided data, passed back with corresponding
0093  *      @(conf) confirmation.
0094  *  @errno: error number.
0095  */
0096 struct rtrs_clt_req_ops {
0097     void    *priv;
0098     void    (*conf_fn)(void *priv, int errno);
0099 };
0100 
0101 int rtrs_clt_request(int dir, struct rtrs_clt_req_ops *ops,
0102              struct rtrs_clt_sess *sess, struct rtrs_permit *permit,
0103              const struct kvec *vec, size_t nr, size_t len,
0104              struct scatterlist *sg, unsigned int sg_cnt);
0105 int rtrs_clt_rdma_cq_direct(struct rtrs_clt_sess *clt, unsigned int index);
0106 
0107 /**
0108  * rtrs_attrs - RTRS session attributes
0109  */
0110 struct rtrs_attrs {
0111     u32     queue_depth;
0112     u32     max_io_size;
0113     u32     max_segments;
0114 };
0115 
0116 int rtrs_clt_query(struct rtrs_clt_sess *sess, struct rtrs_attrs *attr);
0117 
0118 /*
0119  * Here goes RTRS server API
0120  */
0121 
0122 /**
0123  * enum rtrs_srv_link_ev - Server link events
0124  * @RTRS_SRV_LINK_EV_CONNECTED: Connection from client established
0125  * @RTRS_SRV_LINK_EV_DISCONNECTED:  Connection was disconnected, all
0126  *                  connection RTRS resources were freed.
0127  */
0128 enum rtrs_srv_link_ev {
0129     RTRS_SRV_LINK_EV_CONNECTED,
0130     RTRS_SRV_LINK_EV_DISCONNECTED,
0131 };
0132 
0133 struct rtrs_srv_ops {
0134     /**
0135      * rdma_ev():       Event notification for RDMA operations
0136      *          If the callback returns a value != 0, an error
0137      *          message for the data transfer will be sent to
0138      *          the client.
0139 
0140      *  @priv:      Private data set by rtrs_srv_set_sess_priv()
0141      *  @id:        internal RTRS operation id
0142      *  @dir:       READ/WRITE
0143      *  @data:      Pointer to (bidirectional) rdma memory area:
0144      *          - in case of %RTRS_SRV_RDMA_EV_RECV contains
0145      *          data sent by the client
0146      *          - in case of %RTRS_SRV_RDMA_EV_WRITE_REQ points
0147      *          to the memory area where the response is to be
0148      *          written to
0149      *  @datalen:   Size of the memory area in @data
0150      *  @usr:       The extra user message sent by the client (%vec)
0151      *  @usrlen:    Size of the user message
0152      */
0153     int (*rdma_ev)(void *priv,
0154                struct rtrs_srv_op *id, int dir,
0155                void *data, size_t datalen, const void *usr,
0156                size_t usrlen);
0157     /**
0158      * link_ev():       Events about connectivity state changes
0159      *          If the callback returns != 0 and the event
0160      *          %RTRS_SRV_LINK_EV_CONNECTED the corresponding
0161      *          session will be destroyed.
0162      *  @sess:      Session
0163      *  @ev:        event
0164      *  @priv:      Private data from user if previously set with
0165      *          rtrs_srv_set_sess_priv()
0166      */
0167     int (*link_ev)(struct rtrs_srv_sess *sess, enum rtrs_srv_link_ev ev,
0168                void *priv);
0169 };
0170 
0171 struct rtrs_srv_ctx *rtrs_srv_open(struct rtrs_srv_ops *ops, u16 port);
0172 
0173 void rtrs_srv_close(struct rtrs_srv_ctx *ctx);
0174 
0175 bool rtrs_srv_resp_rdma(struct rtrs_srv_op *id, int errno);
0176 
0177 void rtrs_srv_set_sess_priv(struct rtrs_srv_sess *sess, void *priv);
0178 
0179 int rtrs_srv_get_path_name(struct rtrs_srv_sess *sess, char *pathname,
0180                size_t len);
0181 
0182 int rtrs_srv_get_queue_depth(struct rtrs_srv_sess *sess);
0183 
0184 int rtrs_addr_to_sockaddr(const char *str, size_t len, u16 port,
0185               struct rtrs_addr *addr);
0186 
0187 int sockaddr_to_str(const struct sockaddr *addr, char *buf, size_t len);
0188 int rtrs_addr_to_str(const struct rtrs_addr *addr, char *buf, size_t len);
0189 #endif