]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net/smc: fix missing byte order conversion in CLC handshake
authorWen Gu <guwen@linux.alibaba.com>
Wed, 6 Dec 2023 17:02:37 +0000 (01:02 +0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 7 Dec 2023 18:10:56 +0000 (10:10 -0800)
The byte order conversions of ISM GID and DMB token are missing in
process of CLC accept and confirm. So fix it.

Fixes: 3d9725a6a133 ("net/smc: common routine for CLC accept and confirm")
Signed-off-by: Wen Gu <guwen@linux.alibaba.com>
Reviewed-by: Tony Lu <tonylu@linux.alibaba.com>
Reviewed-by: Alexandra Winter <wintera@linux.ibm.com>
Reviewed-by: Wenjia Zhang <wenjia@linux.ibm.com>
Link: https://lore.kernel.org/r/1701882157-87956-1-git-send-email-guwen@linux.alibaba.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/smc/af_smc.c
net/smc/smc_clc.c
net/smc/smc_clc.h

index 2a1388841951e4b6d447ab1f7b2dff4586ad4218..73eebddbbf41d37a12de450420f41ddcedeb26f3 100644 (file)
@@ -723,7 +723,7 @@ static void smcd_conn_save_peer_info(struct smc_sock *smc,
        int bufsize = smc_uncompress_bufsize(clc->d0.dmbe_size);
 
        smc->conn.peer_rmbe_idx = clc->d0.dmbe_idx;
-       smc->conn.peer_token = clc->d0.token;
+       smc->conn.peer_token = ntohll(clc->d0.token);
        /* msg header takes up space in the buffer */
        smc->conn.peer_rmbe_size = bufsize - sizeof(struct smcd_cdc_msg);
        atomic_set(&smc->conn.peer_rmbe_space, smc->conn.peer_rmbe_size);
@@ -1415,7 +1415,7 @@ static int smc_connect_ism(struct smc_sock *smc,
                if (rc)
                        return rc;
        }
-       ini->ism_peer_gid[ini->ism_selected] = aclc->d0.gid;
+       ini->ism_peer_gid[ini->ism_selected] = ntohll(aclc->d0.gid);
 
        /* there is only one lgr role for SMC-D; use server lock */
        mutex_lock(&smc_server_lgr_pending);
index 8deb46c28f1d55e81e996bd6ae06c1f09e30320b..72f4d81a3f41f27215baa9bacfd05b1e51356cf7 100644 (file)
@@ -1004,6 +1004,7 @@ static int smc_clc_send_confirm_accept(struct smc_sock *smc,
 {
        struct smc_connection *conn = &smc->conn;
        struct smc_clc_first_contact_ext_v2x fce;
+       struct smcd_dev *smcd = conn->lgr->smcd;
        struct smc_clc_msg_accept_confirm *clc;
        struct smc_clc_fce_gid_ext gle;
        struct smc_clc_msg_trail trl;
@@ -1021,17 +1022,15 @@ static int smc_clc_send_confirm_accept(struct smc_sock *smc,
                memcpy(clc->hdr.eyecatcher, SMCD_EYECATCHER,
                       sizeof(SMCD_EYECATCHER));
                clc->hdr.typev1 = SMC_TYPE_D;
-               clc->d0.gid =
-                       conn->lgr->smcd->ops->get_local_gid(conn->lgr->smcd);
-               clc->d0.token = conn->rmb_desc->token;
+               clc->d0.gid = htonll(smcd->ops->get_local_gid(smcd));
+               clc->d0.token = htonll(conn->rmb_desc->token);
                clc->d0.dmbe_size = conn->rmbe_size_comp;
                clc->d0.dmbe_idx = 0;
                memcpy(&clc->d0.linkid, conn->lgr->id, SMC_LGR_ID_SIZE);
                if (version == SMC_V1) {
                        clc->hdr.length = htons(SMCD_CLC_ACCEPT_CONFIRM_LEN);
                } else {
-                       clc_v2->d1.chid =
-                               htons(smc_ism_get_chid(conn->lgr->smcd));
+                       clc_v2->d1.chid = htons(smc_ism_get_chid(smcd));
                        if (eid && eid[0])
                                memcpy(clc_v2->d1.eid, eid, SMC_MAX_EID_LEN);
                        len = SMCD_CLC_ACCEPT_CONFIRM_LEN_V2;
index c5c8e7db775a7680ef7a375692b504bf243b4900..08155a96a02a17864712f5de157244cc0949a24f 100644 (file)
@@ -204,8 +204,8 @@ struct smcr_clc_msg_accept_confirm {        /* SMCR accept/confirm */
 } __packed;
 
 struct smcd_clc_msg_accept_confirm_common {    /* SMCD accept/confirm */
-       u64 gid;                /* Sender GID */
-       u64 token;              /* DMB token */
+       __be64 gid;             /* Sender GID */
+       __be64 token;           /* DMB token */
        u8 dmbe_idx;            /* DMBE index */
 #if defined(__BIG_ENDIAN_BITFIELD)
        u8 dmbe_size : 4,       /* buf size (compressed) */