9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER START
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The contents of this file are subject to the terms of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Common Development and Distribution License (the "License").
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You may not use this file except in compliance with the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * or http://www.opensolaris.org/os/licensing.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * See the License for the specific language governing permissions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and limitations under the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * When distributing Covered Code, include this CDDL HEADER in each
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If applicable, add the following below this CDDL HEADER, with the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * fields enclosed by brackets "[]" replaced with your own identifying
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * information: Portions Copyright [yyyy] [name of copyright owner]
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER END
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Use is subject to license terms.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * MODULE: dapl_ep_modify.c
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * PURPOSE: Endpoint management
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Description: Interfaces in this file are completely described in
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the DAPL 1.0 API, Chapter 6, section 5
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * $Id: dapl_ep_modify.c,v 1.23 2003/07/11 18:42:17 hobie16 Exp $
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_cookie.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_ep_util.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_adapter_util.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Internal prototypes
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic _INLINE_ DAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapli_ep_modify_validate_parameters(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_EP_HANDLE ep_handle,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_EP_PARAM_MASK ep_param_mask,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN const DAT_EP_PARAM *ep_param,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor OUT DAPL_IA **ia_ptr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor OUT DAPL_EP **ep_ptr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor OUT DAT_EP_ATTR *ep_attr_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_ep_modify
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAPL Requirements Version xxx, 6.5.6
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Provide the consumer parameters, including attributes and status of
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the Endpoint.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Input:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * ep_handle
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * ep_args_mask
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Output:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * ep_args
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Returns:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_SUCCESS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INVALID_PARAMETER
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INVALID_ATTRIBUTE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INVALID_STATE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_ep_modify(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_EP_HANDLE ep_handle,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_EP_PARAM_MASK ep_param_mask,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN const DAT_EP_PARAM *ep_param)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_IA *ia;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_EP *ep1, *ep2;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_ATTR ep_attr1, ep_attr2;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_EP new_ep, copy_of_old_ep;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_EP alloc_ep; /* Holder for resources. */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_PZ *tmp_pz;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_EVD *tmp_evd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_RETURN dat_status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Flag indicating we've allocated a new one of these. */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_BOOLEAN qp_allocated = DAT_FALSE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_BOOLEAN rqst_cb_allocated = DAT_FALSE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_BOOLEAN recv_cb_allocated = DAT_FALSE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Flag indicating we've used (assigned to QP) a new one of these. */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_BOOLEAN qp_used = DAT_FALSE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_BOOLEAN rqst_cb_used = DAT_FALSE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_BOOLEAN recv_cb_used = DAT_FALSE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapli_ep_modify_validate_parameters(ep_handle,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_param_mask, ep_param, &ia, &ep1, &ep_attr1);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAT_SUCCESS != dat_status) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Setup the alloc_ep with the appropriate parameters (primarily
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * for allocating the QP.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor alloc_ep = *ep1;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor alloc_ep.param.ep_attr = ep_attr1;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_PZ_HANDLE) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor alloc_ep.param.pz_handle = ep_param->pz_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_RECV_EVD_HANDLE) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor alloc_ep.param.recv_evd_handle = ep_param->recv_evd_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_REQUEST_EVD_HANDLE) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor alloc_ep.param.request_evd_handle =
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_param->request_evd_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_CONNECT_EVD_HANDLE) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor alloc_ep.param.connect_evd_handle =
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_param->connect_evd_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Allocate everything that might be needed.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * We allocate separately, and into a different "holding"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * ep, since we a) want the copy of the old ep into the new ep to
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * be atomic with the assignment back (under lock), b) want the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * assignment of the allocated materials to be after the copy of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * old ep into the new ep, and c) don't want the allocation done
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * under lock.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_cb_create(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &alloc_ep.req_buffer, ep1, DAPL_COOKIE_QUEUE_EP,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr1.max_request_dtos);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAT_SUCCESS != dat_status) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rqst_cb_allocated = DAT_TRUE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (!ep1->srq_attached) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_cb_create(&alloc_ep.recv_buffer, ep1,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_COOKIE_QUEUE_EP, ep_attr1.max_recv_dtos);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAT_SUCCESS != dat_status) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor recv_cb_allocated = DAT_TRUE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_ib_qp_alloc(ia, &alloc_ep, ep1);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dat_status != DAT_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qp_allocated = DAT_TRUE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Now we atomically modify the EP, under lock
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * There's a lot of work done here, but there should be no
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * allocation or blocking.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_lock(&ep1->header.lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Revalidate parameters; make sure that races haven't
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * changed anything important.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapli_ep_modify_validate_parameters(ep_handle,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_param_mask, ep_param, &ia, &ep2, &ep_attr2);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAT_SUCCESS != dat_status) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_unlock(&ep2->header.lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * All of the following should be impossible, if validation
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * occurred. But they're important to the logic of this routine,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * so we check.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_assert(ep1 == ep2);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_assert(ep_attr2.max_recv_dtos == ep_attr1.max_recv_dtos);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_assert(ep_attr2.max_request_dtos == ep_attr1.max_request_dtos);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor copy_of_old_ep = *ep2;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Setup new ep.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor new_ep = *ep2;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor new_ep.param.ep_attr = ep_attr2;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * We can initialize the PZ and EVD handles from the alloc_ep because
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the only thing that could have changed since we setup the alloc_ep
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * is stuff changed by dapl_cr_accept, and neither PZ nor EVD is in that
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * list.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor new_ep.param.pz_handle = alloc_ep.param.pz_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor new_ep.param.recv_evd_handle = alloc_ep.param.recv_evd_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor new_ep.param.request_evd_handle = alloc_ep.param.request_evd_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor new_ep.param.connect_evd_handle = alloc_ep.param.connect_evd_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Deal with each of the allocation fields. */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_MAX_RECV_DTOS &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (ep_param->ep_attr.max_recv_dtos !=
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep2->param.ep_attr.max_recv_dtos)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor new_ep.recv_buffer = alloc_ep.recv_buffer;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor recv_cb_used = DAT_TRUE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_MAX_REQUEST_DTOS &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (ep_param->ep_attr.max_request_dtos !=
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep2->param.ep_attr.max_request_dtos)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor new_ep.req_buffer = alloc_ep.req_buffer;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rqst_cb_used = DAT_TRUE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * We need to change the QP only if there already was a QP
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * (leave things the way you found them!) and one of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * following has changed: send/recv EVD, send/recv reqs/IOV max.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAPL_QP_STATE_UNATTACHED != new_ep.qp_state && (ep_param_mask
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor & (DAT_EP_FIELD_EP_ATTR_MAX_REQUEST_IOV |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_EP_ATTR_MAX_RECV_IOV |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_EP_ATTR_MAX_REQUEST_DTOS |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_EP_ATTR_MAX_RECV_DTOS |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_RECV_EVD_HANDLE |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_REQUEST_EVD_HANDLE))) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * We shouldn't be racing with connection establishment
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * because the parameter validate routine should protect us,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * but it's an important enough point that we assert it.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_assert((ep2->param.ep_state !=
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_STATE_PASSIVE_CONNECTION_PENDING) &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (ep2->param.ep_state !=
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_STATE_ACTIVE_CONNECTION_PENDING));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor new_ep.qp_handle = alloc_ep.qp_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor new_ep.qpn = alloc_ep.qpn;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qp_used = DAT_TRUE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The actual assignment, including modifying QP parameters.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Modifying QP parameters needs to come first, as if it fails
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * we need to exit.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAPL_QP_STATE_UNATTACHED != new_ep.qp_state) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_ib_qp_modify(ia, ep2, &ep_attr2);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dat_status != DAT_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_unlock(& ep2->header.lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *ep2 = new_ep;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_unlock(&ep2->header.lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Modify reference counts, incrementing new ones
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and then decrementing old ones (so if they're the same
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the refcount never drops to zero).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tmp_pz = (DAPL_PZ *) new_ep.param.pz_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL != tmp_pz) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_inc(&tmp_pz->pz_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tmp_evd = (DAPL_EVD *) new_ep.param.recv_evd_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL != tmp_evd) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_inc(&tmp_evd->evd_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tmp_evd = (DAPL_EVD *) new_ep.param.request_evd_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL != tmp_evd) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_inc(&tmp_evd->evd_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tmp_evd = (DAPL_EVD *) new_ep.param.connect_evd_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL != tmp_evd) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_inc(&tmp_evd->evd_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* decreament the old reference counts */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tmp_pz = (DAPL_PZ *) copy_of_old_ep.param.pz_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL != tmp_pz) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_dec(&tmp_pz->pz_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tmp_evd = (DAPL_EVD *) copy_of_old_ep.param.recv_evd_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL != tmp_evd) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_dec(&tmp_evd->evd_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tmp_evd = (DAPL_EVD *) copy_of_old_ep.param.request_evd_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL != tmp_evd) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_dec(&tmp_evd->evd_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tmp_evd = (DAPL_EVD *) copy_of_old_ep.param.connect_evd_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL != tmp_evd) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_dec(&tmp_evd->evd_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorbail:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (qp_allocated) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_RETURN local_dat_status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dat_status != DAT_SUCCESS || !qp_used) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor local_dat_status = dapls_ib_qp_free(ia, &alloc_ep);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor local_dat_status = dapls_ib_qp_free(ia,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &copy_of_old_ep);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (local_dat_status != DAT_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_WARN,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "ep_modify: Failed to free QP; status %x\n",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor local_dat_status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (rqst_cb_allocated) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dat_status != DAT_SUCCESS || !rqst_cb_used) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_cb_free(&alloc_ep.req_buffer);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_cb_free(&copy_of_old_ep.req_buffer);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (recv_cb_allocated) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dat_status != DAT_SUCCESS || !recv_cb_used) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_cb_free(&alloc_ep.recv_buffer);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_cb_free(&copy_of_old_ep.recv_buffer);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (dat_status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapli_ep_modify_validate_parameters
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Validate parameters
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The space for the ep_attr_ptr parameter should be allocated by the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * consumer. Upon success, this parameter will contain the current ep
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * attribute values with the requested modifications made.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic DAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapli_ep_modify_validate_parameters(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_EP_HANDLE ep_handle,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_EP_PARAM_MASK ep_param_mask,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN const DAT_EP_PARAM *ep_param,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor OUT DAPL_IA **ia_ptr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor OUT DAPL_EP **ep_ptr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor OUT DAT_EP_ATTR *ep_attr_ptr)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_IA *ia;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_EP *ep;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_ATTR ep_attr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_ATTR ep_attr_limit;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_ATTR ep_attr_request;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_RETURN dat_status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *ia_ptr = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *ep_ptr = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_SUCCESS;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_HANDLE,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_INVALID_HANDLE_EP);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep = (DAPL_EP *) ep_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ia = ep->header.owner_ia;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Verify parameters valid in current EP state
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & (DAT_EP_FIELD_IA_HANDLE |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_EP_STATE |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_LOCAL_IA_ADDRESS_PTR |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_LOCAL_PORT_QUAL |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_REMOTE_IA_ADDRESS_PTR |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_REMOTE_PORT_QUAL |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_SRQ_HANDLE |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_EP_ATTR_SRQ_SOFT_HW)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Can only change the PZ handle if we are UNCONNECTED or
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * TENTATIVE_CONNECTION_PENDING(psp PROVIDER allocated EP)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((ep_param_mask & DAT_EP_FIELD_PZ_HANDLE) &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (ep->param.ep_state != DAT_EP_STATE_UNCONNECTED &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep->param.ep_state !=
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_STATE,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_ep_state_subtype(ep));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((ep_param_mask & (DAT_EP_FIELD_RECV_EVD_HANDLE |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_REQUEST_EVD_HANDLE |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_CONNECT_EVD_HANDLE |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_EP_ATTR_SERVICE_TYPE |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_EP_ATTR_MAX_MESSAGE_SIZE |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_EP_ATTR_MAX_RDMA_SIZE |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_EP_ATTR_QOS |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_EP_ATTR_REQUEST_COMPLETION_FLAGS |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_EP_ATTR_RECV_COMPLETION_FLAGS |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_EP_ATTR_MAX_RECV_DTOS |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_EP_ATTR_MAX_REQUEST_DTOS |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_EP_ATTR_MAX_RECV_IOV |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_FIELD_EP_ATTR_MAX_REQUEST_IOV)) &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (ep->param.ep_state != DAT_EP_STATE_UNCONNECTED &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep->param.ep_state != DAT_EP_STATE_RESERVED &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep->param.ep_state !=
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_STATE,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_ep_state_subtype(ep));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Validate handles being modified
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_PZ_HANDLE) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param->pz_handle != NULL &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_BAD_HANDLE(ep_param->pz_handle, DAPL_MAGIC_PZ)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_INVALID_ARG3);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_RECV_EVD_HANDLE) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param->recv_evd_handle != NULL &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (DAPL_BAD_HANDLE(ep_param->recv_evd_handle,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_MAGIC_EVD) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor !((DAPL_EVD *)ep_param->recv_evd_handle)->evd_flags &
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EVD_DTO_FLAG)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_INVALID_ARG3);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_REQUEST_EVD_HANDLE) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param->request_evd_handle != NULL &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_BAD_HANDLE(ep_param->request_evd_handle,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_MAGIC_EVD)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_INVALID_ARG3);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_CONNECT_EVD_HANDLE) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param->connect_evd_handle != NULL &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_BAD_HANDLE(ep_param->connect_evd_handle,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_MAGIC_EVD) &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor !(((DAPL_EVD *)ep_param->connect_evd_handle)->evd_flags &
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EVD_CONNECTION_FLAG)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_INVALID_ARG3);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Validate the attributes against the HCA limits
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr = ep->param.ep_attr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_memzero(&ep_attr_limit, sizeof (DAT_EP_ATTR));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_ib_query_hca(ia->hca_ptr, NULL,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &ep_attr_limit, NULL, NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dat_status != DAT_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr_request = ep_param->ep_attr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_SERVICE_TYPE) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_attr_request.service_type != DAT_SERVICE_TYPE_RC) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_INVALID_ARG3);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_MAX_MESSAGE_SIZE) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_attr_request.max_mtu_size > ep_attr_limit.max_mtu_size) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_INVALID_ARG3);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr.max_mtu_size = ep_attr_request.max_mtu_size;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Do nothing if the DAT_EP_FIELD_EP_ATTR_MAX_RDMA_SIZE flag is
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * set. Each RDMA transport/provider may or may not have a limit
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * on the size of an RDMA DTO. For InfiniBand, this parameter is
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * validated in the implementation of the dapls_ib_qp_modify()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * function.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* LINTED: E_NOP_IF_STMT */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_QOS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Do nothing, not defined in the spec yet */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_RECV_COMPLETION_FLAGS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapl_ep_check_recv_completion_flags(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr_request.recv_completion_flags);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dat_status != DAT_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr.recv_completion_flags =
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr_request.recv_completion_flags;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_REQUEST_COMPLETION_FLAGS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapl_ep_check_request_completion_flags(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr_request.request_completion_flags);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dat_status != DAT_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr.request_completion_flags =
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr_request.request_completion_flags;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_MAX_RECV_DTOS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((ep->param.srq_handle != NULL) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (ep_attr_request.max_recv_dtos >
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr_limit.max_recv_dtos) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (ep_param->recv_evd_handle == DAT_HANDLE_NULL &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (ep_attr_request.max_recv_dtos > 0))) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_INVALID_ARG3);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr.max_recv_dtos = ep_attr_request.max_recv_dtos;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_MAX_REQUEST_DTOS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_attr_request.max_request_dtos >
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr_limit.max_request_dtos ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (ep_param->request_evd_handle == DAT_HANDLE_NULL &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (ep_attr_request.max_request_dtos > 0))) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_INVALID_ARG3);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr.max_request_dtos =
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr_request.max_request_dtos;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_MAX_RECV_IOV) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((ep->param.srq_handle != NULL) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (ep_attr_request.max_recv_iov >
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr_limit.max_recv_iov)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_INVALID_ARG3);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr.max_recv_iov = ep_attr_request.max_recv_iov;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_MAX_REQUEST_IOV) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_attr_request.max_request_iov >
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr_limit.max_request_iov) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_INVALID_ARG3);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr.max_request_iov =
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_attr_request.max_request_iov;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *ia_ptr = ia;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *ep_ptr = ep;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *ep_attr_ptr = ep_attr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorbail:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (dat_status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}