0001
0002
0003
0004
0005
0006 #ifndef _NVME_FABRICS_H
0007 #define _NVME_FABRICS_H 1
0008
0009 #include <linux/in.h>
0010 #include <linux/inet.h>
0011
0012 #define NVMF_MIN_QUEUE_SIZE 16
0013 #define NVMF_MAX_QUEUE_SIZE 1024
0014 #define NVMF_DEF_QUEUE_SIZE 128
0015 #define NVMF_DEF_RECONNECT_DELAY 10
0016
0017 #define NVMF_DEF_CTRL_LOSS_TMO 600
0018
0019 #define NVMF_DEF_FAIL_FAST_TMO -1
0020
0021
0022
0023
0024
0025
0026 #define NVMF_RESERVED_TAGS 1
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 struct nvmf_host {
0037 struct kref ref;
0038 struct list_head list;
0039 char nqn[NVMF_NQN_SIZE];
0040 uuid_t id;
0041 };
0042
0043
0044
0045
0046 enum {
0047 NVMF_OPT_ERR = 0,
0048 NVMF_OPT_TRANSPORT = 1 << 0,
0049 NVMF_OPT_NQN = 1 << 1,
0050 NVMF_OPT_TRADDR = 1 << 2,
0051 NVMF_OPT_TRSVCID = 1 << 3,
0052 NVMF_OPT_QUEUE_SIZE = 1 << 4,
0053 NVMF_OPT_NR_IO_QUEUES = 1 << 5,
0054 NVMF_OPT_TL_RETRY_COUNT = 1 << 6,
0055 NVMF_OPT_KATO = 1 << 7,
0056 NVMF_OPT_HOSTNQN = 1 << 8,
0057 NVMF_OPT_RECONNECT_DELAY = 1 << 9,
0058 NVMF_OPT_HOST_TRADDR = 1 << 10,
0059 NVMF_OPT_CTRL_LOSS_TMO = 1 << 11,
0060 NVMF_OPT_HOST_ID = 1 << 12,
0061 NVMF_OPT_DUP_CONNECT = 1 << 13,
0062 NVMF_OPT_DISABLE_SQFLOW = 1 << 14,
0063 NVMF_OPT_HDR_DIGEST = 1 << 15,
0064 NVMF_OPT_DATA_DIGEST = 1 << 16,
0065 NVMF_OPT_NR_WRITE_QUEUES = 1 << 17,
0066 NVMF_OPT_NR_POLL_QUEUES = 1 << 18,
0067 NVMF_OPT_TOS = 1 << 19,
0068 NVMF_OPT_FAIL_FAST_TMO = 1 << 20,
0069 NVMF_OPT_HOST_IFACE = 1 << 21,
0070 NVMF_OPT_DISCOVERY = 1 << 22,
0071 NVMF_OPT_DHCHAP_SECRET = 1 << 23,
0072 NVMF_OPT_DHCHAP_CTRL_SECRET = 1 << 24,
0073 };
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113 struct nvmf_ctrl_options {
0114 unsigned mask;
0115 char *transport;
0116 char *subsysnqn;
0117 char *traddr;
0118 char *trsvcid;
0119 char *host_traddr;
0120 char *host_iface;
0121 size_t queue_size;
0122 unsigned int nr_io_queues;
0123 unsigned int reconnect_delay;
0124 bool discovery_nqn;
0125 bool duplicate_connect;
0126 unsigned int kato;
0127 struct nvmf_host *host;
0128 int max_reconnects;
0129 char *dhchap_secret;
0130 char *dhchap_ctrl_secret;
0131 bool disable_sqflow;
0132 bool hdr_digest;
0133 bool data_digest;
0134 unsigned int nr_write_queues;
0135 unsigned int nr_poll_queues;
0136 int tos;
0137 int fast_io_fail_tmo;
0138 };
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165 struct nvmf_transport_ops {
0166 struct list_head entry;
0167 struct module *module;
0168 const char *name;
0169 int required_opts;
0170 int allowed_opts;
0171 struct nvme_ctrl *(*create_ctrl)(struct device *dev,
0172 struct nvmf_ctrl_options *opts);
0173 };
0174
0175 static inline bool
0176 nvmf_ctlr_matches_baseopts(struct nvme_ctrl *ctrl,
0177 struct nvmf_ctrl_options *opts)
0178 {
0179 if (ctrl->state == NVME_CTRL_DELETING ||
0180 ctrl->state == NVME_CTRL_DELETING_NOIO ||
0181 ctrl->state == NVME_CTRL_DEAD ||
0182 strcmp(opts->subsysnqn, ctrl->opts->subsysnqn) ||
0183 strcmp(opts->host->nqn, ctrl->opts->host->nqn) ||
0184 memcmp(&opts->host->id, &ctrl->opts->host->id, sizeof(uuid_t)))
0185 return false;
0186
0187 return true;
0188 }
0189
0190 static inline char *nvmf_ctrl_subsysnqn(struct nvme_ctrl *ctrl)
0191 {
0192 if (!ctrl->subsys)
0193 return ctrl->opts->subsysnqn;
0194 return ctrl->subsys->subnqn;
0195 }
0196
0197 static inline void nvmf_complete_timed_out_request(struct request *rq)
0198 {
0199 if (blk_mq_request_started(rq) && !blk_mq_request_completed(rq)) {
0200 nvme_req(rq)->status = NVME_SC_HOST_ABORTED_CMD;
0201 blk_mq_complete_request(rq);
0202 }
0203 }
0204
0205 int nvmf_reg_read32(struct nvme_ctrl *ctrl, u32 off, u32 *val);
0206 int nvmf_reg_read64(struct nvme_ctrl *ctrl, u32 off, u64 *val);
0207 int nvmf_reg_write32(struct nvme_ctrl *ctrl, u32 off, u32 val);
0208 int nvmf_connect_admin_queue(struct nvme_ctrl *ctrl);
0209 int nvmf_connect_io_queue(struct nvme_ctrl *ctrl, u16 qid);
0210 int nvmf_register_transport(struct nvmf_transport_ops *ops);
0211 void nvmf_unregister_transport(struct nvmf_transport_ops *ops);
0212 void nvmf_free_options(struct nvmf_ctrl_options *opts);
0213 int nvmf_get_address(struct nvme_ctrl *ctrl, char *buf, int size);
0214 bool nvmf_should_reconnect(struct nvme_ctrl *ctrl);
0215 bool nvmf_ip_options_match(struct nvme_ctrl *ctrl,
0216 struct nvmf_ctrl_options *opts);
0217
0218 #endif