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