Skip to content

Commit

Permalink
net/smc: support SMCv2.x supplemental features negotiation
Browse files Browse the repository at this point in the history
This patch adds SMCv2.x supplemental features negotiation. Supported
SMCv2.x supplemental features are represented by feature_mask in FCE
field. The negotiation process is as follows.

 Server                                        Client
            Proposal(features(c-mask bits))
      <-----------------------------------------
            Accept(features(s-mask bits))
      ----------------------------------------->
           Confirm(features(s&c-mask bits))
      <-----------------------------------------

Signed-off-by: Wen Gu <guwen@linux.alibaba.com>
Reviewed-and-tested-by: Wenjia Zhang <wenjia@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Wen Gu authored and David S. Miller committed Dec 26, 2023
1 parent 9505450 commit ece60db
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 4 deletions.
4 changes: 4 additions & 0 deletions net/smc/smc.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ enum smc_state { /* possible states of an SMC socket */
SMC_PROCESSABORT = 27,
};

#define SMC_FEATURE_MASK 0 /* bitmask of
* supported supplemental features
*/

struct smc_link_group;

struct smc_wr_rx_hdr { /* common prefix part of LLC and CDC to demultiplex */
Expand Down
7 changes: 7 additions & 0 deletions net/smc/smc_clc.c
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,7 @@ static int smc_clc_fill_fce_v2x(struct smc_clc_first_contact_ext_v2x *fce_v2x,
fce_v2x->max_conns = ini->max_conns;
fce_v2x->max_links = ini->max_links;
}
fce_v2x->feature_mask = htons(ini->feature_mask);
}

out:
Expand Down Expand Up @@ -907,6 +908,7 @@ int smc_clc_send_proposal(struct smc_sock *smc, struct smc_init_info *ini)
pclc_smcd->v2_ext_offset = htons(v2_ext_offset);
plen += sizeof(*v2_ext);

v2_ext->feature_mask = htons(SMC_FEATURE_MASK);
read_lock(&smc_clc_eid_table.lock);
v2_ext->hdr.eid_cnt = smc_clc_eid_table.ueid_cnt;
plen += smc_clc_eid_table.ueid_cnt * SMC_MAX_EID_LEN;
Expand Down Expand Up @@ -1208,6 +1210,7 @@ int smc_clc_srv_v2x_features_validate(struct smc_sock *smc,

ini->max_conns = SMC_CONN_PER_LGR_MAX;
ini->max_links = SMC_LINKS_ADD_LNK_MAX;
ini->feature_mask = SMC_FEATURE_MASK;

if ((!(ini->smcd_version & SMC_V2) && !(ini->smcr_version & SMC_V2)) ||
ini->release_nr < SMC_RELEASE_1)
Expand Down Expand Up @@ -1251,6 +1254,8 @@ int smc_clc_clnt_v2x_features_validate(struct smc_clc_first_contact_ext *fce,
return SMC_CLC_DECL_MAXLINKERR;
ini->max_links = fce_v2x->max_links;
}
/* common supplemental features of server and client */
ini->feature_mask = ntohs(fce_v2x->feature_mask) & SMC_FEATURE_MASK;

return 0;
}
Expand Down Expand Up @@ -1279,6 +1284,8 @@ int smc_clc_v2x_features_confirm_check(struct smc_clc_msg_accept_confirm *cclc,
if (fce_v2x->max_links != ini->max_links)
return SMC_CLC_DECL_MAXLINKERR;
}
/* common supplemental features returned by client */
ini->feature_mask = ntohs(fce_v2x->feature_mask);

return 0;
}
Expand Down
14 changes: 10 additions & 4 deletions net/smc/smc_clc.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,8 @@ struct smc_clc_v2_extension {
u8 roce[16]; /* RoCEv2 GID */
u8 max_conns;
u8 max_links;
u8 reserved[14];
__be16 feature_mask;
u8 reserved[12];
u8 user_eids[][SMC_MAX_EID_LEN];
};

Expand Down Expand Up @@ -240,9 +241,14 @@ struct smc_clc_first_contact_ext {

struct smc_clc_first_contact_ext_v2x {
struct smc_clc_first_contact_ext fce_v2_base;
u8 max_conns; /* for SMC-R only */
u8 max_links; /* for SMC-R only */
u8 reserved3[2];
union {
struct {
u8 max_conns; /* for SMC-R only */
u8 max_links; /* for SMC-R only */
};
u8 reserved3[2]; /* for SMC-D only */
};
__be16 feature_mask;
__be32 vendor_exp_options;
u8 reserved4[8];
} __packed; /* format defined in
Expand Down
1 change: 1 addition & 0 deletions net/smc/smc_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,7 @@ struct smc_init_info {
u8 max_links;
u8 first_contact_peer;
u8 first_contact_local;
u16 feature_mask;
unsigned short vlan_id;
u32 rc;
u8 negotiated_eid[SMC_MAX_EID_LEN];
Expand Down

0 comments on commit ece60db

Please sign in to comment.