/*
* Copyright (c) 2004 Mellanox Technologies Ltd. All rights reserved.
* Copyright (c) 2004 Infinicon Corporation. All rights reserved.
* Copyright (c) 2004, 2010 Intel Corporation. All rights reserved.
* Copyright (c) 2004 Topspin Corporation. All rights reserved.
* Copyright (c) 2004-2006 Voltaire Corporation. All rights reserved.
*
* This software is available to you under a choice of one of two
* licenses. You may choose to be licensed under the terms of the GNU
* General Public License (GPL) Version 2, available from the file
* COPYING in the main directory of this source tree, or the
* OpenIB.org BSD license below:
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
#ifndef _UMAD_TYPES_H
#define _UMAD_TYPES_H
#include <stdint.h>
#include <infiniband/umad.h>
#ifdef __cplusplus
# define BEGIN_C_DECLS extern "C" {
# define END_C_DECLS }
#else /* !__cplusplus */
# define BEGIN_C_DECLS
# define END_C_DECLS
#endif /* __cplusplus */
BEGIN_C_DECLS
#define UMAD_BASE_VERSION 1
#define UMAD_QKEY 0x80010000
/* Management classes */
enum {
UMAD_CLASS_SUBN_LID_ROUTED = 0x01,
UMAD_CLASS_SUBN_DIRECTED_ROUTE = 0x81,
UMAD_CLASS_SUBN_ADM = 0x03,
UMAD_CLASS_PERF_MGMT = 0x04,
UMAD_CLASS_BM = 0x05,
UMAD_CLASS_DEVICE_MGMT = 0x06,
UMAD_CLASS_CM = 0x07,
UMAD_CLASS_SNMP = 0x08,
UMAD_CLASS_VENDOR_RANGE1_START = 0x09,
UMAD_CLASS_VENDOR_RANGE1_END = 0x0F,
UMAD_CLASS_APPLICATION_START = 0x10,
UMAD_CLASS_DEVICE_ADM = UMAD_CLASS_APPLICATION_START,
UMAD_CLASS_BOOT_MGMT = 0x11,
UMAD_CLASS_BIS = 0x12,
UMAD_CLASS_CONG_MGMT = 0x21,
UMAD_CLASS_APPLICATION_END = 0x2F,
UMAD_CLASS_VENDOR_RANGE2_START = 0x30,
UMAD_CLASS_VENDOR_RANGE2_END = 0x4F
};
/* Management methods */
enum {
UMAD_METHOD_GET = 0x01,
UMAD_METHOD_SET = 0x02,
UMAD_METHOD_GET_RESP = 0x81,
UMAD_METHOD_SEND = 0x03,
UMAD_METHOD_TRAP = 0x05,
UMAD_METHOD_REPORT = 0x06,
UMAD_METHOD_REPORT_RESP = 0x86,
UMAD_METHOD_TRAP_REPRESS = 0x07,
UMAD_METHOD_RESP_MASK = 0x80
};
enum {
UMAD_STATUS_SUCCESS = 0x0000,
UMAD_STATUS_BUSY = 0x0001,
UMAD_STATUS_REDIRECT = 0x0002,
/* Invalid fields, bits 2-4 */
UMAD_STATUS_BAD_VERSION = (1 << 2),
UMAD_STATUS_METHOD_NOT_SUPPORTED = (2 << 2),
UMAD_STATUS_ATTR_NOT_SUPPORTED = (3 << 2),
UMAD_STATUS_INVALID_ATTR_VALUE = (7 << 2),
UMAD_STATUS_INVALID_FIELD_MASK = 0x001C,
UMAD_STATUS_CLASS_MASK = 0xFF00
};
/* Attributes common to multiple classes */
enum {
UMAD_ATTR_CLASS_PORT_INFO = 0x0001,
UMAD_ATTR_NOTICE = 0x0002,
UMAD_ATTR_INFORM_INFO = 0x0003
};
/* RMPP information */
#define UMAD_RMPP_VERSION 1
enum {
UMAD_RMPP_FLAG_ACTIVE = 1,
};
enum {
UMAD_LEN_DATA = 232,
UMAD_LEN_RMPP_DATA = 220,
UMAD_LEN_DM_DATA = 192,
UMAD_LEN_VENDOR_DATA = 216,
};
struct umad_hdr {
uint8_t base_version;
uint8_t mgmt_class;
uint8_t class_version;
uint8_t method;
__be16 status;
__be16 class_specific;
__be64 tid;
__be16 attr_id;
__be16 resv;
__be32 attr_mod;
};
struct umad_rmpp_hdr {
uint8_t rmpp_version;
uint8_t rmpp_type;
uint8_t rmpp_rtime_flags;
uint8_t rmpp_status;
__be32 seg_num;
__be32 paylen_newwin;
};
struct umad_packet {
struct umad_hdr mad_hdr;
uint8_t data[UMAD_LEN_DATA]; /* network-byte order */
};
struct umad_rmpp_packet {
struct umad_hdr mad_hdr;
struct umad_rmpp_hdr rmpp_hdr;
uint8_t data[UMAD_LEN_RMPP_DATA]; /* network-byte order */
};
struct umad_dm_packet {
struct umad_hdr mad_hdr;
uint8_t reserved[40];
uint8_t data[UMAD_LEN_DM_DATA]; /* network-byte order */
};
struct umad_vendor_packet {
struct umad_hdr mad_hdr;
struct umad_rmpp_hdr rmpp_hdr;
uint8_t reserved;
uint8_t oui[3]; /* network-byte order */
uint8_t data[UMAD_LEN_VENDOR_DATA]; /* network-byte order */
};
enum {
UMAD_OPENIB_OUI = 0x001405
};
enum {
UMAD_CLASS_RESP_TIME_MASK = 0x1F
};
struct umad_class_port_info {
uint8_t base_ver;
uint8_t class_ver;
__be16 cap_mask;
__be32 cap_mask2_resp_time;
union {
uint8_t redir_gid[16] __attribute__((deprecated)); /* network byte order */
union umad_gid redirgid;
};
__be32 redir_tc_sl_fl;
__be16 redir_lid;
__be16 redir_pkey;
__be32 redir_qp;
__be32 redir_qkey;
union {
uint8_t trap_gid[16] __attribute__((deprecated)); /* network byte order */
union umad_gid trapgid;
};
__be32 trap_tc_sl_fl;
__be16 trap_lid;
__be16 trap_pkey;
__be32 trap_hl_qp;
__be32 trap_qkey;
};
static inline uint32_t
umad_class_cap_mask2(struct umad_class_port_info *cpi)
{
return (be32toh(cpi->cap_mask2_resp_time) >> 5);
}
static inline uint8_t
umad_class_resp_time(struct umad_class_port_info *cpi)
{
return (uint8_t)(be32toh(cpi->cap_mask2_resp_time)
& UMAD_CLASS_RESP_TIME_MASK);
}
END_C_DECLS
#endif /* _UMAD_TYPES_H */