0001
0002
0003
0004
0005
0006
0007
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
0023
0024
0025
0026
0027
0028
0029
0030 enum rtrs_clt_link_ev {
0031 RTRS_CLT_LINK_EV_RECONNECTED,
0032 RTRS_CLT_LINK_EV_DISCONNECTED,
0033 };
0034
0035
0036
0037
0038 struct rtrs_addr {
0039 struct sockaddr_storage *src;
0040 struct sockaddr_storage *dst;
0041 };
0042
0043
0044
0045
0046
0047
0048
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
0071
0072
0073
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
0089
0090
0091
0092
0093
0094
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
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
0120
0121
0122
0123
0124
0125
0126
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
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
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
0159
0160
0161
0162
0163
0164
0165
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