|
Packit |
db064d |
/*
|
|
Packit |
db064d |
* Copyright (c) 2004-2009 Voltaire Inc. All rights reserved.
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
* This software is available to you under a choice of one of two
|
|
Packit |
db064d |
* licenses. You may choose to be licensed under the terms of the GNU
|
|
Packit |
db064d |
* General Public License (GPL) Version 2, available from the file
|
|
Packit |
db064d |
* COPYING in the main directory of this source tree, or the
|
|
Packit |
db064d |
* OpenIB.org BSD license below:
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
* Redistribution and use in source and binary forms, with or
|
|
Packit |
db064d |
* without modification, are permitted provided that the following
|
|
Packit |
db064d |
* conditions are met:
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
* - Redistributions of source code must retain the above
|
|
Packit |
db064d |
* copyright notice, this list of conditions and the following
|
|
Packit |
db064d |
* disclaimer.
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
* - Redistributions in binary form must reproduce the above
|
|
Packit |
db064d |
* copyright notice, this list of conditions and the following
|
|
Packit |
db064d |
* disclaimer in the documentation and/or other materials
|
|
Packit |
db064d |
* provided with the distribution.
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
Packit |
db064d |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit |
db064d |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
Packit |
db064d |
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
Packit |
db064d |
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
Packit |
db064d |
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit |
db064d |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
Packit |
db064d |
* SOFTWARE.
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
*/
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#if HAVE_CONFIG_H
|
|
Packit |
db064d |
# include <config.h>
|
|
Packit |
db064d |
#endif /* HAVE_CONFIG_H */
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#include <stdio.h>
|
|
Packit |
db064d |
#include <stdlib.h>
|
|
Packit |
db064d |
#include <string.h>
|
|
Packit |
db064d |
#include <errno.h>
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#include <infiniband/umad.h>
|
|
Packit |
db064d |
#include <infiniband/mad.h>
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#include "mad_internal.h"
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#undef DEBUG
|
|
Packit |
db064d |
#define DEBUG if (ibdebug) IBWARN
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int mgmt_class_vers(int mgmt_class)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
if ((mgmt_class >= IB_VENDOR_RANGE1_START_CLASS &&
|
|
Packit |
db064d |
mgmt_class <= IB_VENDOR_RANGE1_END_CLASS) ||
|
|
Packit |
db064d |
(mgmt_class >= IB_VENDOR_RANGE2_START_CLASS &&
|
|
Packit |
db064d |
mgmt_class <= IB_VENDOR_RANGE2_END_CLASS))
|
|
Packit |
db064d |
return 1;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
switch (mgmt_class) {
|
|
Packit |
db064d |
case IB_SMI_CLASS:
|
|
Packit |
db064d |
case IB_SMI_DIRECT_CLASS:
|
|
Packit |
db064d |
return 1;
|
|
Packit |
db064d |
case IB_SA_CLASS:
|
|
Packit |
db064d |
return 2;
|
|
Packit |
db064d |
case IB_PERFORMANCE_CLASS:
|
|
Packit |
db064d |
return 1;
|
|
Packit |
db064d |
case IB_DEVICE_MGMT_CLASS:
|
|
Packit |
db064d |
return 1;
|
|
Packit |
db064d |
case IB_CC_CLASS:
|
|
Packit |
db064d |
return 2;
|
|
Packit |
db064d |
case IB_BOARD_MGMT_CLASS:
|
|
Packit |
db064d |
return 1;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return 0;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
int mad_class_agent(int mgmt)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
if (mgmt < 1 || mgmt >= MAX_CLASS)
|
|
Packit |
db064d |
return -1;
|
|
Packit |
db064d |
return ibmp->class_agents[mgmt];
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
int mad_register_port_client(int port_id, int mgmt, uint8_t rmpp_version)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
int vers, agent;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if ((vers = mgmt_class_vers(mgmt)) <= 0) {
|
|
Packit |
db064d |
DEBUG("Unknown class %d mgmt_class", mgmt);
|
|
Packit |
db064d |
return -1;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
agent = umad_register(port_id, mgmt, vers, rmpp_version, NULL);
|
|
Packit |
db064d |
if (agent < 0)
|
|
Packit |
db064d |
DEBUG("Can't register agent for class %d", mgmt);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return agent;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
int mad_register_client(int mgmt, uint8_t rmpp_version)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
return mad_register_client_via(mgmt, rmpp_version, ibmp);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
int mad_register_client_via(int mgmt, uint8_t rmpp_version,
|
|
Packit |
db064d |
struct ibmad_port *srcport)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
int agent;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (!srcport)
|
|
Packit |
db064d |
return -1;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
agent = mad_register_port_client(mad_rpc_portid(srcport), mgmt,
|
|
Packit |
db064d |
rmpp_version);
|
|
Packit |
db064d |
if (agent < 0)
|
|
Packit |
db064d |
return agent;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
srcport->class_agents[mgmt] = agent;
|
|
Packit |
db064d |
return 0;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
int mad_register_server(int mgmt, uint8_t rmpp_version,
|
|
Packit |
db064d |
long method_mask[], uint32_t class_oui)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
return mad_register_server_via(mgmt, rmpp_version, method_mask,
|
|
Packit |
db064d |
class_oui, ibmp);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
int mad_register_server_via(int mgmt, uint8_t rmpp_version,
|
|
Packit |
db064d |
long method_mask[], uint32_t class_oui,
|
|
Packit |
db064d |
struct ibmad_port *srcport)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
long class_method_mask[16 / sizeof(long)];
|
|
Packit |
db064d |
uint8_t oui[3];
|
|
Packit |
db064d |
int agent, vers;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (method_mask)
|
|
Packit |
db064d |
memcpy(class_method_mask, method_mask,
|
|
Packit |
db064d |
sizeof class_method_mask);
|
|
Packit |
db064d |
else
|
|
Packit |
db064d |
memset(class_method_mask, 0xff, sizeof(class_method_mask));
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (!srcport)
|
|
Packit |
db064d |
return -1;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (srcport->class_agents[mgmt] >= 0) {
|
|
Packit |
db064d |
DEBUG("Class 0x%x already registered %d",
|
|
Packit |
db064d |
mgmt, srcport->class_agents[mgmt]);
|
|
Packit |
db064d |
return -1;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
if ((vers = mgmt_class_vers(mgmt)) <= 0) {
|
|
Packit |
db064d |
DEBUG("Unknown class 0x%x mgmt_class", mgmt);
|
|
Packit |
db064d |
return -1;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
if (mgmt >= IB_VENDOR_RANGE2_START_CLASS &&
|
|
Packit |
db064d |
mgmt <= IB_VENDOR_RANGE2_END_CLASS) {
|
|
Packit |
db064d |
oui[0] = (class_oui >> 16) & 0xff;
|
|
Packit |
db064d |
oui[1] = (class_oui >> 8) & 0xff;
|
|
Packit |
db064d |
oui[2] = class_oui & 0xff;
|
|
Packit |
db064d |
if ((agent =
|
|
Packit |
db064d |
umad_register_oui(srcport->port_id, mgmt, rmpp_version,
|
|
Packit |
db064d |
oui, class_method_mask)) < 0) {
|
|
Packit |
db064d |
DEBUG("Can't register agent for class %d", mgmt);
|
|
Packit |
db064d |
return -1;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
} else
|
|
Packit |
db064d |
if ((agent =
|
|
Packit |
db064d |
umad_register(srcport->port_id, mgmt, vers, rmpp_version,
|
|
Packit |
db064d |
class_method_mask)) < 0) {
|
|
Packit |
db064d |
DEBUG("Can't register agent for class %d", mgmt);
|
|
Packit |
db064d |
return -1;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
srcport->class_agents[mgmt] = agent;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return agent;
|
|
Packit |
db064d |
}
|