Blame libibmad/src/register.c

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
}