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