root/net/smc/smc_clc.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. smc_clc_proposal_get_prefix
  2. smc_get_clc_msg_smcd

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /*
   3  *  Shared Memory Communications over RDMA (SMC-R) and RoCE
   4  *
   5  *  CLC (connection layer control) handshake over initial TCP socket to
   6  *  prepare for RDMA traffic
   7  *
   8  *  Copyright IBM Corp. 2016
   9  *
  10  *  Author(s):  Ursula Braun <ubraun@linux.vnet.ibm.com>
  11  */
  12 
  13 #ifndef _SMC_CLC_H
  14 #define _SMC_CLC_H
  15 
  16 #include <rdma/ib_verbs.h>
  17 
  18 #include "smc.h"
  19 
  20 #define SMC_CLC_PROPOSAL        0x01
  21 #define SMC_CLC_ACCEPT          0x02
  22 #define SMC_CLC_CONFIRM         0x03
  23 #define SMC_CLC_DECLINE         0x04
  24 
  25 #define SMC_CLC_V1              0x1             /* SMC version                */
  26 #define SMC_TYPE_R              0               /* SMC-R only                 */
  27 #define SMC_TYPE_D              1               /* SMC-D only                 */
  28 #define SMC_TYPE_B              3               /* SMC-R and SMC-D            */
  29 #define CLC_WAIT_TIME           (6 * HZ)        /* max. wait time on clcsock  */
  30 #define CLC_WAIT_TIME_SHORT     HZ              /* short wait time on clcsock */
  31 #define SMC_CLC_DECL_MEM        0x01010000  /* insufficient memory resources  */
  32 #define SMC_CLC_DECL_TIMEOUT_CL 0x02010000  /* timeout w4 QP confirm link     */
  33 #define SMC_CLC_DECL_TIMEOUT_AL 0x02020000  /* timeout w4 QP add link         */
  34 #define SMC_CLC_DECL_CNFERR     0x03000000  /* configuration error            */
  35 #define SMC_CLC_DECL_PEERNOSMC  0x03010000  /* peer did not indicate SMC      */
  36 #define SMC_CLC_DECL_IPSEC      0x03020000  /* IPsec usage                    */
  37 #define SMC_CLC_DECL_NOSMCDEV   0x03030000  /* no SMC device found (R or D)   */
  38 #define SMC_CLC_DECL_NOSMCDDEV  0x03030001  /* no SMC-D device found          */
  39 #define SMC_CLC_DECL_NOSMCRDEV  0x03030002  /* no SMC-R device found          */
  40 #define SMC_CLC_DECL_SMCDNOTALK 0x03030003  /* SMC-D dev can't talk to peer   */
  41 #define SMC_CLC_DECL_MODEUNSUPP 0x03040000  /* smc modes do not match (R or D)*/
  42 #define SMC_CLC_DECL_RMBE_EC    0x03050000  /* peer has eyecatcher in RMBE    */
  43 #define SMC_CLC_DECL_OPTUNSUPP  0x03060000  /* fastopen sockopt not supported */
  44 #define SMC_CLC_DECL_DIFFPREFIX 0x03070000  /* IP prefix / subnet mismatch    */
  45 #define SMC_CLC_DECL_GETVLANERR 0x03080000  /* err to get vlan id of ip device*/
  46 #define SMC_CLC_DECL_ISMVLANERR 0x03090000  /* err to reg vlan id on ism dev  */
  47 #define SMC_CLC_DECL_SYNCERR    0x04000000  /* synchronization error          */
  48 #define SMC_CLC_DECL_PEERDECL   0x05000000  /* peer declined during handshake */
  49 #define SMC_CLC_DECL_INTERR     0x09990000  /* internal error                 */
  50 #define SMC_CLC_DECL_ERR_RTOK   0x09990001  /*   rtoken handling failed       */
  51 #define SMC_CLC_DECL_ERR_RDYLNK 0x09990002  /*   ib ready link failed         */
  52 #define SMC_CLC_DECL_ERR_REGRMB 0x09990003  /*   reg rmb failed               */
  53 
  54 struct smc_clc_msg_hdr {        /* header1 of clc messages */
  55         u8 eyecatcher[4];       /* eye catcher */
  56         u8 type;                /* proposal / accept / confirm / decline */
  57         __be16 length;
  58 #if defined(__BIG_ENDIAN_BITFIELD)
  59         u8 version : 4,
  60            flag    : 1,
  61            rsvd    : 1,
  62            path    : 2;
  63 #elif defined(__LITTLE_ENDIAN_BITFIELD)
  64         u8 path    : 2,
  65            rsvd    : 1,
  66            flag    : 1,
  67            version : 4;
  68 #endif
  69 } __packed;                     /* format defined in RFC7609 */
  70 
  71 struct smc_clc_msg_trail {      /* trailer of clc messages */
  72         u8 eyecatcher[4];
  73 };
  74 
  75 struct smc_clc_msg_local {      /* header2 of clc messages */
  76         u8 id_for_peer[SMC_SYSTEMID_LEN]; /* unique system id */
  77         u8 gid[16];             /* gid of ib_device port */
  78         u8 mac[6];              /* mac of ib_device port */
  79 };
  80 
  81 #define SMC_CLC_MAX_V6_PREFIX   8
  82 
  83 /* Struct would be 4 byte aligned, but it is used in an array that is sent
  84  * to peers and must conform to RFC7609, hence we need to use packed here.
  85  */
  86 struct smc_clc_ipv6_prefix {
  87         struct in6_addr prefix;
  88         u8 prefix_len;
  89 } __packed;                     /* format defined in RFC7609 */
  90 
  91 struct smc_clc_msg_proposal_prefix {    /* prefix part of clc proposal message*/
  92         __be32 outgoing_subnet; /* subnet mask */
  93         u8 prefix_len;          /* number of significant bits in mask */
  94         u8 reserved[2];
  95         u8 ipv6_prefixes_cnt;   /* number of IPv6 prefixes in prefix array */
  96 } __aligned(4);
  97 
  98 struct smc_clc_msg_smcd {       /* SMC-D GID information */
  99         u64 gid;                /* ISM GID of requestor */
 100         u8 res[32];
 101 };
 102 
 103 struct smc_clc_msg_proposal {   /* clc proposal message sent by Linux */
 104         struct smc_clc_msg_hdr hdr;
 105         struct smc_clc_msg_local lcl;
 106         __be16 iparea_offset;   /* offset to IP address information area */
 107 } __aligned(4);
 108 
 109 #define SMC_CLC_PROPOSAL_MAX_OFFSET     0x28
 110 #define SMC_CLC_PROPOSAL_MAX_PREFIX     (SMC_CLC_MAX_V6_PREFIX * \
 111                                          sizeof(struct smc_clc_ipv6_prefix))
 112 #define SMC_CLC_MAX_LEN         (sizeof(struct smc_clc_msg_proposal) + \
 113                                  SMC_CLC_PROPOSAL_MAX_OFFSET + \
 114                                  sizeof(struct smc_clc_msg_proposal_prefix) + \
 115                                  SMC_CLC_PROPOSAL_MAX_PREFIX + \
 116                                  sizeof(struct smc_clc_msg_trail))
 117 
 118 struct smc_clc_msg_accept_confirm {     /* clc accept / confirm message */
 119         struct smc_clc_msg_hdr hdr;
 120         union {
 121                 struct { /* SMC-R */
 122                         struct smc_clc_msg_local lcl;
 123                         u8 qpn[3];              /* QP number */
 124                         __be32 rmb_rkey;        /* RMB rkey */
 125                         u8 rmbe_idx;            /* Index of RMBE in RMB */
 126                         __be32 rmbe_alert_token;/* unique connection id */
 127 #if defined(__BIG_ENDIAN_BITFIELD)
 128                         u8 rmbe_size : 4,       /* buf size (compressed) */
 129                            qp_mtu   : 4;        /* QP mtu */
 130 #elif defined(__LITTLE_ENDIAN_BITFIELD)
 131                         u8 qp_mtu   : 4,
 132                            rmbe_size : 4;
 133 #endif
 134                         u8 reserved;
 135                         __be64 rmb_dma_addr;    /* RMB virtual address */
 136                         u8 reserved2;
 137                         u8 psn[3];              /* packet sequence number */
 138                         struct smc_clc_msg_trail smcr_trl;
 139                                                 /* eye catcher "SMCR" EBCDIC */
 140                 } __packed;
 141                 struct { /* SMC-D */
 142                         u64 gid;                /* Sender GID */
 143                         u64 token;              /* DMB token */
 144                         u8 dmbe_idx;            /* DMBE index */
 145 #if defined(__BIG_ENDIAN_BITFIELD)
 146                         u8 dmbe_size : 4,       /* buf size (compressed) */
 147                            reserved3 : 4;
 148 #elif defined(__LITTLE_ENDIAN_BITFIELD)
 149                         u8 reserved3 : 4,
 150                            dmbe_size : 4;
 151 #endif
 152                         u16 reserved4;
 153                         u32 linkid;             /* Link identifier */
 154                         u32 reserved5[3];
 155                         struct smc_clc_msg_trail smcd_trl;
 156                                                 /* eye catcher "SMCD" EBCDIC */
 157                 } __packed;
 158         };
 159 } __packed;                     /* format defined in RFC7609 */
 160 
 161 struct smc_clc_msg_decline {    /* clc decline message */
 162         struct smc_clc_msg_hdr hdr;
 163         u8 id_for_peer[SMC_SYSTEMID_LEN]; /* sender peer_id */
 164         __be32 peer_diagnosis;  /* diagnosis information */
 165         u8 reserved2[4];
 166         struct smc_clc_msg_trail trl; /* eye catcher "SMCR" EBCDIC */
 167 } __aligned(4);
 168 
 169 /* determine start of the prefix area within the proposal message */
 170 static inline struct smc_clc_msg_proposal_prefix *
 171 smc_clc_proposal_get_prefix(struct smc_clc_msg_proposal *pclc)
 172 {
 173         return (struct smc_clc_msg_proposal_prefix *)
 174                ((u8 *)pclc + sizeof(*pclc) + ntohs(pclc->iparea_offset));
 175 }
 176 
 177 /* get SMC-D info from proposal message */
 178 static inline struct smc_clc_msg_smcd *
 179 smc_get_clc_msg_smcd(struct smc_clc_msg_proposal *prop)
 180 {
 181         if (ntohs(prop->iparea_offset) != sizeof(struct smc_clc_msg_smcd))
 182                 return NULL;
 183 
 184         return (struct smc_clc_msg_smcd *)(prop + 1);
 185 }
 186 
 187 struct smcd_dev;
 188 struct smc_init_info;
 189 
 190 int smc_clc_prfx_match(struct socket *clcsock,
 191                        struct smc_clc_msg_proposal_prefix *prop);
 192 int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
 193                      u8 expected_type, unsigned long timeout);
 194 int smc_clc_send_decline(struct smc_sock *smc, u32 peer_diag_info);
 195 int smc_clc_send_proposal(struct smc_sock *smc, int smc_type,
 196                           struct smc_init_info *ini);
 197 int smc_clc_send_confirm(struct smc_sock *smc);
 198 int smc_clc_send_accept(struct smc_sock *smc, int srv_first_contact);
 199 
 200 #endif

/* [<][>][^][v][top][bottom][index][help] */