Blame include/ipmitool/ipmi.h

Packit Service ed0f68
/*
Packit Service ed0f68
 * Copyright (c) 2003 Sun Microsystems, Inc.  All Rights Reserved.
Packit Service ed0f68
 * 
Packit Service ed0f68
 * Redistribution and use in source and binary forms, with or without
Packit Service ed0f68
 * modification, are permitted provided that the following conditions
Packit Service ed0f68
 * are met:
Packit Service ed0f68
 * 
Packit Service ed0f68
 * Redistribution of source code must retain the above copyright
Packit Service ed0f68
 * notice, this list of conditions and the following disclaimer.
Packit Service ed0f68
 * 
Packit Service ed0f68
 * Redistribution in binary form must reproduce the above copyright
Packit Service ed0f68
 * notice, this list of conditions and the following disclaimer in the
Packit Service ed0f68
 * documentation and/or other materials provided with the distribution.
Packit Service ed0f68
 * 
Packit Service ed0f68
 * Neither the name of Sun Microsystems, Inc. or the names of
Packit Service ed0f68
 * contributors may be used to endorse or promote products derived
Packit Service ed0f68
 * from this software without specific prior written permission.
Packit Service ed0f68
 * 
Packit Service ed0f68
 * This software is provided "AS IS," without a warranty of any kind.
Packit Service ed0f68
 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
Packit Service ed0f68
 * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
Packit Service ed0f68
 * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
Packit Service ed0f68
 * SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
Packit Service ed0f68
 * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
Packit Service ed0f68
 * OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.  IN NO EVENT WILL
Packit Service ed0f68
 * SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
Packit Service ed0f68
 * OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
Packit Service ed0f68
 * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
Packit Service ed0f68
 * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
Packit Service ed0f68
 * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
Packit Service ed0f68
 */
Packit Service ed0f68
Packit Service ed0f68
#ifndef IPMI_H
Packit Service ed0f68
#define IPMI_H
Packit Service ed0f68
Packit Service ed0f68
#include <stdlib.h>
Packit Service ed0f68
#include <stdio.h>
Packit Service ed0f68
#include <inttypes.h>
Packit Service ed0f68
#include <sys/types.h>
Packit Service ed0f68
#include <netinet/in.h>
Packit Service ed0f68
#include <ipmitool/helper.h>
Packit Service ed0f68
#include <ipmitool/ipmi_cc.h>
Packit Service ed0f68
Packit Service ed0f68
#if HAVE_CONFIG_H
Packit Service ed0f68
# include <config.h>
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
#define IPMI_BUF_SIZE 1024
Packit Service ed0f68
#define IPMI_MAX_MD_SIZE 0x20
Packit Service ed0f68
Packit Service ed0f68
#if HAVE_PRAGMA_PACK
Packit Service ed0f68
#define ATTRIBUTE_PACKING
Packit Service ed0f68
#else
Packit Service ed0f68
#define ATTRIBUTE_PACKING __attribute__ ((packed))
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
Packit Service ed0f68
/* From table 13.16 of the IPMI v2 specification */
Packit Service ed0f68
#define IPMI_PAYLOAD_TYPE_IPMI               0x00
Packit Service ed0f68
#define IPMI_PAYLOAD_TYPE_SOL                0x01
Packit Service ed0f68
#define IPMI_PAYLOAD_TYPE_OEM                0x02
Packit Service ed0f68
#define IPMI_PAYLOAD_TYPE_RMCP_OPEN_REQUEST  0x10
Packit Service ed0f68
#define IPMI_PAYLOAD_TYPE_RMCP_OPEN_RESPONSE 0x11
Packit Service ed0f68
#define IPMI_PAYLOAD_TYPE_RAKP_1             0x12
Packit Service ed0f68
#define IPMI_PAYLOAD_TYPE_RAKP_2             0x13
Packit Service ed0f68
#define IPMI_PAYLOAD_TYPE_RAKP_3             0x14
Packit Service ed0f68
#define IPMI_PAYLOAD_TYPE_RAKP_4             0x15
Packit Service ed0f68
Packit Service ed0f68
extern int verbose;
Packit Service ed0f68
extern int csv_output;
Packit Service ed0f68
Packit Service ed0f68
struct ipmi_rq {
Packit Service ed0f68
	struct {
Packit Service ed0f68
		uint8_t netfn:6;
Packit Service ed0f68
		uint8_t lun:2;
Packit Service ed0f68
		uint8_t cmd;
Packit Service ed0f68
		uint8_t target_cmd;
Packit Service ed0f68
		uint16_t data_len;
Packit Service ed0f68
		uint8_t *data;
Packit Service ed0f68
	} msg;
Packit Service ed0f68
};
Packit Service ed0f68
Packit Service ed0f68
/*
Packit Service ed0f68
 * This is what the sendrcv_v2() function would take as an argument. The common case
Packit Service ed0f68
 * is for payload_type to be IPMI_PAYLOAD_TYPE_IPMI.
Packit Service ed0f68
 */
Packit Service ed0f68
struct ipmi_v2_payload {
Packit Service ed0f68
	uint16_t payload_length;
Packit Service ed0f68
	uint8_t payload_type;
Packit Service ed0f68
Packit Service ed0f68
	union {
Packit Service ed0f68
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t rq_seq;
Packit Service ed0f68
			struct ipmi_rq *request;
Packit Service ed0f68
		} ipmi_request;
Packit Service ed0f68
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t rs_seq;
Packit Service ed0f68
			struct ipmi_rs *response;
Packit Service ed0f68
		} ipmi_response;
Packit Service ed0f68
Packit Service ed0f68
		/* Only used internally by the lanplus interface */
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t *request;
Packit Service ed0f68
		} open_session_request;
Packit Service ed0f68
Packit Service ed0f68
		/* Only used internally by the lanplus interface */
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t *message;
Packit Service ed0f68
		} rakp_1_message;
Packit Service ed0f68
Packit Service ed0f68
		/* Only used internally by the lanplus interface */
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t *message;
Packit Service ed0f68
		} rakp_2_message;
Packit Service ed0f68
Packit Service ed0f68
		/* Only used internally by the lanplus interface */
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t *message;
Packit Service ed0f68
		} rakp_3_message;
Packit Service ed0f68
Packit Service ed0f68
		/* Only used internally by the lanplus interface */
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t *message;
Packit Service ed0f68
		} rakp_4_message;
Packit Service ed0f68
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t data[IPMI_BUF_SIZE];
Packit Service ed0f68
			uint16_t character_count;
Packit Service ed0f68
			uint8_t packet_sequence_number;
Packit Service ed0f68
			uint8_t acked_packet_number;
Packit Service ed0f68
			uint8_t accepted_character_count;
Packit Service ed0f68
			uint8_t is_nack;	/* bool */
Packit Service ed0f68
			uint8_t assert_ring_wor;	/* bool */
Packit Service ed0f68
			uint8_t generate_break;	/* bool */
Packit Service ed0f68
			uint8_t deassert_cts;	/* bool */
Packit Service ed0f68
			uint8_t deassert_dcd_dsr;	/* bool */
Packit Service ed0f68
			uint8_t flush_inbound;	/* bool */
Packit Service ed0f68
			uint8_t flush_outbound;	/* bool */
Packit Service ed0f68
		} sol_packet;
Packit Service ed0f68
Packit Service ed0f68
	} payload;
Packit Service ed0f68
};
Packit Service ed0f68
Packit Service ed0f68
struct ipmi_rq_entry {
Packit Service ed0f68
	struct ipmi_rq req;
Packit Service ed0f68
	struct ipmi_intf *intf;
Packit Service ed0f68
	uint8_t rq_seq;
Packit Service ed0f68
	uint8_t *msg_data;
Packit Service ed0f68
	int msg_len;
Packit Service ed0f68
	int bridging_level;
Packit Service ed0f68
	struct ipmi_rq_entry *next;
Packit Service ed0f68
};
Packit Service ed0f68
Packit Service ed0f68
struct ipmi_rs {
Packit Service ed0f68
	uint8_t ccode;
Packit Service ed0f68
	uint8_t data[IPMI_BUF_SIZE];
Packit Service ed0f68
Packit Service ed0f68
	/*
Packit Service ed0f68
	 * Looks like this is the length of the entire packet, including the RMCP
Packit Service ed0f68
	 * stuff, then modified to be the length of the extra IPMI message data
Packit Service ed0f68
	 */
Packit Service ed0f68
	int data_len;
Packit Service ed0f68
Packit Service ed0f68
	struct {
Packit Service ed0f68
		uint8_t netfn;
Packit Service ed0f68
		uint8_t cmd;
Packit Service ed0f68
		uint8_t seq;
Packit Service ed0f68
		uint8_t lun;
Packit Service ed0f68
	} msg;
Packit Service ed0f68
Packit Service ed0f68
	struct {
Packit Service ed0f68
		uint8_t authtype;
Packit Service ed0f68
		uint32_t seq;
Packit Service ed0f68
		uint32_t id;
Packit Service ed0f68
		uint8_t bEncrypted;	/* IPMI v2 only */
Packit Service ed0f68
		uint8_t bAuthenticated;	/* IPMI v2 only */
Packit Service ed0f68
		uint8_t payloadtype;	/* IPMI v2 only */
Packit Service ed0f68
		/* This is the total length of the payload or
Packit Service ed0f68
		   IPMI message.  IPMI v2.0 requires this to
Packit Service ed0f68
		   be 2 bytes.  Not really used for much. */
Packit Service ed0f68
		uint16_t msglen;
Packit Service ed0f68
	} session;
Packit Service ed0f68
Packit Service ed0f68
	/*
Packit Service ed0f68
	 * A union of the different possible payload meta-data
Packit Service ed0f68
	 */
Packit Service ed0f68
	union {
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t rq_addr;
Packit Service ed0f68
			uint8_t netfn;
Packit Service ed0f68
			uint8_t rq_lun;
Packit Service ed0f68
			uint8_t rs_addr;
Packit Service ed0f68
			uint8_t rq_seq;
Packit Service ed0f68
			uint8_t rs_lun;
Packit Service ed0f68
			uint8_t cmd;
Packit Service ed0f68
		} ipmi_response;
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t message_tag;
Packit Service ed0f68
			uint8_t rakp_return_code;
Packit Service ed0f68
			uint8_t max_priv_level;
Packit Service ed0f68
			uint32_t console_id;
Packit Service ed0f68
			uint32_t bmc_id;
Packit Service ed0f68
			uint8_t auth_alg;
Packit Service ed0f68
			uint8_t integrity_alg;
Packit Service ed0f68
			uint8_t crypt_alg;
Packit Service ed0f68
		} open_session_response;
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t message_tag;
Packit Service ed0f68
			uint8_t rakp_return_code;
Packit Service ed0f68
			uint32_t console_id;
Packit Service ed0f68
			uint8_t bmc_rand[16];	/* Random number generated by the BMC */
Packit Service ed0f68
			uint8_t bmc_guid[16];
Packit Service ed0f68
			uint8_t key_exchange_auth_code[IPMI_MAX_MD_SIZE];
Packit Service ed0f68
		} rakp2_message;
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t message_tag;
Packit Service ed0f68
			uint8_t rakp_return_code;
Packit Service ed0f68
			uint32_t console_id;
Packit Service ed0f68
			uint8_t integrity_check_value[IPMI_MAX_MD_SIZE];
Packit Service ed0f68
		} rakp4_message;
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t packet_sequence_number;
Packit Service ed0f68
			uint8_t acked_packet_number;
Packit Service ed0f68
			uint8_t accepted_character_count;
Packit Service ed0f68
			uint8_t is_nack;	/* bool */
Packit Service ed0f68
			uint8_t transfer_unavailable;	/* bool */
Packit Service ed0f68
			uint8_t sol_inactive;	/* bool */
Packit Service ed0f68
			uint8_t transmit_overrun;	/* bool */
Packit Service ed0f68
			uint8_t break_detected;	/* bool */
Packit Service ed0f68
		} sol_packet;
Packit Service ed0f68
Packit Service ed0f68
	} payload;
Packit Service ed0f68
};
Packit Service ed0f68
Packit Service ed0f68
#define IPMI_NETFN_CHASSIS		0x0
Packit Service ed0f68
#define IPMI_NETFN_BRIDGE		0x2
Packit Service ed0f68
#define IPMI_NETFN_SE			0x4
Packit Service ed0f68
#define IPMI_NETFN_APP			0x6
Packit Service ed0f68
#define IPMI_NETFN_FIRMWARE		0x8
Packit Service ed0f68
#define IPMI_NETFN_STORAGE		0xa
Packit Service ed0f68
#define IPMI_NETFN_TRANSPORT	0xc
Packit Service ed0f68
#define IPMI_NETFN_PICMG		0x2C
Packit Service ed0f68
#define IPMI_NETFN_DCGRP		0x2C
Packit Service ed0f68
#define IPMI_NETFN_OEM		0x2E
Packit Service ed0f68
#define IPMI_NETFN_ISOL			0x34
Packit Service ed0f68
#define IPMI_NETFN_TSOL			0x30
Packit Service ed0f68
Packit Service ed0f68
#define IPMI_BMC_SLAVE_ADDR		0x20
Packit Service ed0f68
#define IPMI_REMOTE_SWID		0x81
Packit Service ed0f68
Packit Service ed0f68
Packit Service ed0f68
/* These values are IANA numbers */
Packit Service ed0f68
/************************************************************************
Packit Service ed0f68
* Add ID String for IANA Enterprise Number of IBM & ADLINK
Packit Service ed0f68
* https://www.iana.org/assignments/enterprise-numbers/enterprise-numbers
Packit Service ed0f68
************************************************************************/
Packit Service ed0f68
Packit Service ed0f68
typedef enum IPMI_OEM {
Packit Service ed0f68
     IPMI_OEM_UNKNOWN    = 0,
Packit Service ed0f68
     /* 2 for [IBM] */
Packit Service ed0f68
     IPMI_OEM_IBM_2      = 2,
Packit Service ed0f68
     IPMI_OEM_HP         = 11,
Packit Service ed0f68
     IPMI_OEM_SUN        = 42,
Packit Service ed0f68
     IPMI_OEM_NOKIA      = 94,
Packit Service ed0f68
     IPMI_OEM_BULL       = 107,
Packit Service ed0f68
     IPMI_OEM_HITACHI_116 = 116,
Packit Service ed0f68
     IPMI_OEM_NEC        = 119,
Packit Service ed0f68
     IPMI_OEM_TOSHIBA    = 186,
Packit Service ed0f68
     IPMI_OEM_ERICSSON   = 193,
Packit Service ed0f68
     IPMI_OEM_INTEL      = 343,
Packit Service ed0f68
     IPMI_OEM_TATUNG     = 373,
Packit Service ed0f68
     IPMI_OEM_HITACHI_399 = 399,
Packit Service ed0f68
     IPMI_OEM_DELL       = 674,
Packit Service ed0f68
     IPMI_OEM_LMC        = 2168,
Packit Service ed0f68
     IPMI_OEM_RADISYS    = 4337,
Packit Service ed0f68
     IPMI_OEM_BROADCOM   = 4413,
Packit Service ed0f68
     /* 4769 for [IBM Corporation] */
Packit Service ed0f68
     IPMI_OEM_IBM_4769   = 4769,
Packit Service ed0f68
     IPMI_OEM_MAGNUM     = 5593,
Packit Service ed0f68
     IPMI_OEM_TYAN       = 6653,
Packit Service ed0f68
     IPMI_OEM_QUANTA     = 7244,
Packit Service ed0f68
     IPMI_OEM_NEWISYS    = 9237,
Packit Service ed0f68
     IPMI_OEM_ADVANTECH  = 10297,
Packit Service ed0f68
     IPMI_OEM_FUJITSU_SIEMENS = 10368,
Packit Service ed0f68
     IPMI_OEM_AVOCENT    = 10418,
Packit Service ed0f68
     IPMI_OEM_PEPPERCON  = 10437,
Packit Service ed0f68
     IPMI_OEM_SUPERMICRO = 10876,
Packit Service ed0f68
     IPMI_OEM_OSA        = 11102,
Packit Service ed0f68
     IPMI_OEM_GOOGLE     = 11129,
Packit Service ed0f68
     IPMI_OEM_PICMG      = 12634,
Packit Service ed0f68
     IPMI_OEM_RARITAN    = 13742,
Packit Service ed0f68
     IPMI_OEM_KONTRON    = 15000,
Packit Service ed0f68
     IPMI_OEM_PPS        = 16394,
Packit Service ed0f68
     /* 20301 for [IBM eServer X] */
Packit Service ed0f68
     IPMI_OEM_IBM_20301  = 20301,
Packit Service ed0f68
     IPMI_OEM_AMI        = 20974,
Packit Service ed0f68
     /* 24339 for [ADLINK TECHNOLOGY INC.] */
Packit Service ed0f68
     IPMI_OEM_ADLINK_24339 = 24339,
Packit Service ed0f68
     IPMI_OEM_NOKIA_SOLUTIONS_AND_NETWORKS = 28458,
Packit Service ed0f68
     IPMI_OEM_VITA       = 33196,
Packit Service ed0f68
     IPMI_OEM_SUPERMICRO_47488 = 47488
Packit Service ed0f68
} IPMI_OEM;
Packit Service ed0f68
Packit Service ed0f68
extern const struct valstr completion_code_vals[];
Packit Service ed0f68
Packit Service ed0f68
#endif				/* IPMI_H */