xref: /linux/include/linux/nvme-tcp.h (revision 8a61cb6e150ea907b580a1b5e705decb0a3ffc86)
1055d045aSChristoph Hellwig /* SPDX-License-Identifier: GPL-2.0 */
2fc221d05SSagi Grimberg /*
3fc221d05SSagi Grimberg  * NVMe over Fabrics TCP protocol header.
4fc221d05SSagi Grimberg  * Copyright (c) 2018 Lightbits Labs. All rights reserved.
5fc221d05SSagi Grimberg  */
6fc221d05SSagi Grimberg 
7fc221d05SSagi Grimberg #ifndef _LINUX_NVME_TCP_H
8fc221d05SSagi Grimberg #define _LINUX_NVME_TCP_H
9fc221d05SSagi Grimberg 
10fc221d05SSagi Grimberg #include <linux/nvme.h>
11fc221d05SSagi Grimberg 
12fc221d05SSagi Grimberg #define NVME_TCP_DISC_PORT	8009
13fc221d05SSagi Grimberg #define NVME_TCP_ADMIN_CCSZ	SZ_8K
14fc221d05SSagi Grimberg #define NVME_TCP_DIGEST_LENGTH	4
15c2700d28SVarun Prakash #define NVME_TCP_MIN_MAXH2CDATA 4096
16*84e00904SMaurizio Lombardi #define NVME_TCP_MIN_C2HTERM_PLEN	24
17*84e00904SMaurizio Lombardi #define NVME_TCP_MAX_C2HTERM_PLEN	152
18fc221d05SSagi Grimberg 
19fc221d05SSagi Grimberg enum nvme_tcp_pfv {
20fc221d05SSagi Grimberg 	NVME_TCP_PFV_1_0 = 0x0,
21fc221d05SSagi Grimberg };
22fc221d05SSagi Grimberg 
23a86062aaSHannes Reinecke enum nvme_tcp_tls_cipher {
24a86062aaSHannes Reinecke 	NVME_TCP_TLS_CIPHER_INVALID     = 0,
25a86062aaSHannes Reinecke 	NVME_TCP_TLS_CIPHER_SHA256      = 1,
26a86062aaSHannes Reinecke 	NVME_TCP_TLS_CIPHER_SHA384      = 2,
27a86062aaSHannes Reinecke };
28a86062aaSHannes Reinecke 
29fc221d05SSagi Grimberg enum nvme_tcp_fatal_error_status {
30fc221d05SSagi Grimberg 	NVME_TCP_FES_INVALID_PDU_HDR		= 0x01,
31fc221d05SSagi Grimberg 	NVME_TCP_FES_PDU_SEQ_ERR		= 0x02,
32fc221d05SSagi Grimberg 	NVME_TCP_FES_HDR_DIGEST_ERR		= 0x03,
33fc221d05SSagi Grimberg 	NVME_TCP_FES_DATA_OUT_OF_RANGE		= 0x04,
34fc221d05SSagi Grimberg 	NVME_TCP_FES_R2T_LIMIT_EXCEEDED		= 0x05,
35fc221d05SSagi Grimberg 	NVME_TCP_FES_DATA_LIMIT_EXCEEDED	= 0x05,
36fc221d05SSagi Grimberg 	NVME_TCP_FES_UNSUPPORTED_PARAM		= 0x06,
37fc221d05SSagi Grimberg };
38fc221d05SSagi Grimberg 
39fc221d05SSagi Grimberg enum nvme_tcp_digest_option {
40fc221d05SSagi Grimberg 	NVME_TCP_HDR_DIGEST_ENABLE	= (1 << 0),
41fc221d05SSagi Grimberg 	NVME_TCP_DATA_DIGEST_ENABLE	= (1 << 1),
42fc221d05SSagi Grimberg };
43fc221d05SSagi Grimberg 
44fc221d05SSagi Grimberg enum nvme_tcp_pdu_type {
45fc221d05SSagi Grimberg 	nvme_tcp_icreq		= 0x0,
46fc221d05SSagi Grimberg 	nvme_tcp_icresp		= 0x1,
47fc221d05SSagi Grimberg 	nvme_tcp_h2c_term	= 0x2,
48fc221d05SSagi Grimberg 	nvme_tcp_c2h_term	= 0x3,
49fc221d05SSagi Grimberg 	nvme_tcp_cmd		= 0x4,
50fc221d05SSagi Grimberg 	nvme_tcp_rsp		= 0x5,
51fc221d05SSagi Grimberg 	nvme_tcp_h2c_data	= 0x6,
52fc221d05SSagi Grimberg 	nvme_tcp_c2h_data	= 0x7,
53fc221d05SSagi Grimberg 	nvme_tcp_r2t		= 0x9,
54fc221d05SSagi Grimberg };
55fc221d05SSagi Grimberg 
56fc221d05SSagi Grimberg enum nvme_tcp_pdu_flags {
57fc221d05SSagi Grimberg 	NVME_TCP_F_HDGST		= (1 << 0),
58fc221d05SSagi Grimberg 	NVME_TCP_F_DDGST		= (1 << 1),
59fc221d05SSagi Grimberg 	NVME_TCP_F_DATA_LAST		= (1 << 2),
60fc221d05SSagi Grimberg 	NVME_TCP_F_DATA_SUCCESS		= (1 << 3),
61fc221d05SSagi Grimberg };
62fc221d05SSagi Grimberg 
63fc221d05SSagi Grimberg /**
64fc221d05SSagi Grimberg  * struct nvme_tcp_hdr - nvme tcp pdu common header
65fc221d05SSagi Grimberg  *
66fc221d05SSagi Grimberg  * @type:          pdu type
67fc221d05SSagi Grimberg  * @flags:         pdu specific flags
68fc221d05SSagi Grimberg  * @hlen:          pdu header length
69fc221d05SSagi Grimberg  * @pdo:           pdu data offset
70fc221d05SSagi Grimberg  * @plen:          pdu wire byte length
71fc221d05SSagi Grimberg  */
72fc221d05SSagi Grimberg struct nvme_tcp_hdr {
73fc221d05SSagi Grimberg 	__u8	type;
74fc221d05SSagi Grimberg 	__u8	flags;
75fc221d05SSagi Grimberg 	__u8	hlen;
76fc221d05SSagi Grimberg 	__u8	pdo;
77fc221d05SSagi Grimberg 	__le32	plen;
78fc221d05SSagi Grimberg };
79fc221d05SSagi Grimberg 
80fc221d05SSagi Grimberg /**
81fc221d05SSagi Grimberg  * struct nvme_tcp_icreq_pdu - nvme tcp initialize connection request pdu
82fc221d05SSagi Grimberg  *
83fc221d05SSagi Grimberg  * @hdr:           pdu generic header
84fc221d05SSagi Grimberg  * @pfv:           pdu version format
85fc221d05SSagi Grimberg  * @hpda:          host pdu data alignment (dwords, 0's based)
86fc221d05SSagi Grimberg  * @digest:        digest types enabled
87fc221d05SSagi Grimberg  * @maxr2t:        maximum r2ts per request supported
88fc221d05SSagi Grimberg  */
89fc221d05SSagi Grimberg struct nvme_tcp_icreq_pdu {
90fc221d05SSagi Grimberg 	struct nvme_tcp_hdr	hdr;
91fc221d05SSagi Grimberg 	__le16			pfv;
92fc221d05SSagi Grimberg 	__u8			hpda;
93fc221d05SSagi Grimberg 	__u8			digest;
94fc221d05SSagi Grimberg 	__le32			maxr2t;
95fc221d05SSagi Grimberg 	__u8			rsvd2[112];
96fc221d05SSagi Grimberg };
97fc221d05SSagi Grimberg 
98fc221d05SSagi Grimberg /**
99fc221d05SSagi Grimberg  * struct nvme_tcp_icresp_pdu - nvme tcp initialize connection response pdu
100fc221d05SSagi Grimberg  *
101fc221d05SSagi Grimberg  * @hdr:           pdu common header
102fc221d05SSagi Grimberg  * @pfv:           pdu version format
103fc221d05SSagi Grimberg  * @cpda:          controller pdu data alignment (dowrds, 0's based)
104fc221d05SSagi Grimberg  * @digest:        digest types enabled
105fc221d05SSagi Grimberg  * @maxdata:       maximum data capsules per r2t supported
106fc221d05SSagi Grimberg  */
107fc221d05SSagi Grimberg struct nvme_tcp_icresp_pdu {
108fc221d05SSagi Grimberg 	struct nvme_tcp_hdr	hdr;
109fc221d05SSagi Grimberg 	__le16			pfv;
110fc221d05SSagi Grimberg 	__u8			cpda;
111fc221d05SSagi Grimberg 	__u8			digest;
112fc221d05SSagi Grimberg 	__le32			maxdata;
113fc221d05SSagi Grimberg 	__u8			rsvd[112];
114fc221d05SSagi Grimberg };
115fc221d05SSagi Grimberg 
116fc221d05SSagi Grimberg /**
117fc221d05SSagi Grimberg  * struct nvme_tcp_term_pdu - nvme tcp terminate connection pdu
118fc221d05SSagi Grimberg  *
119fc221d05SSagi Grimberg  * @hdr:           pdu common header
120fc221d05SSagi Grimberg  * @fes:           fatal error status
121fc221d05SSagi Grimberg  * @fei:           fatal error information
122fc221d05SSagi Grimberg  */
123fc221d05SSagi Grimberg struct nvme_tcp_term_pdu {
124fc221d05SSagi Grimberg 	struct nvme_tcp_hdr	hdr;
125fc221d05SSagi Grimberg 	__le16			fes;
126aa01c67dSCaleb Sander 	__le16			feil;
127aa01c67dSCaleb Sander 	__le16			feiu;
128aa01c67dSCaleb Sander 	__u8			rsvd[10];
129fc221d05SSagi Grimberg };
130fc221d05SSagi Grimberg 
131fc221d05SSagi Grimberg /**
132fc221d05SSagi Grimberg  * struct nvme_tcp_cmd_pdu - nvme tcp command capsule pdu
133fc221d05SSagi Grimberg  *
134fc221d05SSagi Grimberg  * @hdr:           pdu common header
135fc221d05SSagi Grimberg  * @cmd:           nvme command
136fc221d05SSagi Grimberg  */
137fc221d05SSagi Grimberg struct nvme_tcp_cmd_pdu {
138fc221d05SSagi Grimberg 	struct nvme_tcp_hdr	hdr;
139fc221d05SSagi Grimberg 	struct nvme_command	cmd;
140fc221d05SSagi Grimberg };
141fc221d05SSagi Grimberg 
142fc221d05SSagi Grimberg /**
143fc221d05SSagi Grimberg  * struct nvme_tcp_rsp_pdu - nvme tcp response capsule pdu
144fc221d05SSagi Grimberg  *
145fc221d05SSagi Grimberg  * @hdr:           pdu common header
146fc221d05SSagi Grimberg  * @hdr:           nvme-tcp generic header
147fc221d05SSagi Grimberg  * @cqe:           nvme completion queue entry
148fc221d05SSagi Grimberg  */
149fc221d05SSagi Grimberg struct nvme_tcp_rsp_pdu {
150fc221d05SSagi Grimberg 	struct nvme_tcp_hdr	hdr;
151fc221d05SSagi Grimberg 	struct nvme_completion	cqe;
152fc221d05SSagi Grimberg };
153fc221d05SSagi Grimberg 
154fc221d05SSagi Grimberg /**
155fc221d05SSagi Grimberg  * struct nvme_tcp_r2t_pdu - nvme tcp ready-to-transfer pdu
156fc221d05SSagi Grimberg  *
157fc221d05SSagi Grimberg  * @hdr:           pdu common header
158fc221d05SSagi Grimberg  * @command_id:    nvme command identifier which this relates to
159fc221d05SSagi Grimberg  * @ttag:          transfer tag (controller generated)
160fc221d05SSagi Grimberg  * @r2t_offset:    offset from the start of the command data
161fc221d05SSagi Grimberg  * @r2t_length:    length the host is allowed to send
162fc221d05SSagi Grimberg  */
163fc221d05SSagi Grimberg struct nvme_tcp_r2t_pdu {
164fc221d05SSagi Grimberg 	struct nvme_tcp_hdr	hdr;
165fc221d05SSagi Grimberg 	__u16			command_id;
166fc221d05SSagi Grimberg 	__u16			ttag;
167fc221d05SSagi Grimberg 	__le32			r2t_offset;
168fc221d05SSagi Grimberg 	__le32			r2t_length;
169fc221d05SSagi Grimberg 	__u8			rsvd[4];
170fc221d05SSagi Grimberg };
171fc221d05SSagi Grimberg 
172fc221d05SSagi Grimberg /**
173fc221d05SSagi Grimberg  * struct nvme_tcp_data_pdu - nvme tcp data pdu
174fc221d05SSagi Grimberg  *
175fc221d05SSagi Grimberg  * @hdr:           pdu common header
176fc221d05SSagi Grimberg  * @command_id:    nvme command identifier which this relates to
177fc221d05SSagi Grimberg  * @ttag:          transfer tag (controller generated)
178fc221d05SSagi Grimberg  * @data_offset:   offset from the start of the command data
179fc221d05SSagi Grimberg  * @data_length:   length of the data stream
180fc221d05SSagi Grimberg  */
181fc221d05SSagi Grimberg struct nvme_tcp_data_pdu {
182fc221d05SSagi Grimberg 	struct nvme_tcp_hdr	hdr;
183fc221d05SSagi Grimberg 	__u16			command_id;
184fc221d05SSagi Grimberg 	__u16			ttag;
185fc221d05SSagi Grimberg 	__le32			data_offset;
186fc221d05SSagi Grimberg 	__le32			data_length;
187fc221d05SSagi Grimberg 	__u8			rsvd[4];
188fc221d05SSagi Grimberg };
189fc221d05SSagi Grimberg 
190fc221d05SSagi Grimberg union nvme_tcp_pdu {
191fc221d05SSagi Grimberg 	struct nvme_tcp_icreq_pdu	icreq;
192fc221d05SSagi Grimberg 	struct nvme_tcp_icresp_pdu	icresp;
193fc221d05SSagi Grimberg 	struct nvme_tcp_cmd_pdu		cmd;
194fc221d05SSagi Grimberg 	struct nvme_tcp_rsp_pdu		rsp;
195fc221d05SSagi Grimberg 	struct nvme_tcp_r2t_pdu		r2t;
196fc221d05SSagi Grimberg 	struct nvme_tcp_data_pdu	data;
197fc221d05SSagi Grimberg };
198fc221d05SSagi Grimberg 
199fc221d05SSagi Grimberg #endif /* _LINUX_NVME_TCP_H */
200