|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* This software is available to you under a choice of one of two
|
|
Packit |
13e616 |
* licenses. You may choose to be licensed under the terms of the GNU
|
|
Packit |
13e616 |
* General Public License (GPL) Version 2, available from the file
|
|
Packit |
13e616 |
* COPYING in the main directory of this source tree, or the
|
|
Packit |
13e616 |
* OpenIB.org BSD license below:
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* Redistribution and use in source and binary forms, with or
|
|
Packit |
13e616 |
* without modification, are permitted provided that the following
|
|
Packit |
13e616 |
* conditions are met:
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* - Redistributions of source code must retain the above
|
|
Packit |
13e616 |
* copyright notice, this list of conditions and the following
|
|
Packit |
13e616 |
* disclaimer.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* - Redistributions in binary form must reproduce the above
|
|
Packit |
13e616 |
* copyright notice, this list of conditions and the following
|
|
Packit |
13e616 |
* disclaimer in the documentation and/or other materials
|
|
Packit |
13e616 |
* provided with the distribution.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
Packit |
13e616 |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit |
13e616 |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
Packit |
13e616 |
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
Packit |
13e616 |
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
Packit |
13e616 |
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit |
13e616 |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
Packit |
13e616 |
* SOFTWARE.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* AUTHOR Eitan Zahavi
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* DESCRIPTION
|
|
Packit |
13e616 |
* The lower-level MAD transport interface implementation
|
|
Packit |
13e616 |
* that allows sending a single MAD/receiving a callback
|
|
Packit |
13e616 |
* when a single MAD is received.
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#if HAVE_CONFIG_H
|
|
Packit |
13e616 |
# include <config.h>
|
|
Packit |
13e616 |
#endif /* HAVE_CONFIG_H */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#include <sys/types.h>
|
|
Packit |
13e616 |
#include <sys/stat.h>
|
|
Packit |
13e616 |
#include <sys/ioctl.h>
|
|
Packit |
13e616 |
#include <fcntl.h>
|
|
Packit |
13e616 |
#include <errno.h>
|
|
Packit |
13e616 |
#include <stdlib.h>
|
|
Packit |
13e616 |
#include <string.h>
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#include <vendor/osm_vendor_api.h>
|
|
Packit |
13e616 |
#include <vendor/osm_vendor_mlx_transport.h>
|
|
Packit |
13e616 |
#include <vendor/osm_vendor_mlx_dispatcher.h>
|
|
Packit |
13e616 |
#include <vendor/osm_vendor_mlx_svc.h>
|
|
Packit |
13e616 |
#include <complib/cl_thread.h>
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* the simulator messages definition */
|
|
Packit |
13e616 |
#include <ibmgtsim/ibms_client_api.h>
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
typedef struct _osmv_ibms_transport_mgr {
|
|
Packit |
13e616 |
ibms_conn_handle_t conHdl; /* the connection handle we talk to */
|
|
Packit |
13e616 |
ibms_bind_msg_t filter; /* the bind message defining the filtering */
|
|
Packit |
13e616 |
cl_thread_t receiver; /* the thread waiting for incomming messages */
|
|
Packit |
13e616 |
} osmv_ibms_transport_mgr_t;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void
|
|
Packit |
13e616 |
__osmv_ibms_mad_addr_to_osm_addr(IN osm_vendor_t const *p_vend,
|
|
Packit |
13e616 |
IN struct _ibms_mad_addr *p_ibms_addr,
|
|
Packit |
13e616 |
IN uint8_t is_smi,
|
|
Packit |
13e616 |
OUT osm_mad_addr_t * p_osm_addr);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void
|
|
Packit |
13e616 |
__osmv_ibms_osm_addr_to_mad_addr(IN const osm_mad_addr_t * p_osm_addr,
|
|
Packit |
13e616 |
IN uint8_t is_smi,
|
|
Packit |
13e616 |
OUT struct _ibms_mad_addr *p_ibms_addr);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* this is the callback function the "server" will call on incoming
|
|
Packit |
13e616 |
messages */
|
|
Packit |
13e616 |
void __osmv_ibms_receiver_callback(void *p_ctx, ibms_mad_msg_t * p_mad)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_mad_addr_t mad_addr;
|
|
Packit |
13e616 |
osmv_bind_obj_t *const p_bo = (osmv_bind_obj_t *) p_ctx;
|
|
Packit |
13e616 |
ib_api_status_t status = IB_SUCCESS;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Make sure the p_bo object is still relevant */
|
|
Packit |
13e616 |
if ((p_bo->magic_ptr != p_bo) || p_bo->is_closing)
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
OSM_LOG_ENTER(p_bo->p_vendor->p_log);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* some logging */
|
|
Packit |
13e616 |
osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG,
|
|
Packit |
13e616 |
"__osmv_ibms_receiver_callback: "
|
|
Packit |
13e616 |
"MAD QPN:%d SLID:0x%04x class:0x%02x "
|
|
Packit |
13e616 |
"method:0x%02x attr:0x%04x status:0x%04x "
|
|
Packit |
13e616 |
"tid:0x%016" PRIx64 "\n",
|
|
Packit |
13e616 |
p_mad->addr.dqpn,
|
|
Packit |
13e616 |
cl_ntoh16(p_mad->addr.slid),
|
|
Packit |
13e616 |
p_mad->header.mgmt_class,
|
|
Packit |
13e616 |
p_mad->header.method,
|
|
Packit |
13e616 |
cl_ntoh16(p_mad->header.attr_id),
|
|
Packit |
13e616 |
cl_ntoh16(p_mad->header.status),
|
|
Packit |
13e616 |
cl_ntoh64(p_mad->header.trans_id));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* first arrange an address */
|
|
Packit |
13e616 |
__osmv_ibms_mad_addr_to_osm_addr(p_bo->p_vendor,
|
|
Packit |
13e616 |
&p_mad->addr,
|
|
Packit |
13e616 |
(((ib_mad_t *) & p_mad->
|
|
Packit |
13e616 |
header)->mgmt_class ==
|
|
Packit |
13e616 |
IB_MCLASS_SUBN_LID)
|
|
Packit |
13e616 |
||
|
|
Packit |
13e616 |
(((ib_mad_t *) & p_mad->
|
|
Packit |
13e616 |
header)->mgmt_class ==
|
|
Packit |
13e616 |
IB_MCLASS_SUBN_DIR),
|
|
Packit |
13e616 |
&mad_addr);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* call the receiver callback */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status =
|
|
Packit |
13e616 |
osmv_dispatch_mad((osm_bind_handle_t) p_bo,
|
|
Packit |
13e616 |
(void *)&p_mad->header, &mad_addr);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_EXIT(p_bo->p_vendor->p_log);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
ib_api_status_t
|
|
Packit |
13e616 |
osm_vendor_get_guid_by_ca_and_port(IN osm_vendor_t * const p_vend,
|
|
Packit |
13e616 |
IN char *hca_id,
|
|
Packit |
13e616 |
IN uint32_t port_num,
|
|
Packit |
13e616 |
OUT uint64_t * p_port_guid);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* NAME
|
|
Packit |
13e616 |
* osmv_transport_init
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* DESCRIPTION
|
|
Packit |
13e616 |
* Setup the MAD transport infrastructure (filters, callbacks etc).
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
ib_api_status_t
|
|
Packit |
13e616 |
osmv_transport_init(IN osm_bind_info_t * p_info,
|
|
Packit |
13e616 |
IN char hca_id[VENDOR_HCA_MAXNAMES],
|
|
Packit |
13e616 |
IN uint8_t hca_idx, IN osmv_bind_obj_t * p_bo)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
ibms_conn_handle_t conHdl; /* the connection we talk to the simulator through */
|
|
Packit |
13e616 |
osmv_ibms_transport_mgr_t *p_mgr =
|
|
Packit |
13e616 |
malloc(sizeof(osmv_ibms_transport_mgr_t));
|
|
Packit |
13e616 |
int qpn;
|
|
Packit |
13e616 |
int ibms_status;
|
|
Packit |
13e616 |
uint64_t port_guid;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (!p_mgr) {
|
|
Packit |
13e616 |
return IB_INSUFFICIENT_MEMORY;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
memset(p_mgr, 0, sizeof(osmv_ibms_transport_mgr_t));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* create the client socket connected to the simulator */
|
|
Packit |
13e616 |
/* also perform the "connect" message - such that we
|
|
Packit |
13e616 |
validate the target guid */
|
|
Packit |
13e616 |
if (osm_vendor_get_guid_by_ca_and_port
|
|
Packit |
13e616 |
(p_bo->p_vendor, hca_id, p_bo->port_num, &port_guid)) {
|
|
Packit |
13e616 |
free(p_mgr);
|
|
Packit |
13e616 |
return IB_INVALID_GUID;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
conHdl =
|
|
Packit |
13e616 |
ibms_connect(port_guid, __osmv_ibms_receiver_callback,
|
|
Packit |
13e616 |
(void *)p_bo);
|
|
Packit |
13e616 |
if (!conHdl) {
|
|
Packit |
13e616 |
printf("fail to connect to the server.\n");
|
|
Packit |
13e616 |
free(p_mgr);
|
|
Packit |
13e616 |
return IB_ERROR;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Create the MAD filter on this file handle.
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_mgr->filter.port = p_bo->port_num;
|
|
Packit |
13e616 |
p_mgr->filter.only_input = 1;
|
|
Packit |
13e616 |
p_mgr->filter.mask =
|
|
Packit |
13e616 |
IBMS_BIND_MASK_PORT |
|
|
Packit |
13e616 |
IBMS_BIND_MASK_INPUT | IBMS_BIND_MASK_QP | IBMS_BIND_MASK_CLASS;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
switch (p_info->mad_class) {
|
|
Packit |
13e616 |
case IB_MCLASS_SUBN_LID:
|
|
Packit |
13e616 |
case IB_MCLASS_SUBN_DIR:
|
|
Packit |
13e616 |
qpn = 0;
|
|
Packit |
13e616 |
p_mgr->filter.qpn = qpn;
|
|
Packit |
13e616 |
p_mgr->filter.mgt_class = IB_MCLASS_SUBN_LID;
|
|
Packit |
13e616 |
ibms_status = ibms_bind(conHdl, &p_mgr->filter);
|
|
Packit |
13e616 |
if (ibms_status) {
|
|
Packit |
13e616 |
return IB_ERROR;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_mgr->filter.mgt_class = IB_MCLASS_SUBN_DIR;
|
|
Packit |
13e616 |
ibms_status = ibms_bind(conHdl, &p_mgr->filter);
|
|
Packit |
13e616 |
if (ibms_status) {
|
|
Packit |
13e616 |
return IB_ERROR;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
break;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
case IB_MCLASS_SUBN_ADM:
|
|
Packit |
13e616 |
default:
|
|
Packit |
13e616 |
qpn = 1;
|
|
Packit |
13e616 |
p_mgr->filter.qpn = qpn;
|
|
Packit |
13e616 |
p_mgr->filter.mgt_class = p_info->mad_class;
|
|
Packit |
13e616 |
ibms_status = ibms_bind(conHdl, &p_mgr->filter);
|
|
Packit |
13e616 |
if (ibms_status) {
|
|
Packit |
13e616 |
return IB_ERROR;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
break;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_mgr->conHdl = conHdl;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_bo->p_transp_mgr = p_mgr;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Initialize the magic_ptr to the pointer of the p_bo info.
|
|
Packit |
13e616 |
This will be used to signal when the object is being destroyed, so no
|
|
Packit |
13e616 |
real action will be done then. */
|
|
Packit |
13e616 |
p_bo->magic_ptr = p_bo;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
return IB_SUCCESS;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* NAME
|
|
Packit |
13e616 |
* osmv_transport_send_mad
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* DESCRIPTION
|
|
Packit |
13e616 |
* Send a single MAD (256 byte)
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
ib_api_status_t
|
|
Packit |
13e616 |
osmv_transport_mad_send(IN const osm_bind_handle_t h_bind,
|
|
Packit |
13e616 |
IN void *p_mad, IN const osm_mad_addr_t * p_mad_addr)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind;
|
|
Packit |
13e616 |
osm_vendor_t const *p_vend = p_bo->p_vendor;
|
|
Packit |
13e616 |
int ret;
|
|
Packit |
13e616 |
ibms_mad_msg_t mad_msg;
|
|
Packit |
13e616 |
ib_api_status_t status;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
const ib_mad_t *p_mad_hdr = p_mad;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_ENTER(p_vend->p_log);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
memset(&mad_msg, 0, sizeof(mad_msg));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Make sure the p_bo object is still relevant */
|
|
Packit |
13e616 |
if ((p_bo->magic_ptr != p_bo) || p_bo->is_closing)
|
|
Packit |
13e616 |
return IB_INVALID_CALLBACK;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Copy the MAD over to the sent mad
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
memcpy(&mad_msg.header, p_mad_hdr, MAD_BLOCK_SIZE);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* For all sends other than directed route SM MADs,
|
|
Packit |
13e616 |
* acquire an address vector for the destination.
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
if (p_mad_hdr->mgmt_class != IB_MCLASS_SUBN_DIR) {
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
__osmv_ibms_osm_addr_to_mad_addr(p_mad_addr,
|
|
Packit |
13e616 |
p_mad_hdr->mgmt_class ==
|
|
Packit |
13e616 |
IB_MCLASS_SUBN_LID,
|
|
Packit |
13e616 |
&mad_msg.addr);
|
|
Packit |
13e616 |
} else {
|
|
Packit |
13e616 |
/* is a directed route - we need to construct a permissive address */
|
|
Packit |
13e616 |
/* we do not need port number since it is part of the mad_hndl */
|
|
Packit |
13e616 |
mad_msg.addr.dlid = IB_LID_PERMISSIVE;
|
|
Packit |
13e616 |
mad_msg.addr.slid = IB_LID_PERMISSIVE;
|
|
Packit |
13e616 |
mad_msg.addr.sqpn = 0;
|
|
Packit |
13e616 |
mad_msg.addr.dqpn = 0;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_log(p_bo->p_vendor->p_log, OSM_LOG_DEBUG,
|
|
Packit |
13e616 |
"osmv_transport_mad_send: "
|
|
Packit |
13e616 |
"Sending QPN:%d DLID:0x%04x class:0x%02x "
|
|
Packit |
13e616 |
"method:0x%02x attr:0x%04x status:0x%04x "
|
|
Packit |
13e616 |
"tid:0x%016" PRIx64 "\n",
|
|
Packit |
13e616 |
mad_msg.addr.dqpn,
|
|
Packit |
13e616 |
cl_ntoh16(mad_msg.addr.dlid),
|
|
Packit |
13e616 |
mad_msg.header.mgmt_class,
|
|
Packit |
13e616 |
mad_msg.header.method,
|
|
Packit |
13e616 |
cl_ntoh16(mad_msg.header.attr_id),
|
|
Packit |
13e616 |
cl_ntoh16(mad_msg.header.status),
|
|
Packit |
13e616 |
cl_ntoh64(mad_msg.header.trans_id)
|
|
Packit |
13e616 |
);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* send it */
|
|
Packit |
13e616 |
ret =
|
|
Packit |
13e616 |
ibms_send(((osmv_ibms_transport_mgr_t *) (p_bo->p_transp_mgr))->
|
|
Packit |
13e616 |
conHdl, &mad_msg);
|
|
Packit |
13e616 |
if (ret) {
|
|
Packit |
13e616 |
osm_log(p_vend->p_log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"osmv_transport_mad_send: ERR 5304: "
|
|
Packit |
13e616 |
"Error sending mad (%d).\n", ret);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = IB_SUCCESS;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
Exit:
|
|
Packit |
13e616 |
OSM_LOG_EXIT(p_vend->p_log);
|
|
Packit |
13e616 |
return (status);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
void osmv_transport_done(IN const osm_bind_handle_t h_bind)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind;
|
|
Packit |
13e616 |
osmv_ibms_transport_mgr_t *p_tpot_mgr =
|
|
Packit |
13e616 |
(osmv_ibms_transport_mgr_t *) (p_bo->p_transp_mgr);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
CL_ASSERT(p_bo);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* First of all - zero out the magic_ptr, so if a callback is called -
|
|
Packit |
13e616 |
it'll know that we are currently closing down, and will not handle the
|
|
Packit |
13e616 |
mad. */
|
|
Packit |
13e616 |
p_bo->magic_ptr = 0;
|
|
Packit |
13e616 |
/* usleep(3000000); */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
ibms_disconnect(p_tpot_mgr->conHdl);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* seems the only way to abort a blocking read is to make it read something */
|
|
Packit |
13e616 |
free(p_tpot_mgr);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void
|
|
Packit |
13e616 |
__osmv_ibms_osm_addr_to_mad_addr(IN const osm_mad_addr_t * p_osm_addr,
|
|
Packit |
13e616 |
IN uint8_t is_smi,
|
|
Packit |
13e616 |
OUT struct _ibms_mad_addr *p_ibms_addr)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* For global destination or Multicast address: */
|
|
Packit |
13e616 |
p_ibms_addr->dlid = cl_ntoh16(p_osm_addr->dest_lid);
|
|
Packit |
13e616 |
p_ibms_addr->sl = p_osm_addr->addr_type.gsi.service_level;
|
|
Packit |
13e616 |
if (is_smi) {
|
|
Packit |
13e616 |
p_ibms_addr->sqpn = 0;
|
|
Packit |
13e616 |
p_ibms_addr->dqpn = 0;
|
|
Packit |
13e616 |
} else {
|
|
Packit |
13e616 |
p_ibms_addr->sqpn = 1;
|
|
Packit |
13e616 |
p_ibms_addr->dqpn =
|
|
Packit |
13e616 |
cl_ntoh32(p_osm_addr->addr_type.gsi.remote_qp);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
HACK we limit to the first PKey Index assuming it will
|
|
Packit |
13e616 |
always be the default PKey
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
p_ibms_addr->pkey_index = 0;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void
|
|
Packit |
13e616 |
__osmv_ibms_mad_addr_to_osm_addr(IN osm_vendor_t const *p_vend,
|
|
Packit |
13e616 |
IN struct _ibms_mad_addr *p_ibms_addr,
|
|
Packit |
13e616 |
IN uint8_t is_smi,
|
|
Packit |
13e616 |
OUT osm_mad_addr_t * p_osm_addr)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
memset(p_osm_addr, 0, sizeof(osm_mad_addr_t));
|
|
Packit |
13e616 |
p_osm_addr->dest_lid = cl_hton16(p_ibms_addr->slid);
|
|
Packit |
13e616 |
p_osm_addr->static_rate = 0;
|
|
Packit |
13e616 |
p_osm_addr->path_bits = 0;
|
|
Packit |
13e616 |
if (is_smi) {
|
|
Packit |
13e616 |
/* SMI */
|
|
Packit |
13e616 |
p_osm_addr->addr_type.smi.source_lid =
|
|
Packit |
13e616 |
cl_hton16(p_ibms_addr->slid);
|
|
Packit |
13e616 |
p_osm_addr->addr_type.smi.port_num = 1; /* TODO add if required p_ibms_addr->port; */
|
|
Packit |
13e616 |
} else {
|
|
Packit |
13e616 |
/* GSI */
|
|
Packit |
13e616 |
p_osm_addr->addr_type.gsi.remote_qp =
|
|
Packit |
13e616 |
cl_ntoh32(p_ibms_addr->sqpn);
|
|
Packit |
13e616 |
p_osm_addr->addr_type.gsi.remote_qkey = IB_QP1_WELL_KNOWN_Q_KEY;
|
|
Packit |
13e616 |
p_osm_addr->addr_type.gsi.pkey_ix = p_ibms_addr->pkey_index;
|
|
Packit |
13e616 |
p_osm_addr->addr_type.gsi.service_level = p_ibms_addr->sl;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_osm_addr->addr_type.gsi.global_route = FALSE;
|
|
Packit |
13e616 |
/* copy the GRH data if relevant - TopSpin imp doesnt relate to GRH!!! */
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
if (p_osm_addr->addr_type.gsi.global_route)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
p_osm_addr->addr_type.gsi.grh_info.ver_class_flow =
|
|
Packit |
13e616 |
ib_grh_set_ver_class_flow(p_rcv_desc->grh.IP_version,
|
|
Packit |
13e616 |
p_rcv_desc->grh.traffic_class,
|
|
Packit |
13e616 |
p_rcv_desc->grh.flow_label);
|
|
Packit |
13e616 |
p_osm_addr->addr_type.gsi.grh_info.hop_limit = p_rcv_desc->grh.hop_limit;
|
|
Packit |
13e616 |
memcpy(&p_osm_addr->addr_type.gsi.grh_info.src_gid.raw,
|
|
Packit |
13e616 |
&p_rcv_desc->grh.sgid, sizeof(ib_net64_t));
|
|
Packit |
13e616 |
memcpy(&p_osm_addr->addr_type.gsi.grh_info.dest_gid.raw,
|
|
Packit |
13e616 |
p_rcv_desc->grh.dgid, sizeof(ib_net64_t));
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* NAME osm_vendor_set_sm
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* DESCRIPTION Modifies the port info for the bound port to set the "IS_SM" bit
|
|
Packit |
13e616 |
* according to the value given (TRUE or FALSE).
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
void osm_vendor_set_sm(IN osm_bind_handle_t h_bind, IN boolean_t is_sm_val)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osmv_bind_obj_t *p_bo = (osmv_bind_obj_t *) h_bind;
|
|
Packit |
13e616 |
osm_vendor_t const *p_vend = p_bo->p_vendor;
|
|
Packit |
13e616 |
int ret;
|
|
Packit |
13e616 |
ibms_cap_msg_t cap_msg;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_ENTER(p_vend->p_log);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
cap_msg.mask = IB_PORT_CAP_IS_SM;
|
|
Packit |
13e616 |
if (is_sm_val)
|
|
Packit |
13e616 |
cap_msg.capabilities = IB_PORT_CAP_IS_SM;
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
cap_msg.capabilities = 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
ret = ibms_set_cap(((osmv_ibms_transport_mgr_t *) (p_bo->
|
|
Packit |
13e616 |
p_transp_mgr))->
|
|
Packit |
13e616 |
conHdl, &cap_msg);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (ret) {
|
|
Packit |
13e616 |
osm_log(p_vend->p_log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"osm_vendor_set_sm: ERR 5312: "
|
|
Packit |
13e616 |
"Unable set 'IS_SM' bit to:%u in port attributes.\n",
|
|
Packit |
13e616 |
is_sm_val);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
OSM_LOG_EXIT(p_vend->p_log);
|
|
Packit |
13e616 |
}
|