xref: /freebsd/sys/dev/nvmf/nvmf.h (revision 32cd3ee5901ea33d41ff550e5f40ce743c8d4165)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2022-2024 Chelsio Communications, Inc.
5  * Written by: John Baldwin <jhb@FreeBSD.org>
6  */
7 
8 #ifndef __NVMF_H__
9 #define	__NVMF_H__
10 
11 #include <sys/ioccom.h>
12 #ifndef _KERNEL
13 #include <stdbool.h>
14 #endif
15 
16 /*
17  * Default settings in Fabrics controllers.  These match values used by the
18  * Linux target.
19  */
20 #define	NVMF_MAX_IO_ENTRIES	(1024)
21 #define	NVMF_CC_EN_TIMEOUT	(15)	/* In 500ms units */
22 
23 /* Allows for a 16k data buffer + SQE */
24 #define	NVMF_IOCCSZ		(sizeof(struct nvme_command) + 16 * 1024)
25 #define	NVMF_IORCSZ		(sizeof(struct nvme_completion))
26 
27 #define	NVMF_NN			(1024)
28 
29 /*
30  * Default settings for Fabrics hosts.  These match values used by
31  * Linux.
32  */
33 #define	NVMF_DEFAULT_RECONNECT_DELAY	10
34 #define	NVMF_DEFAULT_CONTROLLER_LOSS	600
35 #define	NVMF_DEFAULT_IO_ENTRIES		128
36 
37 /*
38  * (data, size) is the userspace buffer for a packed nvlist.
39  *
40  * For requests that copyout an nvlist, len is the amount of data
41  * copied out to *data.  If size is zero, no data is copied and len is
42  * set to the required buffer size.
43  */
44 struct nvmf_ioc_nv {
45 	void	*data;
46 	size_t	len;
47 	size_t	size;
48 };
49 
50 /*
51  * The fields in a qpair handoff nvlist are:
52  *
53  * Transport independent:
54  *
55  * bool		admin
56  * bool		sq_flow_control
57  * number	qsize
58  * number	sqhd
59  * number	sqtail			host only
60  *
61  * TCP transport:
62  *
63  * number	fd
64  * number	rxpda
65  * number	txpda
66  * bool		header_digests
67  * bool		data_digests
68  * number	maxr2t
69  * number	maxh2cdata
70  * number	max_icd
71  */
72 
73 /*
74  * The fields in the nvlist for NVMF_HANDOFF_HOST and
75  * NVMF_RECONNECT_HOST are:
76  *
77  * number			trtype
78  * number			kato	(optional)
79  * number                       reconnect_delay (optional)
80  * number                       controller_loss_timeout (optional)
81  * qpair handoff nvlist		admin
82  * qpair handoff nvlist array	io
83  * binary			cdata	struct nvme_controller_data
84  * NVMF_RECONNECT_PARAMS nvlist	rparams
85  */
86 
87 /*
88  * The fields in the nvlist for NVMF_RECONNECT_PARAMS are:
89  *
90  * binary			dle	struct nvme_discovery_log_entry
91  * string			hostnqn
92  * number			num_io_queues
93  * number			kato	(optional)
94  * number                       reconnect_delay (optional)
95  * number                       controller_loss_timeout (optional)
96  * number			io_qsize
97  * bool				sq_flow_control
98  *
99  * TCP transport:
100  *
101  * bool				header_digests
102  * bool				data_digests
103  */
104 
105 /*
106  * The fields in the nvlist for NVMF_CONNECTION_STATUS are:
107  *
108  * bool				connected
109  * timespec nvlist		last_disconnect
110  *  number			tv_sec
111  *  number			tv_nsec
112  */
113 
114 /*
115  * The fields in the nvlist for handing off a controller qpair are:
116  *
117  * number			trtype
118  * qpair handoff nvlist		params
119  * binary			cmd	struct nvmf_fabric_connect_cmd
120  * binary			data	struct nvmf_fabric_connect_data
121  */
122 
123 /* Operations on /dev/nvmf */
124 #define	NVMF_HANDOFF_HOST	_IOW('n', 200, struct nvmf_ioc_nv)
125 #define	NVMF_DISCONNECT_HOST	_IOW('n', 201, const char *)
126 #define	NVMF_DISCONNECT_ALL	_IO('n', 202)
127 
128 /* Operations on /dev/nvmeX */
129 #define	NVMF_RECONNECT_PARAMS	_IOWR('n', 203, struct nvmf_ioc_nv)
130 #define	NVMF_RECONNECT_HOST	_IOW('n', 204, struct nvmf_ioc_nv)
131 #define	NVMF_CONNECTION_STATUS	_IOWR('n', 205, struct nvmf_ioc_nv)
132 
133 #endif /* !__NVMF_H__ */
134