Lines Matching refs:ini

745 				    struct smc_init_info *ini)
748 memcpy(link->peer_gid, ini->peer_gid, SMC_GID_SIZE);
749 memcpy(link->peer_mac, ini->peer_mac, sizeof(link->peer_mac));
1004 static int smc_find_rdma_device(struct smc_sock *smc, struct smc_init_info *ini)
1010 smc_pnet_find_roce_resource(smc->clcsock->sk, ini);
1011 if (!ini->check_smcrv2 && !ini->ib_dev)
1013 if (ini->check_smcrv2 && !ini->smcrv2.ib_dev_v2)
1020 static int smc_find_ism_device(struct smc_sock *smc, struct smc_init_info *ini)
1023 smc_pnet_find_ism_resource(smc->clcsock->sk, ini);
1024 if (!ini->ism_dev[0])
1027 ini->ism_chid[0] = smc_ism_get_chid(ini->ism_dev[0]);
1032 static bool smc_find_ism_v2_is_unique_chid(u16 chid, struct smc_init_info *ini,
1035 int i = (!ini->ism_dev[0]) ? 1 : 0;
1038 if (ini->ism_chid[i] == chid)
1047 struct smc_init_info *ini)
1054 if (smcd_indicated(ini->smc_type_v1))
1058 if (smcd->going_away || smcd == ini->ism_dev[0])
1061 if (!smc_find_ism_v2_is_unique_chid(chid, ini, i))
1065 ini->ism_dev[i] = smcd;
1066 ini->ism_chid[i] = chid;
1067 ini->is_smcd = true;
1075 ini->ism_offered_cnt = i - 1;
1076 if (!ini->ism_dev[0] && !ini->ism_dev[1])
1077 ini->smcd_version = 0;
1084 struct smc_init_info *ini)
1086 if (ini->vlan_id && smc_ism_get_vlan(ini->ism_dev[0], ini->vlan_id))
1092 struct smc_init_info *ini)
1097 if (!(ini->smcd_version & SMC_V1) ||
1098 smc_find_ism_device(smc, ini) ||
1099 smc_connect_ism_vlan_setup(smc, ini))
1100 ini->smcd_version &= ~SMC_V1;
1104 if (!(ini->smcr_version & SMC_V1) ||
1105 smc_find_rdma_device(smc, ini))
1106 ini->smcr_version &= ~SMC_V1;
1109 ini->smc_type_v1 = smc_indicated_type(ini->smcd_version & SMC_V1,
1110 ini->smcr_version & SMC_V1);
1113 if (!(ini->smcd_version & SMC_V2) ||
1115 smc_find_ism_v2_device_clnt(smc, ini))
1116 ini->smcd_version &= ~SMC_V2;
1119 ini->check_smcrv2 = true;
1120 ini->smcrv2.saddr = smc->clcsock->sk->sk_rcv_saddr;
1121 if (!(ini->smcr_version & SMC_V2) ||
1124 smc_find_rdma_device(smc, ini))
1125 ini->smcr_version &= ~SMC_V2;
1126 ini->check_smcrv2 = false;
1128 ini->smc_type_v2 = smc_indicated_type(ini->smcd_version & SMC_V2,
1129 ini->smcr_version & SMC_V2);
1132 if (ini->smc_type_v1 == SMC_TYPE_N && ini->smc_type_v2 == SMC_TYPE_N)
1142 struct smc_init_info *ini)
1144 if (!smcd_indicated(ini->smc_type_v1))
1146 if (ini->vlan_id && smc_ism_put_vlan(ini->ism_dev[0], ini->vlan_id))
1159 struct smc_init_info *ini)
1164 rc = smc_clc_send_proposal(smc, ini);
1202 struct smc_init_info *ini)
1211 if (!ini->first_contact_peer || aclc->hdr.version == SMC_V1)
1215 memcpy(ini->smcrv2.nexthop_mac, &aclc->r0.lcl.mac, ETH_ALEN);
1216 ini->smcrv2.uses_gateway = false;
1220 ini->smcrv2.nexthop_mac,
1221 &ini->smcrv2.uses_gateway))
1223 if (!ini->smcrv2.uses_gateway) {
1229 ini->release_nr = fce->release;
1230 rc = smc_clc_clnt_v2x_features_validate(fce, ini);
1240 struct smc_init_info *ini)
1246 ini->is_smcd = false;
1247 ini->ib_clcqpn = ntoh24(aclc->r0.qpn);
1248 ini->first_contact_peer = aclc->hdr.typev2 & SMC_FIRST_CONTACT_MASK;
1249 memcpy(ini->peer_systemid, aclc->r0.lcl.id_for_peer, SMC_SYSTEMID_LEN);
1250 memcpy(ini->peer_gid, aclc->r0.lcl.gid, SMC_GID_SIZE);
1251 memcpy(ini->peer_mac, aclc->r0.lcl.mac, ETH_ALEN);
1252 ini->max_conns = SMC_CONN_PER_LGR_MAX;
1253 ini->max_links = SMC_LINKS_ADD_LNK_MAX;
1255 reason_code = smc_connect_rdma_v2_prepare(smc, aclc, ini);
1260 reason_code = smc_conn_create(smc, ini);
1268 if (ini->first_contact_local) {
1299 if (ini->first_contact_local)
1300 smc_link_save_peer_info(link, aclc, ini);
1310 if (ini->first_contact_local) {
1334 if (ini->first_contact_local)
1335 smc_fill_gid_list(link->lgr, &ini->smcrv2.gidlist,
1339 reason_code = smc_clc_send_confirm(smc, ini->first_contact_local,
1340 aclc->hdr.version, eid, ini);
1346 if (ini->first_contact_local) {
1363 smc_conn_abort(smc, ini->first_contact_local);
1375 struct smc_init_info *ini)
1379 for (i = 0; i < ini->ism_offered_cnt + 1; i++) {
1380 if (ini->ism_chid[i] == ntohs(aclc->d1.chid)) {
1381 ini->ism_selected = i;
1392 struct smc_init_info *ini)
1397 ini->is_smcd = true;
1398 ini->first_contact_peer = aclc->hdr.typev2 & SMC_FIRST_CONTACT_MASK;
1404 if (ini->first_contact_peer) {
1408 ini->release_nr = fce->release;
1409 rc = smc_clc_clnt_v2x_features_validate(fce, ini);
1414 rc = smc_v2_determine_accepted_chid(aclc_v2, ini);
1418 ini->ism_peer_gid[ini->ism_selected] = ntohll(aclc->d0.gid);
1422 rc = smc_conn_create(smc, ini);
1447 rc = smc_clc_send_confirm(smc, ini->first_contact_local,
1448 aclc->hdr.version, eid, ini);
1460 smc_conn_abort(smc, ini->first_contact_local);
1468 static int smc_connect_check_aclc(struct smc_init_info *ini,
1477 !smcr_indicated(ini->smc_type_v2)) ||
1479 !smcd_indicated(ini->smc_type_v2)))
1483 !smcr_indicated(ini->smc_type_v1)) ||
1485 !smcd_indicated(ini->smc_type_v1)))
1498 struct smc_init_info *ini = NULL;
1514 ini = kzalloc(sizeof(*ini), GFP_KERNEL);
1515 if (!ini)
1519 ini->smcd_version = SMC_V1 | SMC_V2;
1520 ini->smcr_version = SMC_V1 | SMC_V2;
1521 ini->smc_type_v1 = SMC_TYPE_B;
1522 ini->smc_type_v2 = SMC_TYPE_B;
1525 if (smc_vlan_by_tcpsk(smc->clcsock, ini)) {
1526 ini->smcd_version &= ~SMC_V1;
1527 ini->smcr_version = 0;
1528 ini->smc_type_v1 = SMC_TYPE_N;
1529 if (!ini->smcd_version) {
1535 rc = smc_find_proposal_devices(smc, ini);
1548 rc = smc_connect_clc(smc, aclc2, ini);
1559 rc = smc_connect_check_aclc(ini, aclc);
1566 ini->smcr_version = version;
1567 rc = smc_connect_rdma(smc, aclc, ini);
1569 ini->smcd_version = version;
1570 rc = smc_connect_ism(smc, aclc, ini);
1576 smc_connect_ism_vlan_cleanup(smc, ini);
1578 kfree(ini);
1582 smc_connect_ism_vlan_cleanup(smc, ini);
1585 kfree(ini);
1978 struct smc_init_info *ini)
1984 ini->smc_type_v1 = pclc->hdr.typev1;
1985 ini->smc_type_v2 = pclc->hdr.typev2;
1986 ini->smcd_version = smcd_indicated(ini->smc_type_v1) ? SMC_V1 : 0;
1987 ini->smcr_version = smcr_indicated(ini->smc_type_v1) ? SMC_V1 : 0;
1989 if (smcd_indicated(ini->smc_type_v2))
1990 ini->smcd_version |= SMC_V2;
1991 if (smcr_indicated(ini->smc_type_v2))
1992 ini->smcr_version |= SMC_V2;
1994 if (!(ini->smcd_version & SMC_V2) && !(ini->smcr_version & SMC_V2)) {
2000 ini->smcd_version &= ~SMC_V2;
2001 ini->smcr_version &= ~SMC_V2;
2006 if (ini->smcd_version & SMC_V2) {
2008 ini->smcd_version &= ~SMC_V2;
2011 ini->smcd_version &= ~SMC_V2;
2015 ini->smcd_version &= ~SMC_V2;
2019 if (ini->smcr_version & SMC_V2) {
2021 ini->smcr_version &= ~SMC_V2;
2026 ini->release_nr = pclc_v2_ext->hdr.flag.release;
2028 ini->release_nr = SMC_RELEASE;
2031 if (!ini->smcd_version && !ini->smcr_version)
2055 struct smc_init_info *ini)
2060 rc = smc_conn_create(new_smc, ini);
2066 smc_conn_abort(new_smc, ini->first_contact_local);
2075 struct smc_init_info *ini)
2079 rc = smc_conn_create(new_smc, ini);
2086 smc_conn_abort(new_smc, ini->first_contact_local);
2095 struct smc_init_info *ini,
2101 if (smcd == ini->ism_dev[i])
2108 static void smc_check_ism_v2_match(struct smc_init_info *ini,
2117 if (smc_is_already_selected(smcd, ini, *matches))
2121 ini->ism_peer_gid[*matches] = proposed_gid;
2122 ini->ism_dev[*matches] = smcd;
2129 static void smc_find_ism_store_rc(u32 rc, struct smc_init_info *ini)
2131 if (!ini->rc)
2132 ini->rc = rc;
2137 struct smc_init_info *ini)
2147 if (!(ini->smcd_version & SMC_V2) || !smcd_indicated(ini->smc_type_v2))
2157 smc_check_ism_v2_match(ini, ntohs(pclc_smcd->ism.chid),
2163 smc_check_ism_v2_match(ini,
2170 if (!ini->ism_dev[0]) {
2171 smc_find_ism_store_rc(SMC_CLC_DECL_NOSMCD2DEV, ini);
2176 if (!smc_clc_match_eid(ini->negotiated_eid, smc_v2_ext,
2181 smcd_version = ini->smcd_version;
2183 ini->smcd_version = SMC_V2;
2184 ini->is_smcd = true;
2185 ini->ism_selected = i;
2186 rc = smc_listen_ism_init(new_smc, ini);
2188 smc_find_ism_store_rc(rc, ini);
2195 ini->smcd_version = smcd_version; /* restore original value */
2196 ini->negotiated_eid[0] = 0;
2199 ini->smcd_version &= ~SMC_V2;
2200 ini->ism_dev[0] = NULL;
2201 ini->is_smcd = false;
2206 struct smc_init_info *ini)
2212 if (!(ini->smcd_version & SMC_V1) || !smcd_indicated(ini->smc_type_v1))
2214 ini->is_smcd = true; /* prepare ISM check */
2215 ini->ism_peer_gid[0] = ntohll(pclc_smcd->ism.gid);
2216 rc = smc_find_ism_device(new_smc, ini);
2219 ini->ism_selected = 0;
2220 rc = smc_listen_ism_init(new_smc, ini);
2225 smc_find_ism_store_rc(rc, ini);
2226 ini->smcd_version &= ~SMC_V1;
2227 ini->ism_dev[0] = NULL;
2228 ini->is_smcd = false;
2252 struct smc_init_info *ini)
2258 if (!(ini->smcr_version & SMC_V2) || !smcr_indicated(ini->smc_type_v2))
2262 if (!smc_clc_match_eid(ini->negotiated_eid, smc_v2_ext, NULL, NULL))
2266 memcpy(ini->peer_systemid, pclc->lcl.id_for_peer, SMC_SYSTEMID_LEN);
2267 memcpy(ini->peer_gid, smc_v2_ext->roce, SMC_GID_SIZE);
2268 memcpy(ini->peer_mac, pclc->lcl.mac, ETH_ALEN);
2269 ini->check_smcrv2 = true;
2270 ini->smcrv2.clc_sk = new_smc->clcsock->sk;
2271 ini->smcrv2.saddr = new_smc->clcsock->sk->sk_rcv_saddr;
2272 ini->smcrv2.daddr = smc_ib_gid_to_ipv4(smc_v2_ext->roce);
2273 rc = smc_find_rdma_device(new_smc, ini);
2275 smc_find_ism_store_rc(rc, ini);
2278 if (!ini->smcrv2.uses_gateway)
2279 memcpy(ini->smcrv2.nexthop_mac, pclc->lcl.mac, ETH_ALEN);
2281 smcr_version = ini->smcr_version;
2282 ini->smcr_version = SMC_V2;
2283 rc = smc_listen_rdma_init(new_smc, ini);
2285 rc = smc_listen_rdma_reg(new_smc, ini->first_contact_local);
2287 smc_conn_abort(new_smc, ini->first_contact_local);
2291 ini->smcr_version = smcr_version;
2292 smc_find_ism_store_rc(rc, ini);
2295 ini->smcr_version &= ~SMC_V2;
2296 ini->smcrv2.ib_dev_v2 = NULL;
2297 ini->check_smcrv2 = false;
2302 struct smc_init_info *ini)
2306 if (!(ini->smcr_version & SMC_V1) || !smcr_indicated(ini->smc_type_v1))
2310 memcpy(ini->peer_systemid, pclc->lcl.id_for_peer, SMC_SYSTEMID_LEN);
2311 memcpy(ini->peer_gid, pclc->lcl.gid, SMC_GID_SIZE);
2312 memcpy(ini->peer_mac, pclc->lcl.mac, ETH_ALEN);
2313 rc = smc_find_rdma_device(new_smc, ini);
2318 rc = smc_listen_rdma_init(new_smc, ini);
2321 return smc_listen_rdma_reg(new_smc, ini->first_contact_local);
2327 struct smc_init_info *ini)
2332 smc_find_ism_v2_device_serv(new_smc, pclc, ini);
2333 if (ini->ism_dev[0])
2339 smc_find_ism_store_rc(prfx_rc, ini);
2342 if (smc_vlan_by_tcpsk(new_smc->clcsock, ini))
2343 return ini->rc ?: SMC_CLC_DECL_GETVLANERR;
2347 smc_find_ism_v1_device_serv(new_smc, pclc, ini);
2348 if (ini->ism_dev[0])
2354 return ini->rc ?: SMC_CLC_DECL_NOSMCDDEV;
2357 smc_find_rdma_v2_device_serv(new_smc, pclc, ini);
2358 if (ini->smcrv2.ib_dev_v2)
2365 rc = smc_find_rdma_v1_device_serv(new_smc, pclc, ini);
2366 smc_find_ism_store_rc(rc, ini);
2367 return (!rc) ? 0 : ini->rc;
2376 struct smc_init_info *ini)
2382 smc_link_save_peer_info(link, cclc, ini);
2407 struct smc_init_info *ini = NULL;
2453 ini = kzalloc(sizeof(*ini), GFP_KERNEL);
2454 if (!ini) {
2460 rc = smc_listen_v2_check(new_smc, pclc, ini);
2464 rc = smc_clc_srv_v2x_features_validate(pclc, ini);
2474 rc = smc_listen_find_device(new_smc, pclc, ini);
2479 accept_version = ini->is_smcd ? ini->smcd_version : ini->smcr_version;
2480 rc = smc_clc_send_accept(new_smc, ini->first_contact_local,
2481 accept_version, ini->negotiated_eid, ini);
2486 if (ini->is_smcd)
2495 if (!ini->is_smcd)
2500 rc = smc_clc_v2x_features_confirm_check(cclc, ini);
2502 if (!ini->is_smcd)
2513 if (!ini->is_smcd) {
2515 ini->first_contact_local, ini);
2522 SMC_STAT_SERV_SUCC_INC(sock_net(newclcsock->sk), ini);
2528 smc_listen_decline(new_smc, rc, ini ? ini->first_contact_local : 0,
2531 kfree(ini);