root/usr/src/uts/common/sys/ib/mgt/ib_mad.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_IB_MGT_IB_MAD_H
#define _SYS_IB_MGT_IB_MAD_H

#ifdef __cplusplus
extern "C" {
#endif

#include <sys/ib/ib_types.h>

#define MAD_SIZE_IN_BYTES 256

typedef struct _ib_mad_hdr_t {
        uint8_t         BaseVersion;            /* version of MAD base format */
        uint8_t         MgmtClass;              /* class of operation */
        uint8_t         ClassVersion;           /* ver. of MAD class format */
        uint8_t         R_Method;               /* response bit & method to   */
                                                /* perform based on mgmtclass */
        uint16_t        Status;                 /* status of operation */
        uint16_t        ClassSpecific;          /* reserved except for SMPs   */
        uint64_t        TransactionID;          /* transaction id */
        uint16_t        AttributeID;            /* defines class spec objects */
        uint16_t        Reserved;
        uint32_t        AttributeModifier;      /* further scope to attrs. */
} ib_mad_hdr_t;

#define MAD_CLASS_BASE_VERS_1   1

/* Defines and Masks that go with MAD header */
#define MAD_MGMT_CLASS_SUBN_LID_ROUTED          0x01
#define MAD_MGMT_CLASS_SUBN_DIRECT_ROUTE        0x81
#define MAD_MGMT_CLASS_SUBN_ADM                 0x03
#define MAD_MGMT_CLASS_PERF                     0x04
#define MAD_MGMT_CLASS_BM                       0x05
#define MAD_MGMT_CLASS_DEV_MGT                  0x06
#define MAD_MGMT_CLASS_COMM_MGT                 0x07
#define MAD_MGMT_CLASS_SNMP                     0x08
#define MAD_MGMT_CLASS_VENDOR_START             0x09
#define MAD_MGMT_CLASS_VENDOR_END               0x0F
#define MAD_MGMT_CLASS_VENDOR2_START            0x30
#define MAD_MGMT_CLASS_VENDOR2_END              0x4F
#define MAD_MGMT_CLASS_APPLICATION_START        0x10
#define MAD_MGMT_CLASS_APPLICATION_END          0x2F
#define MAD_RESPONSE_BIT                        0x80
#define MAD_RESPONSE_BIT_MASK                   0x80
#define MAD_METHOD_MASK                         0x7F
#define MAD_METHOD_GET                          0x01
#define MAD_METHOD_SET                          0x02
#define MAD_METHOD_GET_RESPONSE                 0x81
#define MAD_METHOD_SEND                         0x03
#define MAD_METHOD_TRAP                         0x05
#define MAD_METHOD_REPORT                       0x06
#define MAD_METHOD_REPORT_RESPONSE              0x86
#define MAD_METHOD_TRAP_REPRESS                 0x07
#define MAD_STATUS_BUSY                         0x01
#define MAD_STATUS_REDIRECT_REQUIRED            0x02
#define MAD_STATUS_NO_INVALID_FIELDS            0x00
#define MAD_STATUS_BAD_VERSION                  0x04
#define MAD_STATUS_UNSUPP_METHOD                0x08
#define MAD_STATUS_UNSUPP_METHOD_ATTR           0x0C
#define MAD_STATUS_INVALID_FIELD                0x1C
#define MAD_ATTR_ID_CLASSPORTINFO               0x01
#define MAD_ATTR_ID_NOTICE                      0x02
#define MAD_ATTR_ID_INFORMINFO                  0x03

/* ClassPortInfo: table 104 */
#if defined(_BIT_FIELDS_HTOL)
typedef struct ib_mad_classportinfo_s {
        uint8_t         BaseVersion;            /* ver. of MAD base format */
        uint8_t         ClassVersion;           /* ver. of MAD class format */
        uint16_t        CapabilityMask;         /* capabilities of this class */
        uint32_t        RespTimeValue;          /* max time btwn req and resp */
                                                /* (lower 5 bit field, upper */
                                                /* 27 bits are reserved) */
        uint64_t        RedirectGID_hi;         /* dest gid of redirect msgs */
        uint64_t        RedirectGID_lo;         /* dest gid of redirect msgs */
        uint32_t        RedirectTC      :8;     /* traffic class */
        uint32_t        RedirectSL      :4;     /* SL to access services */
        uint32_t        RedirectFL      :20;    /* flow label to use */
        ib_lid_t        RedirectLID;            /* dlid for class services */
        ib_pkey_t       RedirectP_Key;          /* p_key for class services */
        uint32_t        Reserved2       :8;
        uint32_t        RedirectQP      :24;    /* QP for class services */
        ib_qkey_t       RedirectQ_Key;          /* q_key for class services */
        uint64_t        TrapGID_hi;             /* dest gid of trap msgs */
        uint64_t        TrapGID_lo;             /* dest gid of trap msgs */
        uint32_t        TrapTC          :8;     /* traffic class for traps */
        uint32_t        TrapSL          :4;     /* SL for traps */
        uint32_t        TrapFL          :20;    /* flow label for traps */
        ib_lid_t        TrapLID;                /* dlid for traps */
        ib_pkey_t       TrapP_Key;              /* p_key for traps */
        uint32_t        TrapHL          :8;     /* hop limit for traps */
        uint32_t        TrapQP          :24;    /* QP for traps */
        ib_qkey_t       TrapQ_Key;              /* q_key for traps */
} ib_mad_classportinfo_t;

#elif defined(_BIT_FIELDS_LTOH)

typedef struct ib_mad_classportinfo_s {
        uint8_t         BaseVersion;            /* ver. of MAD base format */
        uint8_t         ClassVersion;           /* ver. of MAD class format */
        uint16_t        CapabilityMask;         /* capabilities of this class */
        uint32_t        RespTimeValue;          /* max time btwn req and resp */
                                                /* (lower 5 bit field, upper */
                                                /* 27 bits are reserved) */
        uint64_t        RedirectGID_hi;         /* dest gid of redirect msgs */
        uint64_t        RedirectGID_lo;         /* dest gid of redirect msgs */
        uint32_t        RedirectFL      :20;    /* flow label to use */
        uint32_t        RedirectSL      :4;     /* SL to access services */
        uint32_t        RedirectTC      :8;     /* traffic class */
        ib_lid_t        RedirectLID;            /* dlid for class services */
        ib_pkey_t       RedirectP_Key;          /* p_key for class services */
        uint32_t        RedirectQP      :24;    /* QP for class services */
        uint32_t        Reserved2       :8;
        ib_qkey_t       RedirectQ_Key;          /* q_key for class services */
        uint64_t        TrapGID_hi;             /* dest gid of trap msgs */
        uint64_t        TrapGID_lo;             /* dest gid of trap msgs */
        uint32_t        TrapFL          :20;    /* flow label for traps */
        uint32_t        TrapSL          :4;     /* SL for traps */
        uint32_t        TrapTC          :8;     /* traffic class for traps */
        ib_lid_t        TrapLID;                /* dlid for traps */
        ib_pkey_t       TrapP_Key;              /* p_key for traps */
        uint32_t        TrapQP          :24;    /* QP for traps */
        uint32_t        TrapHL          :8;     /* hop limit for traps */
        ib_qkey_t       TrapQ_Key;              /* q_key for traps */
} ib_mad_classportinfo_t;
#else
#error  One of _BIT_FIELDS_HTOL or _BIT_FIELDS_LTOH must be defined
#endif /* _BIT_FIELDS_HTOL */

#define MAD_CLASSPORTINFO_CAP_MASK_TRAPS        0x01
#define MAD_CLASSPORTINFO_CAP_MASK_NOTICES      0x02

/*
 * Trap/Notice: Table 105
 */
#if defined(_BIT_FIELDS_HTOL)
typedef struct ib_mad_notice_s {
        uint32_t        IsGeneric       :1;     /* is generic or vendor spec. */
        uint32_t        Type            :7;     /* type of the trap */

        /* if generic, indicates type of event's producer, else vendor id */
        uint32_t        ProducerType_VendorID:24;

        uint16_t        TrapNumber_DeviceID;    /* trap num or device id */
        uint16_t        IssuerLID;              /* generator's LID */
        uint16_t        NoticeToggle    :1;     /* alt 0/1 between notices */
        uint16_t        NoticeCount     :15;    /* num notices queued */
        uint8_t         DataDetails[54];        /* notice/dtrap data details */
        ib_gid_t        IssuerGID;              /* GID of issuer port */
} ib_mad_notice_t;

#elif defined(_BIT_FIELDS_LTOH)

typedef struct ib_mad_notice_s {
        /* if generic, indicates type of event's producer, else vendor id */
        uint32_t        ProducerType_VendorID:24;

        uint32_t        Type            :7;     /* type of the trap */
        uint32_t        IsGeneric       :1;     /* is generic or vendor spec. */

        uint16_t        TrapNumber_DeviceID;    /* trap num or device id */
        uint16_t        IssuerLID;              /* generator's LID */
        uint16_t        NoticeCount     :15;    /* num notices queued */
        uint16_t        NoticeToggle    :1;     /* alt 0/1 between notices */
        uint8_t         DataDetails[54];        /* notice/dtrap data details */
        ib_gid_t        IssuerGID;              /* GID of issuer port */
} ib_mad_notice_t;
#else
#error  One of _BIT_FIELDS_HTOL or _BIT_FIELDS_LTOH must be defined
#endif /* _BIT_FIELDS_HTOL */

#define MAD_NOTICE_IS_GENERIC                   0x1

#define MAD_NOTICE_TYPE_FATAL                   0x0
#define MAD_NOTICE_TYPE_URGENT                  0x1
#define MAD_NOTICE_TYPE_SECURITY                        0x2
#define MAD_NOTICE_TYPE_SUBNET_MGMT             0x3
#define MAD_NOTICE_TYPE_INFO                    0x4

#define MAD_NOTICE_NODETYPE_CA                  0x1
#define MAD_NOTICE_NODETYPE_SWITCH              0x2
#define MAD_NOTICE_NODETYPE_ROUTER              0x3
#define MAD_NOTICE_NODETYPE_SUBNET_MANAGEMENT   0x4

#define MAD_NOTICE_TRAP_NUMBER_RESERVED         0xFFFF

/* InformInfo: Table 106 */
#if defined(_BIT_FIELDS_HTOL)
typedef struct ib_mad_informinfo_s {
        ib_gid_t        GID;                    /* specific GID to sub. for */
        ib_lid_t        LIDRangeBegin;          /* lowest LID to sub. for */
        ib_lid_t        LIDRangeEnd;            /* highest LID to sub. for */
        uint16_t        Reserved;
        uint8_t         IsGeneric;              /* forward generic traps */
        uint8_t         Subscribe;              /* 1 subscribe, 0 unsubscribe */
        uint16_t        Type;                   /* type of trap */
        uint16_t        TrapNumber_DeviceID;    /* trap num or device id */
        uint32_t        QPN             :24;    /* queue pair for results */
        uint32_t        Reserved2       :3;
        uint32_t        RespTimeValue   :5;     /* response time value */
        uint32_t        Reserved3       :8;
        uint32_t        ProducerType_VendorID:24; /* type of event's producer */
} ib_mad_informinfo_t;

#elif defined(_BIT_FIELDS_LTOH)

typedef struct ib_mad_informinfo_s {
        ib_gid_t        GID;                    /* specific GID to sub. for */
        ib_lid_t        LIDRangeBegin;          /* lowest LID to sub. for */
        ib_lid_t        LIDRangeEnd;            /* highest LID to sub. for */
        uint16_t        Reserved;
        uint8_t         IsGeneric;              /* forward generic traps */
        uint8_t         Subscribe;              /* 1 subscribe, 0 unsubscribe */
        uint16_t        Type;                   /* type of trap */
        uint16_t        TrapNumber_DeviceID;    /* trap num or device id */
        uint32_t        RespTimeValue   :5;     /* response time value */
        uint32_t        Reserved2       :3;
        uint32_t        QPN             :24;    /* queue pair for results */
        uint32_t        ProducerType_VendorID:24; /* type of event's producer */
        uint32_t        Reserved3       :8;
} ib_mad_informinfo_t;
#else
#error  One of _BIT_FIELDS_HTOL or _BIT_FIELDS_LTOH must be defined
#endif /* _BIT_FIELDS_HTOL */

#define MAD_INFORMINFO_ALL_ENDPORTS_RANGE               0xFFFF

#define MAD_INFORMINFO_FORWARD_GENERIC                  0x1
#define MAD_INFORMINFO_FORWARD_VENDOR_SPECIFIC          0x0

#define MAD_INFORMINFO_SUBSCRIBE                        0x1
#define MAD_INFORMINFO_UNSUBSCRIBE                      0x0

#define MAD_INFORMINFO_TRAP_NUMBER_FORWARD_ALL          0xFFFF

#define MAD_INFORMINFO_TRAP_TYPE_FATAL                  0x0
#define MAD_INFORMINFO_TRAP_TYPE_URGENT                 0x1
#define MAD_INFORMINFO_TRAP_TYPE_SECURITY               0x2
#define MAD_INFORMINFO_TRAP_TYPE_SUBNET_MGMT            0x3
#define MAD_INFORMINFO_TRAP_TYPE_INFORM                 0x4
#define MAD_INFORMINFO_TRAP_TYPE_FORWARD_ALL            0xFFFF

#define MAD_INFORMINFO_NODETYPE_CA                      0x1
#define MAD_INFORMINFO_NODETYPE_SWITCH                  0x2
#define MAD_INFORMINFO_NODETYPE_ROUTER                  0x3
#define MAD_INFORMINFO_NODETYPE_SUBNET_MANAGEMENT       0x4

#ifdef __cplusplus
}
#endif

#endif /* _SYS_IB_MGT_IB_MAD_H */