Lines Matching full:ini
750 struct smc_init_info *ini)
753 memcpy(link->peer_gid, ini->peer_gid, SMC_GID_SIZE);
754 memcpy(link->peer_mac, ini->peer_mac, sizeof(link->peer_mac));
1010 static int smc_find_rdma_device(struct smc_sock *smc, struct smc_init_info *ini)
1016 smc_pnet_find_roce_resource(smc->clcsock->sk, ini);
1017 if (!ini->check_smcrv2 && !ini->ib_dev)
1019 if (ini->check_smcrv2 && !ini->smcrv2.ib_dev_v2)
1026 static int smc_find_ism_device(struct smc_sock *smc, struct smc_init_info *ini)
1029 smc_pnet_find_ism_resource(smc->clcsock->sk, ini);
1030 if (!ini->ism_dev[0])
1033 ini->ism_chid[0] = smc_ism_get_chid(ini->ism_dev[0]);
1038 static bool smc_find_ism_v2_is_unique_chid(u16 chid, struct smc_init_info *ini,
1041 int i = (!ini->ism_dev[0]) ? 1 : 0;
1044 if (ini->ism_chid[i] == chid)
1053 struct smc_init_info *ini)
1061 if (smcd_indicated(ini->smc_type_v1))
1065 if (smcd->going_away || smcd == ini->ism_dev[0])
1068 if (!smc_find_ism_v2_is_unique_chid(chid, ini, i))
1080 ini->ism_dev[i] = smcd;
1081 ini->ism_chid[i] = chid;
1082 ini->is_smcd = true;
1091 ini->ism_offered_cnt = i - 1;
1092 if (!ini->ism_dev[0] && !ini->ism_dev[1])
1093 ini->smcd_version = 0;
1099 static int smc_connect_ism_vlan_setup(struct smc_init_info *ini)
1101 if (ini->vlan_id && smc_ism_get_vlan(ini->ism_dev[0], ini->vlan_id))
1107 struct smc_init_info *ini)
1112 if (!(ini->smcd_version & SMC_V1) ||
1113 smc_find_ism_device(smc, ini) ||
1114 smc_connect_ism_vlan_setup(ini))
1115 ini->smcd_version &= ~SMC_V1;
1119 if (!(ini->smcr_version & SMC_V1) ||
1120 smc_find_rdma_device(smc, ini))
1121 ini->smcr_version &= ~SMC_V1;
1124 ini->smc_type_v1 = smc_indicated_type(ini->smcd_version & SMC_V1,
1125 ini->smcr_version & SMC_V1);
1128 if (!(ini->smcd_version & SMC_V2) ||
1130 smc_find_ism_v2_device_clnt(smc, ini))
1131 ini->smcd_version &= ~SMC_V2;
1134 ini->check_smcrv2 = true;
1135 ini->smcrv2.saddr = smc->clcsock->sk->sk_rcv_saddr;
1136 if (!(ini->smcr_version & SMC_V2) ||
1142 smc_find_rdma_device(smc, ini))
1143 ini->smcr_version &= ~SMC_V2;
1144 ini->check_smcrv2 = false;
1146 ini->smc_type_v2 = smc_indicated_type(ini->smcd_version & SMC_V2,
1147 ini->smcr_version & SMC_V2);
1150 if (ini->smc_type_v1 == SMC_TYPE_N && ini->smc_type_v2 == SMC_TYPE_N)
1159 static int smc_connect_ism_vlan_cleanup(struct smc_init_info *ini)
1161 if (!smcd_indicated(ini->smc_type_v1))
1163 if (ini->vlan_id && smc_ism_put_vlan(ini->ism_dev[0], ini->vlan_id))
1176 struct smc_init_info *ini)
1181 rc = smc_clc_send_proposal(smc, ini);
1219 struct smc_init_info *ini)
1226 if (!ini->first_contact_peer || aclc->hdr.version == SMC_V1)
1230 memcpy(ini->smcrv2.nexthop_mac, &aclc->r0.lcl.mac, ETH_ALEN);
1231 ini->smcrv2.uses_gateway = false;
1235 ini->smcrv2.nexthop_mac,
1236 &ini->smcrv2.uses_gateway))
1238 if (!ini->smcrv2.uses_gateway) {
1244 ini->release_nr = fce->release;
1245 rc = smc_clc_clnt_v2x_features_validate(fce, ini);
1255 struct smc_init_info *ini)
1261 ini->is_smcd = false;
1262 ini->ib_clcqpn = ntoh24(aclc->r0.qpn);
1263 ini->first_contact_peer = aclc->hdr.typev2 & SMC_FIRST_CONTACT_MASK;
1264 memcpy(ini->peer_systemid, aclc->r0.lcl.id_for_peer, SMC_SYSTEMID_LEN);
1265 memcpy(ini->peer_gid, aclc->r0.lcl.gid, SMC_GID_SIZE);
1266 memcpy(ini->peer_mac, aclc->r0.lcl.mac, ETH_ALEN);
1267 ini->max_conns = SMC_CONN_PER_LGR_MAX;
1268 ini->max_links = SMC_LINKS_ADD_LNK_MAX;
1270 reason_code = smc_connect_rdma_v2_prepare(smc, aclc, ini);
1275 reason_code = smc_conn_create(smc, ini);
1283 if (ini->first_contact_local) {
1314 if (ini->first_contact_local)
1315 smc_link_save_peer_info(link, aclc, ini);
1324 if (ini->first_contact_local) {
1345 if (ini->first_contact_local)
1346 smc_fill_gid_list(link->lgr, &ini->smcrv2.gidlist,
1350 reason_code = smc_clc_send_confirm(smc, ini->first_contact_local,
1351 aclc->hdr.version, eid, ini);
1357 if (ini->first_contact_local) {
1374 smc_conn_abort(smc, ini->first_contact_local);
1386 struct smc_init_info *ini)
1390 for (i = 0; i < ini->ism_offered_cnt + 1; i++) {
1391 if (ini->ism_chid[i] == ntohs(aclc->d1.chid)) {
1392 ini->ism_selected = i;
1403 struct smc_init_info *ini)
1408 ini->is_smcd = true;
1409 ini->first_contact_peer = aclc->hdr.typev2 & SMC_FIRST_CONTACT_MASK;
1412 if (ini->first_contact_peer) {
1416 ini->release_nr = fce->release;
1417 rc = smc_clc_clnt_v2x_features_validate(fce, ini);
1422 rc = smc_v2_determine_accepted_chid(aclc, ini);
1426 if (__smc_ism_is_emulated(ini->ism_chid[ini->ism_selected]))
1427 ini->ism_peer_gid[ini->ism_selected].gid_ext =
1431 ini->ism_peer_gid[ini->ism_selected].gid = ntohll(aclc->d0.gid);
1435 rc = smc_conn_create(smc, ini);
1463 rc = smc_clc_send_confirm(smc, ini->first_contact_local,
1464 aclc->hdr.version, eid, ini);
1476 smc_conn_abort(smc, ini->first_contact_local);
1484 static int smc_connect_check_aclc(struct smc_init_info *ini,
1489 !smcr_indicated(ini->smc_type_v2)) ||
1491 !smcd_indicated(ini->smc_type_v2)))
1495 !smcr_indicated(ini->smc_type_v1)) ||
1497 !smcd_indicated(ini->smc_type_v1)))
1509 struct smc_init_info *ini = NULL;
1525 ini = kzalloc(sizeof(*ini), GFP_KERNEL);
1526 if (!ini)
1530 ini->smcd_version = SMC_V1 | SMC_V2;
1531 ini->smcr_version = SMC_V1 | SMC_V2;
1532 ini->smc_type_v1 = SMC_TYPE_B;
1533 ini->smc_type_v2 = SMC_TYPE_B;
1536 if (smc_vlan_by_tcpsk(smc->clcsock, ini)) {
1537 ini->smcd_version &= ~SMC_V1;
1538 ini->smcr_version = 0;
1539 ini->smc_type_v1 = SMC_TYPE_N;
1542 rc = smc_find_proposal_devices(smc, ini);
1554 rc = smc_connect_clc(smc, aclc, ini);
1565 rc = smc_connect_check_aclc(ini, aclc);
1572 ini->smcr_version = version;
1573 rc = smc_connect_rdma(smc, aclc, ini);
1575 ini->smcd_version = version;
1576 rc = smc_connect_ism(smc, aclc, ini);
1582 smc_connect_ism_vlan_cleanup(ini);
1584 kfree(ini);
1588 smc_connect_ism_vlan_cleanup(ini);
1591 kfree(ini);
1985 struct smc_init_info *ini)
1991 ini->smc_type_v1 = pclc->hdr.typev1;
1992 ini->smc_type_v2 = pclc->hdr.typev2;
1993 ini->smcd_version = smcd_indicated(ini->smc_type_v1) ? SMC_V1 : 0;
1994 ini->smcr_version = smcr_indicated(ini->smc_type_v1) ? SMC_V1 : 0;
1996 if (smcd_indicated(ini->smc_type_v2))
1997 ini->smcd_version |= SMC_V2;
1998 if (smcr_indicated(ini->smc_type_v2))
1999 ini->smcr_version |= SMC_V2;
2001 if (!(ini->smcd_version & SMC_V2) && !(ini->smcr_version & SMC_V2)) {
2007 ini->smcd_version &= ~SMC_V2;
2008 ini->smcr_version &= ~SMC_V2;
2013 if (ini->smcd_version & SMC_V2) {
2015 ini->smcd_version &= ~SMC_V2;
2018 ini->smcd_version &= ~SMC_V2;
2022 ini->smcd_version &= ~SMC_V2;
2026 if (ini->smcr_version & SMC_V2) {
2028 ini->smcr_version &= ~SMC_V2;
2033 ini->release_nr = pclc_v2_ext->hdr.flag.release;
2035 ini->release_nr = SMC_RELEASE;
2038 if (!ini->smcd_version && !ini->smcr_version)
2064 struct smc_init_info *ini)
2069 rc = smc_conn_create(new_smc, ini);
2075 smc_conn_abort(new_smc, ini->first_contact_local);
2084 struct smc_init_info *ini)
2088 rc = smc_conn_create(new_smc, ini);
2095 smc_conn_abort(new_smc, ini->first_contact_local);
2104 struct smc_init_info *ini,
2110 if (smcd == ini->ism_dev[i])
2117 static void smc_check_ism_v2_match(struct smc_init_info *ini,
2127 if (smc_is_already_selected(smcd, ini, *matches))
2131 ini->ism_peer_gid[*matches].gid = proposed_gid->gid;
2133 ini->ism_peer_gid[*matches].gid_ext =
2136 ini->ism_dev[*matches] = smcd;
2143 static void smc_find_ism_store_rc(u32 rc, struct smc_init_info *ini)
2145 if (!ini->rc)
2146 ini->rc = rc;
2151 struct smc_init_info *ini)
2163 if (!(ini->smcd_version & SMC_V2) || !smcd_indicated(ini->smc_type_v2))
2177 smc_check_ism_v2_match(ini, ntohs(pclc_smcd->ism.chid),
2201 smc_check_ism_v2_match(ini, chid, &smcd_gid, &matches);
2205 if (!ini->ism_dev[0]) {
2206 smc_find_ism_store_rc(SMC_CLC_DECL_NOSMCD2DEV, ini);
2211 if (!smc_clc_match_eid(ini->negotiated_eid, smc_v2_ext,
2216 smcd_version = ini->smcd_version;
2218 ini->smcd_version = SMC_V2;
2219 ini->is_smcd = true;
2220 ini->ism_selected = i;
2221 rc = smc_listen_ism_init(new_smc, ini);
2223 smc_find_ism_store_rc(rc, ini);
2230 ini->smcd_version = smcd_version; /* restore original value */
2231 ini->negotiated_eid[0] = 0;
2234 ini->smcd_version &= ~SMC_V2;
2235 ini->ism_dev[0] = NULL;
2236 ini->is_smcd = false;
2241 struct smc_init_info *ini)
2247 if (!(ini->smcd_version & SMC_V1) ||
2248 !smcd_indicated(ini->smc_type_v1) ||
2251 ini->is_smcd = true; /* prepare ISM check */
2252 ini->ism_peer_gid[0].gid = ntohll(pclc_smcd->ism.gid);
2253 ini->ism_peer_gid[0].gid_ext = 0;
2254 rc = smc_find_ism_device(new_smc, ini);
2257 ini->ism_selected = 0;
2258 rc = smc_listen_ism_init(new_smc, ini);
2263 smc_find_ism_store_rc(rc, ini);
2264 ini->smcd_version &= ~SMC_V1;
2265 ini->ism_dev[0] = NULL;
2266 ini->is_smcd = false;
2290 struct smc_init_info *ini)
2296 if (!(ini->smcr_version & SMC_V2) || !smcr_indicated(ini->smc_type_v2))
2301 !smc_clc_match_eid(ini->negotiated_eid, smc_v2_ext, NULL, NULL))
2305 memcpy(ini->peer_systemid, pclc->lcl.id_for_peer, SMC_SYSTEMID_LEN);
2306 memcpy(ini->peer_gid, smc_v2_ext->roce, SMC_GID_SIZE);
2307 memcpy(ini->peer_mac, pclc->lcl.mac, ETH_ALEN);
2308 ini->check_smcrv2 = true;
2309 ini->smcrv2.clc_sk = new_smc->clcsock->sk;
2310 ini->smcrv2.saddr = new_smc->clcsock->sk->sk_rcv_saddr;
2311 ini->smcrv2.daddr = smc_ib_gid_to_ipv4(smc_v2_ext->roce);
2312 rc = smc_find_rdma_device(new_smc, ini);
2314 smc_find_ism_store_rc(rc, ini);
2317 if (!ini->smcrv2.uses_gateway)
2318 memcpy(ini->smcrv2.nexthop_mac, pclc->lcl.mac, ETH_ALEN);
2320 smcr_version = ini->smcr_version;
2321 ini->smcr_version = SMC_V2;
2322 rc = smc_listen_rdma_init(new_smc, ini);
2324 rc = smc_listen_rdma_reg(new_smc, ini->first_contact_local);
2326 smc_conn_abort(new_smc, ini->first_contact_local);
2330 ini->smcr_version = smcr_version;
2331 smc_find_ism_store_rc(rc, ini);
2334 ini->smcr_version &= ~SMC_V2;
2335 ini->smcrv2.ib_dev_v2 = NULL;
2336 ini->check_smcrv2 = false;
2341 struct smc_init_info *ini)
2345 if (!(ini->smcr_version & SMC_V1) || !smcr_indicated(ini->smc_type_v1))
2349 memcpy(ini->peer_systemid, pclc->lcl.id_for_peer, SMC_SYSTEMID_LEN);
2350 memcpy(ini->peer_gid, pclc->lcl.gid, SMC_GID_SIZE);
2351 memcpy(ini->peer_mac, pclc->lcl.mac, ETH_ALEN);
2352 rc = smc_find_rdma_device(new_smc, ini);
2357 rc = smc_listen_rdma_init(new_smc, ini);
2360 return smc_listen_rdma_reg(new_smc, ini->first_contact_local);
2366 struct smc_init_info *ini)
2371 smc_find_ism_v2_device_serv(new_smc, pclc, ini);
2372 if (ini->ism_dev[0])
2378 smc_find_ism_store_rc(prfx_rc, ini);
2381 if (smc_vlan_by_tcpsk(new_smc->clcsock, ini))
2382 return ini->rc ?: SMC_CLC_DECL_GETVLANERR;
2386 smc_find_ism_v1_device_serv(new_smc, pclc, ini);
2387 if (ini->ism_dev[0])
2393 return ini->rc ?: SMC_CLC_DECL_NOSMCDDEV;
2396 smc_find_rdma_v2_device_serv(new_smc, pclc, ini);
2397 if (ini->smcrv2.ib_dev_v2)
2404 rc = smc_find_rdma_v1_device_serv(new_smc, pclc, ini);
2405 smc_find_ism_store_rc(rc, ini);
2406 return (!rc) ? 0 : ini->rc;
2415 struct smc_init_info *ini)
2421 smc_link_save_peer_info(link, cclc, ini);
2446 struct smc_init_info *ini = NULL;
2493 ini = kzalloc(sizeof(*ini), GFP_KERNEL);
2494 if (!ini) {
2500 rc = smc_listen_v2_check(new_smc, pclc, ini);
2504 rc = smc_clc_srv_v2x_features_validate(new_smc, pclc, ini);
2513 rc = smc_listen_find_device(new_smc, pclc, ini);
2518 accept_version = ini->is_smcd ? ini->smcd_version : ini->smcr_version;
2519 rc = smc_clc_send_accept(new_smc, ini->first_contact_local,
2520 accept_version, ini->negotiated_eid, ini);
2525 if (ini->is_smcd)
2534 if (!ini->is_smcd)
2539 rc = smc_clc_v2x_features_confirm_check(cclc, ini);
2541 if (!ini->is_smcd)
2552 if (!ini->is_smcd) {
2554 ini->first_contact_local, ini);
2561 if (ini->is_smcd &&
2568 SMC_STAT_SERV_SUCC_INC(sock_net(newclcsock->sk), ini);
2576 smc_listen_decline(new_smc, rc, ini ? ini->first_contact_local : 0,
2579 kfree(ini);