b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CDDL HEADER START
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * The contents of this file are subject to the terms of the
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Common Development and Distribution License (the "License").
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * You may not use this file except in compliance with the License.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * or http://www.opensolaris.org/os/licensing.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * See the License for the specific language governing permissions
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * and limitations under the License.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * When distributing Covered Code, include this CDDL HEADER in each
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * If applicable, add the following below this CDDL HEADER, with the
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * fields enclosed by brackets "[]" replaced with your own identifying
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * information: Portions Copyright [yyyy] [name of copyright owner]
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CDDL HEADER END
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Use is subject to license terms.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Copyright (c) 2005 SilverStorm Technologies, Inc. All rights reserved.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * This software is available to you under a choice of one of two
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * licenses. You may choose to be licensed under the terms of the GNU
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * General Public License (GPL) Version 2, available from the file
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * COPYING in the main directory of this source tree, or the
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * OpenIB.org BSD license below:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Redistribution and use in source and binary forms, with or
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * without modification, are permitted provided that the following
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * conditions are met:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * - Redistributions of source code must retain the above
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * copyright notice, this list of conditions and the following
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * disclaimer.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * - Redistributions in binary form must reproduce the above
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * copyright notice, this list of conditions and the following
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * disclaimer in the documentation and/or other materials
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * provided with the distribution.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * SOFTWARE.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Sun elects to include this software in Sun product
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * under the OpenIB BSD license.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * POSSIBILITY OF SUCH DAMAGE.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ib/clients/rds/rdsib_cm.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ib/clients/rds/rdsib_ib.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ib/clients/rds/rdsib_buf.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ib/clients/rds/rdsib_ep.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * This file contains CM related work:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Service registration/deregistration
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Path lookup
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CM connection callbacks
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CM active and passive connection establishment
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Connection failover
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
948cd88e57e92a578228791377c106422dec227eagiri#define SRCIP src_addr.un.ip4addr
948cd88e57e92a578228791377c106422dec227eagiri#define DSTIP dst_addr.un.ip4addr
948cd88e57e92a578228791377c106422dec227eagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Handle an incoming CM REQ
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* ARGSUSED */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic ibt_cm_status_t
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_handle_cm_req(rds_state_t *statep, ibt_cm_event_t *evp,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_cm_return_args_t *rargsp, void *rcmp, ibt_priv_data_len_t rcmp_len)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_cm_req_rcv_t *reqp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ib_gid_t lgid, rgid;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_cm_private_data_t cmp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_session_t *sp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_ep_t *ep;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_channel_hdl_t chanhdl;
948cd88e57e92a578228791377c106422dec227eagiri ibt_ip_cm_info_t ipcm_info;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri uint8_t save_state, save_type;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_handle_cm_req", "Enter");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri reqp = &evp->cm_event.req;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rgid = reqp->req_prim_addr.av_dgid; /* requester gid */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri lgid = reqp->req_prim_addr.av_sgid; /* receiver gid */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "REQ Received: From: %llx:%llx To: %llx:%llx",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rgid.gid_prefix, rgid.gid_guid, lgid.gid_prefix, lgid.gid_guid);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CM private data brings IP information
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Private data received is a stream of bytes and may not be properly
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * aligned. So, bcopy the data onto the stack before accessing it.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bcopy((uint8_t *)evp->cm_priv_data, &cmp,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sizeof (rds_cm_private_data_t));
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
948cd88e57e92a578228791377c106422dec227eagiri /* extract the CM IP info */
948cd88e57e92a578228791377c106422dec227eagiri ret = ibt_get_ip_data(evp->cm_priv_data_len, evp->cm_priv_data,
948cd88e57e92a578228791377c106422dec227eagiri &ipcm_info);
948cd88e57e92a578228791377c106422dec227eagiri if (ret != IBT_SUCCESS) {
948cd88e57e92a578228791377c106422dec227eagiri RDS_DPRINTF2("rds_handle_cm_req", "ibt_get_ip_data failed: %d",
948cd88e57e92a578228791377c106422dec227eagiri ret);
948cd88e57e92a578228791377c106422dec227eagiri return (IBT_CM_REJECT);
948cd88e57e92a578228791377c106422dec227eagiri }
948cd88e57e92a578228791377c106422dec227eagiri
948cd88e57e92a578228791377c106422dec227eagiri RDS_DPRINTF2("rds_handle_cm_req",
948cd88e57e92a578228791377c106422dec227eagiri "REQ Received: From IP: 0x%x To IP: 0x%x type: %d",
d22e11eb92a44ef85ea64989dbff7134a35829ccBill Taylor ipcm_info.SRCIP, ipcm_info.DSTIP, cmp.cmp_eptype);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (cmp.cmp_version != RDS_VERSION) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF2(LABEL, "Version Mismatch: Local version: %d "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "Remote version: %d", RDS_VERSION, cmp.cmp_version);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_REJECT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
948cd88e57e92a578228791377c106422dec227eagiri /* RDS supports V4 addresses only */
948cd88e57e92a578228791377c106422dec227eagiri if ((ipcm_info.src_addr.family != AF_INET) ||
948cd88e57e92a578228791377c106422dec227eagiri (ipcm_info.dst_addr.family != AF_INET)) {
948cd88e57e92a578228791377c106422dec227eagiri RDS_DPRINTF2(LABEL, "Unsupported Address Family: "
948cd88e57e92a578228791377c106422dec227eagiri "src: %d dst: %d", ipcm_info.src_addr.family,
948cd88e57e92a578228791377c106422dec227eagiri ipcm_info.dst_addr.family);
948cd88e57e92a578228791377c106422dec227eagiri return (IBT_CM_REJECT);
948cd88e57e92a578228791377c106422dec227eagiri }
948cd88e57e92a578228791377c106422dec227eagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (cmp.cmp_arch != RDS_THIS_ARCH) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "ARCH does not match (%d != %d)",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri cmp.cmp_arch, RDS_THIS_ARCH);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_REJECT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if ((cmp.cmp_eptype != RDS_EP_TYPE_CTRL) &&
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (cmp.cmp_eptype != RDS_EP_TYPE_DATA)) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "Unknown Channel type: %d", cmp.cmp_eptype);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_REJECT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* user_buffer_size should be same on all nodes */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (cmp.cmp_user_buffer_size != UserBufferSize) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "UserBufferSize Mismatch, this node: %d remote node: %d",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri UserBufferSize, cmp.cmp_user_buffer_size);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_REJECT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri /*
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri * RDS needs more time to process a failover REQ so send an MRA.
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri * Otherwise, the remote may retry the REQ and fail the connection.
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri */
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri if ((cmp.cmp_failover) && (cmp.cmp_eptype == RDS_EP_TYPE_DATA)) {
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri RDS_DPRINTF2("rds_handle_cm_req", "Session Failover, send MRA");
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri (void) ibt_cm_delay(IBT_CM_DELAY_REQ, evp->cm_session_id,
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri 10000000 /* 10 sec */, NULL, 0);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri }
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Is there a session to the destination node? */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_enter(&statep->rds_sessionlock, RW_READER);
d22e11eb92a44ef85ea64989dbff7134a35829ccBill Taylor sp = rds_session_lkup(statep, ipcm_info.SRCIP, rgid.gid_guid);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_exit(&statep->rds_sessionlock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (sp == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * currently there is no session to the destination
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * remote ip in the private data is the local ip and vice
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * versa
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
d22e11eb92a44ef85ea64989dbff7134a35829ccBill Taylor sp = rds_session_create(statep, ipcm_info.DSTIP,
d22e11eb92a44ef85ea64989dbff7134a35829ccBill Taylor ipcm_info.SRCIP, reqp, RDS_SESSION_PASSIVE);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (sp == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Check the list anyway. */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_enter(&statep->rds_sessionlock, RW_READER);
d22e11eb92a44ef85ea64989dbff7134a35829ccBill Taylor sp = rds_session_lkup(statep, ipcm_info.SRCIP,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rgid.gid_guid);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_exit(&statep->rds_sessionlock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (sp == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * The only way this can fail is due to lack
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * of kernel resources
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_REJECT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_enter(&sp->session_lock, RW_WRITER);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* catch peer-to-peer case as soon as possible */
8257fab973a69800a3a3309e8af21fc1876d2df9agiri if ((sp->session_state == RDS_SESSION_STATE_CREATED) ||
8257fab973a69800a3a3309e8af21fc1876d2df9agiri (sp->session_state == RDS_SESSION_STATE_INIT)) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Check possible peer-to-peer case here */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (sp->session_type != RDS_SESSION_PASSIVE) {
8257fab973a69800a3a3309e8af21fc1876d2df9agiri RDS_DPRINTF2("rds_handle_cm_req",
8257fab973a69800a3a3309e8af21fc1876d2df9agiri "SP(%p) Peer-peer connection handling", sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (lgid.gid_guid > rgid.gid_guid) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* this node is active so reject this request */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_exit(&sp->session_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_REJECT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* this node is passive, change the session */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_type = RDS_SESSION_PASSIVE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_lgid = lgid;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_rgid = rgid;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "SP(%p) state: %d", sp, sp->session_state);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri save_state = sp->session_state;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri save_type = sp->session_type;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri switch (sp->session_state) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case RDS_SESSION_STATE_CONNECTED:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "STALE Session Detected SP(%p)", sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_state = RDS_SESSION_STATE_ERROR;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF3("rds_handle_cm_req", "SP(%p) State "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "RDS_SESSION_STATE_ERROR", sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* FALLTHRU */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case RDS_SESSION_STATE_ERROR:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case RDS_SESSION_STATE_PASSIVE_CLOSING:
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri /*
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri * Some other thread must be processing this session,
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri * this thread must wait until the other thread finishes.
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_type = RDS_SESSION_PASSIVE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_exit(&sp->session_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri /* Handling this will take some time, so send an MRA */
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri (void) ibt_cm_delay(IBT_CM_DELAY_REQ, evp->cm_session_id,
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri 10000000 /* 10 sec */, NULL, 0);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri /*
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri * Any pending completions don't get flushed until the channel
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri * is closed. So, passing 0 here will not wait for pending
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri * completions in rds_session_close before closing the channel
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri */
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri rds_session_close(sp, IBT_NOCALLBACKS, 0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_enter(&sp->session_lock, RW_WRITER);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri /*
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri * If the session was in ERROR, then either a failover thread
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri * or event_failure thread would be processing this session.
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri * This thread should wait for event_failure thread to
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri * complete. This need not wait for failover thread.
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri */
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri if ((save_state != RDS_SESSION_STATE_CONNECTED) &&
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri (save_type == RDS_SESSION_PASSIVE)) {
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri /*
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri * The other thread is event_failure thread,
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri * wait until it finishes.
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri */
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri while (!((sp->session_state ==
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri RDS_SESSION_STATE_FAILED) ||
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri (sp->session_state ==
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri RDS_SESSION_STATE_FINI))) {
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri rw_exit(&sp->session_lock);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri delay(drv_usectohz(1000000));
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri rw_enter(&sp->session_lock, RW_WRITER);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri }
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri /* move the session to init state */
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri if ((sp->session_state == RDS_SESSION_STATE_ERROR) ||
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri (sp->session_state == RDS_SESSION_STATE_PASSIVE_CLOSING)) {
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri ret = rds_session_reinit(sp, lgid);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri sp->session_myip = ipcm_info.DSTIP;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri sp->session_lgid = lgid;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri sp->session_rgid = rgid;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri if (ret != 0) {
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri rds_session_fini(sp);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri sp->session_state = RDS_SESSION_STATE_FAILED;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri RDS_DPRINTF3("rds_handle_cm_req",
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri "SP(%p) State RDS_SESSION_STATE_FAILED",
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri sp);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri rw_exit(&sp->session_lock);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri return (IBT_CM_REJECT);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri } else {
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri sp->session_state = RDS_SESSION_STATE_INIT;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri RDS_DPRINTF3("rds_handle_cm_req",
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri "SP(%p) State RDS_SESSION_STATE_INIT", sp);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri }
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri if (cmp.cmp_eptype == RDS_EP_TYPE_CTRL) {
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri ep = &sp->session_ctrlep;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri } else {
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri ep = &sp->session_dataep;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri }
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri /* FALLTHRU */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case RDS_SESSION_STATE_CREATED:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case RDS_SESSION_STATE_FAILED:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case RDS_SESSION_STATE_FINI:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Initialize both channels, we accept this connection
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * only if both channels are initialized
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
8257fab973a69800a3a3309e8af21fc1876d2df9agiri sp->session_type = RDS_SESSION_PASSIVE;
8257fab973a69800a3a3309e8af21fc1876d2df9agiri sp->session_lgid = lgid;
8257fab973a69800a3a3309e8af21fc1876d2df9agiri sp->session_rgid = rgid;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_state = RDS_SESSION_STATE_CREATED;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF3("rds_handle_cm_req", "SP(%p) State "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "RDS_SESSION_STATE_CREATED", sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = rds_session_init(sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Seems like there are not enough resources */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_state = RDS_SESSION_STATE_FAILED;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF3("rds_handle_cm_req", "SP(%p) State "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "RDS_SESSION_STATE_FAILED", sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_exit(&sp->session_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_REJECT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_state = RDS_SESSION_STATE_INIT;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF3("rds_handle_cm_req", "SP(%p) State "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "RDS_SESSION_STATE_INIT", sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* FALLTHRU */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case RDS_SESSION_STATE_INIT:
8257fab973a69800a3a3309e8af21fc1876d2df9agiri /*
8257fab973a69800a3a3309e8af21fc1876d2df9agiri * When re-using an existing session, make sure the
8257fab973a69800a3a3309e8af21fc1876d2df9agiri * session is still through the same HCA. Otherwise, the
8257fab973a69800a3a3309e8af21fc1876d2df9agiri * memory registrations have to moved to the new HCA.
8257fab973a69800a3a3309e8af21fc1876d2df9agiri */
8257fab973a69800a3a3309e8af21fc1876d2df9agiri if (cmp.cmp_eptype == RDS_EP_TYPE_DATA) {
8257fab973a69800a3a3309e8af21fc1876d2df9agiri if (sp->session_lgid.gid_guid != lgid.gid_guid) {
8257fab973a69800a3a3309e8af21fc1876d2df9agiri RDS_DPRINTF2("rds_handle_cm_req",
8257fab973a69800a3a3309e8af21fc1876d2df9agiri "Existing Session but different gid "
8257fab973a69800a3a3309e8af21fc1876d2df9agiri "existing: 0x%llx, new: 0x%llx, "
8257fab973a69800a3a3309e8af21fc1876d2df9agiri "sending an MRA",
8257fab973a69800a3a3309e8af21fc1876d2df9agiri sp->session_lgid.gid_guid, lgid.gid_guid);
8257fab973a69800a3a3309e8af21fc1876d2df9agiri (void) ibt_cm_delay(IBT_CM_DELAY_REQ,
8257fab973a69800a3a3309e8af21fc1876d2df9agiri evp->cm_session_id, 10000000 /* 10 sec */,
8257fab973a69800a3a3309e8af21fc1876d2df9agiri NULL, 0);
8257fab973a69800a3a3309e8af21fc1876d2df9agiri ret = rds_session_reinit(sp, lgid);
8257fab973a69800a3a3309e8af21fc1876d2df9agiri if (ret != 0) {
8257fab973a69800a3a3309e8af21fc1876d2df9agiri rds_session_fini(sp);
8257fab973a69800a3a3309e8af21fc1876d2df9agiri sp->session_state =
8257fab973a69800a3a3309e8af21fc1876d2df9agiri RDS_SESSION_STATE_FAILED;
8257fab973a69800a3a3309e8af21fc1876d2df9agiri sp->session_failover = 0;
8257fab973a69800a3a3309e8af21fc1876d2df9agiri RDS_DPRINTF3("rds_failover_session",
8257fab973a69800a3a3309e8af21fc1876d2df9agiri "SP(%p) State "
8257fab973a69800a3a3309e8af21fc1876d2df9agiri "RDS_SESSION_STATE_FAILED", sp);
8257fab973a69800a3a3309e8af21fc1876d2df9agiri rw_exit(&sp->session_lock);
8257fab973a69800a3a3309e8af21fc1876d2df9agiri return (IBT_CM_REJECT);
8257fab973a69800a3a3309e8af21fc1876d2df9agiri }
8257fab973a69800a3a3309e8af21fc1876d2df9agiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep = &sp->session_dataep;
8257fab973a69800a3a3309e8af21fc1876d2df9agiri } else {
8257fab973a69800a3a3309e8af21fc1876d2df9agiri ep = &sp->session_ctrlep;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri default:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "ERROR: SP(%p) is in an unexpected "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "state: %d", sp, sp->session_state);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_exit(&sp->session_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_REJECT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
8257fab973a69800a3a3309e8af21fc1876d2df9agiri sp->session_failover = 0; /* reset any previous value */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (cmp.cmp_failover) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_handle_cm_req",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "SP(%p) Failover Session (BP %p)", sp, cmp.cmp_last_bufid);
8257fab973a69800a3a3309e8af21fc1876d2df9agiri sp->session_failover = 1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ep->ep_state == RDS_EP_STATE_UNCONNECTED) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_state = RDS_EP_STATE_PASSIVE_PENDING;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_type = RDS_SESSION_PASSIVE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_exit(&sp->session_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else if (ep->ep_state == RDS_EP_STATE_ACTIVE_PENDING) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_exit(&sp->session_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Peer to peer connection. There is an active
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * connection pending on this ep. The one with
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * greater port guid becomes active and the
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * other becomes passive.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
8257fab973a69800a3a3309e8af21fc1876d2df9agiri RDS_DPRINTF2("rds_handle_cm_req",
8257fab973a69800a3a3309e8af21fc1876d2df9agiri "EP(%p) Peer-peer connection handling", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (lgid.gid_guid > rgid.gid_guid) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* this node is active so reject this request */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "SP(%p) EP(%p): "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "Rejecting passive in favor of active", sp, ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_REJECT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * This session is not the active end, change it
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * to passive end.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_state = RDS_EP_STATE_PASSIVE_PENDING;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_enter(&sp->session_lock, RW_WRITER);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_type = RDS_SESSION_PASSIVE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_lgid = lgid;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_rgid = rgid;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_exit(&sp->session_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_exit(&sp->session_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_lbufid = cmp.cmp_last_bufid;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_ackwr.wr.rc.rcwr.rdma.rdma_raddr = (ib_vaddr_t)cmp.cmp_ack_addr;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_ackwr.wr.rc.rcwr.rdma.rdma_rkey = cmp.cmp_ack_rkey;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri cmp.cmp_last_bufid = ep->ep_rbufid;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri cmp.cmp_ack_addr = ep->ep_ack_addr;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri cmp.cmp_ack_rkey = ep->ep_ack_rkey;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* continue with accepting the connection request for this channel */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanhdl = rds_ep_alloc_rc_channel(ep, reqp->req_prim_hca_port);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (chanhdl == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_state = RDS_EP_STATE_UNCONNECTED;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_REJECT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* pre-post recv buffers in the RQ */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_post_recv_buf((void *)chanhdl);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rargsp->cm_ret_len = sizeof (rds_cm_private_data_t);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bcopy((uint8_t *)&cmp, rcmp, sizeof (rds_cm_private_data_t));
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rargsp->cm_ret.rep.cm_channel = chanhdl;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rargsp->cm_ret.rep.cm_rdma_ra_out = 4;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rargsp->cm_ret.rep.cm_rdma_ra_in = 4;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rargsp->cm_ret.rep.cm_rnr_retry_cnt = MinRnrRetry;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_handle_cm_req", "Return: SP(%p) EP(%p) Chan (%p)",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp, ep, chanhdl);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_ACCEPT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Handle an incoming CM REP
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Pre-post recv buffers for the QP
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* ARGSUSED */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic ibt_cm_status_t
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_handle_cm_rep(ibt_cm_event_t *evp, ibt_cm_return_args_t *rargsp,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void *rcmp, ibt_priv_data_len_t rcmp_len)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_ep_t *ep;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_cm_private_data_t cmp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_handle_cm_rep", "Enter");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* pre-post recv buffers in the RQ */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_post_recv_buf((void *)evp->cm_channel);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep = (rds_ep_t *)ibt_get_chan_private(evp->cm_channel);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bcopy((uint8_t *)evp->cm_priv_data, &cmp,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sizeof (rds_cm_private_data_t));
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_lbufid = cmp.cmp_last_bufid;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_ackwr.wr.rc.rcwr.rdma.rdma_raddr = (ib_vaddr_t)cmp.cmp_ack_addr;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_ackwr.wr.rc.rcwr.rdma.rdma_rkey = cmp.cmp_ack_rkey;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rargsp->cm_ret_len = 0;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_handle_cm_rep", "Return: lbufid: %p", ep->ep_lbufid);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_ACCEPT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Handle CONN EST
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic ibt_cm_status_t
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_handle_cm_conn_est(ibt_cm_event_t *evp)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_session_t *sp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_ep_t *ep;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep = (rds_ep_t *)ibt_get_chan_private(evp->cm_channel);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_handle_cm_conn_est", "EP(%p) State: %d", ep,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_state);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ASSERT((ep->ep_state == RDS_EP_STATE_ACTIVE_PENDING) ||
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (ep->ep_state == RDS_EP_STATE_PASSIVE_PENDING));
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_state = RDS_EP_STATE_CONNECTED;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_chanhdl = evp->cm_channel;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp = ep->ep_sp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) rds_session_active(sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_handle_cm_conn_est", "Return");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_ACCEPT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Handle CONN CLOSED
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic ibt_cm_status_t
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_handle_cm_conn_closed(ibt_cm_event_t *evp)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_ep_t *ep;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_session_t *sp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Catch DREQs but ignore DREPs */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (evp->cm_event.closed != IBT_CM_CLOSED_DREQ_RCVD) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_handle_cm_conn_closed",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "Ignoring Event: %d received", evp->cm_event.closed);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_ACCEPT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep = (rds_ep_t *)ibt_get_chan_private(evp->cm_channel);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp = ep->ep_sp;
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rds_handle_cm_conn_closed", "EP(%p) Chan(%p) Enter",
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri ep, evp->cm_channel);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ep->ep_state != RDS_EP_STATE_CONNECTED) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Ignore this DREQ */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_handle_cm_conn_closed",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "EP(%p) not connected, state: %d", ep, ep->ep_state);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_ACCEPT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_state = RDS_EP_STATE_CLOSING;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_enter(&sp->session_lock, RW_WRITER);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_handle_cm_conn_closed", "SP(%p) - state: %d", sp,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_state);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri switch (sp->session_state) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case RDS_SESSION_STATE_CONNECTED:
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala case RDS_SESSION_STATE_HCA_CLOSING:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_state = RDS_SESSION_STATE_PASSIVE_CLOSING;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF3("rds_handle_cm_conn_closed", "SP(%p) State "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "RDS_SESSION_STATE_PASSIVE_CLOSING", sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case RDS_SESSION_STATE_PASSIVE_CLOSING:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_state = RDS_SESSION_STATE_CLOSED;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF3("rds_handle_cm_conn_closed", "SP(%p) State "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "RDS_SESSION_STATE_CLOSED", sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_passive_session_fini(sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_state = RDS_SESSION_STATE_FINI;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF3("rds_handle_cm_conn_closed",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "SP(%p) State RDS_SESSION_STATE_FINI", sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case RDS_SESSION_STATE_ACTIVE_CLOSING:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case RDS_SESSION_STATE_ERROR:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case RDS_SESSION_STATE_CLOSED:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case RDS_SESSION_STATE_INIT:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_state = RDS_SESSION_STATE_ERROR;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF3("rds_handle_cm_conn_closed", "SP(%p) State "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "RDS_SESSION_STATE_ERROR", sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_passive_session_fini(sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_state = RDS_SESSION_STATE_FAILED;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF3("rds_handle_cm_conn_closed",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "SP(%p) State RDS_SESSION_STATE_FAILED", sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri default:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_handle_cm_conn_closed",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "SP(%p) - Unexpected state: %d", sp, sp->session_state);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_passive_session_fini(sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_state = RDS_SESSION_STATE_FAILED;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF3("rds_handle_cm_conn_closed", "SP(%p) State "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "RDS_SESSION_STATE_FAILED", sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_exit(&sp->session_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_state = RDS_EP_STATE_CLOSED;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_handle_cm_conn_closed", "SP(%p) Return", sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_ACCEPT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Handle EVENT FAILURE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic ibt_cm_status_t
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_handle_cm_event_failure(ibt_cm_event_t *evp)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_ep_t *ep;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_session_t *sp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_handle_cm_event_failure", "Enter: Chan hdl: 0x%p "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "Code: %d msg: %d reason: %d", evp->cm_channel,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri evp->cm_event.failed.cf_code, evp->cm_event.failed.cf_msg,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri evp->cm_event.failed.cf_reason);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
015f8fff605f2fbd5fd0072e555576297804d57bhiremath if (evp->cm_event.failed.cf_reason == IBT_CM_INVALID_SID) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF2(LABEL,
015f8fff605f2fbd5fd0072e555576297804d57bhiremath "Received REJ with reason IBT_CM_INVALID_SID: "
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri "RDS may not be loaded on the remote system");
015f8fff605f2fbd5fd0072e555576297804d57bhiremath }
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (evp->cm_channel == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_ACCEPT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
cd03c4aeba7c3ecfdadc0536a3bd40987f6c6063agiri if ((evp->cm_event.failed.cf_code != IBT_CM_FAILURE_STALE) &&
cd03c4aeba7c3ecfdadc0536a3bd40987f6c6063agiri (evp->cm_event.failed.cf_msg == IBT_CM_FAILURE_REQ)) {
cd03c4aeba7c3ecfdadc0536a3bd40987f6c6063agiri /*
cd03c4aeba7c3ecfdadc0536a3bd40987f6c6063agiri * This end is active, just ignore, ibt_open_rc_channel()
cd03c4aeba7c3ecfdadc0536a3bd40987f6c6063agiri * caller will take care of cleanup.
cd03c4aeba7c3ecfdadc0536a3bd40987f6c6063agiri */
cd03c4aeba7c3ecfdadc0536a3bd40987f6c6063agiri RDS_DPRINTF2("rds_handle_cm_event_failure",
cd03c4aeba7c3ecfdadc0536a3bd40987f6c6063agiri "Ignoring this event: Chan hdl: 0x%p", evp->cm_channel);
cd03c4aeba7c3ecfdadc0536a3bd40987f6c6063agiri return (IBT_CM_ACCEPT);
cd03c4aeba7c3ecfdadc0536a3bd40987f6c6063agiri }
cd03c4aeba7c3ecfdadc0536a3bd40987f6c6063agiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep = (rds_ep_t *)ibt_get_chan_private(evp->cm_channel);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp = ep->ep_sp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_enter(&sp->session_lock, RW_WRITER);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (sp->session_type == RDS_SESSION_PASSIVE) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_handle_cm_event_failure",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "SP(%p) - state: %d", sp, sp->session_state);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if ((sp->session_state == RDS_SESSION_STATE_INIT) ||
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (sp->session_state == RDS_SESSION_STATE_CONNECTED)) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_state = RDS_SESSION_STATE_ERROR;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF3("rds_handle_cm_event_failure",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "SP(%p) State RDS_SESSION_STATE_ERROR", sp);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri /*
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri * Store the cm_channel for freeing later
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri * Active side frees it on ibt_open_rc_channel
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri * failure
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri */
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri if (ep->ep_chanhdl == NULL) {
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri ep->ep_chanhdl = evp->cm_channel;
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_exit(&sp->session_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * rds_passive_session_fini should not be called
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * directly in the CM handler. It will cause a deadlock.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ddi_taskq_dispatch(rds_taskq,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_cleanup_passive_session, (void *)sp,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_NOSLEEP);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != DDI_SUCCESS) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF2("rds_handle_cm_event_failure",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "SP(%p) TaskQ dispatch FAILED:%d", sp, ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_ACCEPT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_exit(&sp->session_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_handle_cm_event_failure", "SP(%p) Return", sp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (IBT_CM_ACCEPT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CM Handler
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Called by IBCM
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * The cm_private type differs for active and passive events.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriibt_cm_status_t
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_cm_handler(void *cm_private, ibt_cm_event_t *eventp,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_cm_return_args_t *ret_args, void *ret_priv_data,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_priv_data_len_t ret_len_max)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_cm_status_t ret = IBT_CM_ACCEPT;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_cm_handler", "Enter: event: %d", eventp->cm_type);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri switch (eventp->cm_type) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case IBT_CM_EVENT_REQ_RCV:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = rds_handle_cm_req((rds_state_t *)cm_private, eventp,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret_args, ret_priv_data, ret_len_max);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case IBT_CM_EVENT_REP_RCV:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = rds_handle_cm_rep(eventp, ret_args, ret_priv_data,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret_len_max);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case IBT_CM_EVENT_MRA_RCV:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Not supported */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case IBT_CM_EVENT_CONN_EST:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = rds_handle_cm_conn_est(eventp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case IBT_CM_EVENT_CONN_CLOSED:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = rds_handle_cm_conn_closed(eventp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case IBT_CM_EVENT_FAILURE:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = rds_handle_cm_event_failure(eventp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case IBT_CM_EVENT_LAP_RCV:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Not supported */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "LAP message received");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case IBT_CM_EVENT_APR_RCV:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Not supported */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "APR message received");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri default:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_cm_handler", "Return");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
015f8fff605f2fbd5fd0072e555576297804d57bhiremath/* This is based on OFED Linux RDS */
015f8fff605f2fbd5fd0072e555576297804d57bhiremath#define RDS_PORT_NUM 6556
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Register the wellknown service with service id: RDS_SERVICE_ID
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Incoming connection requests should arrive on this service id.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriibt_srv_hdl_t
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_register_service(ibt_clnt_hdl_t rds_ibhdl)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_srv_hdl_t srvhdl;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_srv_desc_t srvdesc;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_register_service", "Enter: 0x%p", rds_ibhdl);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bzero(&srvdesc, sizeof (ibt_srv_desc_t));
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri srvdesc.sd_handler = rds_cm_handler;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri srvdesc.sd_flags = IBT_SRV_NO_FLAGS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
015f8fff605f2fbd5fd0072e555576297804d57bhiremath /*
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * This is the new service id as per:
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * Annex A11: RDMA IP CM Service
015f8fff605f2fbd5fd0072e555576297804d57bhiremath */
015f8fff605f2fbd5fd0072e555576297804d57bhiremath rdsib_statep->rds_service_id = ibt_get_ip_sid(IPPROTO_TCP,
015f8fff605f2fbd5fd0072e555576297804d57bhiremath RDS_PORT_NUM);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ret = ibt_register_service(rds_ibhdl, &srvdesc,
015f8fff605f2fbd5fd0072e555576297804d57bhiremath rdsib_statep->rds_service_id, 1, &srvhdl, NULL);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath if (ret != IBT_SUCCESS) {
015f8fff605f2fbd5fd0072e555576297804d57bhiremath RDS_DPRINTF2(LABEL,
015f8fff605f2fbd5fd0072e555576297804d57bhiremath "RDS Service (0x%llx) Registration Failed: %d",
015f8fff605f2fbd5fd0072e555576297804d57bhiremath rdsib_statep->rds_service_id, ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_register_service", "Return: 0x%p", srvhdl);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (srvhdl);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* Bind the RDS service on all ports */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriint
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_bind_service(rds_state_t *statep)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_hca_t *hcap;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ib_gid_t gid;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint_t jx, nbinds = 0, nports = 0;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_bind_service", "Enter: 0x%p", statep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_enter(&statep->rds_hca_lock, RW_READER);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hcap = statep->rds_hcalistp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri while (hcap != NULL) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /* skip the HCAs that are not fully online */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if ((hcap->hca_state != RDS_HCA_STATE_OPEN) &&
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala (hcap->hca_state != RDS_HCA_STATE_MEM_REGISTERED)) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rds_bind_service",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala "Skipping HCA: 0x%llx, state: %d",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_guid, hcap->hca_state);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap = hcap->hca_nextp;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala continue;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /* currently, we have space for only 4 bindhdls */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ASSERT(hcap->hca_nports < 4);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri for (jx = 0; jx < hcap->hca_nports; jx++) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nports++;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (hcap->hca_pinfop[jx].p_linkstate !=
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri IBT_PORT_ACTIVE) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * service bind will be called in the async
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * handler when the port comes up. Clear any
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * stale bind handle.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_bindhdl[jx] = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri continue;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri gid = hcap->hca_pinfop[jx].p_sgid_tbl[0];
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF5(LABEL, "HCA: 0x%llx Port: %d "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "gid: %llx:%llx", hcap->hca_guid,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hcap->hca_pinfop[jx].p_port_num, gid.gid_prefix,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri gid.gid_guid);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* pass statep as cm_private */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_bind_service(statep->rds_srvhdl, gid,
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala NULL, statep, &hcap->hca_bindhdl[jx]);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "Bind service for "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "HCA: 0x%llx Port: %d gid %llx:%llx "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "failed: %d", hcap->hca_guid,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hcap->hca_pinfop[jx].p_port_num,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri gid.gid_prefix, gid.gid_guid, ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri continue;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nbinds++;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hcap = hcap->hca_nextp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_exit(&statep->rds_hca_lock);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "RDS Service available on %d/%d ports",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nbinds, nports);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#if 0
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (nbinds == 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (-1);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#endif
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_bind_service", "Return");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* Open an RC connection */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriint
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_open_rc_channel(rds_ep_t *ep, ibt_path_info_t *pinfo,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_execution_mode_t mode, ibt_channel_hdl_t *chanhdl)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_session_t *sp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_chan_open_args_t ocargs;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_rc_returns_t ocrets;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_cm_private_data_t cmp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint8_t hca_port;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_channel_hdl_t hdl;
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ibt_status_t ret = 0;
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ibt_ip_cm_info_t ipcm_info;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_open_rc_channel", "Enter: EP(%p) mode: %d", ep, mode);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp = ep->ep_sp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
015f8fff605f2fbd5fd0072e555576297804d57bhiremath bzero(&ipcm_info, sizeof (ibt_ip_cm_info_t));
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ipcm_info.src_addr.family = AF_INET;
d22e11eb92a44ef85ea64989dbff7134a35829ccBill Taylor ipcm_info.SRCIP = sp->session_myip;
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ipcm_info.dst_addr.family = AF_INET;
d22e11eb92a44ef85ea64989dbff7134a35829ccBill Taylor ipcm_info.DSTIP = sp->session_remip;
d22e11eb92a44ef85ea64989dbff7134a35829ccBill Taylor ipcm_info.src_port = RDS_PORT_NUM;
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ret = ibt_format_ip_private_data(&ipcm_info,
015f8fff605f2fbd5fd0072e555576297804d57bhiremath sizeof (rds_cm_private_data_t), &cmp);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath if (ret != IBT_SUCCESS) {
015f8fff605f2fbd5fd0072e555576297804d57bhiremath RDS_DPRINTF2(LABEL, "SP(%p) EP(%p) ibt_format_ip_private_data "
015f8fff605f2fbd5fd0072e555576297804d57bhiremath "failed: %d", sp, ep, ret);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath return (-1);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath }
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hca_port = pinfo->pi_prim_cep_path.cep_hca_port_num;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hdl = rds_ep_alloc_rc_channel(ep, hca_port);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (hdl == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (-1);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri cmp.cmp_version = RDS_VERSION;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri cmp.cmp_arch = RDS_THIS_ARCH;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri cmp.cmp_eptype = ep->ep_type;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri cmp.cmp_failover = sp->session_failover;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri cmp.cmp_last_bufid = ep->ep_rbufid;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri cmp.cmp_user_buffer_size = UserBufferSize;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri cmp.cmp_ack_addr = ep->ep_ack_addr;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri cmp.cmp_ack_rkey = ep->ep_ack_rkey;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bzero(&ocargs, sizeof (ibt_chan_open_args_t));
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bzero(&ocrets, sizeof (ibt_rc_returns_t));
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ocargs.oc_path = pinfo;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ocargs.oc_cm_handler = rds_cm_handler;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ocargs.oc_cm_clnt_private = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ocargs.oc_rdma_ra_out = 4;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ocargs.oc_rdma_ra_in = 4;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ocargs.oc_priv_data_len = sizeof (rds_cm_private_data_t);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ocargs.oc_priv_data = &cmp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ocargs.oc_path_retry_cnt = IBPathRetryCount;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ocargs.oc_path_rnr_retry_cnt = MinRnrRetry;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_open_rc_channel(hdl, IBT_OCHAN_NO_FLAGS,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mode, &ocargs, &ocrets);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "SP(%p) EP(%p) ibt_open_rc_channel "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "failed: %d", sp, ep, ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) ibt_flush_channel(hdl);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) ibt_free_channel(hdl);
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri mutex_enter(&ep->ep_lock);
cd03c4aeba7c3ecfdadc0536a3bd40987f6c6063agiri /* don't cleanup if this failure is due to peer-peer race */
cd03c4aeba7c3ecfdadc0536a3bd40987f6c6063agiri if (ep->ep_state == RDS_EP_STATE_ACTIVE_PENDING) {
cd03c4aeba7c3ecfdadc0536a3bd40987f6c6063agiri /* cleanup stuff allocated in rds_ep_alloc_rc_channel */
cd03c4aeba7c3ecfdadc0536a3bd40987f6c6063agiri ep->ep_state = RDS_EP_STATE_ERROR;
cd03c4aeba7c3ecfdadc0536a3bd40987f6c6063agiri rds_ep_free_rc_channel(ep);
cd03c4aeba7c3ecfdadc0536a3bd40987f6c6063agiri }
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri mutex_exit(&ep->ep_lock);
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri return (-1);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *chanhdl = hdl;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_open_rc_channel", "Return: EP(%p) Chan: %p", ep,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *chanhdl);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri return (0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriint
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_close_rc_channel(ibt_channel_hdl_t chanhdl, ibt_execution_mode_t mode)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_close_rc_channel", "Enter: Chan(%p) Mode(%d)",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanhdl, mode);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_close_rc_channel(chanhdl, mode, NULL, 0, NULL, NULL, 0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_close_rc_channel", "Return Chan(%p)", chanhdl);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}