(struct smc_clc_msg_accept_confirm_v2 *)aclc;
        struct smc_clc_first_contact_ext *fce =
                smc_get_clc_first_contact_ext(clc_v2, false);
+       int rc;
 
        if (!ini->first_contact_peer || aclc->hdr.version == SMC_V1)
                return 0;
        }
 
        ini->release_nr = fce->release;
+       rc = smc_clc_clnt_v2x_features_validate(fce, ini);
+       if (rc)
+               return rc;
 
        return 0;
 }
                                smc_get_clc_first_contact_ext(aclc_v2, true);
 
                        ini->release_nr = fce->release;
+                       rc = smc_clc_clnt_v2x_features_validate(fce, ini);
+                       if (rc)
+                               return rc;
                }
 
                rc = smc_v2_determine_accepted_chid(aclc_v2, ini);
        if (rc)
                goto out_decl;
 
+       rc = smc_clc_srv_v2x_features_validate(pclc, ini);
+       if (rc)
+               goto out_decl;
+
        mutex_lock(&smc_server_lgr_pending);
        smc_close_init(new_smc);
        smc_rx_init(new_smc);
                goto out_decl;
        }
 
+       rc = smc_clc_v2x_features_confirm_check(cclc, ini);
+       if (rc) {
+               if (!ini->is_smcd)
+                       goto out_unlock;
+               goto out_decl;
+       }
+
        /* finish worker */
        if (!ini->is_smcd) {
                rc = smc_listen_rdma_finish(new_smc, cclc,
 
        return len > 0 ? 0 : len;
 }
 
+int smc_clc_srv_v2x_features_validate(struct smc_clc_msg_proposal *pclc,
+                                     struct smc_init_info *ini)
+{
+       struct smc_clc_v2_extension *pclc_v2_ext;
+
+       if ((!(ini->smcd_version & SMC_V2) && !(ini->smcr_version & SMC_V2)) ||
+           ini->release_nr < SMC_RELEASE_1)
+               return 0;
+
+       pclc_v2_ext = smc_get_clc_v2_ext(pclc);
+       if (!pclc_v2_ext)
+               return SMC_CLC_DECL_NOV2EXT;
+
+       return 0;
+}
+
+int smc_clc_clnt_v2x_features_validate(struct smc_clc_first_contact_ext *fce,
+                                      struct smc_init_info *ini)
+{
+       if (ini->release_nr < SMC_RELEASE_1)
+               return 0;
+
+       return 0;
+}
+
+int smc_clc_v2x_features_confirm_check(struct smc_clc_msg_accept_confirm *cclc,
+                                      struct smc_init_info *ini)
+{
+       struct smc_clc_msg_accept_confirm_v2 *clc_v2 =
+               (struct smc_clc_msg_accept_confirm_v2 *)cclc;
+       struct smc_clc_first_contact_ext *fce =
+               smc_get_clc_first_contact_ext(clc_v2, ini->is_smcd);
+
+       if (cclc->hdr.version == SMC_V1 ||
+           !(cclc->hdr.typev2 & SMC_FIRST_CONTACT_MASK))
+               return 0;
+
+       if (ini->release_nr != fce->release)
+               return SMC_CLC_DECL_RELEASEERR;
+
+       if (fce->release < SMC_RELEASE_1)
+               return 0;
+
+       return 0;
+}
+
 void smc_clc_get_hostname(u8 **host)
 {
        *host = &smc_hostname[0];
 
 #define SMC_CLC_DECL_NOSEID    0x03030006  /* peer sent no SEID              */
 #define SMC_CLC_DECL_NOSMCD2DEV        0x03030007  /* no SMC-Dv2 device found        */
 #define SMC_CLC_DECL_NOUEID    0x03030008  /* peer sent no UEID              */
+#define SMC_CLC_DECL_RELEASEERR        0x03030009  /* release version negotiate failed */
 #define SMC_CLC_DECL_MODEUNSUPP        0x03040000  /* smc modes do not match (R or D)*/
 #define SMC_CLC_DECL_RMBE_EC   0x03050000  /* peer has eyecatcher in RMBE    */
 #define SMC_CLC_DECL_OPTUNSUPP 0x03060000  /* fastopen sockopt not supported */
                         u8 version, u8 *eid, struct smc_init_info *ini);
 int smc_clc_send_accept(struct smc_sock *smc, bool srv_first_contact,
                        u8 version, u8 *negotiated_eid, struct smc_init_info *ini);
+int smc_clc_srv_v2x_features_validate(struct smc_clc_msg_proposal *pclc,
+                                     struct smc_init_info *ini);
+int smc_clc_clnt_v2x_features_validate(struct smc_clc_first_contact_ext *fce,
+                                      struct smc_init_info *ini);
+int smc_clc_v2x_features_confirm_check(struct smc_clc_msg_accept_confirm *cclc,
+                                      struct smc_init_info *ini);
 void smc_clc_init(void) __init;
 void smc_clc_exit(void);
 void smc_clc_get_hostname(u8 **host);