@@ -608,7 +608,9 @@ static int smc_find_rdma_device(struct smc_sock *smc, struct smc_init_info *ini)
608608 * used for the internal TCP socket
609609 */
610610 smc_pnet_find_roce_resource (smc -> clcsock -> sk , ini );
611- if (!ini -> ib_dev )
611+ if (!ini -> check_smcrv2 && !ini -> ib_dev )
612+ return SMC_CLC_DECL_NOSMCRDEV ;
613+ if (ini -> check_smcrv2 && !ini -> smcrv2 .ib_dev_v2 )
612614 return SMC_CLC_DECL_NOSMCRDEV ;
613615 return 0 ;
614616}
@@ -692,27 +694,42 @@ static int smc_find_proposal_devices(struct smc_sock *smc,
692694 int rc = 0 ;
693695
694696 /* check if there is an ism device available */
695- if (ini -> smcd_version & SMC_V1 ) {
696- if (smc_find_ism_device (smc , ini ) ||
697- smc_connect_ism_vlan_setup (smc , ini )) {
698- if (ini -> smc_type_v1 == SMC_TYPE_B )
699- ini -> smc_type_v1 = SMC_TYPE_R ;
700- else
701- ini -> smc_type_v1 = SMC_TYPE_N ;
702- } /* else ISM V1 is supported for this connection */
703- if (smc_find_rdma_device (smc , ini )) {
704- if (ini -> smc_type_v1 == SMC_TYPE_B )
705- ini -> smc_type_v1 = SMC_TYPE_D ;
706- else
707- ini -> smc_type_v1 = SMC_TYPE_N ;
708- } /* else RDMA is supported for this connection */
709- }
710- if (smc_ism_is_v2_capable () && smc_find_ism_v2_device_clnt (smc , ini ))
711- ini -> smc_type_v2 = SMC_TYPE_N ;
697+ if (!(ini -> smcd_version & SMC_V1 ) ||
698+ smc_find_ism_device (smc , ini ) ||
699+ smc_connect_ism_vlan_setup (smc , ini ))
700+ ini -> smcd_version &= ~SMC_V1 ;
701+ /* else ISM V1 is supported for this connection */
702+
703+ /* check if there is an rdma device available */
704+ if (!(ini -> smcr_version & SMC_V1 ) ||
705+ smc_find_rdma_device (smc , ini ))
706+ ini -> smcr_version &= ~SMC_V1 ;
707+ /* else RDMA is supported for this connection */
708+
709+ ini -> smc_type_v1 = smc_indicated_type (ini -> smcd_version & SMC_V1 ,
710+ ini -> smcr_version & SMC_V1 );
711+
712+ /* check if there is an ism v2 device available */
713+ if (!(ini -> smcd_version & SMC_V2 ) ||
714+ !smc_ism_is_v2_capable () ||
715+ smc_find_ism_v2_device_clnt (smc , ini ))
716+ ini -> smcd_version &= ~SMC_V2 ;
717+
718+ /* check if there is an rdma v2 device available */
719+ ini -> check_smcrv2 = true;
720+ ini -> smcrv2 .saddr = smc -> clcsock -> sk -> sk_rcv_saddr ;
721+ if (!(ini -> smcr_version & SMC_V2 ) ||
722+ smc -> clcsock -> sk -> sk_family != AF_INET ||
723+ !smc_clc_ueid_count () ||
724+ smc_find_rdma_device (smc , ini ))
725+ ini -> smcr_version &= ~SMC_V2 ;
726+ ini -> check_smcrv2 = false;
727+
728+ ini -> smc_type_v2 = smc_indicated_type (ini -> smcd_version & SMC_V2 ,
729+ ini -> smcr_version & SMC_V2 );
712730
713731 /* if neither ISM nor RDMA are supported, fallback */
714- if (!smcr_indicated (ini -> smc_type_v1 ) &&
715- ini -> smc_type_v1 == SMC_TYPE_N && ini -> smc_type_v2 == SMC_TYPE_N )
732+ if (ini -> smc_type_v1 == SMC_TYPE_N && ini -> smc_type_v2 == SMC_TYPE_N )
716733 rc = SMC_CLC_DECL_NOSMCDEV ;
717734
718735 return rc ;
@@ -950,17 +967,24 @@ static int smc_connect_ism(struct smc_sock *smc,
950967static int smc_connect_check_aclc (struct smc_init_info * ini ,
951968 struct smc_clc_msg_accept_confirm * aclc )
952969{
953- if ((aclc -> hdr .typev1 == SMC_TYPE_R &&
954- !smcr_indicated (ini -> smc_type_v1 )) ||
955- (aclc -> hdr .typev1 == SMC_TYPE_D &&
956- ((!smcd_indicated (ini -> smc_type_v1 ) &&
957- !smcd_indicated (ini -> smc_type_v2 )) ||
958- (aclc -> hdr .version == SMC_V1 &&
959- !smcd_indicated (ini -> smc_type_v1 )) ||
960- (aclc -> hdr .version == SMC_V2 &&
961- !smcd_indicated (ini -> smc_type_v2 )))))
970+ if (aclc -> hdr .typev1 != SMC_TYPE_R &&
971+ aclc -> hdr .typev1 != SMC_TYPE_D )
962972 return SMC_CLC_DECL_MODEUNSUPP ;
963973
974+ if (aclc -> hdr .version >= SMC_V2 ) {
975+ if ((aclc -> hdr .typev1 == SMC_TYPE_R &&
976+ !smcr_indicated (ini -> smc_type_v2 )) ||
977+ (aclc -> hdr .typev1 == SMC_TYPE_D &&
978+ !smcd_indicated (ini -> smc_type_v2 )))
979+ return SMC_CLC_DECL_MODEUNSUPP ;
980+ } else {
981+ if ((aclc -> hdr .typev1 == SMC_TYPE_R &&
982+ !smcr_indicated (ini -> smc_type_v1 )) ||
983+ (aclc -> hdr .typev1 == SMC_TYPE_D &&
984+ !smcd_indicated (ini -> smc_type_v1 )))
985+ return SMC_CLC_DECL_MODEUNSUPP ;
986+ }
987+
964988 return 0 ;
965989}
966990
@@ -991,14 +1015,15 @@ static int __smc_connect(struct smc_sock *smc)
9911015 return smc_connect_decline_fallback (smc , SMC_CLC_DECL_MEM ,
9921016 version );
9931017
994- ini -> smcd_version = SMC_V1 ;
995- ini -> smcd_version |= smc_ism_is_v2_capable () ? SMC_V2 : 0 ;
1018+ ini -> smcd_version = SMC_V1 | SMC_V2 ;
1019+ ini -> smcr_version = SMC_V1 | SMC_V2 ;
9961020 ini -> smc_type_v1 = SMC_TYPE_B ;
997- ini -> smc_type_v2 = smc_ism_is_v2_capable () ? SMC_TYPE_D : SMC_TYPE_N ;
1021+ ini -> smc_type_v2 = SMC_TYPE_B ;
9981022
9991023 /* get vlan id from IP device */
10001024 if (smc_vlan_by_tcpsk (smc -> clcsock , ini )) {
10011025 ini -> smcd_version &= ~SMC_V1 ;
1026+ ini -> smcr_version = 0 ;
10021027 ini -> smc_type_v1 = SMC_TYPE_N ;
10031028 if (!ini -> smcd_version ) {
10041029 rc = SMC_CLC_DECL_GETVLANERR ;
@@ -1026,15 +1051,17 @@ static int __smc_connect(struct smc_sock *smc)
10261051 /* check if smc modes and versions of CLC proposal and accept match */
10271052 rc = smc_connect_check_aclc (ini , aclc );
10281053 version = aclc -> hdr .version == SMC_V1 ? SMC_V1 : SMC_V2 ;
1029- ini -> smcd_version = version ;
10301054 if (rc )
10311055 goto vlan_cleanup ;
10321056
10331057 /* depending on previous steps, connect using rdma or ism */
1034- if (aclc -> hdr .typev1 == SMC_TYPE_R )
1058+ if (aclc -> hdr .typev1 == SMC_TYPE_R ) {
1059+ ini -> smcr_version = version ;
10351060 rc = smc_connect_rdma (smc , aclc , ini );
1036- else if (aclc -> hdr .typev1 == SMC_TYPE_D )
1061+ } else if (aclc -> hdr .typev1 == SMC_TYPE_D ) {
1062+ ini -> smcd_version = version ;
10371063 rc = smc_connect_ism (smc , aclc , ini );
1064+ }
10381065 if (rc )
10391066 goto vlan_cleanup ;
10401067
0 commit comments