net/smc: split CLC confirm/accept data to be sent
authorUrsula Braun <ubraun@linux.ibm.com>
Sat, 26 Sep 2020 10:44:22 +0000 (12:44 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Sep 2020 22:19:02 +0000 (15:19 -0700)
When sending CLC confirm and CLC accept, separate the trailing
part of the message from the initial part (to be prepared for
future first contact extension).

Signed-off-by: Ursula Braun <ubraun@linux.ibm.com>
Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/smc/smc_clc.c
net/smc/smc_clc.h

index 85b41c1..3cc3a2e 100644 (file)
@@ -505,8 +505,10 @@ static int smc_clc_send_confirm_accept(struct smc_sock *smc,
                                       int first_contact)
 {
        struct smc_connection *conn = &smc->conn;
+       struct smc_clc_msg_trail trl;
+       struct kvec vec[2];
        struct msghdr msg;
-       struct kvec vec;
+       int i;
 
        /* send SMC Confirm CLC msg */
        clc->hdr.version = SMC_V1;              /* SMC version */
@@ -523,7 +525,7 @@ static int smc_clc_send_confirm_accept(struct smc_sock *smc,
                clc->d0.dmbe_size = conn->rmbe_size_short;
                clc->d0.dmbe_idx = 0;
                memcpy(&clc->d0.linkid, conn->lgr->id, SMC_LGR_ID_SIZE);
-               memcpy(clc->d0.smcd_trl.eyecatcher, SMCD_EYECATCHER,
+               memcpy(trl.eyecatcher, SMCD_EYECATCHER,
                       sizeof(SMCD_EYECATCHER));
        } else {
                struct smc_link *link = conn->lnk;
@@ -556,14 +558,19 @@ static int smc_clc_send_confirm_accept(struct smc_sock *smc,
                clc->r0.rmb_dma_addr = cpu_to_be64((u64)sg_dma_address
                                (conn->rmb_desc->sgt[link->link_idx].sgl));
                hton24(clc->r0.psn, link->psn_initial);
-               memcpy(clc->r0.smcr_trl.eyecatcher, SMC_EYECATCHER,
-                      sizeof(SMC_EYECATCHER));
+               memcpy(trl.eyecatcher, SMC_EYECATCHER, sizeof(SMC_EYECATCHER));
        }
 
        memset(&msg, 0, sizeof(msg));
-       vec.iov_base = clc;
-       vec.iov_len = ntohs(clc->hdr.length);
-       return kernel_sendmsg(smc->clcsock, &msg, &vec, 1,
+       i = 0;
+       vec[i].iov_base = clc;
+       vec[i++].iov_len = (clc->hdr.typev1 == SMC_TYPE_D ?
+                           SMCD_CLC_ACCEPT_CONFIRM_LEN :
+                           SMCR_CLC_ACCEPT_CONFIRM_LEN) -
+                          sizeof(trl);
+       vec[i].iov_base = &trl;
+       vec[i++].iov_len = sizeof(trl);
+       return kernel_sendmsg(smc->clcsock, &msg, vec, 1,
                              ntohs(clc->hdr.length));
 }
 
index 5f9fda1..c4644d1 100644 (file)
@@ -134,8 +134,6 @@ struct smcr_clc_msg_accept_confirm {        /* SMCR accept/confirm */
        __be64 rmb_dma_addr;    /* RMB virtual address */
        u8 reserved2;
        u8 psn[3];              /* packet sequence number */
-       struct smc_clc_msg_trail smcr_trl;
-                               /* eye catcher "SMCR" EBCDIC */
 } __packed;
 
 struct smcd_clc_msg_accept_confirm {   /* SMCD accept/confirm */
@@ -150,10 +148,8 @@ struct smcd_clc_msg_accept_confirm {       /* SMCD accept/confirm */
           dmbe_size : 4;
 #endif
        u16 reserved4;
-       u32 linkid;             /* Link identifier */
+       __be32 linkid;          /* Link identifier */
        u32 reserved5[3];
-       struct smc_clc_msg_trail smcd_trl;
-                               /* eye catcher "SMCD" EBCDIC */
 } __packed;
 
 struct smc_clc_msg_accept_confirm {    /* clc accept / confirm message */