net/smc: cleanup of get vlan id
authorKarsten Graul <kgraul@linux.ibm.com>
Fri, 12 Apr 2019 10:57:27 +0000 (12:57 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 12 Apr 2019 17:50:56 +0000 (10:50 -0700)
The vlan_id of the underlying CLC socket was retrieved two times
during processing of the listen handshaking. Change this to get the
vlan id one time in connect and in listen processing, and reuse the id.
And add a new CLC DECLINE return code for the case when the retrieval
of the vlan id failed.

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

index b453728..8ec971f 100644 (file)
@@ -699,9 +699,10 @@ static int __smc_connect(struct smc_sock *smc)
        if (using_ipsec(smc))
                return smc_connect_decline_fallback(smc, SMC_CLC_DECL_IPSEC);
 
-       /* check for VLAN ID */
+       /* get vlan id from IP device */
        if (smc_vlan_by_tcpsk(smc->clcsock, &ini))
-               return smc_connect_decline_fallback(smc, SMC_CLC_DECL_CNFERR);
+               return smc_connect_decline_fallback(smc,
+                                                   SMC_CLC_DECL_GETVLANERR);
 
        /* check if there is an ism device available */
        if (!smc_check_ism(smc, &ini) &&
@@ -1267,6 +1268,12 @@ static void smc_listen_work(struct work_struct *work)
                return;
        }
 
+       /* get vlan id from IP device */
+       if (smc_vlan_by_tcpsk(new_smc->clcsock, &ini)) {
+               smc_listen_decline(new_smc, SMC_CLC_DECL_GETVLANERR, 0);
+               return;
+       }
+
        mutex_lock(&smc_server_lgr_pending);
        smc_close_init(new_smc);
        smc_rx_init(new_smc);
index 0ac3b95..96a9eab 100644 (file)
@@ -39,6 +39,7 @@
 #define SMC_CLC_DECL_RMBE_EC   0x03050000  /* peer has eyecatcher in RMBE    */
 #define SMC_CLC_DECL_OPTUNSUPP 0x03060000  /* fastopen sockopt not supported */
 #define SMC_CLC_DECL_DIFFPREFIX        0x03070000  /* IP prefix / subnet mismatch    */
+#define SMC_CLC_DECL_GETVLANERR        0x03080000  /* err to get vlan id of ip device*/
 #define SMC_CLC_DECL_SYNCERR   0x04000000  /* synchronization error          */
 #define SMC_CLC_DECL_PEERDECL  0x05000000  /* peer declined during handshake */
 #define SMC_CLC_DECL_INTERR    0x09990000  /* internal error                 */
index a016665..1574c7d 100644 (file)
@@ -603,10 +603,6 @@ int smc_conn_create(struct smc_sock *smc, struct smc_init_info *ini)
        int rc = 0;
 
        role = smc->listen_smc ? SMC_SERV : SMC_CLNT;
-       rc = smc_vlan_by_tcpsk(smc->clcsock, ini);
-       if (rc)
-               return rc;
-
        if (role == SMC_CLNT && ini->srv_first_contact)
                /* create new link group as well */
                goto create;