⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ipmi.h

📁 支持IPMI协议的开源API包。可以开发服务器硬件状态监控程序。
💻 H
📖 第 1 页 / 共 2 页
字号:
/* * ipmi.h * * MontaVista IPMI interface * * Author: MontaVista Software, Inc. *         Corey Minyard <minyard@mvista.com> *         source@mvista.com * * Copyright 2002,2003 MontaVista Software Inc. * *  This program is free software; you can redistribute it and/or modify it *  under the terms of the GNU General Public License as published by the *  Free Software Foundation; either version 2 of the License, or (at your *  option) any later version. * * *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * *  You should have received a copy of the GNU General Public License along *  with this program; if not, write to the Free Software Foundation, Inc., *  675 Mass Ave, Cambridge, MA 02139, USA. */#ifndef __LINUX_IPMI_H#define __LINUX_IPMI_H#include <linux/ipmi_msgdefs.h>/* * This file describes an interface to an IPMI driver.  You have to * have a fairly good understanding of IPMI to use this, so go read * the specs first before actually trying to do anything. * * With that said, this driver provides a multi-user interface to the * IPMI driver, and it allows multiple IPMI physical interfaces below * the driver.  The physical interfaces bind as a lower layer on the * driver.  They appear as interfaces to the application using this * interface. * * Multi-user means that multiple applications may use the driver, * send commands, receive responses, etc.  The driver keeps track of * commands the user sends and tracks the responses.  The responses * will go back to the application that send the command.  If the * response doesn't come back in time, the driver will return a * timeout error response to the application.  Asynchronous events * from the BMC event queue will go to all users bound to the driver. * The incoming event queue in the BMC will automatically be flushed * if it becomes full and it is queried once a second to see if * anything is in it.  Incoming commands to the driver will get * delivered as commands. * * This driver provides two main interfaces: one for in-kernel * applications and another for userland applications.  The * capabilities are basically the same for both interface, although * the interfaces are somewhat different.  The stuff in the * #ifdef KERNEL below is the in-kernel interface.  The userland * interface is defined later in the file.  *//* * This is an overlay for all the address types, so it's easy to * determine the actual address type.  This is kind of like addresses * work for sockets. */#define IPMI_MAX_ADDR_SIZE 32struct ipmi_addr{	 /* Try to take these from the "Channel Medium Type" table	    in section 6.5 of the IPMI 1.5 manual. */	int   addr_type;	short channel;	char  data[IPMI_MAX_ADDR_SIZE];};/* * When the address is not used, the type will be set to this value. * The channel is the BMC's channel number for the channel (usually * 0), or IPMC_BMC_CHANNEL if communicating directly with the BMC. */#define IPMI_SYSTEM_INTERFACE_ADDR_TYPE	0x0cstruct ipmi_system_interface_addr{	int           addr_type;	short         channel;	unsigned char lun;};/* An IPMB Address. */#define IPMI_IPMB_ADDR_TYPE		0x01/* Used for broadcast get device id as described in section 17.9 of the   IPMI 1.5 manual. */ #define IPMI_IPMB_BROADCAST_ADDR_TYPE	0x41struct ipmi_ipmb_addr{	int           addr_type;	short         channel;	unsigned char slave_addr;	unsigned char lun;};/* * Channel for talking directly with the BMC.  When using this * channel, This is for the system interface address type only.  FIXME * - is this right, or should we use -1? */#define IPMI_BMC_CHANNEL  0xf#define IPMI_NUM_CHANNELS 0x10/* * A raw IPMI message without any addressing.  This covers both * commands and responses.  The completion code is always the first * byte of data in the response (as the spec shows the messages laid * out). */struct ipmi_msg{	unsigned char  netfn;	unsigned char  cmd;	unsigned short data_len;	unsigned char  *data;};/* * Various defines that are useful for IPMI applications. */#define IPMI_INVALID_CMD_COMPLETION_CODE	0xC1#define IPMI_TIMEOUT_COMPLETION_CODE		0xC3#define IPMI_UNKNOWN_ERR_COMPLETION_CODE	0xff/* * Receive types for messages coming from the receive interface.  This * is used for the receive in-kernel interface and in the receive * IOCTL. */#define IPMI_RESPONSE_RECV_TYPE		1 /* A response to a command */#define IPMI_ASYNC_EVENT_RECV_TYPE	2 /* Something from the event queue */#define IPMI_CMD_RECV_TYPE		3 /* A command from somewhere else *//* Note that async events and received commands do not have a completion   code as the first byte of the incoming data, unlike a response. */#ifdef __KERNEL__/* * The in-kernel interface. */#include <linux/list.h>/* Opaque type for a IPMI message user.  One of these is needed to   send and receive messages. */typedef struct ipmi_user *ipmi_user_t;/* * Stuff coming from the recieve interface comes as one of these. * They are allocated, the receiver must free them with * ipmi_free_recv_msg() when done with the message.  The link is not * used after the message is delivered, so the upper layer may use the * link to build a linked list, if it likes. */struct ipmi_recv_msg{	struct list_head link;	/* The type of message as defined in the "Receive Types"           defines above. */	int              recv_type;	ipmi_user_t      user;	struct ipmi_addr addr;	long             msgid;	struct ipmi_msg  msg;	/* Call this when done with the message.  It will presumably free	   the message and do any other necessary cleanup. */	void (*done)(struct ipmi_recv_msg *msg);	/* Place-holder for the data, don't make any assumptions about	   the size or existance of this, since it may change. */	unsigned char   msg_data[IPMI_MAX_MSG_LENGTH];};/* Allocate and free the receive message. */static inline void ipmi_free_recv_msg(struct ipmi_recv_msg *msg){	msg->done(msg);}struct ipmi_recv_msg *ipmi_alloc_recv_msg(void);struct ipmi_user_hndl{        /* Routine type to call when a message needs to be routed to	   the upper layer.  This will be called with some locks held,	   the only IPMI routines that can be called are ipmi_request	   and the alloc/free operations. */	void (*ipmi_recv_hndl)(struct ipmi_recv_msg *msg,			       void                 *handler_data);	/* Called when the interface detects a watchdog pre-timeout.  If	   this is NULL, it will be ignored for the user. */	void (*ipmi_watchdog_pretimeout)(void *handler_data);};/* Create a new user of the IPMI layer on the given interface number. */int ipmi_create_user(unsigned int          if_num,		     struct ipmi_user_hndl *handler,		     void                  *handler_data,		     ipmi_user_t           *user);/* Destroy the given user of the IPMI layer. */int ipmi_destroy_user(ipmi_user_t user);/* Get the IPMI version of the BMC we are talking to. */void ipmi_get_version(ipmi_user_t   user,		      unsigned char *major,		      unsigned char *minor);/* Set and get the slave address and LUN that we will use for our   source messages.  Note that this affects the interface, not just   this user, so it will affect all users of this interface.  This is   so some initialization code can come in and do the OEM-specific   things it takes to determine your address (if not the BMC) and set   it for everyone else. */void ipmi_set_my_address(ipmi_user_t   user,			 unsigned char address);unsigned char ipmi_get_my_address(ipmi_user_t user);void ipmi_set_my_LUN(ipmi_user_t   user,		     unsigned char LUN);unsigned char ipmi_get_my_LUN(ipmi_user_t user);/* * Send a command request from the given user.  The address is the * proper address for the channel type.  If this is a command, then * the message response comes back, the receive handler for this user * will be called with the given msgid value in the recv msg.  If this * is a response to a command, then the msgid will be used as the * sequence number for the response (truncated if necessary), so when * sending a response you should use the sequence number you received * in the msgid field of the received command.  If the priority is > * 0, the message will go into a high-priority queue and be sent * first.  Otherwise, it goes into a normal-priority queue. */int ipmi_request(ipmi_user_t      user,		 struct ipmi_addr *addr,		 long             msgid,		 struct ipmi_msg  *msg,		 int              priority);/* * Like ipmi_request, but lets you specify the slave return address. */int ipmi_request_with_source(ipmi_user_t      user,			     struct ipmi_addr *addr,			     long             msgid,			     struct ipmi_msg  *msg,			     int              priority,			     unsigned char    source_address,			     unsigned char    source_lun);/* * Like ipmi_request, but with messages supplied.  This will not * allocate any memory, and the messages may be statically allocated * (just make sure to do the "done" handling on them).  Note that this * is primarily for the watchdog timer, since it should be able to * send messages even if no memory is available.  This is subject to * change as the system changes, so don't use it unless you REALLY * have to. */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -